Files
Sprinter-SDCC/applications/PoP/roomtest/pop_sound_tbl.h
T
snark13 8ea4c32e51 Звуковые эффекты 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>
2026-08-20 15:16:43 +03:00

108 lines
4.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* pop_sound_tbl.h — раскладка оцифрованных эффектов PoP.
* СГЕНЕРЕНО toolchain/pop_pack_sound.py — НЕ править вручную.
*
* Данные: 8 бит беззнаковые, МОНО, 10937.5 Гц (CBL_FREQ_10K9) — формат
* CBL один в один, конвертировать в рантайме нечего.
*
* Начало каждого звука кратно 128 — размеру блока запроса CBL, а
* страница (16384) кратна ему же. Поэтому НИ ОДИН блок не пересекает
* границу страницы, и проигрывателю не нужна логика стыка.
*
* Смещение хранится РАЗОБРАННЫМ на страницу и адрес в окне: на Z80
* 32-битная арифметика дорога, а так всё влезает в 8/16 бит.
* Длина округлена вверх до блока — неполных блоков не бывает.
*/
#ifndef POP_SOUND_TBL_H
#define POP_SOUND_TBL_H
#include <stdint.h>
#define POP_SND_PAGES 8
#define POP_SND_COUNT 57
#define POP_SND_BLOCK 128
/* Первый блок страницы 0 — тишина для насоса (см. упаковщик). */
#define POP_SND_SILENCE_PAGE 0
#define POP_SND_SILENCE_OFF 0x0000
typedef struct { uint8_t page; uint16_t off; uint16_t len; } pop_snd_ent_t;
/* len == 0 — у звука нет оцифровки (это музыка, см. sound_plan.md). */
static const pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT] = {
{ 0, 0x0080, 1664 }, /* 0 */
{ 0, 0x0700, 12032 }, /* 1 */
{ 0, 0x3600, 6272 }, /* 2 */
{ 1, 0x0E80, 1280 }, /* 3 */
{ 1, 0x1380, 1152 }, /* 4 */
{ 1, 0x1800, 1408 }, /* 5 */
{ 1, 0x1D80, 5504 }, /* 6 */
{ 1, 0x3300, 896 }, /* 7 */
{ 1, 0x3680, 1664 }, /* 8 */
{ 1, 0x3D00, 2816 }, /* 9 */
{ 2, 0x0800, 4992 }, /* 10 */
{ 2, 0x1B80, 1280 }, /* 11 */
{ 2, 0x2080, 1280 }, /* 12 */
{ 2, 0x2580, 3840 }, /* 13 */
{ 2, 0x3480, 7552 }, /* 14 */
{ 3, 0x1200, 17664 }, /* 15 */
{ 4, 0x1700, 4736 }, /* 16 */
{ 4, 0x2980, 4224 }, /* 17 */
{ 4, 0x3A00, 6912 }, /* 18 */
{ 5, 0x1500, 2816 }, /* 19 */
{ 5, 0x2000, 1408 }, /* 20 */
{ 5, 0x2580, 1152 }, /* 21 */
{ 5, 0x2A00, 1280 }, /* 22 */
{ 5, 0x2F00, 1408 }, /* 23 */
{ 0, 0x0000, 0 }, /* 24 */
{ 0, 0x0000, 0 }, /* 25 */
{ 0, 0x0000, 0 }, /* 26 */
{ 0, 0x0000, 0 }, /* 27 */
{ 0, 0x0000, 0 }, /* 28 */
{ 0, 0x0000, 0 }, /* 29 */
{ 0, 0x0000, 0 }, /* 30 */
{ 0, 0x0000, 0 }, /* 31 */
{ 0, 0x0000, 0 }, /* 32 */
{ 0, 0x0000, 0 }, /* 33 */
{ 0, 0x0000, 0 }, /* 34 */
{ 0, 0x0000, 0 }, /* 35 */
{ 0, 0x0000, 0 }, /* 36 */
{ 0, 0x0000, 0 }, /* 37 */
{ 0, 0x0000, 0 }, /* 38 */
{ 0, 0x0000, 0 }, /* 39 */
{ 0, 0x0000, 0 }, /* 40 */
{ 0, 0x0000, 0 }, /* 41 */
{ 0, 0x0000, 0 }, /* 42 */
{ 0, 0x0000, 0 }, /* 43 */
{ 5, 0x3480, 2688 }, /* 44 */
{ 5, 0x3F00, 4224 }, /* 45 */
{ 6, 0x0F80, 4608 }, /* 46 */
{ 6, 0x2180, 5120 }, /* 47 */
{ 6, 0x3580, 5120 }, /* 48 */
{ 7, 0x0980, 4480 }, /* 49 */
{ 0, 0x0000, 0 }, /* 50 */
{ 7, 0x1B00, 4864 }, /* 51 */
{ 0, 0x0000, 0 }, /* 52 */
{ 0, 0x0000, 0 }, /* 53 */
{ 0, 0x0000, 0 }, /* 54 */
{ 0, 0x0000, 0 }, /* 55 */
{ 0, 0x0000, 0 }, /* 56 */
};
/* Имена файлов видит ТОЛЬКО тот, кто попросил POP_SND_FILES (холодная
* половина): иначе копия строк уезжает в каждый включивший заголовок
* модуль, а в резиденте W1/W2 каждая сотня байт на счету. Тот же
* приём, что у POP_BG_ATLAS_NAMES в pop_bg_atlas.h. */
#ifdef POP_SND_FILES
static const char *const pop_snd_files[POP_SND_PAGES] = {
"SND\\s0.bin",
"SND\\s1.bin",
"SND\\s2.bin",
"SND\\s3.bin",
"SND\\s4.bin",
"SND\\s5.bin",
"SND\\s6.bin",
"SND\\s7.bin",
};
#endif
#endif