我正在尝试使用Python将基本的MIDI信息发送到合成器。
我知道PC-Synthesizer链接功能正常,因为当MIDI输出设置为'DigitalKBD 20:0'端口时,Rosegarden应用程序可以配置为在设备上播放MIDI文件。
我发现了这个Python库(MIDO)并安装了它。好消息是外部MIDI设备在端口列表中被识别并可用。不幸的是,简单的音符开启测试不会触发设备上的任何声音。这是我试过的代码:
使用PortMidi(这是MIDO的默认设置):
>>> import mido
>>> output = mido.open_output('DigitalKBD MIDI 1')
>>> output.send(mido.Message('note_on', note=60, velocity=64))
使用RtMidi:
>>> import mido
>>> rtmidi = mido.Backend('mido.backends.rtmidi')
>>> output = rtmidi.open_output('DigitalKBD 20:0')
>>> output.send(mido.Message('note_on', note=60, velocity=64))
在这两种情况下,合成器都没有声音。
请问,我可以获得如何修复代码(或设置)的建议,以便仪器正确接收和解释消息吗?
答案 0 :(得分:3)
好吧,好吧,我通过创建一个小的脚本来响应MIDI输入/输出工作,这个脚本回应键盘上播放的任何内容,但有一定的延迟:
import mido
import time
from collections import deque
print mido.get_output_names() # To list the output ports
print mido.get_input_names() # To list the input ports
inport = mido.open_input('DigitalKBD MIDI 1')
outport = mido.open_output('DigitalKBD MIDI 1')
msglog = deque()
echo_delay = 2
while True:
while inport.pending():
msg = inport.receive()
if msg.type != "clock":
print msg
msglog.append({"msg": msg, "due": time.time() + echo_delay})
while len(msglog) > 0 and msglog[0]["due"] <= time.time():
outport.send(msglog.popleft()["msg"])
这个脚本运行得很好,所以我有机会小心翼翼地回去看看为什么我的初始测试不成功。结果是,对于要接收的输出消息,还必须打开输入端口。不知道原因,但这是最简单的代码:
import mido
inport = mido.open_input('DigitalKBD MIDI 1')
outport = mido.open_output('DigitalKBD MIDI 1')
outport.send(mido.Message('note_on', note=72))
更重要的是,如果在运行上述代码后立即退出python,可能会发生MIDO无法发送消息,因此不会播放任何声音。给它一些时间来结束。
答案 1 :(得分:0)
在将消息发送到输出之后,您需要在通话中添加睡眠。
我在1s消息后添加了一个简单的睡眠,并且音调很好听