Звуковые эффекты 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:
@@ -10,6 +10,7 @@
|
||||
#include <gfx.h>
|
||||
#include <sprite.h>
|
||||
#include "pop_kid.h"
|
||||
#include "pop_sfx.h" /* звуковые эффекты: опкод SOUND в play_seq */
|
||||
#include "pop_trob.h" /* pop_start_chompers — смена ряда будит чомперы */
|
||||
#include "pop_guard.h" /* Guard/pop_gframe/CHARID_* — интерпретатор общий */
|
||||
#include "pop_bg.h" /* POP_YOFF — вертикальное центрирование */
|
||||
@@ -323,14 +324,26 @@ void play_seq(void)
|
||||
case 0xF4: /* KNOCK_DOWN: приземление трясёт loose В СВОЁМ РЯДУ */
|
||||
knock = -1;
|
||||
break;
|
||||
case 0xF2: /* SOUND (seg006:0611): звука у нас нет, но опкод несёт
|
||||
* ВТОРОЙ смысл — «Кид нашумел», и его терять нельзя.
|
||||
* Шумом считаются id 0..2 (SILENT/FOOTSTEP/BUMP); id 0
|
||||
* назван silent потому, что НЕ звучит, а стражи его всё
|
||||
* равно замечают (стоит, например, в seq доставания меча).
|
||||
* DRINK(3)/LEVEL(4) — не шум. См. BUG-GUARD-DEAF-1. */
|
||||
if (SEQ(Char.curr_seq) < 3) is_guard_notice = 1;
|
||||
Char.curr_seq++;
|
||||
case 0xF2: /* SOUND (seg006:0627). Аргумент — НЕ номер звука игры, а
|
||||
* одно из пяти событий; отображение взято оттуда же:
|
||||
* 0 SILENT — не звучит, но стражи Кида ЗАМЕЧАЮТ
|
||||
* (стоит, например, в seq доставания меча);
|
||||
* 1 FOOTSTEP — звук 23, и шум;
|
||||
* 2 BUMP — звук 8, и шум;
|
||||
* 3 DRINK — звук 18, не шум;
|
||||
* 4 LEVEL — МУЗЫКА конца уровня (32 на 4-м, иначе 41,
|
||||
* на 13/15 молчок). Оцифровки у неё нет,
|
||||
* это путь A на AY — пока тишина.
|
||||
* Второй смысл опкода («Кид нашумел») терять нельзя даже
|
||||
* без звука, см. BUG-GUARD-DEAF-1. */
|
||||
{
|
||||
uint8_t ev = SEQ(Char.curr_seq);
|
||||
Char.curr_seq++;
|
||||
if (ev < 3) is_guard_notice = 1;
|
||||
if (ev == 1) pop_sfx_play(23);
|
||||
else if (ev == 2) pop_sfx_play(8);
|
||||
else if (ev == 3) pop_sfx_play(18);
|
||||
}
|
||||
break;
|
||||
case 0xF1: /* END_LEVEL: seq_70 доиграл — уровень пройден.
|
||||
* В оригинале это `++next_level`, а главный цикл
|
||||
|
||||
Reference in New Issue
Block a user