| Разработка и ромхакинг > Ромхакинг и программирование |
| [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 чтоб понять как оно типично работает |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |