From 4688364091910872862d776c54abd39a07e260ae Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Thu, 20 Aug 2026 12:10:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B2=D1=83=D0=BA:=20=D1=80=D0=B5=D1=88?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20=D0=B8=20=D0=B5=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D1=8F=20=D1=87=D0=B0=D1=81=D1=82=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=2010=20937,5=20=D0=93=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Эффекты — WAV через CBL; музыка первым заходом путь A (ноты на AY); заставки потом WAV; музыка по ходу игры — открыто (WAV с гашением эффектов либо путь B). Единую частоту берём не 11 000, а ровно частоту CBL 10 937,5: тогда тон точен (иначе −9,9 цента), а пересчитывать три файла всё равно надо. 112 922 -> 124 531 Б, 6,9 -> 7,6 EMM-страниц; рост целиком от leveldoor_sliding (источник 2 750 Гц). Взамен CBL открывается один раз и частота не меняется никогда. --- applications/PoP/docs/sound_plan.md | 42 ++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) 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. Что проверить артефактом ДО кодинга