无法通过 USB (python) 与 midi 通信



我的目标:

我想在我的Raspberry Pi Zero W上写一个脚本,每当我在GPIO板上进行特定连接时,它就会向我的计算机发送MIDI。

问题是:

硬件的东西已经处理好了,它可以识别独特的按键。但它似乎不会向我的电脑发送任何数据。我尝试过多个python模块(如rtmidi-pythonpython-rtmidimido(,但没有一个能像我希望的那样工作

为了解决这个问题,我已经将我的树莓设置为从电源端口供电,所以USB端口仍然是空的,当它启动时,我将电缆连接到我的电脑。我甚至写了一个脚本,不断地喊出相同的音符(包括音符off(,因为我找不到任何";设置协议";。在浏览各种表格时,我注意到它们都很旧。最新的是GitHub上的rtmidi-python,但它似乎没有任何设置内容。

很可能是,我一直看错了方向,或者信号甚至没有通过USB电缆,或者也不需要设置。如果是的话,你介意告诉我,或者告诉我如何正确地做吗。

更新

我把我的树莓做成了";MIDI功能";(就是这样(。我的电脑和FL工作室也认识到了这一点。然而,仍然没有行动,当我试着演奏一个音符。此端口探测脚本

import rtmidi_python as rtmidi
midi_out = rtmidi.MidiOut()
for port_name in midi_out.ports:
print port_name

返回

Midi Through:0
f_midi:0

我无法确定它是说没有MIDI消息通过,还是说我的树莓在Port0 上说话

解决方案:

首先,您必须确保您的Raspberry Pi实际上被识别为(在本例中(MIDI gadget。那么,不要混淆PythonPython3,因为它们是不同的,并且pip3 install midopip install mido。此外,一个很好的做法,保持你的SD crad清洁,并删除任何不必要的模块。如果您的系统变得非常混乱,并且即使有pip listapt list(列出了所有已安装的模块(,您也可以重新开始。这意味着擦干净你的SD卡,根据你所学到的经验,这次应该会更容易。

此外,你显然应该检查给出的答案。

希望至少有一个人看到了这一点,我能够帮助他们:(

谢谢

在这个代码中。。。

midi_out = rtmidi.MidiOut()
for port_name in midi_out.ports:
print port_name

您要求提供可用端口的列表,rtmidi将为您提供该信息。有两个midi端口可用:

Midi Through:0
f_midi:0

在这两个端口中,第二个端口(f_midi:0(是由USB小工具功能创建的端口。如果你在这个端口上发送MIDI消息,它应该可以正常工作。例如,我在Pi Zero上复制了您的设置,并能够使用以下代码向桌面发送MIDI消息。我使用的是mido,它是rtmidi的高级包装器(我更喜欢它,因为它使发送/接收MIDI消息变得更容易(:

>>> import mido
>>> mido.get_output_names()
['Midi Through:Midi Through Port-0 14:0', 'f_midi:f_midi 20:0']
>>> out = mido.open_output('f_midi:f_midi 20:0')
>>> out.send(mido.Message('control_change', channel=0, control=0, value=123))

在我的主机上,我看到Pi Zero显示为MIDI端口:

$ aseqdump -l
Port    Client name                      Port name
0:0    System                           Timer
0:1    System                           Announce
14:0    Midi Through                     Midi Through Port-0
28:0    nanoKONTROL2                     nanoKONTROL2 MIDI 1
36:0    Pi Zero Gadget                   Pi Zero Gadget MIDI 1

我看到了我发送的控制更改信息:

$ aseqdump --port 36:0
Waiting for data. Press Ctrl+C to end.
Source  Event                  Ch  Data
36:0   Control change          0, controller 0, value 123

在回答您的最后一条评论时,您可以这样做:

import rtmidi
import sys
out = rtmidi.MidiOut()
for i, port in enumerate(out.get_ports()):
if port.startswith('f_midi'):
out.open_port(i)
break
else:
print('ERROR: failed to find a port')
sys.exit(1)
out.send_message([176, 0, 123])

我使用的是Python3(我建议使用它,因为Python2目前是EOL(,并且我使用apt install python3-rtmidi中的rtmidi模块。

使用我更喜欢的mido模块,它看起来像:

import mido
import sys
for port in mido.get_output_names():
if port.startswith('f_midi'):
out = mido.open_output(port)
break
else:
print('ERROR: failed to find a port')
sys.exit(1)
out.send(mido.Message('control_change', channel=0, control=0, value=123))

最新更新