Как обрабатывать дубликаты note_on, note_off, изменения темпа в нескольких дорожках и дорожки без program_change в миди-файле?

Я использую Mido для Python, работает над анализом MIDI-файлов в <start_time, duration, program, pitch> кортежи и столкнулись с некоторыми проблемами.

Некоторые файлы, которые я анализирую, имеют несколько note_on, что приводит к тому, что ноты с одинаковым шагом и одной и той же программой открываются более одного раза.

Некоторые файлы содержат несколько note_off в результате мы пытаемся закрыть ноты, которые больше не включены из-за того, что были закрыты ранее (при условии, что может быть включена только одна нота в той же программе и та же самая высота).

Некоторые треки не имеют program_change в начале трека (или, что еще хуже, даже не имея его на всем треке).

Некоторые файлы содержат более одной дорожки, содержащей set_tempo Сообщения.

Что я должен сделать в каждом из этих случаев, чтобы получить правильную интерпретацию?

1 ответ

Решение

В общем, чтобы получить правильный поток MIDI-сообщений, вы должны объединить все дорожки в файле типа 1. Для синтезатора важны не треки, а каналы.

Спецификация MIDI гласит:

НАЗНАЧЕНИЕ ЗАПИСИ ВКЛ / ВЫКЛ КОМАНД

Если инструмент получает два или более сообщений Note On с одинаковым номером ключа и MIDI-каналом, он должен определить, как обрабатывать дополнительные примечания On. Получатель сам решит, будет ли звучать тот же или другой голос или сообщения будут проигнорированы. Однако передатчик должен отправлять соответствующее сообщение Note Off для каждой отправленной Note On. Если бы передатчик должен был отправить только одно сообщение Note Off, и если получатель фактически назначил два сообщения Note On различным голосам, то одна нота задержалась бы. Поскольку при отправке избыточных сообщений Note Off нет никакого вреда или отрицательного побочного эффекта, это рекомендуемая практика.


В Общем руководстве для разработчиков уровня MIDI System 1 говорится, что в ответ на сообщение "GM System On" устройство должно установить Program Change на 0. Таким образом, вы можете считать это начальным значением для каналов, у которых есть примечания без предшествующего изменения программы.,


Стандартная спецификация файлов MIDI говорит, что

информация о темпе всегда должна храниться в первом фрагменте MTrk.

Но "должен" - это не "должен".

Другие вопросы по тегам