Звуковые эффекты PoP: оцифровка оригинала через CBL
Набор digisnd1..3.dat приведён упаковщиком к 10 937,5 Гц (частота железа), склеен в 8 EMM-страниц с выравниванием каждого звука на 128 — размер блока запроса CBL, поэтому ни один блок не пересекает границу страницы и проигрыватель не знает слова «стык». Насос (pop_sfx.c) резидентный: его зовут из прерывания CBL, из горячих мест физики и из play_seq. Тишину льём свою (первый блок набора), а не через CBL_UNDERRUN_SILENCE с его malloc — куча в резиденте W2 тесная. Открытие CBL разведено с загрузкой (pop_sfx_start отдельно от pop_sfx_init): пока ESTEX читает файлы, насос не успевает долить блок и железо крутит хвост буфера — на слух скрежет. Разведены все места play_sound() SDLPoP, у которых есть оцифровка (id 0..23, 44..49): посадки, падение, удары о стену, зацеп, тряска и провал плит, ворота, дверь уровня, пики, чомпер, кнопки, боёвка, меч, зеркало, скелет, зелье. Таблица соответствий — docs/sound_plan.md §8. Музыкальные id остаются с нулевой длиной до фазы музыки. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -333,3 +333,53 @@ IBM PC 1989 года: один квадратный голос. Он у нас
|
||||
Если позже захочется богаче — материал уже будет разобран, и можно
|
||||
разложить те же мелодии на три канала AY (бас/мелодия/арпеджио), не трогая
|
||||
ни данные, ни секвенсор.
|
||||
|
||||
---
|
||||
|
||||
## 8. Разводка вызовов по коду (сделано 2026-08-20)
|
||||
|
||||
Портированы ВСЕ места `play_sound()` SDLPoP, у которых есть оцифровка
|
||||
(id 0..23, 44..49, 51 — остальные id это музыка, у них в
|
||||
`pop_sound_tbl.h` длина 0, и вызов просто глушит текущий эффект).
|
||||
|
||||
| id | что | где у нас | оригинал |
|
||||
|----|-----|-----------|----------|
|
||||
| 0 | разбился насмерть | `pop_map.c` land | seg005 |
|
||||
| 1 | крик падения | `pop_map.c` do_fall | seg005:39 |
|
||||
| 2 | плита рухнула | `pop_room.c` (обе ветки посадки) | seg007 |
|
||||
| 3 | кнопка нажата | `pop_trob.c` | seg007 |
|
||||
| 4/5/6/7 | ворота: закрываются / открываются / рухнули / стоп | `pop_trob.c` | seg007 |
|
||||
| 8 | удар о стену | `pop_map.c` bumped_fall/bumped_floor + seqtbl | seg004/seg006 |
|
||||
| 9 | зацеп за карниз | `pop_map.c` check_grab | seg006 |
|
||||
| 11 | свист клинка мимо | `guards.c` check_hurting | seg002:0DAE |
|
||||
| 12/13 | ранен соперник / Кид | `guards.c` hurt_by_sword | seg002:0C1F |
|
||||
| 13 | Кид ранен зельем | `pop_map.c` ветка «злого» зелья | seg006:1894 |
|
||||
| 14/15 | дверь уровня: закрывается / едет | `pop_trob.c` | seg007 |
|
||||
| 16 | средняя посадка; толчок о стража | `pop_map.c` land / bump_into_opponent | seg005/seg003:0654 |
|
||||
| 17 | мягкая посадка | `pop_map.c` land | seg005 |
|
||||
| 18 | пьёт | seqtbl (SEQ_SOUND) | seg006 |
|
||||
| 19 | вынул меч | `pop_ctrl.c` | seg005:945 |
|
||||
| 20/21/22 | дрожит плита | `pop_map.c` loose_shake | seg007:0E55 |
|
||||
| 23 | шаг | seqtbl (SEQ_SOUND) | seg006 |
|
||||
| 44 | скелет оживает | `guards.c` pop_check_skel | seg002:106D |
|
||||
| 45 | прыжок в зеркало | `pop_map.c` jump_through_mirror | seg003:0617 |
|
||||
| 46 | сожрал чомпер | `pop_map.c` | seg004 |
|
||||
| 47 | чомпер щёлкнул | `pop_trob.c` (кадр 2) | seg007 |
|
||||
| 48 | напоролся на пики | `pop_map.c` | seg005 |
|
||||
| 49 | пики пошли | `pop_map.c` start_anim_spike | seg007:08F6 |
|
||||
|
||||
Что осталось не разведено — только МУЗЫКА (25 презентация, 26 объятия,
|
||||
27/35/40 заставки, 29 встреча Джафара, 30/33 зелья, 32/41 конец уровня,
|
||||
36 время вышло, 37 победа, 43 смерть Джафара, 50/52/53 сюжетные вставки)
|
||||
и 51 (дверь принцессы, тоже из заставки). Их черёд — фаза «музыка».
|
||||
|
||||
**Квирк, за которым следить.** Звук ворот у оригинала звучит не всегда, а
|
||||
по условию видимости (`play_door_sound_if_visible`, seg007:1250): либо
|
||||
ворота в комнате слева и стоят в 9-й колонке, либо ворота в НАРИСОВАННОЙ
|
||||
комнате и колонка не 9-я. У нас это параметр `audible` у `animate_door`.
|
||||
|
||||
**Тряска плиты — свой домен prandom.** Оригинал берёт номер сэмпла (20/21/22)
|
||||
из общего генератора и вдобавок «сжигает» один бросок ради совместимости с
|
||||
DOS-версией; у нас последовательности разведены по доменам
|
||||
(`impl_diff.md`), поэтому у тряски свой сид, а холостой бросок не делаем —
|
||||
на розыгрыши физики и кладки это не влияет.
|
||||
|
||||
Reference in New Issue
Block a user