Миди не может общаться через USB (python) - PullRequest
0 голосов
/ 26 апреля 2020

Моя цель:

Я хочу написать скрипт на моем Raspberry Pi Zero W, который отправляет MIDI на мой компьютер всякий раз, когда я устанавливаю c соединение на плате GPIO.

Проблема:

Аппаратные средства уже решены, они могут распознавать уникальные нажатия кнопок. Но, похоже, данные на мой компьютер не отправляются. Я пробовал несколько python модулей (например, rtmidi-python, python-rtmidi, mido), но ни один из них не работает так, как мне бы хотелось.

Пытаясь решить эту проблему, я настроил Raspberry на питание от порта питания, поэтому порт USB остается пустым, и когда он загружается, я подключаю кабель к своему P C. Я даже написал сценарий, который постоянно выкрикивает одну и ту же заметку (включая заметки) снова и снова, так как я не мог найти «протокол настройки». Просматривая различные формы, я заметил, что все они были довольно старыми. Новейшая версия rtmidi-python на GitHub, но, похоже, не имеет никаких настроек.

Вполне может быть, что я все время выглядел неправильно, или что сигнал даже не поступает через USB-кабель, или он не требует настройки. Если да, не могли бы вы дать мне знать или показать, как это правильно сделать.

Обновление

Я превратил Raspberry в "функцию MIDI" ( вот как ). Мой P C, и 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. Тогда не путайте Python с Python3, так как они разные, и pip3 install midopip install mido. Кроме того, это хорошая практика, чтобы поддерживать чистоту вашей SD-карты и удалять ненужные модули. Если ваша система действительно запутана, и вы теряете трек даже с pip list и apt list (в котором перечислены все ваши установленные модули), вы всегда можете начать заново. Это означает, что вычистите свою SD-карту, и с учетом того, что вы узнали, в этот раз все будет проще.

Кроме того, вам, очевидно, следует проверить данный ответ.

Надеюсь, хотя бы один другой человек видит это, и я могу им помочь:)

Спасибо

1 Ответ

1 голос
/ 27 апреля 2020

В этом коде ...

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

... вы запрашиваете список доступных портов, а rtmidi предоставляет вам эту информацию. Доступны два миди-порта:

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 является EOL), и я использую 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))
...