无法通过 USB 传输 midi (python)
Can't communicate midi through USB (python)
我的目标:
我想在我的 Raspberry Pi 零 W 上编写一个脚本,每当我在 GPIO 板上建立特定连接时,它就会将 MIDI 发送到我的计算机。
问题:
硬件的东西已经处理好了,它可以识别独特的按钮按下。但它似乎不会向我的计算机发送任何数据。我已经尝试了多个 python 模块(例如 rtmidi-python
、python-rtmidi
、mido
),但是其中 none 可以正常工作。
为了解决这个问题,我将我的 Raspberry 设置为从电源端口供电,因此 USB 端口保持空白,当它启动时,我将电缆连接到我的 PC。我什至写了一个脚本,因为我找不到任何“设置协议”,所以它总是一遍又一遍地喊出相同的音符(包括音符关闭)。在浏览各种表格时,我注意到它们都很旧。最新的是 GitHub 上的 rtmidi-python
,但似乎没有任何设置内容。
很可能是我一直看错了方向,或者信号甚至没有通过 USB 数据线传输,或者它也不需要设置。如果是这样,你介意让我知道,或者告诉我如何正确地做这件事吗?
更新
我把我的 Raspberry 变成了“MIDI 功能”(this is how)。我的电脑和 FL studio 也能识别它。但是,当我尝试播放音符时,仍然没有任何动作。这个端口探测脚本
import rtmidi_python as rtmidi
midi_out = rtmidi.MidiOut()
for port_name in midi_out.ports:
print port_name
returns
Midi Through:0
f_midi:0
我无法确定它是说没有 MIDI 消息通过,还是我的 Raspberry 在端口 0 上通话
解决方案:
首先,您必须确保您的 Raspberry Pi
实际上被识别为(在本例中)MIDI gadget
。那么,不要混淆Python
和Python3
,它们是不同的,而且pip3 install mido
≠pip install mido
。另外,保持 SD crad 清洁并删除任何不需要的模块的好习惯。如果您的系统变得非常混乱,并且即使使用 pip list
和 apt 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
的高级包装器(我更喜欢它,因为它使 sending/receiving 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])
我正在使用 Python 3(鉴于 Python 2 现在已经停产,我建议这样做),并且我正在使用您获得的 rtmidi
模块如果你 apt install python3-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))
我的目标:
我想在我的 Raspberry Pi 零 W 上编写一个脚本,每当我在 GPIO 板上建立特定连接时,它就会将 MIDI 发送到我的计算机。
问题:
硬件的东西已经处理好了,它可以识别独特的按钮按下。但它似乎不会向我的计算机发送任何数据。我已经尝试了多个 python 模块(例如 rtmidi-python
、python-rtmidi
、mido
),但是其中 none 可以正常工作。
为了解决这个问题,我将我的 Raspberry 设置为从电源端口供电,因此 USB 端口保持空白,当它启动时,我将电缆连接到我的 PC。我什至写了一个脚本,因为我找不到任何“设置协议”,所以它总是一遍又一遍地喊出相同的音符(包括音符关闭)。在浏览各种表格时,我注意到它们都很旧。最新的是 GitHub 上的 rtmidi-python
,但似乎没有任何设置内容。
很可能是我一直看错了方向,或者信号甚至没有通过 USB 数据线传输,或者它也不需要设置。如果是这样,你介意让我知道,或者告诉我如何正确地做这件事吗?
更新
我把我的 Raspberry 变成了“MIDI 功能”(this is how)。我的电脑和 FL studio 也能识别它。但是,当我尝试播放音符时,仍然没有任何动作。这个端口探测脚本
import rtmidi_python as rtmidi
midi_out = rtmidi.MidiOut()
for port_name in midi_out.ports:
print port_name
returns
Midi Through:0
f_midi:0
我无法确定它是说没有 MIDI 消息通过,还是我的 Raspberry 在端口 0 上通话
解决方案:
首先,您必须确保您的 Raspberry Pi
实际上被识别为(在本例中)MIDI gadget
。那么,不要混淆Python
和Python3
,它们是不同的,而且pip3 install mido
≠pip install mido
。另外,保持 SD crad 清洁并删除任何不需要的模块的好习惯。如果您的系统变得非常混乱,并且即使使用 pip list
和 apt 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
的高级包装器(我更喜欢它,因为它使 sending/receiving 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])
我正在使用 Python 3(鉴于 Python 2 现在已经停产,我建议这样做),并且我正在使用您获得的 rtmidi
模块如果你 apt install python3-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))