微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python mido MIDI包中使用MultiPort的问题

如何解决python mido MIDI包中使用MultiPort的问题

我正在开发一个程序,它可以在播放 MIDI 消息时自动保存它们,并且在使用单个输入端口时一切都运行良好。 我想扩展到使用 2 或 3 个同时端口(该应用程序针对 VST 钢琴演奏者,有些将钢琴用作一个 MIDI 设备,将延音踏板用作另一个 USB 插槽中的第二个设备)。我能够使用两个单独的输入端口让它工作,然后使用 2 个 iter_pending() 循环。基本代码是这样的:

ports = mido.get_input_names()
port_A = mido.open_input(ports[0])
port_B = mido.open_input(ports[1])

for msg_A in port_A.iter_pending():
    ...
for msg_B in port_B.iter_pending():
    ...

问题在于循环是顺序的。当我通过 2 个端口发送相同的 MIDI 消息进行测试时,通过 port_B 进入时的事件处理有几毫秒的延迟。

MIDO 包包含了一个完全不同类型的端口:mido.ports.MultiPort() 我的问题是我无法让它工作。

如果我尝试:

multi = mido.ports.MultiPort([port_A,port_B])
for msg in multi:
    print (msg)

按照 MIDO 文档中的建议,不打印 msg...

我已经为 multi 中的端口做了各种语法组合,但似乎没有任何效果

在这里做错了什么?

解决方法

你试过了吗:

open_ports = [portA,portB]

while True:
    for port in open_ports:
        do_whatever(port.poll())

或使其异步:

portA = mido.open_input(ports[0],callback=do_whatever)
portB = mido.open_input(ports[1],callback=do_whatever)

while True:
    pass

在这两种情况下,do_whatever 都是一个函数,它将单个消息作为参数,并根据该消息执行您想要执行的任何操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。