анализ файла MIDI, нераспознанный тип события - PullRequest
3 голосов
/ 11 октября 2011

У меня проблема с попыткой разобрать midi-файл.Я пытаюсь разобрать файлы заметок, используемые игрой «Лады в огне» (она использует только миди-файлы, так что я не думаю, что это удобно), если кто-то из вас знаком с этим, проблема, с которой я столкнулся, является общей проблемой миди,У меня есть файл с треком, называемым гитарной партией, гекс, как видно в редакторе гексагонов, выглядит следующим образом:

4D 54 72 6B 00 00 1E 74 00 FF 03 0B 50 41 52 54 20 47 55 4954 41 52 A9 20 90 61 40 9A 20 61 00 83 60 63 40 BC

Моя программа разбирает этот штраф следующим образом:

4D M
54 T
72 R
6B K
00 <- <br>00 размер
1E части дорожки
74 ->
00 время этого события
Тип события FF (это мета)
03 тип мета-события
0B длина данных
50 "P"
41 "A"
52 "R"
54 "T"
20 ""
47 "G"
55 "U"
49 "I"
54 "T"
41 "A"
52 "R"
A9 время события (переменная длина) 1 0101001
20 время события (переменная длина) 0 0100000
90 событие, канал (немета) 1001 = нота включена, канал = 0000
61 примечание имеет 2 параметра это первое
40 это второе
9А переменное время 1 0011010
20 переменное время 0 0100000

В этом и заключается моя проблема: нет события с типом события 0x6, поскольку 0x61 - это 01100001, мы должны предположить, что это не мета, поэтому тип события должен быть 6 (0110), а канал - (0001), но спецификация midi не содержит идентификатора для этого события. Я добавил несколько байтов после этого случая, когда они как-то пригодны, но, очевидно, в тот момент, когда моя программа переходит к следующему байту, не распознает событие и бомбыout.
61
00
83
60
63
40
BC

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

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

Заранее спасибо.

1 Ответ

7 голосов
/ 11 октября 2011

Это называется текущее состояние . Если событие того же типа, что и предыдущее событие, байт состояния MIDI может быть удален. Поэтому, если первый байт после информации о времени равен <$ 80, используйте предыдущий статус. В случае вашего байта в 61 доллар предыдущее состояние было 90 долларов, так что это Note On, канал 0. Это имеет смысл, поскольку предыдущее событие имело ноту номер 61, скорость 40 долларов. Это событие - нота № 61 со скоростью 0 (освобождение ранее сыгранной ноты). Следующее событие - нота № 63, скорость $ 40. </p>

...