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

Я могу легко отключить / включить звук MIDI-треков, используя метод MusicTrackSetProperty(t, kSequenceTrackProperty_MuteStatus...) MusicPlayer. Но я не обдумал, как включить / отключить определенные миди-каналы внутри трека. Существует ли свойство отключения / включения или отключения / включения каналов внутри дорожки?

Будет ли что-то подобное сделано на уровне дорожки, или я должен каким-то образом манипулировать аудиоустройством midi synth?

Создание конечной точки не приносит мне пользы, потому что я получаю только копию событий, отправленных на синтезатор, а не обратный вызов, который я вижу для фильтрации того, что происходит на синтезаторе. Итак, я думаю, что в графике аудиоустройства есть что-то, что можно изменить, но что именно?

Кто-то может предложить открыть MIDI-файл с флагом kMusicSequenceLoadSMF_ChannelsToTracks, а затем просто включить звук дорожки, соответствующей каналу, и отключить звук остальных. Я пытался это сделать, но на самом деле я получаю /less/ дорожки при открытии таким образом файла midi без флага kMusicSequenceLoadSMF_ChannelsToTracks. Странный. Может быть, я должен понять, почему это так, а? Вот что у меня есть для миди-файла: 16 треков, каждый из которых содержит 6 каналов миди. Без kMusicSequenceLoadSMF_ChannelsToTracks я получаю 16 дорожек, с флагом kMusicSequenceLoadSMF_ChannelsToTracks, 12. Разве это не должно быть 16*6 дорожек?

Спасибо за вашу помощь. Лучше всего тебе. /Jay

1 ответ

Решение

Вы на правильном пути. Насколько мне известно, kMusicSequenceLoadSMF_ChannelsToTracks объединит общие каналы. Таким образом, если даны две дорожки, содержащие заметки из трех каналов, скажем, у track1 есть заметки по каналам 1,2 и 3. А у track2 есть заметки по каналам 3,4 и 5. Затем с помощью флага kMusicSequenceLoadSMF_ChannelsToTracks объединятся заметки с использованием канала 3 из трека 1 и трека 2 в новый трек. Общее количество треков будет 5 с использованием этого метода. Это, вероятно, путь, если вы не можете доказать обратное. В противном случае, если вам действительно нужно выделить вещи, конечная точка - это правильный подход. Вам просто нужно отправить MIDI-события вручную, а не устанавливать соединение (указывать трек на синтезатор). В вашем обратном вызове вы должны проанализировать midi и вызвать MusicDeviceMIDIEvent для прямого запуска синтезатора. Вы могли бы сделать свою фильтрацию там.

Другие вопросы по тегам