diff --git a/applications/PoP/docs/sound_plan.md b/applications/PoP/docs/sound_plan.md index 1112e12..8b84ee9 100644 --- a/applications/PoP/docs/sound_plan.md +++ b/applications/PoP/docs/sound_plan.md @@ -70,6 +70,44 @@ WAV нет ни в одном наборе.** музыки это тот же `cbl_push`, что и для эффектов, только длиннее буфер. B имеет смысл только если C окажется неподъёмным по месту. +## 1б. РЕШЕНИЯ (пользователь, 2026-08-20) + +1. **Эффекты — WAV через CBL.** Как в §1: играются как есть. +2. **Музыка, первый заход — путь A** (ноты спикера на AY). +3. **Заставки и титры — потом WAV.** Конфликта с эффектами там нет: + одновременно они не звучат. +4. **Музыка ПО ХОДУ игры** (она может совпасть с эффектом) — открыто, два + варианта: либо тоже WAV с ГАШЕНИЕМ эффектов на время музыки (музыка + важнее — **проверить на слух**), либо путь B (MIDI -> три голоса AY). +5. **Все эффекты привести к одной частоте.** +6. Синтезатор для MIDI -> WAV — решать ближе к делу; годятся и онлайн- + конвертеры, хоть вручную, если fluidsynth/timidity не поставится. + +### Про единую частоту (замер) + +Приводим не к 11 000, а ровно к **10 937,5 Гц — частоте CBL** +(`CBL_FREQ_10K9`). Тогда тон точен, а не «на 0,6 % ниже»: проигрывание +11 000 Гц данных на 10 937,5 даёт сдвиг **−9,9 цента**, что на коротком +эффекте не слышно, но бесплатно избавиться от него всё равно приятно — +пересчитывать три файла всё равно придётся. + +| id | звук | было | станет | дельта | +|---|---|---|---|---:| +| 15 | `leveldoor_sliding` | 2 750 Гц, 4 436 сэмплов | 17 643 | **+13 207 Б** | +| 23 | `footstep` | 8 200 Гц, 996 | 1 329 | +333 Б | +| 51 | `princess_door_opening` | 14 000 Гц, 6 188 | 4 834 | −1 354 Б | +| — | остальные 28 (11 000 Гц) | — | ×0,9943 | −588 Б | + +Итог: **112 922 -> 124 531 Б, 6,9 -> 7,6 EMM-страниц.** Рост целиком от +`leveldoor_sliding`: источник у него 2 750 Гц, вчетверо реже целевой, и +апсэмплинг не улучшит звучание — только уравняет формат. Платим 0,8 +страницы за то, что **CBL открывается ОДИН раз и частоту менять не надо +никогда** — ни между эффектами, ни при переходе на музыку-WAV. + +(Альтернатива для него — хранить как есть и повторять каждый сэмпл +четырежды в рантайме: 2 750 × 4 = 11 000 ровно. Это код в `fill()` ради +13 КБ; не стоит того, но если место когда-нибудь прижмёт — вариант есть.) + ## 2. Что лежит в ассетах (замерено, а не по памяти) Звук в PoP адресуется как ресурс `10000 + N`, N = 0..56 — 57 звуков @@ -175,7 +213,9 @@ byte length`; `frequency <= 1` — пауза, `0x12` — конец. Ключ | **З1** | распаковщик `pop_pack_sound.py`: DAT → `.snd`-страницы EMM (эффекты) + `.not` (ноты музыки) | формат уже разобран | | **З2** | `pop_sfx.c`: `cbl_open` + `fill()`, таблица «звук → страница/смещение/длина», `pop_sfx_play(id)` | ядро | | **З3** | развесить вызовы: 66 мест `play_sound` в оригинале; у нас часть уже помечена TODO (`pop_ctrl.c:408`, `guards.c:992`, `pop_map.c:3035/3107`, …). **Плюс бесплатный кусок**: опкод `SEQ_SOUND` в seqtbl уже разбирается нашим `play_seq` (`pop_kid.c:326`) — шаги, приземления и прочее поедут сами | механическая | -| **З4** | `pop_music.c`: секвенсор нот на AY, тик из CBL-callback | небольшая | +| **З4** | `pop_music.c`: секвенсор нот на AY (путь A), тик из CBL-callback | небольшая | +| **З6** | заставки и титры — WAV-музыка потоком (эффекты в это время не звучат) | после З1-З4 | +| **З7** | музыка по ходу игры: WAV с гашением эффектов ЛИБО путь B — решать по итогам З6 | открыто | | **З5** | приоритеты и вытеснение: у оригинала `play_sound` глушит предыдущий (`stop_sounds`), музыка и эффект — разные каналы | правила из seg009 | ## 6. Что проверить артефактом ДО кодинга