使用Python在Raspberry Pi上实现MIDI

使用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

我使用扫描矩阵中的按钮将MIDI音符输出到连接到MIDI-OX的MIDI-USB转换器

为此,我使用Python来计算按钮何时被按下或释放,以及它是哪个按钮。这部分代码运行良好

但是,我发现MIDI-OX接收到的命令有很多不一致之处。对于通信,我将Pi的UART0_TXD引脚直接连接到用于MIDI和PySerial发送数据的5极DIN连接器的引脚2。就我所见,我的代码应该生成正确的命令,并通过串行正确发送它们,所以我不确定要到哪里进行故障排除

发送命令的代码如下所示:

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
,然后再做一次,看看是否有任何变化。如果没有任何变化,那么我会将按钮“映射”到值。