Разработка и ромхакинг > Ромхакинг и программирование
[SEGA] Нужна помощь с реверсом звукового драйвера
<< < (2/4) > >>
DrMefistO:

--- Цитата: DrMefistO от 17 Январь 2018, 00:27:58 ---Между отправками каждого байта выполняется 44 раза вот это
--- Конец цитаты ---
Уточню, может я ошибаюсь всё таки: в регистр b перед циклом загружено число 0x2B.
Т.е. всего 44 раза, верно?
MetalliC:
верно, первые 43 раза (пока B != 1) DJNZ выполняется 13 тактов, последний раз 8
SeregaZ:
ща добавлю в гум парсер возможность проигрывать файлы с выбранной частотой и попробую проиграть твой файл.
DrMefistO:

--- Цитата: MetalliC от 17 Январь 2018, 00:41:05 ---верно, первые 43 раза (пока B != 1) DJNZ выполняется 13 тактов, последний раз 8
--- Конец цитаты ---
А, блин, а я думал, это какое-то нецелое число тактов такое..))
SeregaZ:
добавил. попробуй проиграть. верхний обзор не трогай - это для GYM. нижний обзор жмакай и частоту в окошке какую надо выставляй. все-таки я думаю 6300 многовато. слишком писклявый голос. в игре есть тестер звуков в опциях? так хоть примерно послушать на какой частоте там лапочут.
DrMefistO:

--- Цитата: SeregaZ от 17 Январь 2018, 00:59:08 ---все-таки я думаю 6300 многовато
--- Конец цитаты ---
3575611 / (13 * 43 + 8) = 6306 Hz

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

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

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

--- Цитата: SeregaZ от 17 Январь 2018, 00:59:08 --- в игре есть тестер звуков в опциях?
--- Конец цитаты ---
Тестер есть - на титульном экране A+Start

Добавлено позже:
Частота приблизительно как на 4900.
SeregaZ:
я взял аудиоредактор. выставил там запись со стереомикса и тыркал твой сэмпл в проигрывателе и в эмуляторе. после сранивал. думаю да, где-то 5000, мож 5100.

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


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

Добавлено позже:
и точно :) в поменял в эмуляторе - чуть изменилось.
DrMefistO:
Надо посмотреть исходники какого-нибудь GYM2MIDI и понять, как работает воспроизведение.
SeregaZ:
а толку смотреть 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:
DrMefistO:
SeregaZ, ты не понял. Пока что мне интересно, как DAC воспроизводится без инструментов. GYMка же воспроизводит.
SeregaZ:
в dll'ке, что ValleyBell давал - есть команда:
PlayDACSample(номер чипа, размер, указатель на участок памяти с сэмплом, частота)
но это несколько не верно по отношению к YM2612 :) на самом деле на приставке воспроизведение происходит следующим образом:
сначала идет регистр $2B:
OPN_Write(0, $2B, $80) ; DAC enable register
это включает возможность проиграть сэмпл и, видимо, отключает на время возможность играть FM на 6 канале.
после должен происходить спам регистра $2A по моему, где значением идет по байтно этот самый файл сэмпла.
как сэмпл закончил играть, то надо отключить DAC
OPN_Write(0, $2B, $00)
DrMefistO:
SeregaZ, это я видел)
Но вот как происходит воспроизведение этого "спама" в твоей программе?
SeregaZ:
никак. я ж говорю :) эта команда PlayDACSample была запилена товарищем ValleyBell'ом, так как он не хотел заморачиваться с полной 100% реализацией ym2612. я его уже ругал по этому поводу, когда возился с VGM. при проигрывании VGM, из-за неработающего правильно регистра $2A - надо изобретать велосипед, чтоб сэмплы заиграли. так что это тоже можно отнести к минусам библиотеки. но это хоть что-то. я и не надеялся и на такой результат, когда только начинал. эта библиотека очень помогла в моем проекте :)

я не уверен пишет ли эмулятор в GYM логе сэмплы, но по моему если зайти в тестер звуков игры и записать где там голосом лапочут, то можно будет увидеть этот порядок команд. вот там эти $2A должны хором идти и очень много. столько - сколько байт в сэмпле. ща попробую.
DrMefistO:
SeregaZ, эмм....
Я выбираю сэмпл DAC, жму Play, и оно воспроизводит мне нормально.

При чём тут регистр $2A, $2B? В них я знаю что пишется, когда пишется, и зачем. Вот мне нужно самостоятельно эти сэмплы (я уже проикладывал voice sample 0) воспроизводить, из моего кода.
SeregaZ:
да, GYM не пишет сэмплы... скатина :( нету $2A.

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

Добавлено позже:
импорт и что-то типа "объявления" для моего непутевого языка.

--- Код: ---OPNhdll = LoadLibraryEx(?StartOPNDLL, ?EndOPNDLL)
If OPNhdll
  Prototype.i OpenDriver(chip.i)
  Prototype CloseDriver()
  Prototype OPNWrite(chip.i,register.i,value.i) 
  Prototype OPNPlayDACSample(chip.i, size.i, *Data, freq.i);
 
  Global OpenOPNDriver.OpenDriver = GetProcAddressEx(OPNhdll, "OpenOPNDriver")
  Global CloseOPNDriver.CloseDriver = GetProcAddressEx(OPNhdll, "CloseOPNDriver")
  Global OPN_Write.OPNWrite = GetProcAddressEx(OPNhdll, "OPN_Write")
  Global PlayDACSample.OPNPlayDACSample = GetProcAddressEx(OPNhdll, "PlayDACSample")
Else
  MessageRequester("ALERT!", "Critical Error!")
  End 
EndIf
--- Конец кода ---

после надо:

--- Код: ---OpenOPNDriver(1) ; включение ядра так сказать

; потом по усмотрению использовать
OPN_Write(0, $2B, $80) ; DAC enable register

PlayDACSample(номер чипа, размер, указатель на участок памяти с сэмплом, частота)

; здесь наверное нужна пауза, чтоб программа ждала, пока длл доиграет сэмпл

OPN_Write(0, $2B, $00)

CloseOPNDriver() ; отключить драйвер


--- Конец кода ---

OPN_Write(0, reg, val) - туда можно слать все регистры, только что по таймеру - иначе у тебя вся мелодия зазвучит в одну секунду гыгыг.
DrMefistO:

--- Цитата: SeregaZ от 18 Январь 2018, 13:44:50 ---PlayDACSample
--- Конец цитаты ---
Вот мне собственно и нужно понимать, как играется сэмпл на стороне оси. Про регистры связанные с DAC я понимаю.
MetalliC:
в SGDK проигрыватели смотрел ? маловероятно что в игре играется именно так, но для общего ознакомления сойдет.
допустим плеерок Стефана: FM + 4 канала PCM с софтмиксом
DrMefistO:

--- Цитата: MetalliC от 21 Январь 2018, 12:42:13 --- именно так, но для общего ознакомления сойдет
--- Конец цитаты ---
Придётся. Не хочется таскать целую библиотеку, не понимая как она вообще работает. Это не мой подход:).
MetalliC:
я и имел в виду "букварь покурить", вот этот например
https://github.com/Stephane-D/SGDK/blob/master/src/z80_xgm.s80
чтоб понять как оно типично работает
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

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