Python mido 未检测到 Raspberry Pi 中的键盘输入

问题描述 投票:0回答:1

我有一个简单的Python代码,它通过连接到PC的USB从音乐键盘获取MIDI信号,然后将命令发送到Arduino板以写入其数字输出。这工作得很好,没有任何问题。 我尝试将相同的代码迁移到 Raspberry Pi,并进行一些特定于 Pi 的修改。我的代码如下:

import pygame
import mido
import rtmidi
import time
import RPi.GPIO as GPIO

pygame.init()
BLACK = [0,0,0]
WHITE = [255, 222, 111]
note_list = []
note_list_off = []
outport=mido.open_output()
inport=mido.open_input()
GPIO.setmode(GPIO.BCM)
done = False
GPIO.setup(4,GPIO.OUT)
print("START!")
while done == False:
    for msg in inport.iter_pending():
        try:
            n = msg.note
        except: 
            continue
        if msg.velocity>0 and msg.velocity != 64:
            print(msg.velocity)
            GPIO.output(4,True)
            time.sleep(1)
            GPIO.output(4,False)
        else:
            msg=mido.Message('note_off',note=n)
            outport.send(msg)

pygame.quit ()

添加 RPi.GPIO 是与 Windows 上运行的代码的唯一区别。如果我移动代码

GPIO.output(4,True)
time.sleep(1)
GPIO.output(4,False)

就在这条线的上方

print("START!")

Raspberry Pi 写入正确的端口,我通过连接 LED 进行了测试。这里的问题是

之后的行
for msg in inport.iter_pending():

永远不会被处决。我检查了 Pi 是否检测到键盘,这些是输出:

lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 07cf:6803 Casio Computer Co., Ltd CTK-3500 (MIDI keyboard)

amidi-l

Dir Device    Name
IO  hw:3,0,0  CASIO USB-MIDI MIDI 1

aconnect -i

client 0: 'System' [type=kernel]
    0 'Timer           '
    1 'Announce        '
client 14: 'Midi Through' [type=kernel]
    0 'Midi Through Port-0'
client 28: 'CASIO USB-MIDI' [type=kernel,card=3]
    0 'CASIO USB-MIDI MIDI 1'

Pi 可以很好地从键盘读取 MIDI,因为这是 aseqdump -p 28 从键盘弹奏琴键时

Waiting for data. Press Ctrl+C to end.
Source  Event                  Ch  Data
 28:0   Note on                 0, note 64, velocity 9
 28:0   Note on                 0, note 60, velocity 27
 28:0   Note on                 0, note 57, velocity 1
 28:0   Note off                0, note 57, velocity 64
 28:0   Note on                 0, note 60, velocity 30
 28:0   Note on                 0, note 57, velocity 23
 28:0   Note on                 0, note 55, velocity 31
 28:0   Note off                0, note 55, velocity 64
 28:0   Note off                0, note 60, velocity 64
 28:0   Note off                0, note 57, velocity 64
 28:0   Note on                 0, note 55, velocity 29
 28:0   Note off                0, note 55, velocity 64
 28:0   Note on                 0, note 57, velocity 35

我的Python版本是3.11。 非常感谢任何帮助。

python raspberry-pi midi mido
1个回答
0
投票

当您在 Mido 中打开端口时,您应该通过名称指定要打开的端口。 如果您不指定端口,它将打开系统特定的默认端口,该端口可以被环境变量

覆盖

因此,修复您的项目的方法是将 CASIO USB-MIDI 指定为输入端口

inport = mido.open_input("CASIO USB-MIDI MIDI 1")

或者,您可以将

mido.open_input()
中的参数留空,然后通过设置环境变量将 CASIO 配置为系统默认端口:

export MIDO_DEFAULT_INPUT='CASIO USB-MIDI MIDI 1'

如果您稍后可能在其他设备上使用相同的脚本,这可能会更好。

© www.soinside.com 2019 - 2024. All rights reserved.