
Сообщение от
metamorpho
SegaBoy, спасибо за информацию!!
А вот это текстовое представление миди-файла ты как в ручную обрабатываешь
или есть какая-то программа преобразующая в данные для ассемблера ?
Или это текстовое представление миди-файла напрямую вставляется в ассемблер, а уже там програмно обрабатывается ?
Для наглядного изучения миди-файла я использую MidiEditor. Из получившегося текстового файла удаляю всё лишнее - заголовки, хвосты, многократно повторяющиеся фрагменты. Затем на этот текстовый файл натравливаю код, который выстраивает для меня данные пригодные уже для проигрывания в плеере на ассемблере. Соответственно сначала надо придумать как они, данные эти, будут устроены, а потом этот код написать. Так как у меня ничего кроме GameMaker Studio нету, то и пишу код я прямо в нём. А так можно использовать любую среду программирования или язык.
Вот к примеру из такого фрагмента (Super Mario Bros):
Код:
76 On ch=3 n=50 v=90
76 Pb ch=3 v=8160
77 On ch=1 n=66 v=127
77 Pb ch=1 v=8152
77 On ch=2 n=76 v=127
77 Pb ch=2 v=8122
84 Off ch=3 n=50 v=0
85 On ch=3 n=50 v=90
85 Pb ch=3 v=8160
86 Off ch=1 n=66 v=0
86 On ch=1 n=66 v=127
86 Pb ch=1 v=8152
86 Off ch=2 n=76 v=0
86 On ch=2 n=76 v=127
86 Pb ch=2 v=8122
93 Off ch=3 n=50 v=0
103 On ch=3 n=50 v=90
получаются следующие данные для плеера:
Код:
db 4, 3, 1
db 24, 6, 9, 7
db 224, 1
db 4, 3, 1
db 24, 6, 9, 7
db 224, 10
Формат данных (в текущей версии) следующий. Старшие три бита первого байта это флаги выключения каналов 1, 2 и 3. Следующие три бита флаги включения. Последние два бита (пока) не используются. Затем если установлен бит включения канала, то следующий байт это номер ноты. Последний байт это количество кадров которые надо подождать прежде чем проигрывать следующий фрагмент.
Алгоритм следующий - загружаем значение для ноты 3 в третий канал, ждём 1 кадр, загружаем значение для ноты 6 в первый канал, загружаем значение для ноты 9 во второй канал, ждём 7 кадров, выключаем каналы 1, 2 и 3, ждём 1 кадр и тд.
- - - Добавлено - - -
Вот примеры плеера для Апогея (можно запустить в эмуляторе).