Вопрос или проблема
Я пытаюсь использовать mido для захвата MIDI в режиме обратного вызова, и это просто не работает. Я могу без проблем опрашивать тот же вход. Пробовал на Linux 24.04 и Windows 10, Python 3.12 и 3.13. Эквивалент с rtmidi работает, но обратный вызов в mido отказывается срабатывать. Что я делаю не так?
Это мой код:
import time
innames = mido.get_input_names()
def input_callback():
print("СООБЩЕНИЕ ПОЛУЧЕНО")
port_in = None
for n in innames:
if n.startswith("USB"):
port_in = mido.open_input(n, callback=input_callback)
if port_in != None:
while True:
time.sleep(1)```
Ответ или решение
Чтобы использовать библиотеку mido для захвата MIDI-сообщений в режиме обратного вызова, необходимо правильно настроить функцию обратного вызова и обработку входящих сообщений. Рассмотрим, как можно исправить вашу реализацию и получить работоспособный код.
Пошаговая инструкция по настройке
-
Импорт библиотек:
Убедитесь, что вы импортировали необходимые модули. В вашем коде отсутствует импорт библиотеки mido. Это может вызвать ошибки при выполнении.import mido import time
-
Функция обратного вызова:
Убедитесь, что ваша функция обратного вызова принимает аргументы. Mido передает события MIDI в функцию обратного вызова. Ваше определение должно выглядеть следующим образом:def input_callback(message): print("MESSAGE RECEIVED:", message)
Теперь функция будет выводить полученное MIDI-сообщение, что поможет вам убедиться в том, что данные действительно поступают.
-
Поиск MIDI-входов:
Убедитесь, что вы правильно обрабатываете список доступных входов. Ваш код уже делает это правильно, но важно проверить, находятся ли нужные устройства в списке. -
Основной цикл программы:
Ваше основной цикл программы должен оставаться активным, чтобы программа не завершалась немедленно. Убедитесь, что вы оставляете достаточно времени для обработки сообщений. Можно использоватьtime.sleep(1)
, как у вас уже сделано.
Исправленный код
Объединяя все рассмотренные выше моменты, вот исправленный вариант вашего кода:
import mido
import time
# Получаем доступные входы
innames = mido.get_input_names()
# Функция обратного вызова, которая будет вызвана при получении MIDI-сообщения
def input_callback(message):
print("MESSAGE RECEIVED:", message)
# Инициализация переменной для хранения порта
port_in = None
# Поиск MIDI-входа, который начинается с "USB"
for n in innames:
if n.startswith("USB"):
port_in = mido.open_input(n, callback=input_callback)
break # Останавливаем цикл, если нашли вход
# Проверка на успешное открытие порта
if port_in is not None:
print(f"Listening to MIDI input: {port_in.name}")
while True:
time.sleep(1) # Поддерживаем активное состояние программы
else:
print("No USB MIDI input found.")
Дополнительные советы
- Логи: Чтобы помочь в отладке, добавьте логирование или вывод значений переменных на экран. Это поможет понять, проходят ли сообщения через функцию обратного вызова.
- Проверка совместимости: Убедитесь, что ваша версия библиотеки mido поддерживает вашу платформу (Linux или Windows) и установлен правильный драйвер для MIDI-устройств.
- Документация: Ознакомьтесь с документацией Mido для получения дополнительной информации о функциях и параметрах.
Следуя данным рекомендациям, вы сможете успешно использовать mido в режиме обратного вызова и уверенно обрабатывать MIDI-сообщения в ваших проектах.