【发布时间】:2016-12-21 19:15:36
【问题描述】:
我正在使用扫描矩阵中的按钮将 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
表明它正在接收完全不同的数据。
任何关于从这里去哪里的想法将不胜感激。
【问题讨论】:
-
所以你发送 1 件东西和“G 尖锐?”打开,您发送另一件事并且错误的音符“C”关闭,似乎是一个好的开始,为什么不只是迭代每个十六进制
chr并映射音符,它们可能不是十六进制序列?试试看:chr(x90) + chr(0x3D) + chr(0x41)... 成功的一半基本上就是偷偷改变一件事,然后看到结果,改变另一件事,然后看到结果……一遍又一遍,直到你弄清楚为什么会这样没有做你最初预期的事情。 -
感谢您的建议。不幸的是,MIDI-OX 收到的所有数据都是错误的,我看不到模式。我怀疑我在 PySerial 上做错了什么,但我不知道是什么。要么是那个,要么是我的 USB-MIDI 接口有缺陷,但我没有 MIDI 乐器要检查。
-
所以如果你一遍又一遍地发送同样的东西,它会改变吗?也许是一些松动的电压或电线?
-
不,这每次都会产生相同的输出。当我说我看不到模式时,我的意思是我看不到数据中的一致错误。例如,如果所有数据都是正确值的一半。相反,我发送的每个值似乎都是随机错误的。
-
我会从
x000000开始数到xFFFFFF,然后我会再次这样做,看看是否有任何变化。如果没有任何改变,那么我会将按钮“映射”到值。
标签: python serial-port raspberry-pi midi pyserial