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

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

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

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

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

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

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

1 Ответ

1 голос
/ 17 мая 2019

В общем, чтобы получить правильный поток 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.

Но «должен» не значит «должен».

...