MIDI 菜鸟在这里训练...我一直在使用MusicPlayer/MusicSequence/MusicTrack在运行iOS的设备上播放MIDI音符。 音符弹奏良好。 我正在努力改变正在演奏的乐器。 据我所知,这是如何做到的:
-(void) setInstrument:(MIDIInstruments) program channel:(int) channel MusicTrack:(MusicTrack*) track time:(float) time {
if(channel < 0 || channel > 15 || program >=MIDI_INSTRUMENT_COUNT || time < 0) {
return;
}
MIDIChannelMessage programChange = { ((UInt8)0xC) << 4 | ((UInt8)channel), ((UInt8)program), 0, 0};
OSStatus result = MusicTrackNewMIDIChannelEvent(*track, time, &programChange);
if(result != noErr) {
[NSException raise:@"Set Instrument" format:@"Failed to set instrument error: %@", [NSError errorWithDomain:NSOSStatusErrorDomain code:result userInfo:nil]];
}
}
在本例中,通道为 0 或 1,我在有效乐器枚举范围内尝试了几种乐器,时间为 0.0,MusicTrack 有效,并且具有 ~30 秒的音符事件。 设置通道事件的调用会传回 noErr。 我被难住了...任何人?
我在其他帖子中读到,我将能够使用音乐播放器和朋友生成 midi。 它提供了程序更改。 所以,我认为它得到了支持。 在用尽所有理论之后,我转向AUGraph
. 我添加了一个我在网上找到的 *.sf2 文件,实例化了AUGraph
、两个AudioUnits
、一个MidiEndpointRef
和一个MidiClientRef
;根据本教程。
正是在端点回调中,我不得不使用似乎允许程序更改的samplerUnit
上的MusicDeviceMIDIEvent
打开和关闭注释。 而以前我只是将音符事件加载到MusicTrack
中并播放/停止MusicPlayer
.