Музыка: PCM-трек через CBL, первый экран истории озвучен
Путь 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>
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include "pop_bg.h"
|
||||
#include "pop_shadow.h"
|
||||
#include "pop_sfx.h"
|
||||
#include "pop_music.h"
|
||||
#include "pop_cutscene.h"
|
||||
#include "pop_intro.h"
|
||||
#include "pop_pal.h"
|
||||
@@ -1305,10 +1306,21 @@ uint8_t pop_intro_show(void) __banked
|
||||
if (intro_draw_new_palette(INTRO_STORY_ABSENCE) == 0)
|
||||
pop_pal_fade_in(INTRO_FADE);
|
||||
}
|
||||
/* Первый экран истории — единственное место, где музыка уже звучит.
|
||||
* Грузим ПОСЛЕ того, как картинка собрана: чтение кусков идёт через
|
||||
* ESTEX, и при открытом CBL насос не успел бы долить блок (скрежет,
|
||||
* см. pop_sfx_start). Порядок обязателен: load -> start -> play. */
|
||||
if (pop_music_load(POP_MUS_STORY_1) == 0) {
|
||||
(void)pop_sfx_start();
|
||||
pop_music_play();
|
||||
}
|
||||
if (intro_run(intro_before_pv)) {
|
||||
pop_music_free();
|
||||
intro_restore_game_palette();
|
||||
return 1;
|
||||
}
|
||||
pop_music_free();
|
||||
pop_sfx_pause();
|
||||
pv_result = intro_pv_animated();
|
||||
if (pv_result > 0) {
|
||||
intro_restore_game_palette();
|
||||
|
||||
Reference in New Issue
Block a user