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

使用Python发送MIDI消息(在Ubuntu上),python,midi,Python,Midi,我正在尝试使用Python向合成器发送一条基本的MIDI消息 我知道PC合成器链接功能正常,因为当MIDI输出设置为“DigitalKBD 20:0”端口时,可以将Rosegarden应用程序配置为在设备上播放MIDI文件 我发现了这个Python库()并安装了它。好消息是外部MIDI设备已被识别并可在端口列表中使用。不幸的是,测试中的简单提示不会触发设备上的任何声音。以下是我尝试的代码: 使用PortMidi(这是MIDO的默认设置): 使用RtMidi: >>> impor

我正在尝试使用Python向合成器发送一条基本的MIDI消息

我知道PC合成器链接功能正常,因为当MIDI输出设置为“DigitalKBD 20:0”端口时,可以将Rosegarden应用程序配置为在设备上播放MIDI文件

我发现了这个Python库()并安装了它。好消息是外部MIDI设备已被识别并可在端口列表中使用。不幸的是,测试中的简单提示不会触发设备上的任何声音。以下是我尝试的代码:

使用PortMidi(这是MIDO的默认设置):

使用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))
在这两种情况下,合成器都不会发出任何声音


请告诉我如何修复代码(或设置),以便乐器正确接收和解释信息?

好的,我通过创建一个小脚本,以一定的延迟响应键盘上播放的任何内容,使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"])

此外,如果在运行上述代码后立即退出python,则可能是MIDO没有发送消息,因此不会播放声音。给它一些时间来结束。

您需要在将消息发送到输出端后立即在通话中添加睡眠


我在1的信息之后添加了一个简单的睡眠,音调播放很好

运行
aseqdump
,播放到该端口,并检查是否有任何内容到达。mido可能在不同的MIDI通道上发送。验证合成器正在侦听哪个MIDI通道的音符,并尝试显式设置
mido.Message
相应的
channel
字段。这可能不是讨论您的问题的论坛,因为它不是python语言特有的问题。这是一个API、安装、库兼容性或环境问题。您看过库的文档了吗?音量和持续时间如何?
mido.get\u output\u names()
是否将设备名称列为可用输出?尝试使用该函数返回的确切字符串。当使用rtmidi时,我必须做类似的事情。不使用睡眠,你也可以有一个循环,就像上面的例子中键盘被回响一样
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))