Звук: решения пользователя и единая частота 10 937,5 Гц
Эффекты — 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 открывается один раз и частота не меняется никогда.
This commit is contained in:
@@ -70,6 +70,44 @@ WAV нет ни в одном наборе.**
|
|||||||
музыки это тот же `cbl_push`, что и для эффектов, только длиннее буфер.
|
музыки это тот же `cbl_push`, что и для эффектов, только длиннее буфер.
|
||||||
B имеет смысл только если C окажется неподъёмным по месту.
|
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. Что лежит в ассетах (замерено, а не по памяти)
|
## 2. Что лежит в ассетах (замерено, а не по памяти)
|
||||||
|
|
||||||
Звук в PoP адресуется как ресурс `10000 + N`, N = 0..56 — 57 звуков
|
Звук в 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` (ноты музыки) | формат уже разобран |
|
| **З1** | распаковщик `pop_pack_sound.py`: DAT → `.snd`-страницы EMM (эффекты) + `.not` (ноты музыки) | формат уже разобран |
|
||||||
| **З2** | `pop_sfx.c`: `cbl_open` + `fill()`, таблица «звук → страница/смещение/длина», `pop_sfx_play(id)` | ядро |
|
| **З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`) — шаги, приземления и прочее поедут сами | механическая |
|
| **З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 |
|
| **З5** | приоритеты и вытеснение: у оригинала `play_sound` глушит предыдущий (`stop_sounds`), музыка и эффект — разные каналы | правила из seg009 |
|
||||||
|
|
||||||
## 6. Что проверить артефактом ДО кодинга
|
## 6. Что проверить артефактом ДО кодинга
|
||||||
|
|||||||
Reference in New Issue
Block a user