无法通过USB(python)通信midi

时间:2020-04-26 08:41:19

标签: python raspberry-pi midi

我的目标:

我想在Raspberry Pi Zero W上编写一个脚本,每当我在GPIO板上建立特定连接时,该脚本就会将MIDI发送到我的计算机。

问题:

已经处理好了硬件,它可以识别唯一的按钮按下。但这似乎不会向我的计算机发送任何数据。我已经尝试了多个python模块(例如rtmidi-pythonpython-rtmidimido),但是它们都不如我所希望的那样工作。

为解决此问题,我将Raspberry设置为通过电源端口供电,因此USB端口保持为空,并且在启动时将电缆连接到PC。我什至写了一个脚本,不断重复喊同样的音符(包括音符关闭),因为我找不到任何“设置协议”。浏览各种表格时,我注意到所有表格都已经很旧了。最新的是GitHub上的rtmidi-python,但这似乎没有任何设置内容。

很可能是,我一直都看错方向,或者信号甚至没有通过USB电缆进入,或者也不需要设置。如果是这样,您介意让我知道,还是告诉我如何正确进行操作。

更新

我将Raspberry设置为“ MIDI功能”(this is how)。我的PC和FL Studio也可以识别它。但是,当我尝试弹奏音符时,仍然没有任何动作。此端口探测脚本

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消息通过,或者说我的Raspberry在Port0上通话

解决方案:

首先,您必须确保Raspberry Pi实际上被识别为MIDI gadget。然后,不要将PythonPython3混淆,因为它们是不同的,并且pip3 install midopip install mido。同样,一个好的做法是保持SD支架清洁,并删除所有不必要的模块。如果您的系统真的很混乱,并且即使使用pip listapt list(列出了所有已安装的模块)也松动了跟踪,则始终可以重新开始。意思是擦拭SD卡,并以您所学的经验,这次应该会更容易。

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

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

谢谢

1 个答案:

答案 0 :(得分:1)

在此代码中...

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])

我正在使用Python 3(鉴于Python 2到现在为止已经停止销售,因此我建议这样做),并且我使用的是rtmidi模块。 >

使用我更喜欢的apt install python3-rtmidi模块,如下所示:

mido