I am using kAudioUnitSubType_MIDISynth Audio Unit in my iOS app.

I successfully loaded Fluid R3 GM soundfont into it and I figured out how
to select a preset for a specific channel.

I am able to use all presets of the soundfont from the bank 0. But the
percussion presets, which I also what to use, are in the bank 128 (as I see
in the Polyphone app).

I could not find any documentation on how to do it. I tried to send bank
select messages to the unit, but had no success with it.

Here is the method I currently use to set the preset and the bank:

-(*void*) setPreset:(UInt32) preset bank:(UInt32) bank forChannel:(UInt8)
channel forInstrumentUnit:(AudioUnit) instrumentUnit {



    // set the instrumentUnit into mode when it loads the requested preset
into memory

    UInt32 preloadEnabled = 1;

    OSStatus err = AudioUnitSetProperty(

                               instrumentUnit,

                               kAUMIDISynthProperty_EnablePreload,

                               kAudioUnitScope_Global,

                               0,

                               &preloadEnabled,

                               *sizeof*(preloadEnabled));



    *if* (err) {

        NSLog(@"Unable to set enablePreload property: %@", @(err));

    }


    // Send bank load message MSB

UInt32 ccCommand = 0xB0 | channel;

UInt32 bankMsb = bank >> 7;

err = MusicDeviceMIDIEvent(instrumentUnit, ccCommand, 0, bankMsb, 0);

*if* (err) {

NSLog(@"Failed to load preset: %@ in %s.", @(err), *__PRETTY_FUNCTION__*);

}

UInt32 bankLsb = bank & 0x7F;

err = MusicDeviceMIDIEvent(instrumentUnit, ccCommand, 0x20, bankLsb, 0);


*if* (err) {

NSLog(@"Failed to load preset: %@ in %s.", @(err), *__PRETTY_FUNCTION__*);

}





    // request preset on the channel to load it into memory(but it is not
activated here)

UInt32 pcCommand = 0xC0 | channel;

err = MusicDeviceMIDIEvent(instrumentUnit, pcCommand, preset, 0, 0);

*if* (err) {

NSLog(@"Failed to load preset: %@ in %s.", @(err), *__PRETTY_FUNCTION__*);

}



    // set instrumentUnit into regular mode when the requested preset is
activetad for the specified channel

    preloadEnabled = 0; //disable preload property

    err = AudioUnitSetProperty(

                               instrumentUnit,

                               kAUMIDISynthProperty_EnablePreload,

                               kAudioUnitScope_Global,

                               0,

                               &preloadEnabled,

                               *sizeof*(preloadEnabled));



    *if* (err) {

        NSLog(@"Unable to set enablePreload property: %@", @(err));

    }



    // repeat programm change command to actually activate the presed for
the channel after it has been loaded in the previous steps

    err = MusicDeviceMIDIEvent(instrumentUnit, pcCommand, preset, 0, 0);



    *if* (err) {

        NSLog(@"Failed to activate preset: %@ in %s.", @(err),
*__PRETTY_FUNCTION__*);

    }

}


Could you please tell if the MIDISynth unit supports soundfonts with
multiple banks, and what is the correct way to set a bank for a specific
channel?


Best regards,

Dmitry
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/coreaudio-api/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to