34ba5f71d5
Путь C из sound_plan.md вместо ранее выбранного A (ноты спикера на AY). Причина смены: появились готовые записи DOS-версии, и строка «нужен синтезатор на хосте», из-за которой C считался дорогим, отпала — осталось `ffmpeg -ac 1 -ar 10937 -f u8`. Оцифровки музыки в самой игре нет вовсе: digisnd*.dat содержит только эффекты, музыка лежит MIDI под Adlib, так что конвертировать ресурс игры всё равно было не из чего. * toolchain/pop_pack_music.py — запись flac -> сырой u8 на 10 937,5 Гц (частота CBL, чтобы её не переключать никогда), нарезка на куски MUS\m<id>_<nn>.bin по 16 КБ: bank_load_file читает файл только целиком и только в одну страницу. Каталог -> pop_music_tbl.h; длина трека хранится ПОРЦИЯМИ по 128 байт — 169 КБ в uint16 не влезает, 1350 блоков влезает (32-бит арифметики на Z80 избегаем). * pop_music.c (банк 9) — загрузка трека в EMM и курсор; pop_sfx_fill (резидент) получил третий источник: эффект важнее музыки, музыка важнее тишины. Эффект музыку не сбрасывает — её курсор стоит, пока тот доигрывает, и она продолжается с места. * story_1_absence звучит на первом экране истории, где была тишина. Грузим ПОСЛЕ сборки картинки: чтение идёт через ESTEX, и при открытом CBL насос не успел бы долить блок. Проверено записью звука из MAME: корреляция огибающих с эталоном 0,836 при сдвиге 1,8 с, RMS 22,6 против 18,3 (разница — 8-битное квантование). Эффекты двери в PV-сцене после трека звучат по-прежнему. Бюджет: резидент +83 Б кода и +25 Б данных, запас W2 151 Б (кучи в приложении нет, malloc не слинкован); банк 9 занят на 88 %. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
84 lines
2.6 KiB
C
84 lines
2.6 KiB
C
/*
|
|
* pop_music_tbl.h — каталог музыкальных треков, СГЕНЕРИРОВАН.
|
|
* Источник: applications/PoP/PoP1_DOS_music/flac (записи DOS-версии).
|
|
* Генератор: toolchain/pop_pack_music.py. Руками не править.
|
|
*
|
|
* Нумерация id — оригинала (SDLPoP data/music/names.txt). pages —
|
|
* сколько кусков m<id>_<nn>.bin лежит на диске, blocks — длина трека
|
|
* в порциях насоса по 128 байт (в байтах не влезло бы в uint16).
|
|
*/
|
|
#ifndef POP_MUSIC_TBL_H
|
|
#define POP_MUSIC_TBL_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#define POP_MUS_COUNT 56
|
|
#define POP_MUS_BLOCK 128
|
|
#define POP_MUS_MAX_PAGES 11
|
|
|
|
typedef struct {
|
|
uint8_t pages; /* 0 — трека нет */
|
|
uint16_t blocks; /* длина в порциях по 128 байт */
|
|
} pop_mus_ent_t;
|
|
|
|
static const pop_mus_ent_t pop_mus_tbl[POP_MUS_COUNT] = {
|
|
{ 0, 0 }, /* 0 */
|
|
{ 0, 0 }, /* 1 */
|
|
{ 0, 0 }, /* 2 */
|
|
{ 0, 0 }, /* 3 */
|
|
{ 0, 0 }, /* 4 */
|
|
{ 0, 0 }, /* 5 */
|
|
{ 0, 0 }, /* 6 */
|
|
{ 0, 0 }, /* 7 */
|
|
{ 0, 0 }, /* 8 */
|
|
{ 0, 0 }, /* 9 */
|
|
{ 0, 0 }, /* 10 */
|
|
{ 0, 0 }, /* 11 */
|
|
{ 0, 0 }, /* 12 */
|
|
{ 0, 0 }, /* 13 */
|
|
{ 0, 0 }, /* 14 */
|
|
{ 0, 0 }, /* 15 */
|
|
{ 0, 0 }, /* 16 */
|
|
{ 0, 0 }, /* 17 */
|
|
{ 0, 0 }, /* 18 */
|
|
{ 0, 0 }, /* 19 */
|
|
{ 0, 0 }, /* 20 */
|
|
{ 0, 0 }, /* 21 */
|
|
{ 0, 0 }, /* 22 */
|
|
{ 0, 0 }, /* 23 */
|
|
{ 0, 0 }, /* 24 */
|
|
{ 0, 0 }, /* 25 */
|
|
{ 0, 0 }, /* 26 */
|
|
{ 0, 0 }, /* 27 */
|
|
{ 0, 0 }, /* 28 */
|
|
{ 0, 0 }, /* 29 */
|
|
{ 0, 0 }, /* 30 */
|
|
{ 0, 0 }, /* 31 */
|
|
{ 0, 0 }, /* 32 */
|
|
{ 0, 0 }, /* 33 */
|
|
{ 0, 0 }, /* 34 */
|
|
{ 0, 0 }, /* 35 */
|
|
{ 0, 0 }, /* 36 */
|
|
{ 0, 0 }, /* 37 */
|
|
{ 0, 0 }, /* 38 */
|
|
{ 0, 0 }, /* 39 */
|
|
{ 0, 0 }, /* 40 */
|
|
{ 0, 0 }, /* 41 */
|
|
{ 0, 0 }, /* 42 */
|
|
{ 0, 0 }, /* 43 */
|
|
{ 0, 0 }, /* 44 */
|
|
{ 0, 0 }, /* 45 */
|
|
{ 0, 0 }, /* 46 */
|
|
{ 0, 0 }, /* 47 */
|
|
{ 0, 0 }, /* 48 */
|
|
{ 0, 0 }, /* 49 */
|
|
{ 0, 0 }, /* 50 */
|
|
{ 0, 0 }, /* 51 */
|
|
{ 0, 0 }, /* 52 */
|
|
{ 0, 0 }, /* 53 */
|
|
{ 0, 0 }, /* 54 */
|
|
{ 11, 1350 }, /* 55 story_1_absence */
|
|
};
|
|
|
|
#endif /* POP_MUSIC_TBL_H */
|