同时播放多个Midi程序?

时间:2018-09-17 21:32:23

标签: python midi synthesizer mido

我正在使用mido库通过python控制amsynth。

到目前为止,这工作得很不错...但是我一次只能播放一个“预设”。

我正在尝试使用“ 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 个答案:

答案 0 :(得分:1)

使用MIDI,有16个通道。在给定的时间,每个频道可以在一个节目/音色上。调用program_change时,您正在更改该默认频道的补丁。您应该将program_change发送到另一个通道,然后再将MIDI音符也发送到另一个通道。