使用Python发送MIDI消息(在Ubuntu上)

时间:2014-12-31 11:42:39

标签: python midi

我正在尝试使用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))

在这两种情况下,合成器都没有声音。

请问,我可以获得如何修复代码(或设置)的建议,以便仪器正确接收和解释消息吗?

2 个答案:

答案 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消息后添加了一个简单的睡眠,并且音调很好听