Музыка: озвучена вся заставка, тайминги сведены со шкалой оригинала

Добавлены треки 54 (тема титров), 50/53/52 (три реплики сцены с
принцессой и Джафаром) — заставка звучит целиком, как в оригинале.

pop_music: два слота EMM. Реплики идут встык, паузы под загрузку нет,
поэтому следующая читается в НЕ играющий слот, а play подменяет
резидентную таблицу страниц. Своей копии таблицы слот не держит — её
хранит блок EMM. Плюс постраничная загрузка (load_begin/load_step):
страница стоит 33 мс, четверть логического кадра сцены, и подкачка
посреди анимации не видна.

Тайминги: все длительности сцен — в тиках оригинала (60 Гц), перевод в
кадры луча делает POP_T60. Пока сцены были немыми, разбег в 20 % был
незаметен; с музыкой реплика кончалась раньше картинки. Переведены
титры, история, хвост после PV и пейсинг самой PV-сцены.

Паузы, которые оригинал отмеряет концом сэмпла, теперь равны реальной
длине наших записей: конец m50 на тике 846, вход Джафара 1046, уход
2073, конец сцены 2500 (было 1959). Fade перед PV сдвинут так, чтобы
полная темнота наступала в тот же момент трека, что у SDLPoP: их fade
длиннее нашего на 123 тика, наш полосовой переход длиннее на 16.

Финальная сцена: убраны песочные часы — end_sequence_anim не трогает
hourglass_state, а reset_cutscene его обнулил. Уровень пройден, время
больше не идёт.

Проверено в MAME: цепочка 54 -> 55 -> 50 -> 53 -> 52 отыгрывается
целиком, интро доходит до демо-режима. Host-тесты: 15 наборов.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-25 20:17:38 +03:00
parent 16d3262340
commit d86adc54c4
13 changed files with 477 additions and 140 deletions
+57 -3
View File
@@ -707,9 +707,9 @@ DOS-версии** — `applications/PoP/PoP1_DOS_music` (flac/mp3/ogg/ogg_MT-32
### Что сделано
`toolchain/pop_pack_music.py` -> куски `MUS\m<id>_<nn>.bin` по 16 КБ
(bank_load_file читает файл только целиком и только в одну страницу) +
каталог `pop_music_tbl.h`. Длина трека хранится **порциями по 128 байт**,
`toolchain/pop_pack_music.py` -> один файл `MUS\m<id>.bin` на трек
(читается порциями по 16 КБ из одного открытого fd) + каталог
`pop_music_tbl.h`. Длина трека хранится **порциями по 128 байт**,
а не байтами: 169 КБ в uint16 не влезает, 1350 блоков — легко.
`pop_music.c` (банк 9) грузит трек в EMM и ставит курсор; насос
@@ -791,3 +791,57 @@ _io_page_w3 = saved;
Бонус: в W3 нет стаба восстановления окна, который в W0 занимал начало
страницы, — звуковые страницы можно использовать целиком.
## 6. ВСЯ ЗАСТАВКА ОЗВУЧЕНА (2026-08-25)
К `story_1_absence` добавлены остальные четыре трека заставки:
**54** intro_theme (титры), **50** story_2_princess, **53**
story_3_Jaffar_enters, **52** story_4_Jaffar_leaves (сцена с принцессой).
`MUS_IDS` в Makefile — 50 52 53 54 55, всего 1056 КБ на образе.
### Два слота вместо одного
Реплики оригинала идут ВСТЫК: следующая начинается там, где кончилась
предыдущая, паузы под загрузку нет. Поэтому `pop_music` держит два слота
EMM: `pop_music_load*` всегда пишет в НЕ играющий, `pop_music_play`
подменяет резидентную таблицу страниц и отпускает прошлый слот. Своей
копии таблицы слот не хранит — её и так держит блок EMM, `mem_get_page`
отдаёт номер по индексу (иначе −40 байт W2 у игры, а там их нет).
Плюс **постраничная загрузка**: `pop_music_load_begin` / `_load_step`
читают по одной странице за вызов. Страница стоит 33 мс — четверть
логического кадра заставки (133 мс), поэтому подкачка следующей реплики
прямо посреди анимации не видна. Кто может позволить себе паузу (титры,
чёрный экран между сценами) — зовёт прежний `pop_music_load`.
### Тайминги приведены к шкале оригинала
Все длительности сцен взяты из SDLPoP в его тиках (60 Гц), а ждём мы
кадрами луча (~50 Гц). Пока сцены были немыми, разбег в 20 % не был
виден; с музыкой он слышен сразу — реплика кончается раньше картинки.
Введён `POP_T60(t)` (pop_cutscene.h), и на него переведены титры,
`intro_before_pv`, хвост после PV и пейсинг самой PV-сцены (счётчик
потраченных кадров луча против `POP_T60(tick)`, вместо прежних жёстких
четырёх кадров на логический).
**Паузы-реплики.** Там, где оригинал ждёт конца сэмпла, у нас теперь
стоит реальная длина нашей записи: m50 — 831 тик, m53 — 985. Отсюда
новая шкала PV: конец m50 на 846, вход Джафара (m53) на 1046, уход
(m52) на 2073, конец сцены 2500 тиков (было 1959).
**Fade перед PV** (вопрос пользователя: наш fade короче, 4 ступени против
64). Совпасть должен момент полной темноты, считая от пуска m55:
у SDLPoP это 80 (transition) + 600 (wait) + 128 (fade_out_2: 0x40 шагов
по 2 тика); у нас переход занимает 80 кадров луча = 96 тиков, а fade —
5 тиков. Отсюда `WAIT = 80 + 600 + 128 96 5 = 707` тиков. Дальше и
там и там экран уже чёрный, а трек доигрывает: этой паузой заставка и
стыкуется с PV.
**Музыка переживает смену сцен.** m54 звучит с титров и до первого
экрана истории (`pop_intro_show` больше не глушит CBL на входе), m52
начинается в PV и доигрывает уже на экране «свадьбы» — как seg000:2051.
Проверено в MAME: цепочка 54 → 55 → 50 → 53 → 52 отыгрывается целиком,
курсор `pop_mus_id` меняется ровно на своих кадрах, интро доходит до
демо-режима. Слуховая проверка (нет ли хрипа от диска при играющей
музыке) — за пользователем.