Как эмулировать клавиши пианино в Python? - PullRequest
0 голосов
/ 03 февраля 2020

Я написал сценарий Python, который отправляет MIDI-данные в другую программу на моем ноутбуке, если на клавиатуре нажата клавиша a , которая запускает звук пианино.

Моя проблема следующее: на настоящем пианино, если я нажимаю клавишу и держу ее нажатой, звучит одна нота с сустейном. Но если я нажимаю клавишу a на клавиатуре во время выполнения сценария, вместо того, чтобы вести себя как настоящий акустический c рояль, при нажатии клавиши нота звучит несколько раз. Я полагаю, что эту проблему можно решить с помощью некоторых if и l oop logi c. Я просто не знаю, как.

Кто-нибудь может мне что-нибудь предложить?

Мой сценарий такой:

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)

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

После большой помощи MaxiMouse я смог выполнить sh, что хотел. Я воспользовался предложением 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")
0 голосов
/ 03 февраля 2020

Вам нужна переменная, которая запоминает нажатие клавиши:

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 для сохранения информации о более чем одной клавише.

...