Неизвестное событие в файле MIDI - PullRequest
1 голос
/ 10 января 2020

Как я уже писал ранее, я пишу парсер MIDI на Python. Я сталкиваюсь с ошибкой, когда мой анализатор застревает, потому что он пытается прочитать событие с именем 2a, но такого события не существует. ниже приведена выдержка из рассматриваемого MIDI-файла:

5d7f 00b5 5d7f 00b6 5d7f 00b1 5d00 00b9
5d00 8356 9923 7f00 2a44 0192 367f 0091
237f 0099 4640 0092 2f7c 0099 3f53 0b3f

Я проанализировал файл вручную и застрял в том же месте, что и мой анализатор! MIDI-файл воспроизводится, поэтому я знаю, что он действителен, но я уверен, что я неправильно читаю события.

1 Ответ

2 голосов
/ 10 января 2020

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

Текущее состояние используется: байты состояния сообщений канала MIDI могут быть опущены, если предыдущее событие является сообщением канала MIDI с тот же статус. Первое событие в каждом чанке MTrk должно указывать статус. Дельта-время не считается самим событием: оно является неотъемлемой частью синтаксиса события MTrk. Обратите внимание, что состояние выполнения происходит через дельта-раз.

Ваша выдержка будет расшифрована следующим образом:

delta  <- event ------->
time   status parameters
-----  ------ ----------
          ... 5d 7f
00      b5    5d 7f
00      b6    5d 7f
00      b1    5d 00
00      b9    5d 00
83 56   99    23 7f
00            2a 44
01      92    36 7f
00      91    23 7f
00      99    46 40
00      92    2f 7c
00      99    3f 53
0b            3f ...
...