| Разработка и ромхакинг > Ромхакинг и программирование |
| [SEGA] Нужна помощь с реверсом звукового драйвера |
| << < (3/4) > >> |
| SeregaZ:
а накой велосипед изобретать? в винде есть замищательная винапи: --- Код: ---sndPlaySound_(*snddest,#SND_MEMORY | #SND_ASYNC | #SND_NODEFAULT) --- Конец кода --- *snddest указатель на память, где загружен сэмпл #SND_MEMORY один из флагов, которые говорят что это память, а не из файла играется. то есть алгоритм будет примерно такой: получаем размер файла сэмпла. скажем 500 байт. создаем хедер вав файла - кусочек памяти 44 байта, где будет указано что моно, что 8 бит, что частота такая-то. читаем в памяти образ файла сэмпла. склеиваем 44 байтовый хедер и образ файла. подсовываем это дело винапи sndPlaySound_ |
| DrMefistO:
MetalliC, ну, это уже другое - это когда я до инструментов доберусь. А сейчас: я имею DAC 8-bit, который хочу сконвертировать в формат, который бы мог воспроизвести, например, через waveOut( ) API. Добавлено позже: SeregaZ, т.е. я могу просто взять и DAC-сэмпл в sndPlaySound() закинуть? А конвертировать не нужно? |
| MetalliC:
в общем и в целом - в таких плеерах расчёты-вычисления бьются/дискретизируются на маленькие кусочки, каждый по размеру не более задержки между семплами. и весь код проигрывателя типично выглядит как: начало: - что-то немножко делаем или считаем. - выводим семпл - что-то еще делаем - выводим следующий семпл и так далее и тому подобное кучку раз, когда считать уже нечего цикл становится: - цикл тупой задержки - выводим очередной семпл повторенное кучку раз, затем goto начало: |
| SeregaZ:
если обычные 8 бит - нет. если там было какое сжатие типа DPCM или ADPCM - то нужно. правда вот насчет 4 битных не сжатых надо тестировать. по идее должно играть. пойду испытывать. по моему я вчера видел игру с такими 4 битными. надо будет перепроверить это дело :) |
| DrMefistO:
MetalliC, на уровне драйвера я уже понял как DAC воспроизводится) мне же нужна ось - смотри выше. SeregaZ, тогда это то, что я хотел) Попробую, спасибо. Добавлено позже: --- Цитата: DrMefistO от 21 Январь 2018, 13:00:37 ---Попробую, спасибо. --- Конец цитаты --- Супер! Работает! Я юзал waveOut API, но суть та же! Крутяк) Только сейчас подсчитаю точное число тактов задержки в драйвере, и, будет прям огонь!) |
| SeregaZ:
так инструменты и ноты то нашел? разобрался в каком формате они хранятся? |
| DrMefistO:
SeregaZ, нашёл, но формат не разбирал. Скоро займусь. |
| SeregaZ:
хы... а чего WAV не может быть 4 битный чтоль? :) смотрю во всех описаниях либо 8 либо 16. ставлю внаглую 4 - играет все равно как 8 бит :)) |
| DrMefistO:
MetalliC, в общем, частота дискретизации ~5050Гц в игре. Единственное, не понял, какое значение циклов прибавлять в случае (опкод: C4), если условие не выполняется: --- Код: ---call nz, sub_237 --- Конец кода --- |
| SeregaZ:
а в случае, если сэмпл 4 битный и без сжатия - то видимо его надо будет превращать в 8 битный, чтоб винапи его проиграть могло. 4 битное оно не играет. надо брать по 4 бита значение, умножать на 16 и писать в файл как 8 бит. если 4 битные со сжатием - то надо искать таблицу в файле драйвера и формулу по какой он производит подсчет. как это было в МК3 - там таблица была выдернута из файла драйвера. с комиксзонным ADPCM таблица вроде тоже есть в файле драйвера, но вот формулу мне буржуи не объяснили :) |
| DrMefistO:
Если что, то на питоне вот (воспроизводилка voice сэмпла): --- Код: ---import pyaudio import sys if __name__ == '__main__': if (len(sys.argv)) < 2: print 'Please, specify voice sample file!' sys.exit(-1) p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paUInt8, channels=1, rate=5100, output=True) with open(sys.argv[1], 'rb') as f: voice = f.read() stream.start_stream() stream.write(voice) stream.stop_stream() stream.close() p.terminate() --- Конец кода --- |
| SeregaZ:
съест твой код этот сэмпл? :))) 4 бита, 7300 по идее частота должна быть. |
| DrMefistO:
SeregaZ, может я неправильно себе представляю 4 бита, но по идее, там старшие 4 бита должны быть равны 0 (ну или младшие), а они у тебя вполне 8-битные. На 4300 вполне слышно переговоры по рации. |
| MetalliC:
--- Цитата: DrMefistO от 21 Январь 2018, 13:55:28 ---MetalliC, в общем, частота дискретизации ~5050Гц в игре. Единственное, не понял, какое значение циклов прибавлять в случае (опкод: C4), если условие не выполняется: --- Код: ---call nz, sub_237 --- Конец кода --- --- Конец цитаты --- 10 если условие ложно (перехода не было), иначе 17 |
| DrMefistO:
--- Цитата: MetalliC от 21 Январь 2018, 14:27:04 ---10 если условие ложно (перехода не было), иначе 17 --- Конец цитаты --- Спасибо. Итоговая частота 5100Hz. |
| SeregaZ:
да там не рация. там стадион ревет, а диктор орет типа "awesome baby!" 0000хххх - по твоей схеме это ж дикая трата места в роме :) xxxxyyyy - 4 битный там пишется в одном байте, то есть 2 тика получается. а про частоту сэмплов - там надо смотреть в таблице объявления сэмплов. там должен быть адрес в роме, размер, и или частота сэмпла или какой-то флаг обозначающий частоту. типа 1 - 5100, 2 - 6000, 3 - 7000... от фонаря цифры пишу. и эту теорию надо будет проверить в других играх с тем-же движком. то есть песни из других игр должны подходить к этой. здесь по всей видимости сэмплы все одной частоты 5100. |
| DrMefistO:
--- Цитата: SeregaZ от 21 Январь 2018, 14:42:52 ---а про частоту сэмплов --- Конец цитаты --- в моём случае частота считалась суммированием тактов, необходимых на выполнение каждой инструкции в коде заливки сэмпла. А затем частоту процессора нужно поделить на эту сумму. |
| SeregaZ:
а я все-таки голосую за таблицу :) эти игроделы максимально снижали ресурсоемкость всего, что только можно. если бы у них такая система подсчета стояла - то это сколько кода займет то? вагон. думаю все-таки коротенькая таблица индекс и значение, или просто явное указание частоты должно быть. ну это если ты конечно будешь делать универсальную программу для драйвера. если только частный случай с одной игрой - то и так пойдет конечно. |
| DrMefistO:
SeregaZ, даже у Стефа напротив критичных мест есть указание тактов инструкций. |
| SeregaZ:
чото ты куда-то слился... давай доделывай :) хочу поглядеть на распакованные данные. http://datacrystal.romhacking.net/wiki/THUNDER_FORCE2:Tutorials |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |