Mortal Kombat Trilogy [PSX]Как можно добавить новые треки (для арен из МК1)
Явно придётся разбирать и писать код, этот вопрос к опытным ромхакерах.
изменить старые (хочу поменять музыку из опций и титров)
1. Если длина треков останется такой же, то всё просто. Музыка хранится как CD-DA (обычный Audio CD), которая имеет характеристики 44100 Hz, 16-bit, Little-Endian, Stereo.
1a. При редактировании "CUE + несколько BIN" как redump образ, то аудио - все треки, кроме 1-го (с 02 до 30). Можно открыть в Audacity: Файл > Импорт > Raw-данные > Signed 16-bit PCM, Little-endian, 2 канала (стерео). В начале всегда 2 секунды тишины. После редактирования, которое не изменит длину трека (смотреть на количество сэмплов), выделить наш трек, Файл > Экспорт > Экспорт выделенного аудио..., сохранить как там указано (RAW, Signed 16-bit PCM). ffmpeg тоже может сконвертировать в CD-DA как-то так:
ffmpeg -i Awaken.mp3 -f s16le -ar 44100 -ac 2 -c:a pcm_s16le Track22.raw
Но всё равно придётся добавлять тишину и обрезать.
1b. При редактировании "CUE + один BIN" (после сохранения в CDmage, например) нужно будет вставлять через HEX-редактор. Извлечь и прослушать трек можно с помощью CDmage, изменяем как делали выше, потом поиск по данных из оригинального трека в HEX-редакторе и вставка поверх нового трека. Найти начало и конец трека можно по-другому, в CUE у нужного трека смотрим:
TRACK 22 AUDIO
INDEX 00 43:33:08
INDEX 01 43:35:08
0-й индекс начало с тишиной, 1-й начало музыки, поэтому можно вставлять сразу с позиции музыки. Здесь указаны минута:секунда:сектор(frame), в одной секунде 75 секторов, а один сектор 2352 байта, поэтому ((
43 * 60 +
33) * 75 +
8) * 2352 = 460952016 байт (0x1b7991d0) начало 22-го трека, а концом будет 0-й индекс следующего трека минус 1.
Есть программы для работы с Audio CD, но я их не смотрел.
2. Если длина треков другая, то уже не получится просто заменить трек, т. к. игра где-то хранит смещения. Проблему можно увидеть, если заменить трек Track 22 на Track 23, что проще сделать с "CUE + несколько BIN", тогда на главном экране будет неправильная музыка, которая идёт позже, из-за уменьшения Track 22.
Я не смог найти смещения через HEX-редактор в Track 01, т. е. по всем данным игры. Я предположил только 3 способа хранения смещения: в байтах, в секторах по 2352 байта, в минута:секунда:сектор. Все способы между собой легко преобразуются. Последний способ используется в PlayStation SDK, страница 670 в PlayStation 1 SDK 4.4\Devrefs\Libref.pdf:
typedef struct {
u_char minute; Minute
u_char second; Second
u_char sector; Sector
u_char track; Track number (не используется)
} CdlLOC;
Эта структура передаётся в CdControl() на странице 673 для команды CdlPlay, которая воспроизводит CD-DA.
Для поиска я использовал точные смещения, хотя они могут быть заданы с отступом. Также меня путает 2 секунды тишины и поле Start Sector в CDmage, которое смещено на ещё 2 секунды (150 секторов). Я пробовал смещать секунды вперёд и назад на 2, всё равно не получилось найти общую таблицу. Это тоже оставим на опытных ромхакеров.