Вход

Просмотр полной версии : Музыкальный движок Jason C. Brooke



Barmaley_m
20.01.2010, 04:50
Значит, всем, кто интересуется созданием музыки на движке JCBrooke (Savage) - шлю его дизассемблер с метками и комментариями, а также привожу небольшое руководство по формату данных.

Данный файл является дизассемблером движка из Savage 2. Движок JCBrooke немного различается в разных играх, но в Savage 2 (а также в Savage 3) присутствует наиболее полнофункциональная его версия.

В Savage2 имеется три мелодии (заставка, "Wrong" и "Game over"), данные инициализации по каждой из них представлены в таблицах song_initdata_0, song_initdata_1 и song_initdata_2 соответственно. Таблица инициализации мелодии содержит: скорость воспроизведения (в прерываниях на треккерную строку, аналогично QNT. VAL в редакторе ASM). Каждый из трех каналов (два тональных (0,1) и один ударников (2)) имеет независимый список одноканальных паттернов для воспроизведения. В таблице инициализации для каждого из каналов содержится адрес списка паттернов, его длина и позиция зацикливания.

Каждый список паттернов представляет собой двухбайтные адреса данных каждого паттерна соответственно. Формат данных паттернов для тональных каналов 0 и 1 одинаковый, для ударников формат особый.

Формат данных каждого паттерна следующий:

00..7F - нота или пауза, по номеру полутона
80 - пауза

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

81..87 - спецфункции:
81 - glis. Спецэффект в виде плавного изменения (уменьшение) частоты тона. Следующий байт паттерна задает скорость понижения тона
82 - конец паттерна
83 - конец музыки (выход из процедуры воспроизведения)
84 - установка транспозиции. Следующий байт данных паттерна задает конкретное значение.
85 - установка параметра тембра skew (скважности). Следующий байт данных паттерна задает конкретное значение.
86 - genfx. Запуск спецэффекта на данном канале. Спецэффекты для каналов 0 и 1 различаются. Спецэффект на канале 1 приводит к взаимодействию звуков на обоих каналах (в остальных случаях, включая спецэффект на канале 0, взаимодействия каналов нет). Спецэффект действует только на одну ноту. Чтобы повторить его для следующей ноты, нужно указать код 86 перед ней снова.
87 - установка параметра тембра skew xoring (вариации скважности). Следующий байт паттерна задает конкретное значение.

С0..DF - установка орнамента номер 0-1F соответственно
E0..FF - установка длительности ноты, измеряемой количеством строк треккера (Quants) от 01 до 20

перед воспроизведением первой ноты в песне на каждом канале обязательно проинициализировать все ее параметры: длительность, номер орнамента, транспозиция, skew, skew_xoring. Перед каждым паттерном инициализацию проводить не требуется.

---

формат данных паттернов для ударного канала следующий:

00 - конец паттерна
01..7F - пауза в течение указанного числа строк (Quants)
80..FF - воспроизвести звук ударника с номером 00..7F (немедленно).

Фактически, коды 01..7F задают длительность ноты на канале ударников, но если для тональных каналов длительность нужно задавать ДО собственно ноты, то для канала ударников наоборот, сначала нужно указать, какой ударник, а потом его длительность.

---

фактически количество различных ударников в движке Savage 2 ограничено 5 (с номерами от 0 до 4), воспроизведение ударников заключаются в вызове подпрограмм, адреса которых косвенно задаются таблицей по адресу noise_offsets, а сами подпрограммы располагаются после этой таблицы.

То же самое можно сказать об орнаментах: хоть движок позволяет иметь до 32 орнаментов, но фактически их задано меньше, адреса данных каждого орнамента косвенно (в виде смещений) указаны в таблице orn_offsets. Формат данных орнамента следующий:

00..7F - для каждого прерывания, задает смещение номера ноты для канала от базового, в полутонах
80..FE - задает смещение номера ноты и запускает орнамент сначала
FF - завершает обработку орнамента

При этом орнамент 0 на уровне кода фактически является отсутствием орнамента, независимо от того, что в его данных может быть задано иное.

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

---

параметр skew задает тембр звука в виде изменения скважности формируемых прямоугольных импульсов. Параметр skew_xoring действует следующим образом. Когда он не равен нулю, то при каждом изменении на любом из каналов, параметр skew для этого канала ксорится с указанным числом. Если используются орнаменты, то изменение skew происходит 50 раз в секунду, а если они не используются - то соответственно частоте следования нот на обоих каналах. Таким образом, на канале, где проигрывается мелодия, будут наблюдаться изменения скважности синхронно с нотами на канале аккомпанемента.

Barmaley_m
20.01.2010, 07:10
Хочу добавить к вышесказанному.

Действие эффекта glis сбрасывается при каждом изменении ноты на любом из каналов. То есть если на канале 0 используется glis, а на канале 1 в это время проигрываются ноты, то звук на канале 0 будет принимать исходную частоту каждый раз, когда на канале 1 проигрывается следующая нота. Если же используются орнаменты, то glis сбрасывается каждые 1/50 секунды.

Допустимо использование паттернов без нот, которые только устанавливают параметры, такие как skew, skew_xoring, транспозиция. Это дает возможность иметь только один паттерн для басовой партии и проигрывать его много раз в разной транспозиции, вставляя между вызовом басового паттерна вызовы коротких паттернов, инициализирующих транспозицию, но не содержащих нот.

CityAceE
21.01.2010, 16:53
Чтобы не затерялась столь ценная информация, выделил в виде отдельной темы.

Barmaley_m
21.01.2010, 22:59
Чтобы не затерялась столь ценная информация, выделил в виде отдельной темы.
Спасибо. Вообще, строго говоря, автором движка является Jason C. Brooke, а JCBrooke - это сокращение. В названии темы лучше использовать полное имя, чтобы поиск через гугл находил. Так что, если можно - поменяй название темы.

Тут поступали вопросы, чем открывать файл .lst, который я привел. Это текстовый файл, открывается "блокнотом" или любым другим текстовым редактором. Может быть, его можно скормить какому-нибудь ассемблеру и переассемблировать, но я этого никогда не делал и цели такой не ставил. Более простой способ использования движка заключается в следующем:

1) сохранить соответствующий кусок игры Savage 2 в виде файла на диск
2) подменить, где надо, структуры данных музыки, подставив вместо существующей свою музыку. Данные своей музыки можно размещать даже не на месте данных старой музыки, а в другой части памяти. В движок прописать только их адреса в таблице song_initdata_0.
3) начать этот процесс (экспериментирование) можно даже с простых изменений в существующих паттернах, чтобы посмотреть, как это влияет на звук. Ну типа ноты поменять, скважность и т.д.

И вот еще что. Прежде, чем использовать движок, нужно хоть приблизительно ознакомиться с его кодом. Какую процедуру вызывать для начала проигрывания, с какими параметрами. Еще там используются прерывания IM 2, но таблица векторов прерываний в моем файле не фигурирует (она подразумевается). Все это нужно учитывать.

Vitamin
22.01.2010, 01:43
Аттач еще не смотрел, но два вопроса:
1) есть ли выделенные из игр мелодии?
2) сколько их?

Barmaley_m
22.01.2010, 06:06
Аттач еще не смотрел, но два вопроса:
1) есть ли выделенные из игр мелодии?
2) сколько их?

Ты разве не читал вот эту тему: http://zx.pk.ru/showthread.php?t=6425

Выкладываю еще раз мою конверсию музык из Savage и 1943, так как моя домашняя страничка на данный момент не работает.

Что касается мелодий, выделенных из игр в виде кода Z80 - то существует коллекция .ay-файлов, которые и представляют собой это. Их только надо распаковать. По этим файлам я и изучал движок JCBrooke и конвертировал музыку.

Vitamin
22.01.2010, 08:48
Ты разве не читал вот эту тему: http://zx.pk.ru/showthread.php?t=6425

Выкладываю еще раз мою конверсию музык из Savage и 1943, так как моя домашняя страничка на данный момент не работает.

Что касается мелодий, выделенных из игр в виде кода Z80 - то существует коллекция .ay-файлов, которые и представляют собой это. Их только надо распаковать. По этим файлам я и изучал движок JCBrooke и конвертировал музыку.
Не, не читал. Меня интересуют оригинальные модули в формате простого дампа данных, не .ay и без плеера (насколько я понял, он везде одинаковый?).

Barmaley_m
22.01.2010, 23:29
Не, не читал. Меня интересуют оригинальные модули в формате простого дампа данных, не .ay и без плеера (насколько я понял, он везде одинаковый?).
Нет, плеер везде разный, т.е. он почти одинаковый, но различия все же есть. В частности, в плеере Savage 1 нет орнаментов и используются другие коды команд в паттернах; в 1943 - тоже другие управляющие коды, хотя орнаменты есть. Мне видится совершенно бесполезным отделение плеера от данных в случае Savage. Потому что эти данные без плеера нечем интерпретировать. Но если очень хочется - то возьми .ay-файл (он содержит и плеер, и данные), изучи мой дизассемблер движка, найди, где в ay-файле данные, а где плеер - и отделяй.

Только зачем это тебе может быть нужно - большая для меня загадка.

Vitamin
24.01.2010, 13:58
Только зачем это тебе может быть нужно - большая для меня загадка.
Ну раз плеер везде разный, то уже незачем:)

newart
24.01.2010, 14:39
Ну раз плеер везде разный, то уже незачем
Поддержал бы сначала основные форматы...

Vitamin
24.01.2010, 16:45
Поддержал бы сначала основные форматы...
Поскольку никто, за очень редким исключением, не сделал ни одного feature request'a или внятного пожелания, процесс разработки веду так, как мне кажется лучшим.

newart
24.01.2010, 17:29
Поскольку никто, за очень редким исключением, не сделал ни одного feature request'a или внятного пожелания, процесс разработки веду так, как мне кажется лучшим.
Как вариант... идем на zxtunes и смотрим популярность форматов...

Vitamin
24.01.2010, 17:45
Как вариант... идем на zxtunes и смотрим популярность форматов...
Самый первый тест поддерживал 5 самых популярных форматов. И чо?

newart
24.01.2010, 18:32
Самый первый тест поддерживал 5 самых популярных форматов. И чо?
Чо - чо, вот AY Fly не поддерживает ftc/gtr/fxm/fls/psm, как результат на сайте их тоже не проиграть и плеер свой делать смысла нет на основе dll и т.д. :(

А вообще 128k AY поддержал бы? (или тупо .sna) А то нечем играть digital вообще.

Vitamin
24.01.2010, 18:38
А вообще 128k AY поддержал бы? (или тупо .sna) А то нечем играть digital вообще.
Я ориентируюсь на обработку конкретных форматов, а не обобщенных контейнеров, суть которых тупо в эмуляции зетника (хотя и это будет поддержано). Ибо это дает гораздо больше преимуществ.

ЗЫ. 2moderatorial: надо бы отчекрыжить оффтопичные сообщения куда следует...

rasmer
25.01.2010, 00:36
Поскольку никто, за очень редким исключением, не сделал ни одного feature request'a или внятного пожеланияФронтэнд нужон и сборка под лялех...

Vitamin
25.01.2010, 08:24
Фронтэнд нужон и сборка под лялех...
А что, под линуксом не собирается?