Как поменять музыкальный инструмент для MusicTrack?

Используя audiotoolbox, я создал MusicSeqence от NewMusicSequence. Затем я создал MusicTrack от MusicSequenceNewTrack. Я вставил несколько заметок в MusicTrack от MusicTrackNewMIDINoteEvent. И я создал AVMIDIPlayer для воспроизведения MusicSequence. Однако я могу играть на нем только на одном музыкальном инструменте: пианино. У меня вопрос, можно ли поменять музыкальный инструмент на MusicTrack? Например, сыграйте MusicTrack на скрипке. Если возможно, как это сделать?


person Alan Wu    schedule 05.12.2017    source источник


Ответы (1)


Хорошо, я разобрался.

var inMessage = MIDIChannelMessage(status: 0xE0, data1: 120, data2: 0, reserved: 0)
MusicTrackNewMIDIChannelEvent(musicTrack!, 0, &inMessage)
// set msb to 120 and lsb to 0

inMessage = MIDIChannelMessage(status: 0xC0, data1: 48, data2: 0, reserved: 0)
MusicTrackNewMIDIChannelEvent(musicTrack!, 0, &inMessage)
// change program to 48
// you changed the instrument to Orchestra Drums

И вы можете получить всю информацию об инструментах из CopyInstrumentInfoFromSoundBank.
Статус и соответствующие данные1 и данные2 для MusicTrackNewMIDIChannelEvent можно найти в здесь

person Alan Wu    schedule 05.12.2017
comment
Статус 0xE0 устанавливает изменение высоты звука, что не, что вам нужно. Чтобы выбрать банк, вам понадобятся два вызова со статусом 0xB0 (Control Change), затем 0xC0 (Program Change), чтобы установить голос в банке. - person Ford; 19.03.2018
comment
@Ford, согласно вашему предложению, я нашел эту страницу: ссылка. Основываясь на этой странице, перед вызовом '0xC0' мне нужно ввести 0 как data1 и MSB как data2 в '0xB0', чтобы установить MSB. И затем мне нужно ввести 32 как data1 и LSB как data2 в '0xB0', чтобы установить LSB. Я прав? - person Alan Wu; 20.03.2018
comment
Да, я так понимаю - в C это будет: MIDIChannelMessage msg1 = { 0xB0, 0x00, BANKMSB, 0 }; MIDIChannelMessage msg2 = { 0xB0, 0x20, BANKLSB, 0 }; MIDIChannelMessage msg3 = { 0xC0, PROGRAM, 0, 0 }; - person Ford; 07.04.2018