我有一个简单的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。 非常感谢任何帮助。