我正在使用 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 播放两个音符,因此不幸的是,这不起作用。