【问题标题】:How to emulate a piano key in Python?如何在 Python 中模拟钢琴键?
【发布时间】:2020-02-04 16:45:02
【问题描述】:

我编写了一个 Python 脚本,如果按下键盘上的 a 键会触发钢琴声音,它会将 MIDI 数据发送到笔记本电脑上的另一个程序。

我的问题如下:在真正的钢琴上,如果我按下一个键并按住它,一个单一的音符会发出延音。但是,如果我在运行脚本时按下键盘上的 a 键,而不是像真正的原声钢琴一样,在按下键时音符会响起很多次。我想这个问题可以通过一些 if 和循环逻辑来解决。我只是不知道怎么做。

谁能给我建议?

我的脚本是这样的:

import time
import rtmidi
import mido
import keyboard

outport = mido.open_output('loopMIDI 1')

while True:
    #Pad A
    if keyboard.is_pressed("a"):
        msg = mido.Message("note_on", note=36, velocity=100, time=10)
        outport.send(msg)
        time.sleep(0.05)
    else:
        msg = mido.Message("note_off", note=36, velocity=100, time=10)
        outport.send(msg)

【问题讨论】:

    标签: python midi


    【解决方案1】:

    你需要一个能记住按键是否被按下的变量:

    import time
    import rtmidi
    import mido
    import keyboard
    
    outport = mido.open_output('loopMIDI 1')
    a_pressed = False
    
    while True:
        #Pad A
        if keyboard.is_pressed("a"):
            if a_pressed:
                msg = mido.Message("note_on", note=36, velocity=100, time=10)
                outport.send(msg)
                a_pressed = True
        elif a_pressed:
            msg = mido.Message("note_off", note=36, velocity=100, time=10)
            outport.send(msg)
            a_pressed = False
    

    您可以使用dict 来保存有关多个键的信息。

    【讨论】:

    • 这似乎不起作用。它可以打开和关闭音符,但例如,如果反复按下键,音符将被听到多次并关闭多次。我的意思是,这应该确实有效。但是,我能错过什么???
    • @DiegoHernandezHerrera 我编辑了代码,现在应该可以工作了。
    【解决方案2】:

    在 MaxiMouse 的大力帮助下,我可以完成我想要的。我使用了 MaxiMouse 的建议,通过一些变化,我可以让脚本正常工作。

    我将把工作代码留在这里。

    import time
    import rtmidi
    import mido
    import keyboard
    
    outport = mido.open_output('loopMIDI 1')
    a_pressed = False
    
    while True:
        #Pad A
        if keyboard.is_pressed("a") and not a_pressed:
            msg = mido.Message("note_on", note=36, velocity=100, time=10)
            outport.send(msg)
            a_pressed = True
            print("True press")
        elif (keyboard.is_pressed("a") == False):
            msg = mido.Message("note_off", note=36, velocity=100, time=10)
            outport.send(msg)
            a_pressed = False
            print("False press")
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 2010-12-25
    • 2020-10-05
    • 2013-08-22
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多