Автор Тема: [SEGA] Нужна помощь с реверсом звукового драйвера  (Прочитано 4853 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Собственно, есть звуковой движок от игры Thunder Force 3.
Мне нужно его аккуратно раскочерыжить, разобрать формат сэмплов для последующего написания конвертера из MIDI, ну и в принципе, сделать самостоятельный исходник для встраивания в игры.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Выкладываю свою наработку в IDB, если кому интересно продолжить. Добить бы остальное.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
надо подписаться на тему :) midi2gems делал делал... чтоб с блек джеком и легкодоступными женщинами, но так толком и не доделал :)

в моем случае было все просто - шелл все сделал. то есть расковырял и сам движок и инструмент для сборки этих gems банков. а сама мелодия была в удобном текстовом файле. мне оставалось только расковырять миди, придумать алгоритм, чтобы уместить мидишные 44100 или сколько там тиков в горааааздо меньшее значение для выделения минимальной ноты для GEMS - 1/24. и худо бедно побороть рассинхрон, получающийся из-за этого ограничения. и еще надо было найти инструменты миди подобные для YM2612. с ними помог один буржуйский товарищ - дал два пака, они чуть разные и половина инструментов не подходит ваще. но уже что-то. потом я еще выковырял из DOS GEMS программы заготовленные банки инструментов, но опять таки там не все, названия в перемешку. нужно сидеть перебирать и сортировывать. второй путь по сбору более менее похожих инструментов - опять таки ручной режим - брать мидишные треки, каверы или как они там называются, на сеговские игры. типа для дюны очень даже качественные мидишки есть. вот значит берем эту мидишку, смотрим номера инструментов, а после берем инструменты из игры и просто делаем соответствие. и так по всем инструментам и играм, которые инструменты не подходят из тех паков. так-же еще делал программу для одновременного звучания миди и выбранного FM инструмента для сравнения. но то-же не доделал :)

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Мне интересно, и не понятно, как с этими A0, D0, A1, D1 пинами Ямахи работать, чтобы в итоге работать с вот этими регистрами - http://md.squee.co/YM2612 ?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
хы... я тоже ходил с этого длинного конца :) я правда не понял всех тонкостей, но попытаюсь на пальцах объяснить что сам понял. ссылки кстати не открылись. 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

  • Технический консультант
  • Сообщений: 9376
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Мне интересно, и не понятно, как с этими A0, D0, A1, D1 пинами Ямахи работать, чтобы в итоге работать с вот этими регистрами
в A0 пишется номер/адрес регистра, затем в D0 данные которые в этот регистр нужно записать, A1/D1 аналогично.
у Ямахи подобный принцип используется практически во всех чипах с 8бит интерфейсом.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
тогда извиняйте :) я видимо о другом поэму написал.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
A1/D1 аналогично.
Я так понял, что A1/D1 - это та самая Part2 - на дополнительные каналы?

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9376
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
да, через A0/D0 управляются каналы 1-3, A1/D1 - каналы 4-6. глобальные регистры типа таймеров и прочего доступны и так и сяк.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Пытаюсь вкурить это всё, но понять не могу. Например, почти никакой связи с просходящим здесь 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

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
я вот asm не знаю. и не ромхакер :) но по моему ты копаешь не в том месте (с)Индиана Джонс :)

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

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9376
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Где о регистре $B6 написано что-либо, и почему оно в драйвере у Stef'а указано как Panning?
глючок несущественный обыкновенный :)
при записи в $Bx младшие два бита адреса игнорируются, то есть эффект от записи в $B6 тот же что и $B4

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

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
ща стойте :) сделаю окошко для загрузки файла отдельное и будет вам... кривой отладчик гыгыг

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
вот попробуй. обзор тыркнуть, указать путь до гум файла, загрузится. там можно каналы выбрать какой-то отдельный. нажать плей послушать что в этом канале. на окошко с нотами не обращай внимания. это для 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 должно быть?
« Последнее редактирование: 17 Январь 2018, 00:42:52 от SeregaZ »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
SeregaZ, сколько инфы... А драйвер это не очень пока помогает разбирать. :)

Добрался до voice-сэмплов (DAC 8-bit). Как их вообще конвертировать, юзать?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
ну почему-же. если будешь точно знать, что здесь у тебя отсюда и досюда инструменты, здесь ноты, здесь сэмплы... хотя да. насчет сэмплов надо движок смотреть обязательно. опять-таки на примере GEMS - обычно там обычные 8бит сэмплы. в "инструменте" для сэмпла указан размер и частота проигрывания. ну еще там чот - я хз чо. мне итак пойдет... НО! некоторые игры содержут измененный GEMS и там уже не обычные 8бит, а всякая фигня - DPCM например в мортал комбате 3 и Punisher. но DPCM еще легко разобраться - там простая формула. вот в Comix Zone и Ooze некоторые сэмплы в ADPCM - тут никто ничего мне не смог подсказать :( так и висит этот комикс зон недоделаный. все никак в свой онлайн базу GEMS не могу добавить эту игру :(

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

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
SeregaZ, сэмплы я все нашёл давно) и адреса их знаю.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
и точно 8 бит? какойнить сэмпл пришли.

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

Добавлено позже:
хы... ближе к концу файла эти сэмплы. и по крайней мере четыре фразы, кажется, 8 бит, моно и 6000 частота. а мож даже меньше частота. потому как даже в эти минимальные 6к голоса писклявые :)))) для GEMS минимальная 5.2к по моему. надо попробывать этот кусочек проиграть на 5.2. мож там нормальная скорость звучания будет.
« Последнее редактирование: 17 Январь 2018, 00:23:13 от SeregaZ »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вот, пример сэмпла. Шлётся сразу в DAC, по байту.
Между отправками каждого байта выполняется 44 раза вот это:
djnz    $Я посмотрел одна такая операция занимает 13/8 циклов. Т.е. 13/8 * 44 циклов - задержка.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9376
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
13/8 * 44 циклов - задержка
строго говоря:  13 * 43 + 8, так что частота дескретизации выходит около 6300Гц

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Между отправками каждого байта выполняется 44 раза вот это
Уточню, может я ошибаюсь всё таки: в регистр b перед циклом загружено число 0x2B.
Т.е. всего 44 раза, верно?

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9376
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
верно, первые 43 раза (пока B != 1) DJNZ выполняется 13 тактов, последний раз 8

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
ща добавлю в гум парсер возможность проигрывать файлы с выбранной частотой и попробую проиграть твой файл.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
верно, первые 43 раза (пока B != 1) DJNZ выполняется 13 тактов, последний раз 8
А, блин, а я думал, это какое-то нецелое число тактов такое..))

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
добавил. попробуй проиграть. верхний обзор не трогай - это для GYM. нижний обзор жмакай и частоту в окошке какую надо выставляй. все-таки я думаю 6300 многовато. слишком писклявый голос. в игре есть тестер звуков в опциях? так хоть примерно послушать на какой частоте там лапочут.
« Последнее редактирование: 17 Январь 2018, 17:46:09 от SeregaZ »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
все-таки я думаю 6300 многовато
3575611 / (13 * 43 + 8) = 6306 Hz

Добавлено позже:
Да, чёт по частоте многовато.

Добавлено позже:
А, блин, я же пренебрёг другими инструкциями)

Добавлено позже:
в игре есть тестер звуков в опциях?
Тестер есть - на титульном экране A+Start

Добавлено позже:
Частота приблизительно как на 4900.
« Последнее редактирование: 17 Январь 2018, 01:38:07 от DrMefistO »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
я взял аудиоредактор. выставил там запись со стереомикса и тыркал твой сэмпл в проигрывателе и в эмуляторе. после сранивал. думаю да, где-то 5000, мож 5100.

Добавлено позже:


хотя может дело еще в частоте самого эмулятора :) мож там играет роль PAL или NTSC. я в PAL делал. там получается 5100. надо посмотреть как изменится в NTSC.

Добавлено позже:
и точно :) в поменял в эмуляторе - чуть изменилось.
« Последнее редактирование: 17 Январь 2018, 02:20:20 от SeregaZ »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Надо посмотреть исходники какого-нибудь GYM2MIDI и понять, как работает воспроизведение.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
а толку смотреть GYM2MIDI? ведь там не будет четкого соответствия инструментов. хотя ValleyBell что-то там говорил про то, как он в VGM2MIDI делал некий алгоритм, который видя настройки FM инструмента как-то подбирал ему мидишный инструмент.

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

а по поводу воспроизведения - так ты-ж участвовал в теме :))))
http://www.emu-land.net/forum/index.php/topic,78554.msg1311233.html#msg1311233

эта как раз та дллка ValleyBell. с помощью неё gymka и проигрывает gym файл. так-же она-же проигрывает сэмплы с любой частотой. разве что 8 бит надо сэмпл. только в оригинале в этой длл две проблемы, о которых я писал: прерывание проигрывания сэмпла, если в сэмпле идет трансляция тишины - $80 в течении секунды. но возможно жертвуя производительностью я это нашел где исправить. а вот вторая проблема - корректное включение двух и более ядер - тут я пас. сейчас при включении второго как будто частота обоих чипов увеличивается. звук начинает звучать гораздо выше по частоте. но в твоем случае хватит и 1 ядра. 1 ядерный режим играет нормально. но мне бы два...

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

и думаю надо чтоб гумка выводила окошко где в том порядке, как ему идут команды для выставления инструмента - так-же и выводила. второй момент - определять инструмент в программе надо будет в момент старта ноты. поскольку раньше нет четкого одного момента времени, когда все 29 или сколько там параметров инструменты, выставлены. они могут быть в 1 секунду выставлена половина, на 2 секунде оставшаяся и концы не найдешь. а вот если просто мониторить регистры и "ловить" инструмент перед стартом ноты - то там уже все параметры выставлены и остается только что снять сливки.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2514
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля