Музыка: PCM-трек через CBL, первый экран истории озвучен
Путь C из sound_plan.md вместо ранее выбранного A (ноты спикера на AY). Причина смены: появились готовые записи DOS-версии, и строка «нужен синтезатор на хосте», из-за которой C считался дорогим, отпала — осталось `ffmpeg -ac 1 -ar 10937 -f u8`. Оцифровки музыки в самой игре нет вовсе: digisnd*.dat содержит только эффекты, музыка лежит MIDI под Adlib, так что конвертировать ресурс игры всё равно было не из чего. * toolchain/pop_pack_music.py — запись flac -> сырой u8 на 10 937,5 Гц (частота CBL, чтобы её не переключать никогда), нарезка на куски MUS\m<id>_<nn>.bin по 16 КБ: bank_load_file читает файл только целиком и только в одну страницу. Каталог -> pop_music_tbl.h; длина трека хранится ПОРЦИЯМИ по 128 байт — 169 КБ в uint16 не влезает, 1350 блоков влезает (32-бит арифметики на Z80 избегаем). * pop_music.c (банк 9) — загрузка трека в EMM и курсор; pop_sfx_fill (резидент) получил третий источник: эффект важнее музыки, музыка важнее тишины. Эффект музыку не сбрасывает — её курсор стоит, пока тот доигрывает, и она продолжается с места. * story_1_absence звучит на первом экране истории, где была тишина. Грузим ПОСЛЕ сборки картинки: чтение идёт через ESTEX, и при открытом CBL насос не успел бы долить блок. Проверено записью звука из MAME: корреляция огибающих с эталоном 0,836 при сдвиге 1,8 с, RMS 22,6 против 18,3 (разница — 8-битное квантование). Эффекты двери в PV-сцене после трека звучат по-прежнему. Бюджет: резидент +83 Б кода и +25 Б данных, запас W2 151 Б (кучи в приложении нет, malloc не слинкован); банк 9 занят на 88 %. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
# Звук в порте PoP — разбор и план
|
||||
|
||||
Дата: 2026-08-20. Статус: **PCM-эффекты реализованы; музыка/AY не реализованы.**
|
||||
Дата: 2026-08-20, музыка дописана 2026-08-25. Статус: **PCM-эффекты
|
||||
реализованы; музыка — путь C (PCM через CBL), первый трек играет.**
|
||||
|
||||
Задача пользователя: добавить звук. Приоритет — эффекты; музыку, если
|
||||
найдётся способ. Эффекты — **обязательно WAV, а не PC-спикер**
|
||||
@@ -682,3 +683,54 @@ play_next_sound() seg000:1304 — раз в кадр решает, зап
|
||||
и малое зелья (`30/33`), Shadow (`32`), победа/меч (`37`), перо (`39`),
|
||||
конец уровня (`41`) и победа над Jaffar (`43`). Вызовы и AY-проигрыватель
|
||||
для них ещё не реализованы; наличие всех PCM-эффектов эту задачу не закрывает.
|
||||
|
||||
|
||||
## 4. МУЗЫКА: решение пересмотрено (2026-08-25) — путь C вместо A
|
||||
|
||||
В §1б первым заходом был выбран **путь A** (ноты PC-спикера на AY), а путь
|
||||
C (запись -> WAV -> CBL) стоил дорого из-за строки «нужен синтезатор на
|
||||
хосте». Это обстоятельство отпало: у пользователя есть **готовые записи
|
||||
DOS-версии** — `applications/PoP/PoP1_DOS_music` (flac/mp3/ogg/ogg_MT-32,
|
||||
22 трека). Синтезировать нечего, остаётся `ffmpeg -ac 1 -ar 10937 -f u8`.
|
||||
|
||||
### Что померено по этим записям
|
||||
|
||||
| группа | длительность | PCM 10 937,5 Гц |
|
||||
|---|---:|---:|
|
||||
| всё вместе (22 трека) | 339 с | **3 625 КБ = 227 EMM-страниц** |
|
||||
| игровые джинглы (10) | 57 с | 608 КБ |
|
||||
| заставки и титры | 282 с | 3 017 КБ |
|
||||
| финальный `won` один | 115 с | 1 233 КБ |
|
||||
|
||||
Свободной EMM на старте ~3 440 КБ, так что вся музыка разом в память не
|
||||
влезает и не должна: трек грузится под сцену и освобождается после.
|
||||
|
||||
### Что сделано
|
||||
|
||||
`toolchain/pop_pack_music.py` -> куски `MUS\m<id>_<nn>.bin` по 16 КБ
|
||||
(bank_load_file читает файл только целиком и только в одну страницу) +
|
||||
каталог `pop_music_tbl.h`. Длина трека хранится **порциями по 128 байт**,
|
||||
а не байтами: 169 КБ в uint16 не влезает, 1350 блоков — легко.
|
||||
|
||||
`pop_music.c` (банк 9) грузит трек в EMM и ставит курсор; насос
|
||||
`pop_sfx_fill` (резидент) получил **третий источник**: эффект важнее
|
||||
музыки, музыка важнее тишины. Эффект музыку не сбрасывает — её курсор
|
||||
стоит, пока эффект доигрывает, и она продолжается с места.
|
||||
|
||||
Проверено в MAME записью звука: трек `story_1_absence` на первом экране
|
||||
истории, корреляция огибающих с эталоном **0,836**, RMS 22,6 против 18,3
|
||||
(разница — 8-битное квантование). Эффекты двери в PV-сцене после него
|
||||
звучат как прежде, то есть освобождение страниц и возврат к набору
|
||||
эффектов работают.
|
||||
|
||||
### Цена и что осталось
|
||||
|
||||
* CBL один: пока играет музыка, эффектов нет. Для заставок это не важно
|
||||
(их там не бывает), для игровых джинглов — открытый вопрос §1б.4.
|
||||
* Резидент вырос на 83 байта (третий источник в насосе) плюс 25 байт
|
||||
данных под курсор и таблицу страниц; запас W2 — 151 байт. Кучи в
|
||||
приложении нет (`malloc` не слинкован), так что это чистый запас роста.
|
||||
* Банк 9 занят на 88 %. Следующий модуль туда уже не влезет — либо
|
||||
переносить, либо заводить банк 12.
|
||||
* `won` (77 страниц) в POP_MUS_PAGES=20 не помещается: финал придётся либо
|
||||
резать, либо стримить кусками по ходу.
|
||||
|
||||
Reference in New Issue
Block a user