Структура аудио в SA
Материал из GTAModding.ru
В этой статье описана структура аудио-форматов в GTA SA.
Содержание |
Папка STREAMS
В папке STREAMS хранятся файлы радиостанций и звуковые дорожки катсцен.
TRAKLKUP.DAT
Все поинтеры для файлов папки STREAMS хранятся в файле TRAKLKUP.DAT. Структура файла такова:
1 байт - BYTE - ID файла 3 байта - зарезервированное место 4 байта - DWORD - Оффсет метаданных звукового файла 4 байта - DWORD - Непосредственно, длина звукового файла
Обратите внимание на то, что второе значение ссылается именно на метаданные, а не на звуковой файл, а третье значение является уже длинной самого звукового файла. Поэтому, если вы хотите прочитать и метаданные, и сам звуковой файл, то прибавьте 8068 к длине звукового файла, а если только сам звуковой файл, то прибавьте 8068 к оффсету метаданных.
PS2
Структура метаданных
8000 байт - "танцевальный ритм" (Beats) 4 байта - DWORD - длина "исцелённого" левого канала звукового файла 4 байта - DWORD - частота левого канала звукового файла 4 байта - DWORD - длина "исцелённого" правого канала звукового файла 4 байта - DWORD - частота правого канала звукового файла 4 байта - DWORD - неизвестное (возможно, кол-во каналов, т.к. всегда равно 2)
Rockstar зачем-то прописали длину и частоту для каждого канала отдельно (смысла в этом нет никакого, так как эти значения будут одинаковыми всегда), поэтому чтобы прочитать сколько весит "исцелённый" файл надо сложить значения длины правого и левого каналов.
"Битые" файлы
Наверное вы заметили ранее употребление слова "исцелённый". Дело в том, что файлы хранятся в немного побитом виде - посреди файлов были добавлены пустые блоки. Процедура корректного прочтения музыки из радиостанций описано в статье Моддинг San Andreas PS2. В файле CUTSCENE.PAK обстоит всё несколько по-другому - через каждые 131072 байта (0x20000) вставлен блок нулевых байтов размером 4096 байт (0x1000).
Структура Beats
Таблица Beats используется в танцевальных мини-играх, состоит из двух значений:
4 байта - DWORD - время появления (в миллисекундах) 4 байта - DWORD - клавиша
Если значение времени стоит -1, то "ритмы" не используются.
Таблица Beats не может весить больше 8000 байт. Это означает, что в мини-игре не может быть задействовано более 1000 "ритмов".
Проигрывание файлов
"Исцелённые" файлы можно проиграть с помощью программы MF Audio. Для этого надо выставить тип формата RAW ADPCM, в Interleave - 10000 и истинную частоту (где она находится описано выше).
PC
Дешифровка
В ПК-версии файлы зашифрованы и для корректного прочтения нужно их сначала дешифровать. Дешифровуются файлы методом исключения (XOR).
16-байтный ключ шифрования в hex-нотации выглядит так:
EA 3A C4 A1 9A A8 14 F3 48 B0 D7 23 9D E8 FF F1
Алгоритм дешифровки таков:
- Исключить из первого байта файла первый байт ключа (EA)
- Исключить из второго байта файла второй байт ключа (3A)
(...)
- Исключить из шестнадцатого байта файла шестнадцатый байт ключа (F1)
- Исключить из семнадцатого байта файла первый байт ключа (EA)
Вот простой алгоритм дешифровки в C++ (взят из исходного кода программы San Andreas Audio Toolkit)
void stream_encode(int8_t *buff, const size_t size, int &index) { for (size_t i = 0; i < size; ++i) { buff[i] ^= encode_key[index]; index = (index + 1) % 16; } return; }
Этот метод является двухсторонним, т.е. его можно использовать как для дешифровки, так и для зашифровки.
XBOX
Таблица ID файлов
ID | Файл |
---|---|
0 | AA |
1 | ADVERTS |
2 | AMBIENCE |
3 | BEATS |
4 | CH |
5 | CO |
6 | CR |
7 | CUTSCENE |
8 | DS |
9 | HC |
10 | MH |
11 | MR |
12 | NJ |
13 | RE |
14 | RG |
15 | TK |
Таблица клавиш для Beats
Значение (hex) | Клавиша | ||
---|---|---|---|
xbox | PS2 | PC (по умолчанию) | |
0x01 | A | X | Вниз |
0x02 | X | Квадрат | Влево |
0x03 | Y | Треугольник | Вверх |
0x04 | B | Круг | Вправо |
0x21 | Окончание мини-игры |
Значение (hex) | Клавиша | |
---|---|---|
xbox и PS2 | PC (по умолчанию) | |
0x09 | Прав. аналоговый стик: вправо | Numpad 6 |
0x0a | Прав. аналоговый стик: влево | Numpad 4 |
0x0b | Прав. аналоговый стик: вверх и вправо | Numpad 8 и Numpad 6 |
0x0c | Прав. аналоговый стик: вниз и влево | Numpad 2 и Numpad 4 |
0x0d | Прав. аналоговый стик: вверх | Numpad 8 |
0x0e | Прав. аналоговый стик: вниз | Numpad 2 |
0x0f | Прав. аналоговый стик: вверх и влево | Numpad 8 и Numpad 4 |
0x10 | Прав. аналоговый стик: вниз и вправо | Numpad 2 и Numpad 6 |
0x21 | Окончание мини-игры |