Используя audiotoolbox, я создал MusicSeqence от NewMusicSequence. Затем я создал MusicTrack от MusicSequenceNewTrack. Я вставил несколько заметок в MusicTrack от MusicTrackNewMIDINoteEvent. И я создал AVMIDIPlayer для воспроизведения MusicSequence. Однако я могу играть на нем только на одном музыкальном инструменте: пианино. У меня вопрос, можно ли поменять музыкальный инструмент на MusicTrack? Например, сыграйте MusicTrack на скрипке. Если возможно, как это сделать?
Как поменять музыкальный инструмент для MusicTrack?
Ответы (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
Статус
0xE0
устанавливает изменение высоты звука, что не, что вам нужно. Чтобы выбрать банк, вам понадобятся два вызова со статусом 0xB0
(Control Change), затем 0xC0
(Program Change), чтобы установить голос в банке.
- person Ford; 19.03.2018
@Ford, согласно вашему предложению, я нашел эту страницу: ссылка. Основываясь на этой странице, перед вызовом '0xC0' мне нужно ввести 0 как data1 и MSB как data2 в '0xB0', чтобы установить MSB. И затем мне нужно ввести 32 как data1 и LSB как data2 в '0xB0', чтобы установить LSB. Я прав?
- person Alan Wu; 20.03.2018
Да, я так понимаю - в C это будет:
MIDIChannelMessage msg1 = { 0xB0, 0x00, BANKMSB, 0 }; MIDIChannelMessage msg2 = { 0xB0, 0x20, BANKLSB, 0 }; MIDIChannelMessage msg3 = { 0xC0, PROGRAM, 0, 0 };
- person Ford; 07.04.2018