Typo there: that should read "responds to program changes as requests to switch”.
-DS > On Jan 12, 2016, at 9:54 AM, Douglas Scott <[email protected]> wrote: > > Yes. When “enable preload” is on, sending a program change tells the AU to > load the resources for the particular patch from file into memory. The idea > is that you do ALL of those “preload” requests up front, before doing > anything else. Once “enable preload” is off again, the AU responds like any > GM synth does, and responds to program changes as a request switch to the > requested (and already pre-loaded) patch during MIDI playback. > > -DS > >> On Jan 11, 2016, at 12:47 PM, Archagon <[email protected]> wrote: >> >> Hi Douglas, thank you for the help. I had tried playing with >> kAUMIDISynthProperty_EnablePreload before sending my original e-mail, >> but I didn't realize I had to disable it before sending further MIDI >> messages. ("Playback" seemed like it was referring to MusicSequence, >> not real-time MIDI note-on messages.) >> >> This time, I had trouble getting it to work, but then I realized I had >> to send the program change message a second time after enabling >> preload for my chosen instrument: >> >> UInt32 instrument = arc4random_uniform(100); >> >> UInt32 enabled = 1; >> AudioUnitSetProperty(self.samplerUnit, >> kAUMIDISynthProperty_EnablePreload, kAudioUnitScope_Global, 0, >> &enabled, sizeof(enabled)); >> >> UInt32 command = 0xC0 | 0; >> MusicDeviceMIDIEvent(self.samplerUnit, command, instrument, 0, 0); >> >> enabled = 0; >> AudioUnitSetProperty(self.samplerUnit, >> kAUMIDISynthProperty_EnablePreload, kAudioUnitScope_Global, 0, >> &enabled, sizeof(enabled)); >> >> // sending the program change message a second time! >> MusicDeviceMIDIEvent(self.samplerUnit, command, instrument, 0, 0); >> >> UInt32 noteNum = kMidNote; >> UInt32 onVelocity = 127; >> UInt32 noteCommand = kMIDIMessage_NoteOn << 4 | 0; >> MusicDeviceMIDIEvent(self.samplerUnit, noteCommand, noteNum, onVelocity, >> 0); >> >> This code finally let me switch the instrument on device. Without the >> second program change message, the synth was stuck on the piano patch. >> Is this the correct approach? >> >> Thank you, >> -Alexei >> >> On Mon, Jan 11, 2016 at 10:14 AM, Douglas Scott <[email protected]> >> wrote: >>> From AudioUnitProperties.h: >>> >>> /*! >>> @enum Apple AUMIDISynth Property IDs >>> @abstract The collection of property IDs for the Apple Midi Synth audio >>> unit. >>> >>> >>> >>> @discussion The AUMIDISynth audio unit lets a client create fully >>> GM-compatible Midi Synth. >>> >>> >>> >>> @constant kAUMIDISynthProperty_EnablePreload >>> @discussion Scope: Global >>> Value Type: UInt32 >>> Access: Write >>> >>> >>> >>> Setting this property to 1 puts the MIDISynth in a mode where it will >>> attempt to load >>> instruments from the bank or file when it receives a program change >>> message. This >>> is used internally by the MusicSequence. It should only be used prior to >>> MIDI playback, >>> and must be set back to 0 before attempting to start playback. >>> */ >>> >>> CF_ENUM(AudioUnitPropertyID) { >>> kAUMIDISynthProperty_EnablePreload = 4119 >>> }; >>> >>> This is needed on the device because we do not have the spare memory to load >>> every instrument from a bank in advance. Set this property to 1, send your >>> program changes (looks like you will need to send a message for ALL of them >>> if you are randomly choosing one later), then set the property to 0, then >>> start playback. >>> >>> -DS >>> >>> On Jan 9, 2016, at 8:00 PM, Archagon <[email protected]> wrote: >>> >>> Hello, >>> >>> I can't figure out how to make the AUMIDISynth MusicDevice >>> (kAudioUnitType_MusicDevice, kAudioUnitSubType_MIDISynth) change its >>> instrument on iOS. In the simulator, sending the following message... >>> >>> UInt32 command = 0xC0 | 0; >>> UInt32 instrument = arc4random_uniform(100); >>> MusicDeviceMIDIEvent(self.samplerUnit, command, instrument, 0, 0); >>> >>> ...works fine. On device, however, the synth just goes mute after >>> receiving the message. (The first instrument in the soundfont — >>> usually piano — does load correctly, however.) Is this a bug? If so, >>> is there any way to work around it? >>> >>> Here's a simple test case based on the LoadPreset demo: >>> https://github.com/archagon/ios-midisynth-program-change-bug-demo >>> You can tap the middle button to change to a random instrument. >>> >>> Thank you, >>> -Alexei >>> >>> _______________________________________________ >>> 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/douglas_scott%40apple.com >>> >>> This email sent to [email protected] >>> >>> >> >> _______________________________________________ >> 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/douglas_scott%40apple.com >> >> This email sent to [email protected] > _______________________________________________ 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]
