7e6b38cca6
Звуки 24..43 в наборе оцифровки пустые — в оригинале это Adlib-музыка, и в digisnd её нет. На этом и построено подключение: pop_sfx_play для звука с нулевой длиной кладёт номер в pop_mus_req, а разбирает заявку pop_music_service() — один вызов на кадр из любого цикла (игра, интро, катсцена). Всё чтение с диска живёт там. Ждать полной загрузки джингла нельзя — это фриз посреди игры. Поэтому pop_music_stream читает первую страницу (33 мс) и сразу пускает трек: она звучит 1,5 с, а следующая читается те же 33 мс. Остальные доливаются по одной за кадр. Расставлено по местам оригинала: смерть (24/28/32), вступление первого уровня и тень шестого (25), сцены перед уровнями (27/35/40), встреча с Джафаром (29), зелья (30/33/39), время вышло (36), меч и смерть стража (37), смерть Джафара (43), конец уровня (41/32), встреча с принцессой (26). Темы «раз за уровень» сбрасывает pop_music_level_start. Упакован 21 трек (2,4 МБ). Не озвучен только финал: won — 115 с и 78 страниц EMM, ему нужен кольцевой стриминг (задача MUS-WON на доске). Проверено в MAME: вступительная тема первого уровня отыгрывается на старте (курсор дошёл до конца, id 25). Host-тесты: 15 наборов. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
84 lines
3.0 KiB
C
84 lines
3.0 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 20
|
|
|
|
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 */
|
|
{ 3, 305 }, /* 24 regular_death */
|
|
{ 2, 196 }, /* 25 find_mirror_and_find_shadow */
|
|
{ 9, 1132 }, /* 26 embrace */
|
|
{ 8, 915 }, /* 27 cutscene_before_2_4_6_12 */
|
|
{ 6, 656 }, /* 28 fight_death */
|
|
{ 4, 428 }, /* 29 meet_Jaffar */
|
|
{ 3, 299 }, /* 30 life_potion */
|
|
{ 0, 0 }, /* 31 */
|
|
{ 5, 624 }, /* 32 end_level_4_and_killed_by_shadow */
|
|
{ 2, 205 }, /* 33 potion */
|
|
{ 0, 0 }, /* 34 */
|
|
{ 7, 888 }, /* 35 cutscene_before_8_9 */
|
|
{ 10, 1256 }, /* 36 out_of_time */
|
|
{ 3, 280 }, /* 37 guard_death_and_obtaining_the_sword */
|
|
{ 0, 0 }, /* 38 */
|
|
{ 13, 1591 }, /* 39 floating */
|
|
{ 5, 596 }, /* 40 cutscene_not_much_time_left */
|
|
{ 9, 1043 }, /* 41 story_5_level_end_and_merge_with_shadow */
|
|
{ 0, 0 }, /* 42 */
|
|
{ 3, 285 }, /* 43 killed_Jaffar */
|
|
{ 0, 0 }, /* 44 */
|
|
{ 0, 0 }, /* 45 */
|
|
{ 0, 0 }, /* 46 */
|
|
{ 0, 0 }, /* 47 */
|
|
{ 0, 0 }, /* 48 */
|
|
{ 0, 0 }, /* 49 */
|
|
{ 10, 1184 }, /* 50 story_2_princess */
|
|
{ 0, 0 }, /* 51 */
|
|
{ 20, 2443 }, /* 52 story_4_Jaffar_leaves */
|
|
{ 11, 1403 }, /* 53 story_3_Jaffar_enters */
|
|
{ 17, 2064 }, /* 54 intro_theme */
|
|
{ 11, 1350 }, /* 55 story_1_absence */
|
|
};
|
|
|
|
#endif /* POP_MUSIC_TBL_H */
|