使用Python在Raspberry Pi上实现MIDI
我使用扫描矩阵中的按钮将MIDI音符输出到连接到MIDI-OX的MIDI-USB转换器 为此,我使用Python来计算按钮何时被按下或释放,以及它是哪个按钮。这部分代码运行良好 但是,我发现MIDI-OX接收到的命令有很多不一致之处。对于通信,我将Pi的UART0_TXD引脚直接连接到用于MIDI和PySerial发送数据的5极DIN连接器的引脚2。就我所见,我的代码应该生成正确的命令,并通过串行正确发送它们,所以我不确定要到哪里进行故障排除 发送命令的代码如下所示:使用Python在Raspberry Pi上实现MIDI,python,serial-port,raspberry-pi,midi,pyserial,Python,Serial Port,Raspberry Pi,Midi,Pyserial,我使用扫描矩阵中的按钮将MIDI音符输出到连接到MIDI-OX的MIDI-USB转换器 为此,我使用Python来计算按钮何时被按下或释放,以及它是哪个按钮。这部分代码运行良好 但是,我发现MIDI-OX接收到的命令有很多不一致之处。对于通信,我将Pi的UART0_TXD引脚直接连接到用于MIDI和PySerial发送数据的5极DIN连接器的引脚2。就我所见,我的代码应该生成正确的命令,并通过串行正确发送它们,所以我不确定要到哪里进行故障排除 发送命令的代码如下所示: message=chr(0
message=chr(0x90) + chr(0x3D) + chr(0x40)
port.write(message)
这将在MIDI-OX中产生以下输出:
TIMESTAMP IN PORT STATUS DATA1 DATA2 CHAN NOTE EVENT
007B971E 1 -- 90 68 27 1 G# 8 Note On
007B971E 1 -- FF -- -- -- --- System Reset
从上面可以看出,MIDI-OX正在接收数据2的68,并且正在输出该数字的正确音符(G)。但是,如果我将代码更改为:
message=chr(0x90) + chr(0x3C) + chr(0x40)
port.write(message)
MIDI-OX输出为:
TIMESTAMP IN PORT STATUS DATA1 DATA2 CHAN NOTE EVENT
007FAC19 1 -- 81 00 42 2 C 0 Note Off
007FAC3A 1 -- FF -- -- -- --- System Reset
显示它正在接收完全不同的数据
如果您有任何关于从这里出发的想法,我们将不胜感激。刚刚开始一个类似的项目,我指的是您的评论: 不幸的是,MIDI-OX接收到的所有数据都是错误的,我看不到模式。我怀疑我对PySerial做了什么错事,但我不知道是什么 据我所知,MIDI波特率设置对于Raspi来说并不那么简单,请参阅
可能您的设置有点不同步,因此只能生成“几乎”正确但有点不稳定的MIDI数据,并且需要调整波特率以使其正确。刚刚开始一个类似的项目,我指的是您的评论: 不幸的是,MIDI-OX接收到的所有数据都是错误的,我看不到模式。我怀疑我对PySerial做了什么错事,但我不知道是什么 据我所知,MIDI波特率设置对于Raspi来说并不那么简单,请参阅
可能您的设置有点不同步,因此只生成“几乎”正确但有点不稳定的MIDI数据,并且需要调整波特率以使其正确。因此,您发送一个东西,而“G sharp?”打开,发送另一个东西,而错误的音符“C”关闭,这似乎是一个好的开始,为什么不迭代每个十六进制
chr
并映射注释,它们可能不是十六进制序列?试试看:chr(x90)+chr(0x3D)+chr(0x41)
。。。一半的战斗基本上只是窥探改变一件事,然后看到结果,改变另一件事,然后看到结果。。。一次又一次的重复,直到你明白为什么它没有达到你最初的期望。谢谢你的建议。不幸的是,MIDI-OX接收到的所有数据都是错误的,我看不到模式。我怀疑我对PySerial做了什么错事,但我不知道是什么。或者是我的USB-MIDI接口有缺陷,但我没有MIDI设备要检查。所以如果你一遍又一遍地发送同样的东西,它会改变吗?可能是一些松动的电压或电线?不,每次都会产生相同的输出。当我说我看不到模式时,我的意思是我看不到数据中的一致错误。例如,如果所有数据都是正确值的一半。相反,我发送的每个值似乎都是随机错误的。我会从x000000
开始,然后计数到xfffff
,然后再做一次,看看是否有任何变化。如果没有任何变化,那么我会将按钮“映射”到值。因此,如果发送1个,则“G sharp?”会打开,如果发送另一个,则错误的音符“C”会关闭,这似乎是一个好的开始,为什么不迭代每个十六进制chr
并映射音符,它们可能不是十六进制序列?试试看:chr(x90)+chr(0x3D)+chr(0x41)
。。。一半的战斗基本上只是窥探改变一件事,然后看到结果,改变另一件事,然后看到结果。。。一次又一次的重复,直到你明白为什么它没有达到你最初的期望。谢谢你的建议。不幸的是,MIDI-OX接收到的所有数据都是错误的,我看不到模式。我怀疑我对PySerial做了什么错事,但我不知道是什么。或者是我的USB-MIDI接口有缺陷,但我没有MIDI设备要检查。所以如果你一遍又一遍地发送同样的东西,它会改变吗?可能是一些松动的电压或电线?不,每次都会产生相同的输出。当我说我看不到模式时,我的意思是我看不到数据中的一致错误。例如,如果所有数据都是正确值的一半。相反,我发送的每个值似乎都是随机错误的。我会从x000000
开始,然后计数到xfffff
,然后再做一次,看看是否有任何变化。如果没有任何变化,那么我会将按钮“映射”到值。