Mido - 如何从不同端口实时获取 midi 数据

Posted

技术标签:

【中文标题】Mido - 如何从不同端口实时获取 midi 数据【英文标题】:Mido - How to get midi data in realtime from different ports 【发布时间】:2020-02-12 06:40:55 【问题描述】:

我创建了 2 个端口作为输入,用于从键盘和 midi 表面控制器(具有一堆滑块和旋钮)捕获数据。虽然我不确定如何从两者中获取数据

for msg1 in input_hw:
    if not msg1.type == "clock":
        print(msg1)
    # Play the note if the note has been triggered
    if msg1.type == 'note_on' or msg1.type == 'note_off' and msg1.velocity > 0:
        out.send(msg1)

for msg in input_hw2:
    #avoid to print the clock message
    if not msg.type == "clock":
        print(msg)

第一个 For 循环有效,我在弹奏键盘时打开和关闭了 midi 音符,它与input_hw 端口绑定,但第二个循环从未通过。

【问题讨论】:

【参考方案1】:

找到解决方案;您需要将 for 循环包装在 while 循环中,并使用 iter_pending() 函数,该函数确实允许 mido 继续并且不会在第一个循环上等待。

可能有更优雅的解决方案,但这是我能够找到的

while True:
    for msg1 in input_hw.iter_pending():
        if not msg1.type == "clock":
            print(msg1)
        # Play the note if the note has been triggered
        if msg1.type == 'note_on' or msg1.type == 'note_off' and msg1.velocity > 0:
            out.send(msg1)

    for msg in input_hw2.iter_pending():
        #avoid to print the clock message
        if not msg.type == "clock":
            print(msg)

【讨论】:

你能告诉我你是如何获得midi事件的吗?更准确地说,您是如何从外部仪器获得msg1 对象的? 你需要先创建一个端口对象,它会获取通过midi端口发送的消息。首先您调用mido.get_input_names(),这样您就可以看到活动输入和mido.get_output_names() 的输出。然后使用msg1=mido.open_input('DEVICENAME') 创建对象并使用mido.open_output('DEVICEOUT') 创建输出

以上是关于Mido - 如何从不同端口实时获取 midi 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将MIDO下的ticks_per_beat设置为一个新的MIDI文件?

为啥干净的 Midi 文件播放不同? (与米多)

使用 mido 库的绝对 MIDI 刻度值

在 Python MIDI MIDO 读取/保存文件中转换时间/刻度

MIDI,如何获取小节和音符

在 Mac 上从 Python Mido 库输出 MIDI 声音