Не можете прочитать миди-файл? [расширенная спецификация?]

Я пытаюсь прочитать MIDI-файл в C ++, и я застрял с ошибкой, которая кажется событием, которое не определено в стандартной спецификации MIDI (получено со многих сайтов, включая этот: http://www.sonicspot.com/guide/midifiles.html)

Я открыл миди в редакторе HEX и указал на ошибку. Это происходит перед самым первым событием. Файл был сгенерирован с использованием программного обеспечения Sibelius 6, и мне было интересно, что если я опубликую раздел файла здесь, кто-то поможет мне разобраться с этим.

Это начало 3-го трека:

4D 54 72 6B (MTrk magic number)
00 00 1F F5 (track size in bytes - 8181)
00 FF 03 04 (4 bytes follows) (track sequence name)
00 FF 04 0B (11 bytes follows) (instrument name)
00 C0 34 (program change event)
00 B0 79 00 (controller event)
00 5B <- (what the heck is that?!)

Это не могут быть дельта-тики, поскольку первое значение равно 00 (MSB не установлен в 1), это также не распознаваемое событие. Через 10 байтов я узнаю событие «Записка о»
Идет:

00 5B 30 00 40 00 00 07 64 00 0A 10 00 90 3E 47 <- обратите внимание на

Я понятия не имею, что представляют собой эти 12 байтов перед «note on» и, следовательно, не могут прочитать файл. Я знаю, что самая первая нота довольно длинная, может быть, в этом причина. Я также заметил, что не смог найти событие для представления «барных» пауз. Может быть, это код для бара + длина? Должен ли я читать эти как галочки?

4

Решение

Одна сложность MIDI-файлов Статус работы. Если есть последовательность сообщений одного типа и канала (например, все контроллеры или все ноты), тогда MIDI может сохранить количество байтов, пропустив байт состояния. Если бы он не использовал статус выполнения, то вы увидите следующие байты:

00 B0 79 00 - controller 121: controller reset
00 B0 5B 00 - controller 91: reverb
00 B0 40 00 - controller 64: sustain
00 B0 07 64 - controller 7: volume
00 B0 0A 10 - controller 10: pan
00 90 3E 47 - note message

Поскольку все сообщения контроллера являются смежными и предназначены для одного и того же канала, байт состояния может быть опущен. Как только происходит изменение типа сообщения, байт состояния должен быть добавлен снова.

Если вы пытаетесь понять MIDI-файлы, я бы порекомендовал использовать отдельный инструмент, такой как Python-MIDI или же GNMidi в качестве проверки здравомыслия, когда есть событие MIDI, которое вы не можете понять. Они могут отображать его как текст, чтобы вы могли имитировать то, что он делает.

РЕДАКТИРОВАТЬ: Еще один недостаток, о котором следует знать, это то, что любые MIDI-сообщения, которые принимают параметр длины или длительности (например, время в PPQN между событиями в MIDI-файле, или длину сисекс-сообщений или мета-событий), используют переменную длину, поэтому Не предполагайте, что все поля длины всегда имеют фиксированную длину.

Отказ от ответственности: я написал код экспорта MIDI в Sibelius 6 …

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]