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

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