Несколько миди-программ, играющих одновременно? - PullRequest
0 голосов
/ 18 сентября 2018

Я использую библиотеку 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, поэтому, к сожалению, это не работает.

1 Ответ

0 голосов
/ 18 сентября 2018

С MIDI есть 16 каналов. Каждый канал может быть в одной программе / патче в данный момент времени. Когда вы звоните program_change, вы меняете патч для этого канала по умолчанию. Вы должны отправить program_change для другого канала, а затем отправить ноты MIDI на этот другой канал.

...