Разработка и ромхакинг > Ромхакинг и программирование
[SEGA] Нужна помощь с реверсом звукового драйвера
(1/4) > >>
DrMefistO:
Собственно, есть звуковой движок от игры Thunder Force 3.
Мне нужно его аккуратно раскочерыжить, разобрать формат сэмплов для последующего написания конвертера из MIDI, ну и в принципе, сделать самостоятельный исходник для встраивания в игры.
DrMefistO:
Выкладываю свою наработку в IDB, если кому интересно продолжить. Добить бы остальное.
SeregaZ:
надо подписаться на тему :) midi2gems делал делал... чтоб с блек джеком и легкодоступными женщинами, но так толком и не доделал :)

в моем случае было все просто - шелл все сделал. то есть расковырял и сам движок и инструмент для сборки этих gems банков. а сама мелодия была в удобном текстовом файле. мне оставалось только расковырять миди, придумать алгоритм, чтобы уместить мидишные 44100 или сколько там тиков в горааааздо меньшее значение для выделения минимальной ноты для GEMS - 1/24. и худо бедно побороть рассинхрон, получающийся из-за этого ограничения. и еще надо было найти инструменты миди подобные для YM2612. с ними помог один буржуйский товарищ - дал два пака, они чуть разные и половина инструментов не подходит ваще. но уже что-то. потом я еще выковырял из DOS GEMS программы заготовленные банки инструментов, но опять таки там не все, названия в перемешку. нужно сидеть перебирать и сортировывать. второй путь по сбору более менее похожих инструментов - опять таки ручной режим - брать мидишные треки, каверы или как они там называются, на сеговские игры. типа для дюны очень даже качественные мидишки есть. вот значит берем эту мидишку, смотрим номера инструментов, а после берем инструменты из игры и просто делаем соответствие. и так по всем инструментам и играм, которые инструменты не подходят из тех паков. так-же еще делал программу для одновременного звучания миди и выбранного FM инструмента для сравнения. но то-же не доделал :)
DrMefistO:
Мне интересно, и не понятно, как с этими A0, D0, A1, D1 пинами Ямахи работать, чтобы в итоге работать с вот этими регистрами - http://md.squee.co/YM2612 ?
SeregaZ:
хы... я тоже ходил с этого длинного конца :) я правда не понял всех тонкостей, но попытаюсь на пальцах объяснить что сам понял. ссылки кстати не открылись. ERR_CONNECTION_TIMED_OUT.

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

так вот изучение вопроса завело в тему с мануалом по этому YM2612:
http://www.smspower.org/maxim/Documents/YM2612

но здесь по моему более ясно:
https://wiki.megadrive.org/index.php?title=YM2612_Registers

в GEMS есть понятие инструмент. это файлик 39 байт. в нем содержатся значения параметров, которые нужно слать в соответствующие регистры. это всякие detune, attack, relise rate и тд и тп. в одном байте того файла может быть несколько параметров. типа AM и Decoy rate. биты там кароче читать надо.

после выставления инструмента идут как раз твои $A0 и $A4 друг за дружкой. эти два регистра отвечают за частоту - то есть ноту, которая будет выставлена для проигрывания. $A0 и $A4 - это для первого канала. $A1 и $A5 - для второго. $A2 и $A6 для третьего. после повторяется, просто надо прибавлять 256 или $FF. $A0+256 и $A4+256 - четвертый и так далее. (тут наврал. 256 или 255? уточнять надо в своем недокоде)

в итоге инструмент уже выставлен, нота уже выставлена. нужна команда для старта звучания ноты. а она частично зависит от инструмента. в инструменте есть keyon параметр. этот параметр отвечает за то, какие из 4 операторов будут включены так сказать. то есть в инструменте 4 операторов - то есть 4 комплектов параметров detune, attack и так далее. вот этот keyon параметр и говорит системе что этот используется, а этот нет. казалось бы параметры в операторах выставлены одинаковые, но стоит изменить этот keyon и звучание меняется. (когда детям надоедает читать скушную книжку, то надо разбавить иллюстрацией. разбавляю)


так вот этот самый регистр $28, где первые 4 бита это этот параметр keyon, а вторая часть это номер канала. поскольку мы все в теории выставляли в первый канал ($A4 и $A0) то значит в этот же первый канал и надо выводить "включение" значение будет примерно $F0 - где F - 1111 четыре бита, то есть все операторы включены, а 0 это первый канал. 1-2, 2-3, 4-4, 5-5, 6-6. хотя тут я могу ошибаться насчет тройки. надо смотреть в своем недокоде...

когда нота начала петь, и пропела там сколько полагается, то надо её выключить. шлем в тот-же канал - то есть 1, то есть 0 - нули в качестве keyon: регистр $28, значение $00 (типа $01 - выключить ноту во втором канале, $02 - в третьем, $04 - в четвертом и так далее)

а вот насчет регистров D1 или D0 я не знаю. их чот в описании не видно :) там от $22 до $B0 по моему. может это уже само значение регистра было? тогда может быть.

с выставлением ноты $A4 и $A0 там тоже свои нюансы. так-же есть особенности при проигрывании сэмплов, так-же при переключении специального режима для 3 канала (Sonic blast - звук выстрела из танка соника в Dune например), но об этом уже в следующей серии :))) конечно если из моей сумбурной писанины было что понятно.
MetalliC:

--- Цитата: DrMefistO от 15 Январь 2018, 11:49:56 ---Мне интересно, и не понятно, как с этими A0, D0, A1, D1 пинами Ямахи работать, чтобы в итоге работать с вот этими регистрами
--- Конец цитаты ---
в A0 пишется номер/адрес регистра, затем в D0 данные которые в этот регистр нужно записать, A1/D1 аналогично.
у Ямахи подобный принцип используется практически во всех чипах с 8бит интерфейсом.
SeregaZ:
тогда извиняйте :) я видимо о другом поэму написал.
DrMefistO:

--- Цитата: MetalliC от 15 Январь 2018, 14:12:00 ---A1/D1 аналогично.
--- Конец цитаты ---
Я так понял, что A1/D1 - это та самая Part2 - на дополнительные каналы?
MetalliC:
да, через A0/D0 управляются каналы 1-3, A1/D1 - каналы 4-6. глобальные регистры типа таймеров и прочего доступны и так и сяк.
DrMefistO:
Пытаюсь вкурить это всё, но понять не могу. Например, почти никакой связи с просходящим здесь https://github.com/Stephane-D/SGDK/blob/master/src/z80_drv1.s80 (в плане номеров регистров, хотя бы) я не вижу.
Инфа в статьях убогая, или я тупой?

Вот, например:

--- Код: ---ld      a, 0C0h
ld      h, 0B6h
call    set_a1_reg_val  ; h = reg, a = val
--- Конец кода ---

Где о регистре $B6 написано что-либо, и почему оно в драйвере у Stef'а указано как Panning? Где же инструменты, мать их?
SeregaZ:
я вот asm не знаю. и не ромхакер :) но по моему ты копаешь не в том месте (с)Индиана Джонс :)

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

--- Цитата: DrMefistO от 16 Январь 2018, 21:09:44 ---Где о регистре $B6 написано что-либо, и почему оно в драйвере у Stef'а указано как Panning?
--- Конец цитаты ---
глючок несущественный обыкновенный :)
при записи в $Bx младшие два бита адреса игнорируются, то есть эффект от записи в $B6 тот же что и $B4

сорри, на счёт инструментов не знаю, по идее "инструмент" это комбинация операторов и ADSR, то есть регистры 28h и 30h-90h.
позапускай игры на Regen debug build или Exodus, там неплохие "отладчики" YM2612, видно чо как играет.
SeregaZ:
ща стойте :) сделаю окошко для загрузки файла отдельное и будет вам... кривой отладчик гыгыг
SeregaZ:
вот попробуй. обзор тыркнуть, указать путь до гум файла, загрузится. там можно каналы выбрать какой-то отдельный. нажать плей послушать что в этом канале. на окошко с нотами не обращай внимания. это для GEMS. для твоего движка не подойдет. хотя там многие ноты смотрю тоже 0 - без питча, то есть мягко говоря совместимы :)

однако в файлах песен будет номер ноты - скажем $01 вместо какой-то там частоты $1234. эту таблицу соответствия еще потом надо будет выяснить.

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

так. зеленые это походу как раз старт звучания ноты или наоборот стоп.

по поводу $B6 и $C0 - все верно. paning. а именно включение левого и правого каналов. то есть если $B4 для первого канала, то $B5 - 2, $B6 - 3.
0xB4 - Stereo and LFO
Bit   L   R   a   a   0   f   f   f
L - левый
R - правый
a - два бита AMS
f - три бита FMS
$C0 = %11000000
то есть левый и правый включен. амс и фмс по нулям. и это, кстати! может быть началом инструмента. только видимо не для 3, а для 6 канала. так как у тебя set_a1_reg_val. я так понимаю для первой половины чипа set_a0_reg_val должно быть?
DrMefistO:
SeregaZ, сколько инфы... А драйвер это не очень пока помогает разбирать. :)

Добрался до voice-сэмплов (DAC 8-bit). Как их вообще конвертировать, юзать?
SeregaZ:
ну почему-же. если будешь точно знать, что здесь у тебя отсюда и досюда инструменты, здесь ноты, здесь сэмплы... хотя да. насчет сэмплов надо движок смотреть обязательно. опять-таки на примере GEMS - обычно там обычные 8бит сэмплы. в "инструменте" для сэмпла указан размер и частота проигрывания. ну еще там чот - я хз чо. мне итак пойдет... НО! некоторые игры содержут измененный GEMS и там уже не обычные 8бит, а всякая фигня - DPCM например в мортал комбате 3 и Punisher. но DPCM еще легко разобраться - там простая формула. вот в Comix Zone и Ooze некоторые сэмплы в ADPCM - тут никто ничего мне не смог подсказать :( так и висит этот комикс зон недоделаный. все никак в свой онлайн базу GEMS не могу добавить эту игру :(

так что забей на сэмплы и точно узнавай где лежат инструменты и где ноты. сэмплы подождут. мож повезет и там обычные 8битные сэмплы без прибабахов. так ты смотрел в GYM парсере или не смотрел? там данные по инструментам можно взять. то есть примерно в одно и то-же время выставляется целая пачка параметров для какого-то одного канала. вот надо понять в каком порядке они хранятся и найти их в роме.
DrMefistO:
SeregaZ, сэмплы я все нашёл давно) и адреса их знаю.
SeregaZ:
и точно 8 бит? какойнить сэмпл пришли.

и это ты еще инструмент PSG не искал :))) там будет полный пэ... обратную операцию я так и не родил, чтоб из логов GYM можно было родить PSG инструмент для GEMS. здесь по идее тоже должно быть что-то подобное.

Добавлено позже:
хы... ближе к концу файла эти сэмплы. и по крайней мере четыре фразы, кажется, 8 бит, моно и 6000 частота. а мож даже меньше частота. потому как даже в эти минимальные 6к голоса писклявые :)))) для GEMS минимальная 5.2к по моему. надо попробывать этот кусочек проиграть на 5.2. мож там нормальная скорость звучания будет.
DrMefistO:
Вот, пример сэмпла. Шлётся сразу в DAC, по байту.
Между отправками каждого байта выполняется 44 раза вот это:

--- Код: ---djnz    $
--- Конец кода ---
Я посмотрел одна такая операция занимает 13/8 циклов. Т.е. 13/8 * 44 циклов - задержка.
MetalliC:

--- Цитата: DrMefistO от 17 Январь 2018, 00:27:58 ---13/8 * 44 циклов - задержка
--- Конец цитаты ---
строго говоря:  13 * 43 + 8, так что частота дескретизации выходит около 6300Гц
Навигация
Главная страница сообщений
Следующая страница

Перейти к полной версии