Несколько миди-программ, играющих одновременно?
Я использую библиотеку Mido для управления Amsynth с Python.
Пока это работает прекрасно... но я могу играть только одну "пресет" за раз.
Я пытаюсь использовать "program_change" для переключения инструментов, чтобы я мог играть на нескольких инструментах одновременно.
В качестве быстрого примера:
import mido
from mido import Message
import time
outport = mido.open_output('amsynth:MIDI IN')
msg = Message('note_on', note = 64)
outport.send(msg)
time.sleep(2.0)
msg = Message('program_change', program = 1)
outport.send(msg)
msg = Message('note_on', note = 68)
outport.send(msg)
time.sleep(2.0)
msg = Message('note_off', note = 64)
outport.send(msg)
time.sleep(0.5)
msg = Message('note_off', note = 68)
outport.send(msg)
time.sleep(0.5)
Но когда я пытаюсь это сделать, заметка из первой программы обрывается, как только я переключаю каналы.
Так что, возможно, проблема в том, что каждая программа должна быть на другом канале:
import mido
from mido import Message
import time
outport = mido.open_output('amsynth:MIDI IN')
msg = Message('note_on', note = 64, channel = 0)
outport.send(msg)
time.sleep(2.0)
msg = Message('program_change', program = 1)
outport.send(msg)
msg = Message('note_on', note = 68, channel = 1)
outport.send(msg)
time.sleep(2.0)
msg = Message('note_off', note = 64)
outport.send(msg)
time.sleep(0.5)
msg = Message('note_off', note = 68)
outport.send(msg)
time.sleep(0.5)
Но это тоже не работает.
В качестве обходного пути я рассматривал возможность запуска нескольких экземпляров Amsynth... но это просто кажется мне извращенным.
Как я могу играть на нескольких инструментах одновременно?
Редактировать:
Похоже, мне нужно будет назначить программы каналам перед началом воспроизведения, а затем воспроизвести для каждого канала следующим образом:
msg = Message('program_change', program = 23, channel = 1)
outport.send(msg)
msg = Message('program_change', program = 3, channel = 2)
outport.send(msg)
msg = Message('note_on', note = 64, channel = 1)
outport.send(msg)
time.sleep(2.0)
msg = Message('note_on', note = 68, channel = 2)
outport.send(msg)
time.sleep(2.0)
msg = Message('note_off', note = 64, channel = 1)
outport.send(msg)
time.sleep(0.5)
msg = Message('note_off', note = 68, channel = 2)
outport.send(msg)
time.sleep(0.5)
Однако, это воспроизводит обе ноты с программой 3, так что, к сожалению, это не работает.
1 ответ
С MIDI есть 16 каналов. Каждый канал может быть в одной программе / патче в данный момент времени. Когда вы звоните program_change
вы меняете патч для этого канала по умолчанию. Вы должны отправить program_change
для другого канала, а затем отправьте ноты MIDI на этот другой канал.