Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 17

Тема: Музыкальный движок Jason C. Brooke

  1. #1
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    890
    Благодарностей: 478
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Question Музыкальный движок Jason C. Brooke

    Значит, всем, кто интересуется созданием музыки на движке 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 в 08:16.

  2. Эти 10 пользователя(ей) поблагодарили Barmaley_m за это полезное сообщение:
    Aprisobal (20.01.2010), breeze (23.01.2010), CityAceE (21.01.2010), introspec (07.05.2013), jerri (20.01.2010), PheeL (20.01.2010), psndcj (20.01.2010), research (18.06.2013), Vitamin (22.01.2010), ViThor (25.02.2010)

  3. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  4. #2
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    890
    Благодарностей: 478
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Хочу добавить к вышесказанному.

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

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

  5. #3
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Владивосток
    Сообщений
    3,082
    Благодарностей: 1339
    Записей в дневнике
    6
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Чтобы не затерялась столь ценная информация, выделил в виде отдельной темы.
    С уважением, Станислав.

  6. #4
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    890
    Благодарностей: 478
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

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

  7. #5
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,057
    Благодарностей: 1437
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  8. #6
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    890
    Благодарностей: 478
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    Аттач еще не смотрел, но два вопроса:
    1) есть ли выделенные из игр мелодии?
    2) сколько их?
    Ты разве не читал вот эту тему: http://zx.pk.ru/showthread.php?t=6425

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

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

  9. #7
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,057
    Благодарностей: 1437
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Ты разве не читал вот эту тему: http://zx.pk.ru/showthread.php?t=6425

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

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

  10. #8
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    890
    Благодарностей: 478
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  11. #9
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,057
    Благодарностей: 1437
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Только зачем это тебе может быть нужно - большая для меня загадка.
    Ну раз плеер везде разный, то уже незачем

  12. #10
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    10,948
    Благодарностей: 1520
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    Ну раз плеер везде разный, то уже незачем
    Поддержал бы сначала основные форматы...

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Музыкальный редактор
    от GriV в разделе Для начинающих
    Ответов: 56
    Последнее: 21.06.2008, 11:19
  2. Четвертуха Jason Krueger-a
    от Conan в разделе Поздравления
    Ответов: 5
    Последнее: 07.08.2005, 15:32
  3. H.B. Jason
    от Conan в разделе Поздравления
    Ответов: 0
    Последнее: 24.07.2005, 20:01
  4. Куплю музыкальный процессор для Спектрума !!!
    от Andrnow в разделе Барахолка (архив)
    Ответов: 16
    Последнее: 04.07.2005, 21:34

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •