Я использую библиотеку 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 ... но мне это кажется извращенным.
Как я могу играть на нескольких инструментах одновременно?
Edit:
Похоже, мне нужно будет назначить программы каналам перед началом воспроизведения, а затем воспроизвести для каждого канала следующим образом:
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, поэтому, к сожалению, это не работает.