Просмотры
Структура аудио в 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 | Окончание мини-игры | |


