Как использовать mido с Python в режиме обратного вызова

Вопрос или проблема

Я пытаюсь использовать 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-сообщений в режиме обратного вызова, необходимо правильно настроить функцию обратного вызова и обработку входящих сообщений. Рассмотрим, как можно исправить вашу реализацию и получить работоспособный код.

Пошаговая инструкция по настройке

  1. Импорт библиотек:
    Убедитесь, что вы импортировали необходимые модули. В вашем коде отсутствует импорт библиотеки mido. Это может вызвать ошибки при выполнении.

    import mido
    import time
  2. Функция обратного вызова:
    Убедитесь, что ваша функция обратного вызова принимает аргументы. Mido передает события MIDI в функцию обратного вызова. Ваше определение должно выглядеть следующим образом:

    def input_callback(message):
       print("MESSAGE RECEIVED:", message)

    Теперь функция будет выводить полученное MIDI-сообщение, что поможет вам убедиться в том, что данные действительно поступают.

  3. Поиск MIDI-входов:
    Убедитесь, что вы правильно обрабатываете список доступных входов. Ваш код уже делает это правильно, но важно проверить, находятся ли нужные устройства в списке.

  4. Основной цикл программы:
    Ваше основной цикл программы должен оставаться активным, чтобы программа не завершалась немедленно. Убедитесь, что вы оставляете достаточно времени для обработки сообщений. Можно использовать 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-сообщения в ваших проектах.

Оцените материал
Добавить комментарий

Капча загружается...