🔔 Bladewake GDD
📄 Doc 32 · Art · VFX · Âm thanh

32 — Audio Bible (âm thanh & nhạc, bản 1.0)

hợp đồng âm thanh đủ để 1 agent/nhà làm âm thanh tìm nguồn, sản xuất, mix và nối vào Unity MỌI sound/nhạc của Bladewake 1.0 mà không cần hỏi lại.

Cập nhật: 2026-11-07
17
mục ##
38
mục ###
38
bảng
20 348
từ

1Giới thiệu & bản đồ tài liệu

Mục đích: hợp đồng âm thanh đủ để 1 agent/nhà làm âm thanh tìm nguồn, sản xuất, mix và nối vào Unity MỌI sound/nhạc của Bladewake 1.0 mà không cần hỏi lại. Phụ thuộc: GDD/Full/docs/00-Design-Bible.md + GDD/Full/data/_bible.json (canon: INV-02 tell, §5 hero, §7 biome/quái, §10.3 ngân sách, §11 ID) · demo GDD/07-Game-Feel.md §7 · skill .claude/skills/create-sfx/ (synth + Freesound + QA) · MCP bf-sfx. Được dùng bởi: agent audio (nguồn/synth/mix), dev code Audio* (mixer, hook, nhạc thích nghi), VFX/anim (frame kích SFX), QA (test tai + LUFS), loc (phụ đề tell, text bark), sản xuất (thuê ngoài nhạc 4 PM + SFX 4 PM).

📌
Trạng thái: 2026-11-07, bản đầu. Số gắn [ASSUMED] = giá trị khởi điểm, playtest chỉnh; mọi số khác là hợp đồng.
SFX theo bus trộnSFX theo bus trộnBossBoss: 305305HeroHero: 187187EnemyHordeEnemyHorde: 139139WorldWorld: 116116EnemyEnemy: 7878HeroAttackHeroAttack: 7474HeroDefenseHeroDefense: 6161AmbienceAmbience: 5151VOVO: 3939UIUI: 3838TellTell: 2424StingerStinger: 1111SFXSFX: 66
Nguồn: data/av/*.json (bus).
SFX theo lớp tellSFX theo lớp tellnone: 1115 (99%)P: 8 (1%)Y: 5 (0%)N: 1 (0%)1129SFXnone — 1115 (99%)P — 8 (1%)Y — 5 (0%)N — 1 (0%)
Nguồn: data/av/*.json (tell_class).
VFX theo lớp sortVFX theo lớp sortoverheadoverhead: 514514body_frontbody_front: 395395floor_decalfloor_decal: 236236body_backbody_back: 7878screenscreen: 4040floor_tellfloor_tell: 2626prioritizeprioritize: 2020shadowshadow: 77
Nguồn: data/av/*.json (layer).
🎼
Danh sách cue nhạc và leitmotif dạng trực quan: Danh sách cue nhạc.
Độ dài từng mục (nghìn ký tự)Độ dài từng mục (nghìn ký tự)0. Phạm vi & thứ bậc0. Phạm vi & thứ bậc: 0.7k0.7k1. Trụ cột âm thanh (AP1–AP6)1. Trụ cột âm thanh (AP1–AP6): 1k1k2. Bản sắc âm (sonic identity)2. Bản sắc âm (sonic identity): 10.5k10.5k3. Âm nhạc3. Âm nhạc: 20.8k20.8k4. SFX — đặt tên, mẫu spec, khuôn sự k…4. SFX — đặt tên, mẫu spec, khuôn sự kiện: 11.1k11.1k5. Mixer Unity, ưu tiên, voice, suy gi…5. Mixer Unity, ưu tiên, voice, suy giảm, ducking, độ to: 7.2k7.2k6. Luật bầy (horde) — gộp, lớp, ngẫu n…6. Luật bầy (horde) — gộp, lớp, ngẫu nhiên (class HordeAudio, chạy cuối frame sau Combat): 3.2k3.2k7. UI & hub7. UI & hub: 9.5k9.5k8. Thư viện SHARED (57 mục SFX_SHARED_…8. Thư viện SHARED (57 mục SFX_SHARED_<slug>; R = nguồn dùng lại cho sự kiện hero/quái, S = sự kiện hệ thống tính trong nhóm Khác §4.4): 3.9k3.9k9. Bark & giọng (VO) — chính sách9. Bark & giọng (VO) — chính sách: 1.6k1.6k10. Ambience & hazard theo biome10. Ambience & hazard theo biome: 18.3k18.3k11. Nguồn, định dạng, nhập Unity11. Nguồn, định dạng, nhập Unity: 3.9k3.9k12. Nối vào code (hook sự kiện → id)12. Nối vào code (hook sự kiện → id): 10.3k10.3k13. Ngân sách âm thanh theo mốc (đếm s…13. Ngân sách âm thanh theo mốc (đếm sự kiện SFX theo §4.4; nhạc theo §3.7): 1.7k1.7k14. Kiểm nghiệm (AT = acceptance test;…14. Kiểm nghiệm (AT = acceptance test; chạy trước mỗi MS): 1k1kQuy tắc cho dev/AIQuy tắc cho dev/AI: 1.2k1.2kQuyết định đã chốtQuyết định đã chốt: 2.6k2.6k
Bấm tên mục để nhảy tới mục đó.
Mục lục chi tiết (## và ###)
  1. 0. Phạm vi & thứ bậc
  2. 1. Trụ cột âm thanh (AP1–AP6)
  3. 2. Bản sắc âm (sonic identity)
  4. 2.1 Tell — 3 lớp INV-02 (khoá, mọi hero/quái/boss/hazard/Khăn Tang/mutator/Tro Nhớ)
  5. 2.2 Bảng timbre theo phe
  6. 2.3 Bảng timbre 12 hero (chất liệu chủ không trùng; AP5)
  7. 2.4 Bảng timbre kẻ địch theo biome
  8. 3. Âm nhạc
  9. 3.1 Hướng chung
  10. 3.2 Bảng hướng nhạc theo khu (bpm/meter/key/nhạc cụ khoá)
  11. 3.3 Leitmotif (nốt chuẩn; hoà âm/nhạc cụ tự do trong luật §3.1)
  12. 3.4 Hệ nhạc thích nghi (class MusicDirector)
  13. 3.5 Đồng bộ H12 Ambrin (120 BPM)
  14. 3.6 Mẫu cue nhạc (FINAL) — mỗi cue 1 khối trong GDD/Full/data/audio_music.json (agent audio tạo; khoá field)
  15. 3.7 Danh sách cue 1.0 (18 bản canon + 4 bộ stem H12) — 1 dòng/cue
  16. 4. SFX — đặt tên, mẫu spec, khuôn sự kiện
  17. 4.1 Đặt tên (canon §11)
  18. 4.2 Mẫu spec SFX (FINAL) — 1 hàng/sự kiện trong GDD/Full/data/audio_sfx.csv (agent audio tạo; khoá cột)
  19. 4.3 Mục tiêu độ to theo loại (PC; momentary-max, trước bus fader)
  20. 4.4 Khuôn sự kiện theo chủ (sinh audio_sfx.csv từ khuôn; số khớp canon §10.3)
  21. 5. Mixer Unity, ưu tiên, voice, suy giảm, ducking, độ to
  22. 5.1 Cây bus (Assets/_Project/Audio/Mixer/BW_Main.mixer, 1 AudioMixer; fader mặc định)
  23. 5.2 Snapshot (chuyển 0.15 s trừ khi ghi khác)
  24. 5.3 Ưu tiên (Unity priority, 0 = cao) & giới hạn voice (Project Settings › Audio: Real Voices 64, Virtual 256, DSP buffer Best latency = 256 mẫu)
  25. 5.4 Ngân sách tell đồng thời (từ token INV-08)
  26. 5.5 Suy giảm khoảng cách (góc 3/4, không 3D)
  27. 5.6 Ducking / sidechain
  28. 5.7 Đồng hồ & slow-mo
  29. 5.8 Độ to chương trình & tuỳ chọn người chơi
  30. 6. Luật bầy (horde) — gộp, lớp, ngẫu nhiên (class HordeAudio, chạy cuối frame sau Combat)
  31. 6.1 Gộp cú trúng của hero (mỗi frame, mỗi nguồn sát thương)
  32. 6.2 Kill-crunch (cửa sổ trượt 100 ms)
  33. 6.3 Âm quái thường trong bầy
  34. 6.4 Ngẫu nhiên & chống lặp
  35. 6.5 Kiểm hiệu năng âm (Lát Chịu Tải MS01b)
  36. 7. UI & hub
  37. 7.1 UI (37 sự kiện SFX_UI_ = 29 lõi + 8 thêm 2026-11-07; bus UI; clock UI; chất liệu giấy/gỗ/đồng nhỏ, AUD-01; spec đủ field ở data/av/UI.json)
  38. 7.2 Hub (29 sự kiện = 13 lõi SFX_HUB_ + 16 SFX_ENV_HUB_ thêm 2026-11-07; bus World/Ambience; spec đủ field ở data/av/ENV_HUB.json)
  39. 8. Thư viện SHARED (57 mục SFX_SHARED_<slug>; R = nguồn dùng lại cho sự kiện hero/quái, S = sự kiện hệ thống tính trong nhóm Khác §4.4)
  40. 9. Bark & giọng (VO) — chính sách
  41. 10. Ambience & hazard theo biome
  42. 10.1 Bed ambience (1 loop stereo ≥ 60 s/biome, SFX_<Bn>_amb_bed, bus Ambience, −30 LUFS-I) + spot ngẫu nhiên (sự kiện amb_spot riêng theo data/av/ENV_.json, AmbienceSpot chọn 1 spot / 6–14 s, pan ngẫu nhiên ±0.6)
  43. 10.2 Hazard (46 sự kiện = 14 lõi + 32 thêm 2026-11-07 theo data/av/ENV_.json; theo INV-18: dùng đúng Y/P/N, nhịp ≥ 1.0 s, trúng cả quái)
  44. 10.3 Đạo cụ, mục tiêu, phòng & cảnh theo biome (64 sự kiện SFX_ENV_<Bn>_, thêm 2026-11-07; spec đủ field ở data/av/ENV_<Bn>.json; bus World trừ ghi khác; hook theo §12.2)
  45. 11. Nguồn, định dạng, nhập Unity
  46. 11.1 Thang nguồn SFX (đúng thứ tự, theo skill create-sfx)
  47. 11.2 Định dạng & mastering
  48. 11.3 Bộ nhớ & dung lượng (Steam Deck là trần)
  49. 12. Nối vào code (hook sự kiện → id)
  50. 12.1 Kiến trúc runtime (thay Systems/Sfx.cs demo)
  51. 12.2 Bảng hook (EventName → id; {H} = hero đang chơi, {E} = enemy id, {B} = biome, {BOSS} = id mini/boss)
  52. 13. Ngân sách âm thanh theo mốc (đếm sự kiện SFX theo §4.4; nhạc theo §3.7)
  53. 14. Kiểm nghiệm (AT = acceptance test; chạy trước mỗi MS)
  54. Quy tắc cho dev/AI
  55. Quyết định đã chốt

20. Phạm vi & thứ bậc

  • Canon thắng doc này: id, số lượng (SFX ~880 sự kiện = 336 + 195 + 104 + 245, DEC-2026-11-07-17, chi tiết §4.4/§13; nhạc 18 bản + 4 bộ stem 120 BPM H12), tempo/nhạc cụ biome trong _bible.json biomes[].theme.
  • Doc này sở hữu: luật timbre, cấu trúc nhạc thích nghi, mixer, giới hạn voice, LUFS, mẫu spec, thư viện SFX_SHARED_*, hook sự kiện → id, quy trình nguồn.
  • Không có trong 1.0 (canon §13): voice có nghĩa (lời thoại đọc), video cutscene, nhịp theo nhạc ngoài bộ stem H12, middleware âm thanh ngoài Unity AudioMixer.
  • Nền tảng mix: PC Steam (loa ngoài + tai nghe) → Steam Deck (loa nhỏ, tai nghe) cùng 1 bản mix + preset "Loa nhỏ" (§5.8). Port console sau dùng nguyên bus/snapshot.

31. Trụ cột âm thanh (AP1–AP6)

IDTrụ cộtLuật cứngKPI kiểm
AP1Tell nghe là biết"tinh" = vàng = ĐÁP; "ù" = tím = Lướt; vùng đọng N không tiếng tell. 2 âm này độc quyền dải phổ của nó (§2.1)playtest nhắm mắt: ≥ 90% gọi đúng Y/P sau 10 phút; 0 âm khác bị gọi nhầm là tell
AP2Bầy là một khối250 quái nghe như 1 cơn sóng, không như 250 nguồn: gộp trúng/chết (§6), không lặp đều0 méo/clipping ở 250 quái + Ult; p95 voice thật ≤ 56/64
AP3Hero luôn nổihero > địch 6 dB cùng loại; ĐÁP thành công = âm to nhất mix (demo canon)ĐÁP thắng mọi âm khác về LUFS ngắn hạn tại khung đó
AP4Đã taymỗi cú trúng có SFX trong ≤ 1 frame (INV-10); onset ≤ 12 ms; trễ input→âm ≤ 40 msđo thu loopback: input→onset âm p95 ≤ 40 ms
AP5Mỗi Kẻ Thức một tiếng12 bảng timbre không trùng chất liệu chủ (§2.3); nghe 3 s nhận ra hero≥ 80% nhận ra hero chỉ qua âm (khớp P6 canon)
AP6Tang mà ấmnhạc u buồn có hơi ấm, hài đen ở NPC; cảm hứng tang lễ Á Đông thành fantasy gốc, không tái hiện nghi lễ/bài kinh có thậtreview tông: 0 lời kinh thật, 0 giai điệu dân ca có thật trích nguyên

42. Bản sắc âm (sonic identity)

2.1 Tell — 3 lớp INV-02 (khoá, mọi hero/quái/boss/hazard/Khăn Tang/mutator/Tro Nhớ)

LớpId âmKhi phátTimbre (bắt buộc)Thời lượngLUFS mmaxGhi chú
Y glint 1EnemyWindupStart tellClass=Y (frame đầu windup = glint 1); lịch PlayS… SFX_SHARED_tell_y_glint1frame đầu windup (glint 1)ping kim loại nhỏ, cùng họ "tinh" nhưng nhẹ: partial 2.6/4.1/6.3 kHz, attack 2 ms, decay 90 ms120 ms−22báo "sắp có đòn vàng"
Y "tinh"EnemyWindupStart tellClass=Y → lịch PlayScheduled đỉnh transient đúng… SFX_SHARED_tell_y_tinhđỉnh transient ĐÚNG 0.12 s trước frame va chạm (cùng glint 2)sáng, kim loại, gõ: chuông tay nhỏ đồng-thiếc bị gõ, fundamental 2.8 kHz, partial bất hoà 1.0/1.47/2.09/2.76, attack ≤ 2 ms, decay 180 ms, không reverb dài (≤ 120 ms room)220 ms−14âm tell to nhất; mỗi nhịp đòn Y×n = 1 "tinh" riêng, nhịp k cao hơn nhịp đầu +1 bán cung × (k−1), tối đa +3
P "ù"EnemyWindupStart tellClass=P (cả hazard/Khăn Tang/mutator P); chọn bả… SFX_SHARED_tell_p_swelltừ frame đầu windup tím tới ĐÚNG frame va chạm, cắt cứng tại va chạmtrầm, ngược, phồng lên: gong/chuông lớn đảo ngược + sub 45 Hz, fundamental 70–110 Hz, cao độ trượt +2 bán cung suốt windup, độ to tăng tuyến tính dB (−30 → −16)= windup (0.45–1.5 s; co giãn bằng 3 bản 0.45/0.8/1.2 s + vòng sustain)−16 tại cuốiva chạm tím = EnemyImpact tellClass=P (frame va chạm tím) SFX_SHARED_tell_p_impact (thump trầm 120 ms)
N vùng đọng——KHÔNG âm tell (canon); vùng phát loop môi trường vùng đọng N (hazard/đòn/MRN15 vũng) tồn tại → loop; dừng khi vùng tắt SFX_SHARED_zone_n_loop ≤ −30 LUFS, không onset——mỗi tick sát thương N không phát âm riêng
Nhịp lừa (INV-15)EnemyFeint (frame bắt đầu nhịp trì ≤ 0.35 s, INV-15) SFX_SHARED_tell_feintframe bắt đầu nhịp trì (≤ 0.35 s)gỗ khô "cạch" + hít hơi, KHÔNG kim loại150 ms−20"tinh" thật vẫn phát đúng 0.12 s trước va chạm thật
Đạn tím (INV-13)EnemyProjectileFire purple=true → loop tới khi đạn biến mất/bị dội SFX_SHARED_tell_p_projloop khi đạn tím bayù rung 90 Hz + nhiễu lọc 300 Hz, AM 6 Hzloop−22≤ 2 viên/màn → ≤ 2 voice

Luật sở hữu phổ (tương đương INV-01 cho âm; mã AUD-01..AUD-04):

  • AUD-01 Dải "tinh": âm không phải tell vàng KHÔNG được có partial tonal kim loại 2.2–3.6 kHz decay > 60 ms với mức ≥ −12 dB so với đỉnh của chính âm đó. Áp cho: chuông H03, đe H05, xu H09, chũm chọe H12, chuông hazard B1/B4, chuông mục tiêu BELLS, UI. Đồng xu/chũm chọe = nhiễu (noise) hoặc decay ≤ 60 ms → hợp lệ.
  • AUD-02 Dải "ù": âm không phải tell tím KHÔNG được là swell đảo ngược/tăng dần có năng lượng chính < 140 Hz dài > 0.25 s. Âm trầm khác phải có transient (thump) hoặc mức ổn định (drone không phồng).
  • AUD-03 Tell không bị bóp: bus EnemyTell miễn mọi trần đám đông, mọi duck, mọi snapshot bóp (kể cả BS_TRUE P2 "Nuốt Tiếng"); pitch không theo slow-mo (luôn 1.0); không ngẫu nhiên pitch > ±1%.
  • AUD-04 Chỉ kẻ thật phát tell: ảnh giả MB_B4_2, bóng sàn không thật, hình nhân trang trí → 0 âm tell. Token (INV-08) quyết định ai được windup → số voice tell tối đa = 4 cận chiến + 3 loạt đạn + 5 tím = 12 (§5.4).
  • Trợ năng meta.accessibility: "âm tell theo vị trí" bật → tell pan đầy ±1.0 theo x màn + cao độ "tinh" +2 bán cung khi nguồn ngoài màn; "phụ đề tell" → chữ [tinh ↖] / [ù ↓] ở mép màn theo hướng.

2.2 Bảng timbre theo phe

PheChất liệuDải chủĐặc tínhCấm
Hero (12)vũ khí riêng (§2.3) + lửa/hơi nóng150 Hz–8 kHz, transient sắc"nóng, đặc, gần": khô, gần mic, lớp sweetener sáng; tương ứng FX lõi trắng nóngping kim loại 2.2–3.6 kHz dài (AUD-01)
Quái thườngtro, xương, vải khô, đất mộ, bùn, sắt nguội200 Hz–4 kHz, −6 dB so với hero cùng loại"lạnh, rỗng, xa": hơi ẩm phòng, lớp hiss tro; tương ứng FX lõi tối viền sángtiếng người rõ chữ; gầm kiểu quái vật điện ảnh quá to
Tinh Anh/mininhư quái biome + 1 chất liệu nặng (gỗ quan, xích, đồng)80 Hz–5 kHztrọng lượng: sub thump ở đòn, giọng thú/hơi thở—
Bosschất liệu chữ ký riêng (§3.4)toàn dảimỗi boss 1 "giọng" không lời: thở, rên, gầm biến âmlời nói có nghĩa
Thế giới/hazardtheo biome (§10)—hazard dùng đúng Y/P/N (INV-18)swell trầm ngoài tell tím
Ma #9ff3ffthuỷ tinh lạnh lấp lánh3–9 kHz nhiễu mịnactor có lõi ma #9ff3ff trong view (≤ 3 gần hero nhất) → loop SFX_SHARED_ghost_core loop rất nhỏtonal 2.2–3.6 kHz
UIgiấy, gỗ, đồng xu nhỏ, chuông gió trầm300 Hz–6 kHzngắn, ấm, không ồnâm "game điện tử" vuông/chiptune

2.3 Bảng timbre 12 hero (chất liệu chủ không trùng; AP5)

Mỗi hero: 1 chất liệu chủ (vũ khí) + 1 chất liệu tài nguyên + âm ĐÁP riêng xếp trên lớp chung HeroAnswerSuccess (lớp chung dưới SFX_{H}_answer) + send Answer SFX_SHARED_answer_core (người chơi học: lớp chung = thành công; lớp riêng = hero). Motif hero dùng ở chọn hero, Ult, thẻ kết (§3.3).

HeroChất liệu chủ (vũ khí)Tài nguyên → âmĐÁP · verb giữUlt (UL1)Motif LM_Hxx (nốt, nhạc cụ)Cấm
H01 Varekthép mỏng cong song liềm: cạo thép 3–6 kHz 4 ms + whoosh 400–1.800 Hz quét xuốngDòng Chảy: hơi thở gió ấm tăng dần; ≥ 50 Cuồng Lưu = lớp tim đập 2 nhịpGạt: thép gạt thép + đuôi ngân ngắn (demo parry_1/2) · Thủ: chặn trầm gỗ-thép, Phản đòn: chém képTrăng Máu: whoosh tròn trầm + chuỗi chém + nổ cuốiD–F–E–A, đàn dây cung trầm méodao phay nặng, tiếng quạt
H02 Bodangỗ quan tài dày + đai sắt: thud gỗ 120–300 Hz, kẽo kẹtĐinh: tiếng đóng đinh búa; xả nổ = tiếng nứt gỗ + bùmChặn Nắp: va gỗ lớn "rầm" · Dựng Quan: cắm nắp xuống đất + bụiĐóng nắp lớn + 6 đinh dồnG–D–G–A–G, tuba/kèn đồng trầm hát rukim loại sáng
H03 Halkagỗ cán dài + chuông tay đồng ĐÃ BỊT (fundamental ≤ 600 Hz, decay ≤ 400 ms, AUD-01)Vang: mỗi tầng 1 tiếng ngân bịt cao dần 1 quãng 5; Vỡ Âm = chuông vỡ nứt + subGõ Chuông: gõ bịt trầm tại kẻ tấn công · Nhảy Sào: tre uốn "vút"Hồi chuông bịt dây chuyềnA–E–A–B–C, chuông đồng bịt + sáo trúc trầmping cao trong dải tinh
H04 Sậusắt compa: bản lề "tách/khép" + phấn cào, búng dây mựcMực: giọt mực rơi; 5 Mực → Kẻ Mực = búng dây mực căng "pưng" trầm + xé giấyKhép Compa: kéo cắt "xoẹt" kim loại khô ngắn ≤ 60 ms · Kẻ Vòng: phấn vẽ vòng loopđường mực khổng lồ xéE–G–B–A, đàn tranh gẩy khôngân kim loại
H05 Oskađe gang + xích: xích quay loop (cao độ theo Đà 0→100 = +0→+7 bán cung), đe va "đùng" 200–400 HzĐà: hum quay; Đà 100 = rít xích căngQuay Chắn: xích quất vòng · Quỹ Đạo: vù vù liên tụcđe rơi + vùng hút trầm hút ngược (chỉ 0.25 s, AUD-02)C–C–G–F, trống đồng + bễ thổiđe ngân dài (decay ≤ 300 ms)
H06 Ruvangăng sắt nung: đấm thịt dày + xèo hơiNhiệt: lò rít cao dần; Nung/Chảy = lớp lửa ầm; Tôi = xì hơi lớnBắt Đòn: tóm "chát" + bóp vỡ · Hấp Nhiệt: lửa hút vàolò nổ hơi lớnF–A♭–G–C, trống da + tù vàcạo thép mỏng
H07 Veyragỗ-xương cung: dây cung xương kẽo kẹt (cao độ tăng theo thời gian kéo), tên rítHơi: hít vào theo kéo; Đỉnh Hơi = "nín" tắt mọi lớp 0.12 s + 1 tiếng gõ nhẹ dâyBắn Ngắt: phựt nhanh · Lùi Lắp: bước lùi + kéomưa tên + hơi thở dàiB–D–F♯–E, sáo xương + dây buôngtên kim loại "ding"
H08 Dovhoả mai nòng loa: nổ thuốc súng trầm + đạn chì, khói phụt2 ổ × 3: lẫy cơ khí; Nạp Nóng đúng = "cạch" sáng gỗ-sắt; 9 phản ứng = 9 lớp màu (Muối rắc, Ma Trơi xèo xanh, Đinh lách cách)Nổ Chặn: nổ ngắn nón · Tì Báng Nạp: báng gỗ dậmphát đại bácD–D–A–G–F, trống trận nhỏ + kèn sừngsúng hiện đại, tiếng vỏ đạn đồng ngân
H09 Kessadây gai + chuỗi xu: dây quất "vút", xu xủng xoẻng = nhiễu ngắn ≤ 60 ms (AUD-01)Vòng: mỗi quái bị quấn 1 nút thắt "sột"; Ném Bó = khối thịt rơiQuăng Vòng Xu: quất dây + giật · Lưới Xu: lưới thả loạt xubó 6 quật ngãA–C–D–E–D, đàn nguyệt gẩy + mõxu ngân tonal dài
H10 Ingralư trầm đồng + xích: khói "phù", xích lắc, thì thầm không lờiKhói: mỗi vùng 1 lớp hơi thở thấp; Châm = châm lửa "xoẹt" + mọi vùng phụt cùng lúc lệch 30 msMàn Khói: khói phụt tại kẻ đánh · Hoá Khói: tan khívùng khói đồng loạt bùngE–F–E–B, đàn nhị kéo + giọng humlời tụng có nghĩa
H11 Wennaxẻng sắt + đất: xúc đất, đập phẳng "bép", sỏiĐất: đất đổ; Hố: đào sâu 0.4 s loop; Bia Sụt = đất sụt ầm dàiHất Đất: hất đất rào · Cắm Xẻng: cắm sắt vào đấtmặt đất sụt diện rộngG–A–C–A–G, đàn gáo + trống đấttiếng hồn/ma, chuông
H12 Ambrinkèn đưa tang (kèn dăm kép) + phường ma: trống sóng, chũm chọe (nhiễu), cờ phướn vải, kèn phụNhịp: đúng phách = nốt kèn đúng cao độ hợp âm stem; lệch = nốt lạc nửa cung, Nhịp/2 = kèn hụt hơiThổi Dội: sóng kèn ngắn · Nốt Ngân: kèn giữ hơicả phường thổi tuttiD–A–C–D (đỉnh 120 BPM), kèn dăm + trốngquantize âm đánh (trễ input)

Luật hero: (1) swing phát ở frame CUT kể cả đánh hụt; trúng là âm riêng (§6). (2) ≥ 3 biến thể cho mọi âm lặp; pitch ±6%, volume ±1.5 dB. (3) Dạng Rèn AS2/AS3 đổi vũ khí → đổi bộ swing/hit (cùng hero, 6 sự kiện swap, tính trong 28 sự kiện/hero qua biến thể). (4) Skin = cùng âm (LUT chỉ đổi màu).

2.4 Bảng timbre kẻ địch theo biome

BiomeChất liệu chung quáiGiọng (không lời)Lớp chung bầy (crowd_bed)
B1 Đồi Mộ Troxương khô, vải mục, đất mộ, tro rơirên khàn, gió qua hàmlê chân trên đất + rắc xương
B2 Đầm Vải Liệmvải ướt, bùn, nước nông, treọc nước, ếch trầm, cánh bướm vảilội nước lép bép
B3 Lò Đúc Câmsắt nguội, xỉ, than, hơi nước (decay ngắn, AUD-01)ho xỉ, thở bễguốc sắt lạch cạch + xì hơi xa
B4 Thành Chuông Treođá phiến, xích lạnh, cánh đá, giórít gió qua lỗ, kêu chim than khànbước đá + xích leng keng NHIỄU (không tonal)
B6 Bờ Lặngvắng: hút âm (nhiễu lọc thở vào), nước gươngkhông giọngkhông; im lặng là chất liệu

Boss & mini — giọng chữ ký (1 giọng/boss, không lời):

IdGiọng/chất liệuÂm chữ ký
MB_B1_1 Xà Ích Xe Tangbánh gỗ nghiến, ngựa xương thở, roi daLao Xe: bánh lăn tăng tốc + "ù" tím
MB_B2_1 Mẹ Kén Tơ Trotơ kéo căng, kén nứt ướtĐẻ Kén: xoáy trung tính + kén nứt
MB_B2_2 Cá Voi Xácrên cá voi trầm 40–80 Hz qua tro (không swell, AUD-02), vây rẽTrồi Vồ: tro phun + hàm đóng
MB_B3_1 Cỗ Máy Bướcpiston, khớp sắt, giáp tấm dồn "cang" ngắnDậm: búa máy
MB_B3_2 Gã Hai Đầu Lò2 giọng ho lò lệch 1 quãng 3Giọt Đồng: đồng sôi
MB_B4_1 Rồng Hai Đầu2 hơi thở rồng (lửa-tro / sừng)Phun / Húc
MB_B4_2 Kiếm Sĩ Gươnggương rạn, kiếm rút; ẢNH GIẢ: chỉ tiếng sột gương, không tell (AUD-04)Rút kiếm
BS_B1 Người Gác Chuôngbúa chuông verdigris, áo giáp nặng, hơi thở giàHồi Chuông Tang: chuông lớn TRẦM 110 Hz (đòn tím → kèm "ù")
BS_B2 Lão Lái Đò Không Bếnsào tre vào nước, bè kẽo kẹt, giọng hát ngâm không lờiSóng Đò: sóng nước lớn
BS_B3 Thợ Cả Đúc Chuônglò, búa rèn, xích, giáo (Rèn Phản = 3 âm rèn khác nhau theo vũ khí)Rèn Phản: 3 nhát rèn + tôi nước
BS_B4 Yvra & Rồng Khàngiáp kỵ, thương, rồng khàn (khò khè, mất giọng)Bổ Nhào: rít gió từ cao
BS_FINAL Vua DravosMũ Chuông: chuông câm (gõ ra "thịch" không ngân), áo choàng tro, thở nặngHồi Câm: mọi âm hero bị lọc 0.5 s; đòn cuối Hồi Chuông = tiếng chuông THẬT duy nhất của game (ngân 8 s)
BS_TRUE Cái Lặngkhông giọng; hút âm: âm khác bị "nuốt" (lowpass quét xuống) quanh nóLặng Nuốt Sân: tiếng chuông nhỏ báo rẻ kế (bịt, 660 Hz, attack 20 ms, AUD-01)

53. Âm nhạc

3.1 Hướng chung

  • Bảng nhạc cụ gốc: dây cung trầm (cello/bass bowed, méo nhẹ), trống khung/trống da, đe & chiêng (decay ngắn ở combat), kèn dăm kép, sáo trúc/xương, đàn gẩy một dây & dây buông, hợp xướng nguyên âm "a/o" (không lời có nghĩa, không trích kinh), drone bễ/harmonium trầm.
  • Cấm toàn game: chiptune sóng vuông làm lead, wobble/dubstep bass, nhạc điện tử EDM drop, giai điệu dân ca/tôn giáo có thật trích nguyên, lời hát có nghĩa, piano trữ tình kiểu phim.
  • Nhạc không theo slow-mo World (giữ tốc, chỉ lọc); không bị hitstop; pitch luôn 1.0.
  • Mọi cue combat nằm trong 1 lưới tempo cố định, stem dài bằng nhau, lặp mẫu-chính-xác (§11.3). Key gốc của game = D (Hồi I và Kết cùng D → vòng tròn truyện).

3.2 Bảng hướng nhạc theo khu (bpm/meter/key/nhạc cụ khoá)

Khu · cueBPM · nhịpKeyNhạc cụ (canon in đậm)Cảm xúcLeitmotif dùng
Tiêu đề · TITLE · màn tiêu đề + menu chính (Cài đặt/Credits mở từ đây giữ nguyên cue dưới SN_DRAFT)… MUS_title_mute_night66 tự doD Aeolianchuông câm (gõ "thịch"), hợp xướng xa, cello soloĐêm Câm, mất mátLM_BELL (vỡ), LM_DRAVOS
Hub · HUB · HUB_BELL_TOWER Tháp Chuông Gãy (mọi trạm ST_*) · S0 + stem GĐ Phục Dựng đã mở (GD1–… MUS_hub_bell_tower72 · 3/4F Lydian → D (GD5)lửa canh (ambience), đàn gẩy, kèn bầu, harmonium; mỗi GĐ Phục Dựng +1 stemấm, nghỉ ngơiLM_ULLA, LM_LEM; GD5: LM_BELL trọn vẹn
Bến giữa Hồi · DOCK · Bến Giữa Hồi (nút DOCK sau boss Hồi I–IV, ≤ 20 s, Sạp Rong + chở đò Calla sang Hồi… MUS_dock_crossing84 · 6/8D Dorianmái chèo (bộ gõ nước), sáo trúc, dây buôngtrôi, chuyển chươngLM_CALLA
B1 · EXPLORE/COMBAT · Hồi I B1 Đồi Mộ Tro · bản đồ + mọi nút CMB/ELT/CHL/RSC/EVT/SHP/RST/SEC c… MUS_b1_grave_hill132 · 4/4D Phrygiantrống khung + dây trầm, đe nhẹ phách 2–4, đàn gẩy 16 nốtdồn dập, u tốiLM_BELL vỡ (ostinato)
B2 · EXPLORE/COMBAT · Hồi II B2 Đầm Vải Liệm · bản đồ + mọi nút chiến/tiện ích B2 · lớp theo I MUS_b2_shroud_marsh96 · 6/8E Aeolianđàn một dây + gõ nước, trống cơm, hợp xướng nữ thấpnặng, ngộp, đung đưaLM_CALLA đảo (biến dạng)
B3 · EXPLORE/COMBAT · Hồi III B3 Lò Đúc Câm · bản đồ + mọi nút chiến/tiện ích B3 · lớp theo I MUS_b3_mute_foundry140 · 4/4C Phrygian dominantđe, chiêng, kèn đồng, bễ thổi (bass sidechain giả)công nghiệp, cuồng tínLM_FOUNDER
B4 · EXPLORE/COMBAT · Hồi IV B4 Thành Chuông Treo · bản đồ + mọi nút chiến/tiện ích B4 · lớp t… MUS_b4_hanging_city7/8 · 120 (2+2+3)B Aeolianhợp xướng + chuông (chuông trầm, AUD-01), timpani, dây cao tremolouy nghi, chóng mặtLM_DRAVOS (kèn), LM_YVRA
Kết B5 · FINALE · B5 Đỉnh Chuông Câm (Kết, act V): ải 60 s trộn quái 4 Hồi (lớp theo I) + BS_FINAL… MUS_finale_crown120 · 4/4D Aeolian → D Dorian (P3)chủ đề Varek + hợp xướng, toàn dàn; stem L4 = motif hero đang chơiđỉnh điểm, bi trángLM_H01 + LM_Hxx + LM_DRAVOS + LM_BELL
Bí mật B6 · SECRET · B6 Bờ Lặng (Bí mật, act VI, cần FLAG_SHORE_OPEN): ải 45 s quanh Tiếng Câm EN_B6_… MUS_quiet_shorekhông nhịpkhông key (drone A 55 Hz rất nhỏ)gần như im: nước, 1 giọng hum xa −36 LUFS; chỉ tell có âmtrống rỗng, rợnLM_SILENCE
Boss B1 · BOSS · nút BOS Hồi I · BS_B1 Người Gác Chuông · stem theo pha (không theo I) · P3 "Chuông… MUS_boss_b1_bell_warden120 · 4/4D Phrygiantrống khung lớn, búa đe, dây trầm, hợp xướng nambổn phận mù quángLM_BELL (đảo, chậm)
Boss B2 · BOSS · nút BOS Hồi II · BS_B2 Lão Lái Đò Không Bến · stem theo pha · P3 "Nước Dâng": S0 t… MUS_boss_b2_ferryman120 · 12/8 (chấm đen = 120)E Aeolianđàn một dây khuếch, trống nước, giọng ngâm không lờituyệt vọngLM_CALLA (thứ)
Boss B3 · BOSS · nút BOS Hồi III · BS_B3 Thợ Cả Đúc Chuông · stem theo pha · S2 có 3 biến thể theo … MUS_boss_b3_founder120 · 4/4C Phrygian dominantđe 3 tầng (Rèn Phản đổi lớp theo vũ khí), kèn đồng, chiêngcuồng tínLM_FOUNDER
Boss B4 · BOSS · nút BOS Hồi IV · BS_B4 Thống Lĩnh Yvra & Rồng Khàn · stem theo pha · P2 tách thân:… MUS_boss_b4_yvra120 · 4/4 (accent 3+3+2)B Aeolianhợp xướng, timpani, kèn kỵ binh, tiếng rồng khàn mẫu hoátrung thành bi kịchLM_YVRA, LM_DRAVOS
Mini-boss · GATE_MINI · nút MBS (Cổng) mọi biome · mọi MB_ (MB_B1_1, MB_B2_1, MB_B2_2, MB_B3_1, MB_B3… MUS_miniboss_gate120 · 4/4theo key biome (4 bộ stem chuyển giọng D/E/C/B)trống nặng, drone biome, ostinato ngắn 8 ôcổng nguy hiểm—
Chết · DEATH · hết Lửa Gửi trong run (mọi biome, mọi mode) · bắt đầu đồng bộ thẻ recap INV-16 = … MUS_death_epitaph60 tự doD Aeoliancello + chuông câm 1 tiếng, gióthua mà ấmLM_ULLA (ngắn)
Kết thường · ENDING · END_BELL_TOLL Hồi Chuông (Gióng chuông sau BS_FINAL) · phần tuyến tính 180 s = f… MUS_end_bell_toll76 · 4/4D major (duy nhất trưởng)toàn dàn + chuông thật ngângiải thoát, dư âm buồnLM_BELL trọn, LM_H01
Kết thật · ENDING · END_QUIET_SHORE Bến Bình Yên (hạ BS_TRUE ở B6) · 210 s tuyến tính đi cùng 12 thẻ… MUS_end_quiet_shore64 · 3/4D Lydian12 nhạc cụ 12 hero lần lượt vào, chuông lõibình yên12 LM_Hxx + LM_LEM + LM_BELL
Kết phụ · ENDING · END_ASH_CROWN Mũ Tro (chọn "Giữ lõi" ở BS_FINAL) · 120 s tuyến tính: hero đội Mũ… MUS_end_ash_crown56 · 4/4D Locrianchuông câm, hợp xướng thì thầm, dronecam chịuLM_DRAVOS (trên đầu hero)

H12 Ambrin: B1–B4 thay bằng 4 bộ stem 120 BPM EXPLORE/COMBAT · Hồi I B1 KHI CHƠI H12 Ambrin (thay MUS_b1_grave_hill; biomes[].music.h12… MUS_b1_grave_hill_h12 … EXPLORE/COMBAT · Hồi IV B4 khi chơi H12 (thay MUS_b4_hanging_city) · 7/8 → 4/4 120, giữ a… MUS_b4_hanging_city_h12 (canon). Mọi boss cue + mini + finale = 120 BPM nên dùng chung với máy nhịp, không cần bộ riêng (§3.6).

3.3 Leitmotif (nốt chuẩn; hoà âm/nhạc cụ tự do trong luật §3.1)

IdChủNốt (độ dài)Nhạc cụ chuẩnXuất hiện
LM_BELLĐại Chuông VọngD–A–G–D (trắng, trắng, đen, tròn) — quãng 5 xuống "hồi chuông"chuông lớn + hợp xướngtiêu đề (vỡ: thiếu nốt cuối), hub GD5, kết
LM_DRAVOSVua DravosA–G♯–G–F♯–F (bè trầm chromatic đi xuống, đen đều)kèn đồng trầm, celloB4, finale P1/P3, tiêu đề
LM_SILENCECái LặngE → B♭ (tritone) chỉ 2 nốt, nốt 2 bị cắt sau 1 pháchâm đảo ngược mờ (KHÔNG < 140 Hz, AUD-02)B6, finale cuối (gợi ý)
LM_ULLABà UllaF–G–A–C–A (3/4, ru)giọng hum nữ, đàn gẩyhub, chết
LM_CALLACallaD–E–F–A–G–F (6/8, chèo)sáo trúcdock, B2 (đảo), boss B2 (thứ)
LM_LEMNhóc LemA5–C6–D6–C6 (hộp nhạc)hộp nhạc, celesta gỗhub GD1+, kết thật
LM_HOLThầy Hol3 tiếng chuông bịt cùng cao độ D2, không giai điệuchuông bịt trầmhub ST_LEDGER
LM_GREMLão Gremnhịp đe 3+3+2 (không cao độ)đe nhỏhub ST_FORGE
LM_MOTTBà MottC–D–E♭–D–C láyđàn nguyệtSạp Rong (SHP), Chợ Đò
LM_RAMBù Nhìn RămG–F♯–G (lạc điệu, hài)sáo méo + mõSân Tập
LM_FOUNDERThợ CảC–D♭–E–F (Phrygian dominant, đen nhấn)kèn đồng + đeB3, boss B3
LM_YVRAThống Lĩnh YvraB–F♯–A–B (kèn kỵ, chấm dôi)kèn sừngB4, boss B4
LM_H01–LM_H1212 Kẻ Thứcbảng §2.3 cột Motifnhạc cụ chủ herochọn hero (stinger 3 s), Ult (stinger 1 ô), finale L4, kết thật

Luật motif: ≤ 6 nốt; nhận ra trong 2 s; không nhạc cụ trùng giữa 2 motif hero; motif hero không dùng nhạc cụ có partial 2.2–3.6 kHz decay dài (AUD-01).

3.4 Hệ nhạc thích nghi (class MusicDirector)

Stem chuẩn mỗi cue combat (biome/boss/mini/finale) — 5 stem, dài bằng nhau, cùng điểm lặp:

StemVaiVí dụ B1
S0 beddrone/pad, luôn chạydây cung trầm + hợp xướng "a" + drone bễ
S1 pulsenhịp nhẹtrống khung phách 1–3
S2 drivebộ gõ đầytom, đe phách 2–4, trống khung 16 nốt
S3 ostinatohình nốt lặpdây staccato + đàn gẩy 16 nốt
S4 leadgiai điệu/motifdây cung méo/kèn swell, LM_BELL vỡ

Tham số cường độ I (0–1), tính mỗi 0.25 s (Hero clock): I_raw = clamp01(0.50·D + 0.25·T + 0.15·E + 0.10·H)

  • D = min(alive_view, 200) / 200 — quái sống trong khung 480×270 art px quanh camera.
  • T = 0.5·(melee_tokens_used / 4) + 0.5·(proj_tokens_used / 3) — token INV-08 đang dùng.
  • E = 1 nếu Tinh Anh/mini/boss sống trong khung, else 0.
  • H = 1 nếu HP hero < 35%, else 0.
  • Làm mượt: lên τ_up = 1.0 s, xuống τ_down = 4.0 s (EMA). Ví dụ: 120 quái, 4/4 token cận chiến, 1/3 đạn, 1 Tinh Anh, HP 80% → 0.5·0.6 + 0.25·(0.5·1 + 0.5·0.333) + 0.15·1 + 0 = 0.30 + 0.167 + 0.15 = 0.617 → bật S0–S3, S4 chưa (ngưỡng 0.70) nhưng E = 1 ép S4 (bảng dưới).

Bảng lớp (hysteresis; đổi lớp chỉ ở vạch ô nhịp kế; vào 1 ô fade, ra 2 ô fade):

LớpBật khiTắt khiMức stem
S0luôn (trạng thái COMBAT/EXPLORE)—0 dB
S1I ≥ 0.15 hoặc EXPLOREI < 0.10 và không EXPLOREEXPLORE −6 dB, COMBAT 0 dB
S2I ≥ 0.40I < 0.320 dB
S3I ≥ 0.55I < 0.450 dB
S4I ≥ 0.70 hoặc E = 1I < 0.60 và E = 00 dB

Trạng thái nhạc (máy trạng thái):

StateVào khiStemThoát
TITLEmàn tiêu đềTITLE · màn tiêu đề + menu chính (Cài đặt/Credits mở từ đây giữ nguyên cue dưới SN_DRAFT)… MUS_title_mute_nightnhấn bắt đầu → fade 2 s
HUBvào HUB_BELL_TOWERHUB · HUB_BELL_TOWER Tháp Chuông Gãy (mọi trạm ST_*) · S0 + stem GĐ Phục Dựng đã mở (GD1–… MUS_hub_bell_tower S0 + stem GĐ đã mởtới ST_DOCK xuất phát → stinger depart
EXPLOREbản đồ, phòng tiện ích SHP/RST/EVT/SEC, phòng chiến chưa spawncue biome S0 + S1 (−6 dB); SHP thêm lớp LM_MOTTspawn đầu phòng → COMBAT ở vạch ô kế
COMBATphòng CMB/CHL/RSC/ELTcue biome theo Ixong phòng → stinger room_clear (2 ô) → EXPLORE
GATE_MINIMBSGATE_MINI · nút MBS (Cổng) mọi biome · mọi MB_ (MB_B1_1, MB_B2_1, MB_B2_2, MB_B3_1, MB_B3… MUS_miniboss_gate (key biome)thắng → stinger victory → EXPLORE
BOSSBOScue boss, S0–S4 theo pha (bảng dưới)thắng → stinger victory 4 ô → im 2 s → DOCK
DOCKBến Giữa HồiDOCK · Bến Giữa Hồi (nút DOCK sau boss Hồi I–IV, ≤ 20 s, Sạp Rong + chở đò Calla sang Hồi… MUS_dock_crossingchở đò → crossfade cue biome Hồi kế (8 s)
DRAFTmở draft/tạm dừng/menu trong runcue hiện tại tiếp tục, snapshot SN_DRAFT (lowpass 800 Hz, −6 dB)đóng → bỏ snapshot 0.3 s
DEATHhết Lửa Gửidừng cue (fade 0.5 s) → DEATH · hết Lửa Gửi trong run (mọi biome, mọi mode) · bắt đầu đồng bộ thẻ recap INV-16 = … MUS_death_epitaph"Thức Lại" → HUB/RUN
ENDINGEND_*cue kết tương ứng, không lặpcredit xong → TITLE

Chuyển cảnh (đều lượng tử hoá theo vạch ô nhịp, đồng hồ DSP AudioSettings.dspTime):

  • Cùng cue: bật/tắt stem tại vạch ô kế (≤ 1 ô trễ: ≤ 1.82 s ở 132 BPM, ≤ 2.0 s ở 120 BPM).
  • Khác cue cùng tempo: crossfade ở vạch ô kế, dài 1 ô.
  • Khác tempo: stinger thoát (≤ 2 ô) → cue mới bắt đầu ô 1 mẫu 0; không bao giờ trộn 2 tempo > 1 ô.
  • Vào BOSS: im 0.5 s (khoảnh khắc thở) → stinger boss_intro của cue boss đồng bộ với khung giới thiệu tên boss → S0+S1 vòng P1.

Stinger (asset con của cue, <cueId>__stg_<slug>; bus Music_Stinger; luôn đúng key cue; dài ≤ 4 ô):

SlugKhiCó ở cue
elite_inTinh Anh/Ấn xuất hiện (cùng chữ "TINH ANH XUẤT HIỆN")4 biome
surgeTIDE đợt mới, MESO dịch spawn, mutator kích hoạt4 biome
room_clearphòng xong4 biome + miniboss_gate
ash_readTro Nhớ đổi thế (đi kèm AshVariantOn (Tro Nhớ đổi thế: khựng 0.6 s + ◆ Mắt Tro, ≥ 1.0 s trước… SFX_SHARED_ash_read, khựng 0.6 s)4 biome + 4 boss + finale
boss_introvào trận boss4 boss + finale + quiet_shore
phase2 / phase3boss đổi pha (khoảnh khắc quỳ bất tử)4 boss + finale + quiet_shore
victoryhạ boss/mini4 boss + miniboss_gate + finale
departrời hub/ra bếnhub
hero_<Hxx>chọn hero ở ST_HEARTH (3 s, LM_Hxx)hub (12 stinger)
ult_<Hxx>Ult kích hoạt (1 ô, LM_Hxx trên S4 của cue đang chạy, trộn key cue)dùng chung: 12 stinger viết ở D, MusicDirector chọn bản chuyển giọng gần nhất (D/E/C/B: 48 file) [ASSUMED]

Boss — cue theo pha (mọi boss Hồi; finale/quiet_shore theo cột riêng):

PhaStemĐổi pha
P1S0 + S1 + S3—
P2+ S2, S3 đổi biến thể B (hình nốt nhanh gấp đôi)__stg_phase2 đúng lúc boss quỳ bất tử, nhạc cắt sang S0 1 ô rồi P2
P3 (BS_B1 Chuông Vỡ Hẳn; boss khác ở pha cuối)+ S4 (motif boss)__stg_phase3, 1 ô im trừ S0
Vỡ Thế bossS2 + S3 −6 dB trong 3 s, S4 giữ—
Boss windup tím chữ kýS1–S3 −3 dB suốt windup (để "ù" nổi)—
Hạ__stg_victory 4 ô, cắt mọi stem—

3.5 Đồng bộ H12 Ambrin (120 BPM)

3.6 Mẫu cue nhạc (FINAL) — mỗi cue 1 khối trong GDD/Full/data/audio_music.json (agent audio tạo; khoá field)

FieldKiểuĐịnh nghĩa
idstringMUS_<slug> snake_case (canon §11); bộ H12 = MUS_<slug>_h12
contextstringstate §3.4 + khu + điều kiện phát
bpm · meter · keysố · string · stringtempo cố định; meter 4/4, 6/8 (ghi rõ phách = chấm đen); key + mode
chordsfile<id>.chords.json: hợp âm từng ô (H12 chọn nốt kèn, ult stinger chọn bản chuyển giọng)
intro_bars · loop_bars · loop_samplesintloop_samples = round(loop_bars × beats_per_bar × 60 / bpm × 44100); intro là file riêng __intro
stemslistS0..S4 + biến thể (S3b, S4b1..b4, S4h01..h12); mỗi stem 1 file stereo, dài đúng loop_samples
adaptiveobjectngưỡng I hoặc bảng pha (§3.4); mặc định = bảng lớp chuẩn
stingerslistslug §3.4; mỗi stinger: độ dài ô, ô vào (next_bar/next_beat), cắt stem nào
transitionsobjectquantize (bar/beat), fade_in_bars 1, fade_out_bars 2, exit_to
leitmotifslistLM_*
bannedlisttimbre cấm riêng cue (ngoài §3.1)
mixobjectlufs_i_full (mọi stem, I = 1): −16 combat, −20 hub/dock, −24 death, −18 kết; true_peak −1 dBTP; ducked_by
filespathAssets/_Project/Audio/Music/<id>/<id>__S0.ogg …
statusenumbrief / demo / final / approved

Ví dụ đủ field — EXPLORE/COMBAT · Hồi I B1 Đồi Mộ Tro · bản đồ + mọi nút CMB/ELT/CHL/RSC/EVT/SHP/RST/SEC c… MUS_b1_grave_hill: context COMBAT/EXPLORE Hồi I B1 · 132 · 4/4 · D Phrygian, chords: i–♭II–i–♭VII lặp 4 ô · intro 2 ô (3.64 s) · loop 32 ô = 58.18 s = 2.565.818 mẫu · S0 dây cung trầm + hợp xướng "a" + drone bễ; S1 trống khung phách 1–3; S2 tom + đe phách 2–4 + trống khung 16 nốt; S3 dây staccato + đàn gẩy 16 nốt; S4 dây cung méo/kèn swell, LM_BELL vỡ (D–A–G, thiếu nốt D cuối) · adaptive chuẩn · stingers elite_in (2 ô), surge (1 ô), room_clear (2 ô), ash_read (1 ô, cắt S2–S4 trong 1 ô) · quantize bar, vào 1 ô, ra 2 ô, exit_to BOSS · nút BOS Hồi I · BS_B1 Người Gác Chuông · stem theo pha (không theo I) · P3 "Chuông… MUS_boss_b1_bell_warden qua im 0.5 s · banned: lead sóng vuông, hợp xướng có lời · mix −16 LUFS-I full, ducked_by ĐÁP −4 dB 0.4 s, stinger boss −6 dB 1 s · files Assets/_Project/Audio/Music/MUS_b1_grave_hill/MUS_b1_grave_hill__S0.ogg…__S4.ogg, __intro.ogg, __stg_elite_in.ogg.

3.7 Danh sách cue 1.0 (18 bản canon + 4 bộ stem H12) — 1 dòng/cue

id · state · bpm/meter/key · intro + loop (ô = giây) · stem · stinger · ghi chú

  1. TITLE · màn tiêu đề + menu chính (Cài đặt/Credits mở từ đây giữ nguyên cue dưới SN_DRAFT)… MUS_title_mute_night · TITLE · 66 tự do / D Aeolian · loop 90 s (không lưới) · S0 + S4 · — · cũng dùng teaser MS01 "Đêm Câm".
  2. HUB · HUB_BELL_TOWER Tháp Chuông Gãy (mọi trạm ST_*) · S0 + stem GĐ Phục Dựng đã mở (GD1–… MUS_hub_bell_tower · HUB · 72 3/4 / F Lydian (GD5 → D) · loop 40 ô = 100.0 s · S0 + 5 stem GĐ (GD1 hộp nhạc LM_LEM, GD2 đàn nguyệt chợ, GD3 kèn bầu, GD4 dây, GD5 chuông LM_BELL) · depart, hero_H01..H12 · 18 hộp nhạc (Nến Canh) = phát lại 18 cue này ở hub.
  3. DOCK · Bến Giữa Hồi (nút DOCK sau boss Hồi I–IV, ≤ 20 s, Sạp Rong + chở đò Calla sang Hồi… MUS_dock_crossing · DOCK · 84 6/8 (chấm đen = 84) / D Dorian · loop 16 ô = 22.86 s · S0–S2 · — · crossfade 8 s sang cue Hồi kế.
  4. EXPLORE/COMBAT · Hồi I B1 Đồi Mộ Tro · bản đồ + mọi nút CMB/ELT/CHL/RSC/EVT/SHP/RST/SEC c… MUS_b1_grave_hill · EXPLORE/COMBAT B1 · 132 4/4 / D Phrygian · 2 + 32 ô = 58.18 s · S0–S4 · elite_in, surge, room_clear, ash_read · ví dụ §3.6.
  5. EXPLORE/COMBAT · Hồi II B2 Đầm Vải Liệm · bản đồ + mọi nút chiến/tiện ích B2 · lớp theo I MUS_b2_shroud_marsh · B2 · 96 6/8 (chấm đen = 96) / E Aeolian · 2 + 48 ô = 60.0 s · S0–S4 · như B1 · LM_CALLA đảo trên S4.
  6. EXPLORE/COMBAT · Hồi III B3 Lò Đúc Câm · bản đồ + mọi nút chiến/tiện ích B3 · lớp theo I MUS_b3_mute_foundry · B3 · 140 4/4 / C Phrygian dominant · 2 + 32 ô = 54.86 s · S0–S4 · như B1 · đe ở S2 decay ≤ 150 ms (AUD-01).
  7. EXPLORE/COMBAT · Hồi IV B4 Thành Chuông Treo · bản đồ + mọi nút chiến/tiện ích B4 · lớp t… MUS_b4_hanging_city · B4 · 7/8 đen = 120 (2+2+3) / B Aeolian · 2 + 32 ô = 56.0 s · S0–S4 · như B1 · chuông trầm ≤ 600 Hz.
  8. BOSS · nút BOS Hồi I · BS_B1 Người Gác Chuông · stem theo pha (không theo I) · P3 "Chuông… MUS_boss_b1_bell_warden · BOSS BS_B1 · 120 4/4 / D Phrygian · 1 + 32 ô = 64.0 s · S0–S4 + S3b · boss_intro, phase2, phase3, ash_read, victory · P3 "Chuông Vỡ Hẳn".
  9. BOSS · nút BOS Hồi II · BS_B2 Lão Lái Đò Không Bến · stem theo pha · P3 "Nước Dâng": S0 t… MUS_boss_b2_ferryman · BOSS BS_B2 · 120 12/8 (chấm đen = 120) / E Aeolian · 1 + 32 ô = 64.0 s · S0–S4 + S3b · như #8 · P3 Nước Dâng: S0 thêm sóng nước.
  10. BOSS · nút BOS Hồi III · BS_B3 Thợ Cả Đúc Chuông · stem theo pha · S2 có 3 biến thể theo … MUS_boss_b3_founder · BOSS BS_B3 · 120 4/4 / C Phrygian dominant · 1 + 32 ô = 64.0 s · S0–S4 + S2 3 biến thể (búa/xích/giáo theo Rèn Phản) · như #8.
  11. BOSS · nút BOS Hồi IV · BS_B4 Thống Lĩnh Yvra & Rồng Khàn · stem theo pha · P2 tách thân:… MUS_boss_b4_yvra · BOSS BS_B4 · 120 4/4 accent 3+3+2 / B Aeolian · 1 + 32 ô = 64.0 s · S0–S4 + S3b · như #8 · P2 tách thân: S4 tách 2 bè (Yvra kèn / rồng khàn mẫu).
  12. GATE_MINI · nút MBS (Cổng) mọi biome · mọi MB_ (MB_B1_1, MB_B2_1, MB_B2_2, MB_B3_1, MB_B3… MUS_miniboss_gate · GATE_MINI · 120 4/4 / 4 bộ key D/E/C/B · 1 + 16 ô = 32.0 s · S0–S3 × 4 key · room_clear, victory · dùng cho mọi MB_.
  13. FINALE · B5 Đỉnh Chuông Câm (Kết, act V): ải 60 s trộn quái 4 Hồi (lớp theo I) + BS_FINAL… MUS_finale_crown · B5 ải + BS_FINAL · 120 4/4 / D Aeolian → D Dorian · 2 + 32 ô = 64.0 s · S0–S3 + S4 (LM_DRAVOS) + S4b1..b4 + S4h01..h12 · boss_intro, phase2, phase3, ash_read, victory · đòn cuối = chuông thật ngân 8 s.
  14. SECRET · B6 Bờ Lặng (Bí mật, act VI, cần FLAG_SHORE_OPEN): ải 45 s quanh Tiếng Câm EN_B6_… MUS_quiet_shore · B6 + BS_TRUE · không nhịp / drone A · loop 120 s · S0, S1 (tim 60 BPM), S4h01..h12 (P3) · boss_intro, phase2, phase3 · P2 tắt nhạc.
  15. DEATH · hết Lửa Gửi trong run (mọi biome, mọi mode) · bắt đầu đồng bộ thẻ recap INV-16 = … MUS_death_epitaph · DEATH · 60 4/4 / D Aeolian · loop 12 ô = 48.0 s · S0 + S4 · — · bắt đầu đồng bộ thẻ recap INV-16.
  16. ENDING · END_BELL_TOLL Hồi Chuông (Gióng chuông sau BS_FINAL) · phần tuyến tính 180 s = f… MUS_end_bell_toll · ENDING END_BELL_TOLL · 76 4/4 / D major · 180 s tuyến tính + credit loop 32 ô = 101.05 s · stereo full · — · chuông thật mở bài.
  17. ENDING · END_QUIET_SHORE Bến Bình Yên (hạ BS_TRUE ở B6) · 210 s tuyến tính đi cùng 12 thẻ… MUS_end_quiet_shore · ENDING END_QUIET_SHORE · 64 3/4 / D Lydian · 210 s tuyến tính · 12 lớp nhạc cụ hero vào lần lượt · — · đi cùng 12 thẻ kết theo hero.
  18. ENDING · END_ASH_CROWN Mũ Tro (chọn "Giữ lõi" ở BS_FINAL) · 120 s tuyến tính: hero đội Mũ… MUS_end_ash_crown · ENDING END_ASH_CROWN · 56 4/4 / D Locrian · 120 s tuyến tính · stereo full · — · chuông câm "thịch" thay chuông thật.

19–22. EXPLORE/COMBAT · Hồi I B1 KHI CHƠI H12 Ambrin (thay MUS_b1_grave_hill; biomes[].music.h12… MUS_b1_grave_hill_h12 · EXPLORE/COMBAT · Hồi II B2 khi chơi H12 (thay MUS_b2_shroud_marsh) · 6/8 96 → 12/8 chấm đ… MUS_b2_shroud_marsh_h12 · EXPLORE/COMBAT · Hồi III B3 khi chơi H12 (thay MUS_b3_mute_foundry) · 140 → 120, hi-hat k… MUS_b3_mute_foundry_h12 · EXPLORE/COMBAT · Hồi IV B4 khi chơi H12 (thay MUS_b4_hanging_city) · 7/8 → 4/4 120, giữ a… MUS_b4_hanging_city_h12 · B1–B4 khi chơi H12 · 120 (B2 12/8 chấm đen = 120; B4 4/4 accent 3+3+2) / key như gốc · 2 + 32 ô = 64.0 s · S0–S4 + stinger như gốc · không tính vào 18 bản (canon "+ 4 bộ stem").

64. SFX — đặt tên, mẫu spec, khuôn sự kiện

4.1 Đặt tên (canon §11)

4.2 Mẫu spec SFX (FINAL) — 1 hàng/sự kiện trong GDD/Full/data/audio_sfx.csv (agent audio tạo; khoá cột)

FieldKiểuĐịnh nghĩa / giá trị hợp lệ
idstringSFX_<ownerId>_<slug>
owneridchủ; SHARED/UI/HUB cho âm chung
hookstringEventName phát (§12) + điều kiện (vd HeroAttackCut khi move=A1)
framestringframe kích: cut (frame chém), contact, windup_start, T-0.12, spawn, end; hoặc event
kindenumswing hit cast shot impact explode tell_y tell_p answer move vocal loop ui_short ui_jingle stinger amb_spot
layerstexttransient (0–6 ms, chất liệu) / body (150–450 Hz trọng lượng, chất liệu) / tail (lấp lánh, phòng); mỗi lớp 1 chất liệu; tối đa 3
length_msinttổng; one-shot ≤ 1.500 ms trừ ult/boss ≤ 4.000
variantsint≥ 3 cho mọi âm lặp (hit, swing, shot, step, death); 1 cho UI/stinger
pitch_rand · vol_rand% · dBmặc định ±6% · ±1.5 dB; tell ±1% · 0 dB
priority0–255Unity AudioSource.priority, 0 = cao nhất (bảng §5.3)
max_voices · cooldown_ms · stealint · int · enumtrần voice cho id; khoảng tối thiểu giữa 2 lần; oldest/quietest/none
spatialenumcenter (hero, UI) / screen_pan (pan theo x màn ±0.6, suy giảm §5.5) / screen_pan_full (tell trợ năng)
clockenumWorld (pitch theo slow-mo §5.7) / Hero / UI (không pitch)
busenumnhóm mixer §5.1
ducks · ducked_bytextid snapshot/send (§5.6)
lufs_mmaxdBmomentary-max BS.1770 (cửa sổ 400 ms) theo bảng §4.3; đỉnh ≤ −1 dBTP; onset ≤ 12 ms (trừ swell/charge)
loop · loop_start · loop_endbool · mẫu · mẫuloop mẫu-chính-xác; file loop không fade đầu/cuối
tell_classenumY / P / N / none (âm Y/P chỉ được là asset tell chung hoặc lớp phụ ≤ −12 dB so với nó)
asset_refidtrỏ âm chung (SFX_SHARED_*) khi dùng lại; rỗng = âm riêng
sourceenumreuse / freesound / synth / foley / outsource
brieftextvật gì, chất liệu gì, làm gì, vào gì, cỡ nào + "KHÔNG được nghe như …"
freesound_querytextquery + bộ lọc (license, max_duration, single_event, sort, min_num_ratings)
synth_recipetextrecipe create-sfx + element + tham số (--pitch --life --tint --seed)
credittextdòng credit CC BY (rỗng nếu CC0/synth)
status · verdictenumbrief/sourced/mastered/wired/final · pending/ok/redo (nghe theo lô)

Ví dụ đủ field — HeroAttackCut heroId=H01 moveIndex=1 (H01_COMBO_A_1; H01_UL3_ECHO dư … SFX_H01_a1_swing: owner H01 · hook HeroAttackCut move=A1 · frame cut (cả khi hụt) · kind swing · layers: transient 4 ms cạo thép sáng 3–6 kHz / body 120 ms whoosh bandpass 400–1.800 Hz quét xuống / tail 80 ms ngân sống lưỡi ~2.4 kHz ở −18 dB (decay ≤ 60 ms → hợp lệ AUD-01) · 220 ms · 4 biến thể, ±6%, ±1.5 dB (A2 = gốc +4%; A3 = HeroAttackCut heroId=H01 moveIndex=3 (H01_COMBO_A_3, H01_HEAVY_1 Bổ C… SFX_H01_a3_swing riêng) · priority 40, max 2, cooldown 60 ms, steal oldest · center · clock World · bus HeroAttack · ducked_by send Answer · −19 LUFS mmax · loop no · tell none · source freesound · brief "lưỡi liềm thép mỏng chém không khí, nhanh, nhẹ; KHÔNG nghe như dao phay nặng, quạt máy, tiếng zip hoạt hình" · query "sword whoosh swing fast blade", license cc0, max_duration 0.6, single_event, sort rating_desc, min_num_ratings 5 · synth fallback dash_whoosh --element neutral --tint metal · status final · verdict pending.

4.3 Mục tiêu độ to theo loại (PC; momentary-max, trước bus fader)

KindLUFS mmaxDàiBiến thểCooldown mặc định
tell_y "tinh"−14220 ms1 (±1%)0 (token giới hạn)
tell_p swell (đỉnh)−16= windup3 độ dài0
answer (lớp chung + hero)−12 (tổng)250–450 ms380 ms
hero swing−19150–300 ms460 ms
hero hit (1 mục tiêu)−20120–250 ms450 ms (≤ 3/50 ms, demo)
hero cast kỹ năng−17300–900 ms2–3150 ms
hero ult−131.0–4.0 s1–2—
enemy swing (không tell)−25150–300 ms380 ms
enemy vocal−26200–800 ms4250 ms
kill crunch đơn / cụm / gặt−24 / −20 / −17150 / 300 / 500 ms4 / 3 / 325 / 100 / 250 ms
explode nhỏ / lớn−20 / −16400 / 900 ms380 ms
boss chữ ký−15≤ 2.5 s2—
ui_short / ui_jingle−22 / −1660–300 ms / 0.8–2.0 s1–3 / 140 ms / —
vocal hero (gắng sức)−20150–500 ms5400 ms
amb loop / spot−30 / −26 (LUFS-I loop)≥ 20 s / 1–6 s— / 4— / 3 s

4.4 Khuôn sự kiện theo chủ (sinh audio_sfx.csv từ khuôn; số khớp canon §10.3)

Hero — 28 sự kiện/hero × 12 = 336 (slug cố định, Hxx thay id):

#SlugFrame/hookGhi chú
1–3a1_swing a2_swing a3_swingcut mỗi đòn chuỗi (hero chuỗi dài hơn: đòn 4+ dùng a2 pitch +4%/bước)đòn kết chuỗi = a3 (nặng)
4hitcontactchất liệu vũ khí; gộp bầy §6
5combo_specialnhánh combo chữ ký (H01 Đánh sau Lướt · H02 Xoay Quan · H03 cắm sào · H04 đổi thế Tách/Ghép · H05 giật đe về · H06 ném bowling · H07 Tên Hồi · H08 phản ứng cặp ổ (9 lớp) · H09 Ném Bó · H10 Châm · H11 lấp hố · H12 khúc 4 phách)
6dashLướt frame 0lớp hero trên HeroDash frame 0 (lớp chung dưới SFX_{H}_dash) SFX_SHARED_dash_base
7answerĐÁP thành cônglớp hero trên HeroAnswerSuccess (lớp chung dưới SFX_{H}_answer) + send Answer SFX_SHARED_answer_core
8counterđòn COUNTER sau ĐÁP (Phản đòn, Dội, ném…)
9–11hold_start hold_loop hold_endverb giữ RB/RMBloop dừng ngay khi thả/huỷ (INV-11)
12–14res_gain res_full res_spendtài nguyên tăng (cooldown 120 ms) / đạt ngưỡng (Cuồng Lưu, 6 Đinh, 3 Vang, 5 Mực, Đà 100, Chảy, Đỉnh Hơi, ổ đầy, 6 Vòng, 5 Khói, 5 Đất, 16 Nhịp) / xả
15–22SK01_cast … SK08_castkỹ năng (owner = Hxx_SKnn, vd SkillCast skillId=H01_SK01 rank=I|II|III (+ lớp __impact khi trúng; H… SFX_H01_SK01_cast); va chạm riêng = lớp __impacthạng II–III = cùng âm + lớp sweetener (biến thể)
23–25UL1_* UL2_* UL3_*Ult (slug riêng, canon vd UltActivate ultId=H01_UL1 (H01_UL1_BLINK 8 nhát + H01_UL1_BURST trăng… SFX_H01_UL1_moon); kèm stinger ult_Hxxduck §5.6
26–28vo_effort vo_hurt vo_deathgắng sức (≤ 1/1.2 s) · trúng đòn · chếtgiọng không lời §9
  • Dạng Rèn AS2/AS3 đổi vũ khí → bộ biến thể thay cho #1–#4 (+8 file/hero), không thêm id. Đòn Vọng (BS_TRUE/EN_B6_01) = âm kỹ năng hero + lọc đảo (§5.6 fx_reverse_tint), 0 âm mới.

Quái thường + Tinh Anh — 5 sự kiện × 39 = 195: atk (thân đòn không phải tell; mỗi đòn _Ann 1 lớp con __A01…) · impact (đạn/đòn trúng) · vocal (aggro/idle, cooldown 250 ms toàn loài) · hurt (chỉ Tinh Anh phát mỗi lần; quái thường gộp vào hit của hero) · death (Tinh Anh riêng; quái thường = asset_ref → kill_* + lớp chất liệu biome). Tell luôn là asset chung (AUD-03). Mini/boss/kết — 8 sự kiện × 13 = 104: intro · move_loop · sig_a · sig_b · sig_c (3 đòn chữ ký; đòn khác = lớp con __Ann) · phase · broken (Vỡ Thế) · death. BS_B3 sig_a có 3 lớp búa/xích/giáo; BS_FINAL sig_c = Hồi Chuông thật; BS_TRUE phase = nuốt âm. Nhóm khác — lõi canon 95: hệ thống SFX_SHARED_* nhóm S (27, §8) · UI 29 (§7) · HUB 13 (§7.2) · hazard 14 (§10.2) · trạng thái 6 loop SFX_STS_<NAME>_loop · ambience 6 bed RunStart/ActChanged biome=B1 + RoomStart B1 (phòng ngoài trời) SFX_B1_amb_bed…BiomeEnter biome=B6 (cảnh đò giây 9) → loop tới BS_TRUE P2; fader bus… SFX_B6_amb_bed (hub bed trong HUB). Nhóm khác — mở rộng theo data AV (2026-11-07) +150 → 245: UI +8 (§7.1, data/av/UI.json) · HUB +16 (§7.2, ENV_HUB.json) · hazard +32 (§10.2, tổng 46) · bed hầm B1 +1 (§10.1) · spot ambience biome 29 (§10.1) · đạo cụ/mục tiêu/phòng/cảnh biome 64 (§10.3). Tổng: 336 + 195 + 104 + 245 = 880 = canon ~880 (DEC-2026-11-07-17; nhóm khác = lõi 95 + 150 mở rộng). Nhóm R của SHARED (30 asset, §8) là nguồn "dùng lại" của sự kiện hero/quái, không cộng thêm id. Ngoài 880 (không phải sự kiện SFX): nhạc 18 + 4 bộ H12 · stinger nhạc (asset con); click máy nhịp H12 = biến thể click của HeroResource heroId=H12 kind=gain (Nhịp +1/+2) · nhạc công Trống Sóng… SFX_H12_res_gain.

75. Mixer Unity, ưu tiên, voice, suy giảm, ducking, độ to

5.1 Cây bus (Assets/_Project/Audio/Mixer/BW_Main.mixer, 1 AudioMixer; fader mặc định)

GroupChaFaderHiệu ứng (thứ tự)Exposed param
Master—0 dBHighpass Simple 25 Hz → Compressor (thr −10 dB, ratio 3:1, attack 10 ms, release 120 ms) → Compressor-giới hạn (thr −2 dB, ratio 20:1, attack 1 ms, release 50 ms)vol_master
MusicMaster−4 dBLowpass (snapshot), Duck Volume (nhận send Answer, Ult, VO, TellP)vol_music, music_lp_hz
Music_StemMusic0——
Music_StingerMusic−2 dB——
AmbienceMaster−8 dBLowpass (snapshot), Duck Volume (nhận VO)vol_amb
SFXMaster0 dBDuck Volume (nhận Answer)vol_sfx
HeroAttackSFX0——
HeroDefenseSFX+2 dBSend Answer (khi answer phát)—
HeroSkillSFX0Send Ult (khi Ult)—
EnemySFX−6 dBDuck Volume (nhận TellY, TellP, Ult)—
EnemyCrowdEnemy−2 dBCompressor (thr −18 dB, 4:1) — "keo" đám đông—
EnemyHeavyEnemy0— (Tinh Anh/mini/boss)—
EnemyTellSFX+3 dBSend TellY/TellP; miễn duck và snapshot bóp (AUD-03)vol_tell (Trợ năng, sàn −6 dB)
WorldSFX−3 dBhazard, đạo cụ, mục tiêu—
StatusSFX−6 dBloop trạng thái—
UIMaster−2 dBbỏ qua pausevol_ui
VOMaster0 dBSend VOvol_vo

Ghi chú: Unity không có fader trên send-receive riêng; Duck Volume cài: threshold −30 dB, ratio 4:1 (mức giảm đích ở §5.6 đạt bằng attenuation của từng duck), attack 5 ms, release theo bảng §5.6.

  • Luật B6 Bờ Lặng (2026-11-07, từ biomes/B6.json): khi hero ở B6 (act VI), fader HeroAttack và HeroSkill = −6 dB so với mặc định (đặt thẳng exposed param qua AudioSettingsService, chuyển 1.0 s khi vào/ra; không thêm snapshot); cộng dồn với SN_WEDGE/SN_MUTE_SKILL nếu chúng bật. HeroDefense (ĐÁP) và EnemyTell giữ nguyên mức (INV-02, AUD-03). Đi kèm: send reverb mọi bus = 0 ở B6 (§10.1). [ASSUMED, khớp codex Bờ Lặng CDX_b6 "nhỏ hơn một nửa"].
  • Giá trị bus trong data AV (enum schema) → group mixer: Tell → EnemyTell · Stinger → Music_Stinger · EnemyHorde → EnemyCrowd · Boss → EnemyHeavy · Hero → HeroAttack · các giá trị trùng tên (Master Music SFX HeroAttack HeroDefense Enemy World Ambience UI VO) → group cùng tên. Kỹ năng hero vào HeroSkill theo hook SkillCast/UltActivate (§12.2), không theo field bus.

5.2 Snapshot (chuyển 0.15 s trừ khi ghi khác)

SnapshotKhiThay đổi
SN_DEFAULTchơinhư §5.1
SN_DRAFTdraft/tạm dừng/menu trong runMusic LP 800 Hz −6 dB · SFX −12 dB · Ambience LP 1.200 Hz · UI 0
SN_HUBhubMusic −6 dB (dưới lửa + giọng NPC) · Ambience −4 dB
SN_BOSS_INTRO2.0 s khung tên bossSFX −8 dB · Ambience −12 dB
SN_DEATHchếtSFX LP 600 Hz −10 dB trong 1.5 s → −40 dB · Music → DEATH · hết Lửa Gửi trong run (mọi biome, mọi mode) · bắt đầu đồng bộ thẻ recap INV-16 = … MUS_death_epitaph
SN_SWALLOWBS_TRUE P2 "Nuốt Tiếng"MỌI bus trừ EnemyTell/UI: LP 400 Hz, −18 dB; Music −80 dB (canon "SFX bóp trừ tell")
SN_WEDGEhero trong rẻ quạt BS_TRUE P1HeroAttack/HeroSkill/HeroDefense −40 dB ("không âm"), EnemyTell giữ
SN_MUTE_SKILLHồi Câm BS_FINAL / Tiếng Câm EN_B6_02 (câm kỹ năng)HeroSkill LP 300 Hz −12 dB cho tới hết câm
SN_SMALL_SPEAKERtuỳ chọn "Loa nhỏ" / tự đề xuất trên Deck không tai ngheMaster HP 150 Hz, Compressor thr −16 dB 4:1, EnemyTell +2 dB

5.3 Ưu tiên (Unity priority, 0 = cao) & giới hạn voice (Project Settings › Audio: Real Voices 64, Virtual 256, DSP buffer Best latency = 256 mẫu)

NhómPriorityVoice thật tối đaCooldown/throttleSteal
Tell Y (tinh, glint1)07 (= token 4 cận chiến + 3 đạn)—none (dành chỗ)
Tell P (swell, proj)15 (= token tím ≤ 5)—none
ĐÁP / Né Hoàn Hảo / Phản2280 msoldest
Ult hero / boss chữ ký53—quietest
Music stem + stinger812 (2 cue × 5 stem khi crossfade + 2 stinger)—none
Hero swing/skill/combo20660 ms/idoldest
Hero hit (gộp §6)3043/50 msoldest
Boss/mini/Tinh Anh (EnemyHeavy)40680 ms/idquietest
VO hero/NPC452400 msoldest
Kill (gộp §6)6044/100 msoldest
Explode/slam70380 msquietest
Enemy thường atk/vocal/impact (EnemyCrowd)100680 ms/id, vocal 250 ms/loàiquietest
World/hazard11041.0 s/id (nhịp ≥ 1.0 s INV-18)quietest
UI120440 msoldest
Ambience bed + spot1504spot 3 squietest
Status loop1603—quietest
Pickup (XP/vàng/máu)1802gộp chuỗi 0.5 soldest

Trần nhóm cộng = 77 > 64 (cố ý): khi đầy, Unity ảo hoá nguồn priority cao số nhất trước (Pickup → Status → Ambience → EnemyCrowd). Tổng chỗ dành: 7 + 5 + 2 + 3 + 12 = 29 voice không bao giờ bị cướp; còn 35 cho phần còn lại; mục tiêu p95 voice thật ≤ 56 khi 250 quái + Ult (AP2). Pool AudioSource: 48 one-shot + 12 music + 4 ambience (thay 24 nguồn round-robin của demo).

5.4 Ngân sách tell đồng thời (từ token INV-08)

Cận chiến ≤ 4 windup nhắm hero (≤ 2 khi Elite/Boss windup) + ≤ 3 loạt đạn → ≤ 7 "tinh" chồng; tím sàn ≤ 5 tổng. Hai "tinh" trong 40 ms → phát cả hai nhưng cái sau −3 dB và +1 bán cung (không gộp: mỗi tell là 1 thông tin). Đòn Y×n: mỗi nhịp 1 "tinh" riêng (INV-02).

5.5 Suy giảm khoảng cách (góc 3/4, không 3D)

  • spatialBlend = 0 cho mọi nguồn; pan bằng panStereo; không Doppler, không reverb theo vị trí.
  • Khoảng cách d đo trên mặt sàn (x, z) bằng art px từ hero (người nghe = hero, không phải camera, để tâm luôn đúng nhân vật). Màn 480×270 art px; tầm sàn nửa ngang 240.
  • Pan: pan = clamp((x_src − x_hero) / 240, −1, 1) × 0.6 (screen_pan); × 1.0 khi screen_pan_full.
  • Gain: d ≤ 120 → 0 dB · 120 < d ≤ 300 → tuyến tính dB tới −12 dB · d > 300 (ngoài màn) → −18 dB và CHỈ phát nếu priority ≤ 40; tell ngoài màn: −6 dB tối đa (không bao giờ dưới), pan đầy, "tinh" +2 bán cung (trợ năng bật).
  • Trục dọc màn bị nén 0.5 (screenY = z·0.5): khoảng cách tính bằng z thật, nên quái trên/dưới cách 60 px màn = 120 px sàn → đúng cảm giác 3/4.
  • Hero và UI: center, không suy giảm.

5.6 Ducking / sidechain

Nguồn (send)ĐíchMứcAttack / giữ / nhả
Answer (ĐÁP, Né Hoàn Hảo, Phản)SFX trừ HeroDefense + EnemyTell−8 dB5 ms / 250 ms / 200 ms
AnswerMusic−4 dB10 ms / 400 ms / 400 ms
Ult (hero Ult toàn anim)Music −6 dB · Enemy −6 dB20 ms / theo anim / 500 ms
TellYEnemyCrowd−3 dB2 ms / 150 ms / 150 ms
TellPEnemyCrowd −4 dB · Music −2 dB50 ms / tới va chạm / 300 ms
Boss windup tím chữ kýMusic S1–S3 −3 dB (MusicDirector, §3.4)theo windup
VO (bark/giọng NPC/hero)Music −4 dB · Ambience −3 dB30 ms / theo clip / 300 ms
Stinger boss_intro/phaseMusic_Stem −6 dB20 ms / 1.0 s / 500 ms
  • fx_reverse_tint (Đòn Vọng của bóng hero/Gương Lặng): âm kỹ năng hero phát qua Enemy + Lowpass 2.5 kHz + pitch −2 bán cung; tell của đòn đó vẫn dùng asset tell chung.

5.7 Đồng hồ & slow-mo

  • clock = World: pitch = max(0.75, 0.5 + 0.5 × worldScale) (World 25% Né Hoàn Hảo → 0.625 → kẹp 0.75); hitstop KHÔNG đổi pitch.
  • clock = Hero / UI / Music / VO / EnemyTell: pitch 1.0 cố định.
  • Lịch tell: PlayScheduled(dspNow + (t_impact − 0.12 − t_now)/worldScale − outputLatency − audioOffsetMs); tính lại mỗi frame nếu worldScale đổi trong windup.
  • Tạm dừng: mọi nguồn World/Hero pause; UI ignoreListenerPause = true; nhạc tiếp tục dưới SN_DRAFT.

5.8 Độ to chương trình & tuỳ chọn người chơi

ĐoMục tiêuCách đo
Combat (Hồi I, 5 phút, 150–250 quái)−16 LUFS-I ±1thu Master offline (Sfx offline mix của demo)
Hub/menu−18 LUFS-I ±13 phút hub
Đỉnh≤ −1 dBTPtoàn bộ phiên
LRA combat6–12 LU—
Loa nhỏ (SN_SMALL_SPEAKER)−14 LUFS-I, LRA ≤ 6Steam Deck loa trong

Tuỳ chọn: Master/Music/SFX/Ambience/UI/VO 0–100% (bước 5) · Âm tell 50–150% (sàn −6 dB) · Dải động: Rộng / Thường (mặc định) / Hẹp (= SN_SMALL_SPEAKER) · Mono · Âm tell theo vị trí · Phụ đề tell · Click nhịp H12 · Hiệu chỉnh trễ âm −100..+100 ms (màn gõ theo nhịp 8 lần, lấy trung vị) · Tắt âm khi cửa sổ mất focus (mặc định bật).

86. Luật bầy (horde) — gộp, lớp, ngẫu nhiên (class HordeAudio, chạy cuối frame sau Combat)

6.1 Gộp cú trúng của hero (mỗi frame, mỗi nguồn sát thương)

n = số mục tiêu hero trúng trong frame từ 1 đòn/1 sóng VFX (sóng lan §6.1 demo: đếm theo frame mặt sóng chạm).

nPhátMức thêmGhi chú
1SFX_<Hxx>_hit0
2–5SFX_<Hxx>_hit + HeroHitBatch n = 2–5 (cộng +1.5 × log2(n) dB, ≤ +3.5) SFX_SHARED_hit_multi+1.5 × log2(n) dB (≤ +3.5)1 voice mỗi lớp
≥ 6SFX_<Hxx>_hit + HeroHitBatch n ≥ 6 (cộng +3 × log2(n/3) dB, trần +6) SFX_SHARED_hit_mass+3 × log2(n/3) dB, trần +6hit_mass có thân trầm 80–200 Hz
chí mạng trong cụm+ HeroHitBatch critCount ≥ 1 (1 lần/frame) SFX_SHARED_hit_crit 1 lần/frame0không nhân theo số chí mạng
Tinh Anh/boss trong cụm+ HeroHitBatch hasHeavyTarget=true (Tinh Anh/mini/boss trong cụm) + đòn… SFX_SHARED_hit_heavy riêng (bus EnemyHeavy)0luôn nghe được đòn vào kẻ lớn
  • Throttle sau gộp: ≤ 3 lần phát hit / 50 ms toàn cục (demo canon); vượt → cộng n vào lần kế (không mất cảm giác "nặng").
  • INV-10: frame có ≥ 1 cú trúng của hero mà bị throttle → lần phát kế dời ≤ 1 frame, không bỏ hẳn.

6.2 Kill-crunch (cửa sổ trượt 100 ms)

k = số quái thường chết trong 100 ms gần nhất.

kLớp phát (1 lần cho cả cửa sổ)Mức
1kill_crunch (xương gãy + tro phụt, chất liệu biome qua lớp __B1..B6)−24
2–4kill_crunch × 2 lệch 15–35 ms ngẫu nhiên + rắc xương−22
5–11kill_cluster (đã trộn sẵn 4–6 lớp) + 1 kill_crunch−20
≥ 12kill_reap (thump trầm 60 Hz + mưa xương + tro "xào") ≤ 1/250 ms + kill_cluster−17
  • Cao độ kill_crunch: ngẫu nhiên ±8%; khi chuỗi gặt liên tục ≥ 2 s (≥ 12 kill/100 ms mỗi lần) → kill_reap lên +1 bán cung mỗi 2 s, tối đa +3, về 0 sau 1.5 s không gặt (thưởng cảm giác dọn bầy, P2 canon).
  • Tinh Anh/mini chết: luôn phát death riêng (không gộp) + EnemyKilled Tinh Anh+/mini (tan dither 0.4 s, sau death riêng) SFX_SHARED_corpse_dissolve.
  • Xác Trương EN_B1_05 nổ dây chuyền: gộp như explode — ≤ 3 explode_s / 80 ms, còn lại cộng mức +2 dB vào lần kế.

6.3 Âm quái thường trong bầy

  • Bước chân: KHÔNG có âm từng con. HordeAudio mỗi frame: crossfade 4 lớp theo alive_view 0–20/20–80/80–1… SFX_SHARED_crowd_bed (loop 4 lớp: ít/vừa/đông/rất đông) crossfade theo alive_view: 0–20 / 20–80 / 80–160 / 160–250, mỗi biome 1 lớp chất liệu (bảng §2.4), bus EnemyCrowd −30 → −22 LUFS.
  • vocal aggro/idle: mỗi loài ≤ 1 / 250 ms toàn cục, ≤ 3 voice tổng; chọn con gần hero nhất trong khung.
  • atk (thân đòn không tell): chỉ con đang giữ token mới phát (token = đúng những con nguy hiểm) → ≤ 7 + quái không token im.
  • hurt quái thường: không phát (cú trúng của hero đã đủ).
  • Spawn: spawn_ash ≤ 2 voice; ≥ 6 ấn spawn trong 0.3 s → 1 lần spawn_ash +3 dB (đợt TIDE nghe như 1 đợt sóng).

6.4 Ngẫu nhiên & chống lặp

  • Biến thể: chọn ngẫu nhiên không lặp lại biến thể vừa phát (round-robin xáo trộn, "shuffle bag").
  • Pitch ±6% / vol ±1.5 dB mặc định; quái thường ±8% / ±2 dB; tell ±1% / 0 dB; UI 0%.
  • Lệch thời gian (micro-offset) cho lớp gộp: 0–20 ms ngẫu nhiên để 2 lớp không trùng pha.
  • Seed: dùng RNG riêng âm thanh (không dùng RNG gameplay → không ảnh hưởng seed DAILY).

6.5 Kiểm hiệu năng âm (Lát Chịu Tải MS01b)

Kịch bản MS01b (250 quái + H01 Ult + 1 Tinh Anh + MESO) trên Steam Deck: CPU audio thread ≤ 1.0 ms/frame p95 · voice thật p95 ≤ 56 · 0 clipping Master (đỉnh ≤ −1 dBTP) · HordeAudio ≤ 0.10 ms/frame main thread · 0 cấp phát GC/frame.

97. UI & hub

7.1 UI (37 sự kiện SFX_UI_* = 29 lõi + 8 thêm 2026-11-07; bus UI; clock UI; chất liệu giấy/gỗ/đồng nhỏ, AUD-01; spec đủ field ở data/av/UI.json)

IdKhiÂm (≤ 1 dòng)LUFS
UiNavigate (focus đổi; cooldown 40 ms khi giữ hướng) SFX_UI_nav_movedi chuyển focusgõ gỗ nhỏ khô 30 ms−26
UiConfirm (A / Enter / click trái) SFX_UI_nav_confirmxác nhậngiấy gấp + gỗ "cộc"−22
UiBack (B / Esc / click phải) SFX_UI_nav_backquay lạigiấy lật ngược−24
UiError (hành động không được phép: thiếu tiền, khoá, ô đầy) SFX_UI_nav_errorkhông được phépgỗ bịt 2 nhịp trầm−22
UiTabSwitch (LB/RB, Q/E, click tab) SFX_UI_tab_switchđổi tab (LB/RB)lật trang sổ−24
UiSliderStep (mỗi bước thanh trượt; pitch = −6..+6 bán cung theo giá … SFX_UI_slider_tickthanh trượt mỗi bướctích gỗ nhỏ, pitch theo giá trị−28
UiHoldStart → loop cháy dần (1.0 s mặc định) → UiHoldComplete 'phụt';… SFX_UI_hold_confirmgiữ để xác nhận (loop + chốt)tro cháy dần + "phụt"−22
UiPopupOpen / UiPopupClose (biến thể 01 open, 02 close) SFX_UI_popupmở/đóng popup (2 biến thể open/close)vải phủ / vải kéo−24
UiPause open/close (Start / Esc; snapshot SN_DRAFT; UI ignoreListener… SFX_UI_pausemở/đóng tạm dừngchuông gió trầm 1 tiếng (≤ 600 Hz)−22
DraftOpen (sau LevelUp; 3 thẻ rút ra lệch 60 ms; snapshot SN_DRAFT) SFX_UI_draft_openmở draft (3 thẻ)3 lá giấy rút ra lệch 60 ms−20
UiCardHover (focus/rê sang thẻ trong draft, shop, chọn Relic) SFX_UI_card_hoverrê thẻgiấy sột nhẹ−28
DraftPick rarity=COMMON|RARE|EPIC (biến thể 01 COMMON, 02 RARE, 03 EP… SFX_UI_card_pickchọn thẻ thường/hiếmgiấy dập + tro loé; RARE/EPIC thêm lớp ấm−18
DraftPick rarity=LEGENDARY (Then Chốt) hoặc chọn thẻ Tiến Hoá SFX_UI_card_pick_legendchọn Then Chốt/LEGENDARYdập + hợp xướng 1 hợp âm ngắn−16
DraftPick/hiện thẻ Relic Lời Nguyền RL049–RL060 SFX_UI_card_cursedthẻ/Relic Lời Nguyềngiấy cháy xèo + thì thầm−18
DraftReroll (Đổi, biến thể 01) · DraftBanish (Xoá, 02) · DraftHold (G… SFX_UI_card_editĐổi · Xoá · Giữ (3 biến thể)xào bài · xé giấy · kẹp giấy−20
SkillLearned / SkillSwapped / SkillRankUp (draft SKILL, hub chọn 2 kỹ… SFX_UI_skill_learnhọc/đổi/nâng hạng kỹ năngdập ấn gỗ + motif hero 2 nốt−18
MapOpen (sau phòng xong / nút bản đồ) SFX_UI_map_openmở bản đồcuộn giấy dài−22
MapNodeChosen (chọn nút CMB/ELT/CHL/EVT/SHP/RST/SEC/RSC/MBS/BOS/DOCK) SFX_UI_map_nodechọn nút bản đồmực chấm−22
LevelQueued (pip '+N cấp chờ' trên HUD khi lên cấp giữa giao tranh) SFX_UI_level_queuepip "+N cấp chờ"nhịp tro nhỏ−26
CurrencyChanged delta>0 curId ∈ {CUR_SOUL_ASH 01, CUR_ECHO_SHARD 02, … SFX_UI_currency_gaincộng Tro Hồn/Mảnh Vọng/Nến Canh (biến thể theo CUR_*)tro rơi · mảnh đồng va (nhiễu) · sáp nhỏ giọt−20
CurrencyChanged delta<0 (mọi tiền meta; Phục Dựng, nâng trạm, mở hero… SFX_UI_currency_spendtiêu tiền metatro thổi bay−20
UnlockGranted (hero 01 · Dạng Rèn 02 · ult 03 · mode 04 · trang codex… SFX_UI_unlockmở hero/Dạng Rèn/ult/mode/trang codex (biến thể)rèn 1 nhát + hợp âm ấm−16
MasteryRankUp (lên MR01–MR20 / xong TT1–TT5) SFX_UI_mastery_ranklên MR / xong TTtrống khung 2 nhịp + motif hero−16
AchievementUnlocked (ACH_*; toast góc phải trên) SFX_UI_achievementthành tựuchuông câm "thịch" + tro sáng−18
DeathRecapLine / dòng 'Tro đã học' (INV-16), 1 lần/dòng, cách ≥ 0.25 s SFX_UI_recap_linemỗi dòng recap INV-16 / "Tro đã học"bút lông gạch−24
EpitaphShown (bia mộ đóng dấu cuối recap, TMB_Hxx) SFX_UI_epitaphbia mộ đóng dấuđá khắc 2 nhát−18
MourningBandChanged (buộc/cởi MRN01–MRN15: lớp vải; tổng Độ Tang đổi:… SFX_UI_mourning_bandbuộc/cởi Khăn Tang (biến thể theo MRN) + tổng Độ Tang đổivải thắt nút; tổng: trống khung trầm−20
ScoreCount (đếm điểm DAILY/ENDLESS/BOSS_RUSH; pitch +1 bán cung mỗi 1… SFX_UI_score_tickđếm điểm DAILY/ENDLESS/BOSS_RUSHtích gỗ tăng nhịp, pitch +1 bán cung/10%−24
BarkShown (mỗi 3 ký tự 1 blip; 8 bộ: 7 NPC + hero; giọng NPC lấy SFX_… SFX_UI_bark_blipchữ bark hiện (mỗi 3 ký tự 1 blip; 8 bộ biến thể: 7 NPC + hero)blip giọng không lời ngắn 40 ms−28
SkillCastDenied (input kỹ năng khi đang hồi chiêu; HUD nháy ô 0.2 s, … SFX_UI_skill_deniedSkillCastDenied: bấm kỹ năng đang hồi (HUD nháy ô 0.2 s)gỗ bịt 1 nhịp 220 Hz, decay 40 ms; nhỏ hơn nav_error 4 dB−26
LinchpinTaken (nhặt Then Chốt H{xx}_E37–E40; callout 'THEN CHỐT: <tên… SFX_UI_linchpinLinchpinTaken: nhặt Then Chốt E37–E40 (callout "THEN CHỐT: <tên>" 1.0 s)ấn ngà dập + hợp âm treo D–G–A dây gảy 700 ms + tro sáng; sau card_pick_legend 0.4 s nếu từ draft−16
ResonanceCallout tier=I ('CỘNG HƯỞNG: <tên>' 1.2 s) SFX_UI_resonance_1ResonanceCallout bậc I ("CỘNG HƯỞNG: <tên>" 1.2 s)2 nốt hoà âm gỗ-dây quãng 5, 300 ms (lớp UI, khác ResonanceTriggered (Cộng Hưởng bậc I/II kích, trong combat) SFX_SHARED_resonance)−18
ResonanceCallout tier=II ('CỘNG HƯỞNG II: <tên>' 1.2 s) SFX_UI_resonance_2ResonanceCallout bậc II ("CỘNG HƯỞNG II: <tên>")3 nốt hoà âm (thêm quãng 8), 300 ms + gió lửa nhẹ−17
EvolutionFuse (draft đóng → World ×0 0.8 s EVO1–3 / 1.5 s EVO4; 2 ico… SFX_UI_evo_fuseEvolutionFuse: 2 icon nguồn bay vào nhau (World ×0 0.8 s EVO1–3 / 1.5 s EVO4)2 nhát rèn chạm (decay ≤ 60 ms) + lửa lò phồng + tôi nước xèo; 01 EVO1–3 1.2 s, 02 EVO4 1.5 s; trước EvolutionTriggered (Tiến Hoá trên hero sau khi màn draft đóng) SFX_SHARED_evolution−16
HeroSelected (Lửa Canh: xác nhận hero / ult / Dạng Rèn / 2 kỹ năng kh… SFX_UI_hero_selectHeroSelected ở Lửa Canh (biến thể 01 hero, 02 loadout ult/Dạng Rèn/2 kỹ năng)lửa canh "phụt" + motif LM_<hero> 1 nốt gảy dây, 300 ms−18
ShopPurchase (Sạp Rong SHP/DOCK, mua bằng Vàng Mã; Chợ Đò mở pool dùn… SFX_UI_shop_buyShopPurchase: mua ở Sạp Rong SHP/DOCK bằng Vàng Mã (hết tiền = nav_error; Chợ Đò mở pool = currency_spend)giấy tiền đặt xuống + Bà Mott tặc lưỡi đếm 2 tờ, 220 ms−20
RewardPanelOpen (thưởng phòng: chọn Relic 1/2 hoặc 1/3 ELT_RISK, thẻ … SFX_UI_reward_revealRewardPanelOpen: bảng thưởng phòng (Relic 1/2 hoặc 1/3 ELT_RISK, thẻ kỹ năng, Lễ Vật) + bảng tiền meta cuối runvải đỏ xỉn kéo khỏi khay gỗ + tro sáng 3–6 kHz 80 ms, 280 ms (khác draft_open)−20

Luật UI: không âm UI nào > 300 ms trừ unlock/mastery_rank/achievement/card_pick_legend/linchpin/evo_fuse (≤ 2.0 s); điều hướng nhanh liên tục → nav_move cooldown 40 ms; đọc thẻ < 3 s (P5) → âm thẻ không che giọng đọc màn hình.

7.2 Hub (29 sự kiện = 13 lõi SFX_HUB_* + 16 SFX_ENV_HUB_* thêm 2026-11-07; bus World/Ambience; spec đủ field ở data/av/ENV_HUB.json)

SceneLoaded Hub_BellTower (phát suốt; lớp GD1–GD5 bật theo FLAG Phục … SFX_HUB_amb_bed (lửa canh lép bép + sông + gió qua tháp gãy; lớp GD1–GD5 cộng dồn: đèn chuông thử, chợ đông, lò rèn xa, vải tủ áo, chuông treo lại hum 98 Hz) · HubWake: hero ngồi dậy cạnh Lửa Canh (t=0 frame 0 clip wake) SFX_HUB_hearth_wake (thức dậy: hít sâu + lửa bùng) · GremStrike (idle 6–9 s, nhịp 3+3+2 = LM_GREM) SFX_HUB_forge_strike (Grem rèn, LM_GREM 3+3+2) · ForgeUnlock (rèn mở hero): 3 nhát cách 0.3 s + tôi nước t=0.9 s SFX_HUB_forge_unlock (rèn mảnh hero: 3 nhát + tôi nước) · DepartConfirmed ở ST_DOCK (t=0 cảnh 6 s) SFX_HUB_dock_depart (đò rời bến, mái chèo) · LedgerPageTurn (Hol idle 8–12 s; đổi tab/trang Sổ Tang) SFX_HUB_ledger_page (Sổ Tang lật trang) · TestBellStruck (INTERACT Chuông Thử, đổi Nến Canh, buộc Khăn Tang) SFX_HUB_test_bell (Chuông Thử gõ — chuông trầm 196 Hz, AUD-01) · MarketPurchase + Mott idle đếm tiền (10–14 s) SFX_HUB_market (Bà Mott đếm tiền giấy + ghế kẽo kẹt) · YardDummyHit (đòn hero trúng NPC_RAM) SFX_HUB_yard_dummy (bù nhìn rơm trúng đòn, biến thể Y/P cho bài tập dùng đúng asset tell) · WardrobeOpen / SkinEquipped SFX_HUB_wardrobe (vải tang giũ) · RestoreStageBought GD1–GD5 (t=0 cảnh) SFX_HUB_restore_stage (Phục Dựng GĐ: 4 s, gỗ dựng + lửa + LM_BELL 1 nốt thêm mỗi GĐ) · FastTravel t=0 (rời chỗ cũ) SFX_HUB_fast_travel (tro cuốn) · BarkShown speaker=NPC_* (1 lần khi bark mở) SFX_HUB_npc_murmur (giọng không lời, 7 bộ biến thể = 7 NPC, §9).

108. Thư viện SHARED (57 mục SFX_SHARED_<slug>; R = nguồn dùng lại cho sự kiện hero/quái, S = sự kiện hệ thống tính trong nhóm Khác §4.4)

#IdNhómMô tả 1 dòng (timbre · dài · LUFS)
1tell_y_glint1Rping kim loại nhẹ, glint 1 · 120 ms · −22
2tell_y_tinhR"tinh" chuông tay đồng-thiếc 2.8 kHz, đỉnh T−0.12 s · 220 ms · −14
3tell_p_swellR"ù" gong đảo ngược + sub 45 Hz, co giãn theo windup · 0.45/0.8/1.2 s + sustain · −16
4tell_p_impactRthump trầm va chạm tím · 120 ms · −18
5tell_p_projRloop ù 90 Hz AM 6 Hz cho đạn tím · loop · −22
6tell_feintRgỗ khô "cạch" + hít hơi, nhịp lừa · 150 ms · −20
7answer_coreRlớp thành công ĐÁP: "xoẹt" trắng nóng đi lên + thump · 300 ms · −14
8answer_whiffRhụt ĐÁP: vải quất rỗng + gỗ bịt (báo khoá 0.30 s) · 200 ms · −22
9perfect_dodgeRNé Hoàn Hảo: gió hút ngược ngắn + nhịp tim chậm (World 25%) · 400 ms · −16
10dash_baseRLướt: vút không khí trung tính · 180 ms · −22
11poise_breakRVỡ Thế: nứt giáp lớn + rơi bass 1 quãng 8 · 700 ms · −14
12shield_breakRvỡ khiên (shieldbreak, ĐÁP vào khiên Y) · 450 ms · −16
13shield_blockRđòn bị khiên địch chặn: gỗ-đồng bịt · 150 ms · −22
14hit_fleshRtrúng thịt khô/tro · 140 ms · −21
15hit_boneRtrúng xương rắc · 140 ms · −21
16hit_heavyRtrúng nặng (A3, đòn vào Tinh Anh+) · 250 ms · −18
17hit_critRlớp chí mạng: nứt sáng + "!" (không vàng tell, AUD-01) · 120 ms · −20
18hit_multiRlớp gộp 2–5 trúng · 200 ms · −20
19hit_massRlớp gộp ≥ 6 trúng, thân trầm · 300 ms · −17
20kill_crunchRchết đơn: xương gãy + tro phụt, lớp biome · 150 ms · −24
21kill_clusterRchết 5–11 trộn sẵn · 300 ms · −20
22kill_reapRchết ≥ 12: thump 60 Hz + mưa xương · 500 ms · −17
23explode_sRnổ nhỏ (Xác Trương, bom) · 400 ms · −20
24explode_lRnổ lớn · 900 ms · −16
25slam_groundRnện đất/tiếp đất nặng · 500 ms · −17
26proj_enemy_fireRđịch bắn cầu/đạn (lớp chất liệu theo quái) · 250 ms · −24
27proj_enemy_hitRđạn địch chạm · 150 ms · −24
28proj_reflectRđạn bị ĐÁP dội ngược, lõi trắng · 300 ms · −18
29hero_hurt_impactRhero trúng đòn (không lời; giọng ở vo_hurt) · 200 ms · −16
30footstep_heroRbước hero, 6 bề mặt (đất, đá, nước nông, gỗ, xỉ sắt, tro) × 4 biến thể · 80 ms · −30
31dash_rechargeSlượt Lướt nạp lại (0.70 s): tích nhẹ · 60 ms · −28
32hero_low_hpSHP < 25%: tim đập loop 72 BPM, lowpass nhẹ SFX · loop · −24
33hero_deathShero chết: tro sụp + chuông câm "thịch" · 1.5 s · −14
34revive_emberSLửa Gửi hồi sinh + sóng r120 · 1.2 s · −14
35spawn_ashSấn tro spawn 0.6 s (INV-14), xì tro nhẹ, không tell · 600 ms · −26
36summon_vortexSxoáy trung tính 1.0 s (triệu hồi boss/Tinh Anh), gió xoáy KHÔNG swell trầm · 1.0 s · −22
37corpse_dissolveSxác Tinh Anh+ tan dither 0.4 s · 400 ms · −24
38zone_n_loopSvùng đọng N: xèo/sủi rất nhỏ, không onset · loop · −30
39crowd_bedSlê chân đám đông 4 lớp mật độ × lớp biome · loop · −30…−22
40ghost_coreSlõi ma #9ff3ff: lấp lánh thuỷ tinh lạnh nhiễu 3–9 kHz · loop · −34
41xp_pickupSnhặt XP: hạt tro sáng, pitch +1 bán cung mỗi nhặt trong chuỗi 0.5 s (tối đa +12) · 60 ms · −26
42gold_pickupSVàng Mã: giấy tiền sột · 80 ms · −26
43heal_orbScầu máu/hồi phục: hơi ấm + thở ra · 400 ms · −22
44level_upSlên cấp: lửa canh bùng + hợp âm D · 1.0 s · −16
45relic_chestSmở rương Relic: nắp gỗ + tro sáng · 900 ms · −17
46ult_readySDư Âm đầy: ngân hợp âm thấp 1 lần (không lặp) · 700 ms · −18
47ult_coreSlớp mở Ult chung: hút không khí + nhịp tim tắt · 500 ms · −15
48resonanceSCộng Hưởng kích: 2 nốt hoà âm của motif hero · 600 ms · −17
49evolutionSTiến Hoá: rèn + hợp xướng ngắn · 1.5 s · −15
50ash_readSTro Nhớ đổi thế (khựng 0.6 s + Mắt Tro): thì thầm tro hạt 1–4 kHz + 1 nhịp tim · 1.0 s · −16
51ash_mesoScallout MESO đầu phòng: tro cuộn xa · 800 ms · −20
52elite_affixSTinh Anh có Ấn xuất hiện (lớp theo EM01–EM16 = biến thể) · 800 ms · −17
53status_applySgây trạng thái (6 biến thể theo STS) · 200 ms · −22
54stun_loopSđịch choáng: rung ù 180 Hz tremolo (không swell, không tonal cao) · loop · −28
55objective_bellSchuông mục tiêu BELLS + chuông làng/hiệu (biến thể): đồng lớn 220 Hz ngân 2 s, transient gỗ (AUD-01) · 2.0 s · −15
56room_clearSphòng xong: tro lắng + lửa nhỏ (kèm stinger nhạc) · 900 ms · −18
57door_openSlối ra mở: đá/gỗ trượt · 700 ms · −20

119. Bark & giọng (VO) — chính sách

MụcLuật
Lời có nghĩa0 câu thoại đọc ở 1.0 (canon §13). Mọi thoại = chữ (bark ≤ 1 dòng + phụ đề), 10 ngôn ngữ ở 1.0 qua loc; không cần ghi âm theo ngôn ngữ
Hero (12)chỉ giọng không lời: vo_effort (gắng sức, 5 biến thể, ≤ 1/1.2 s, chỉ trên đòn nặng/kỹ năng/Ult), vo_hurt (5, cooldown 400 ms), vo_death (2). Không la hét ở mỗi nhát thường
NPC (7)BarkShown speaker=NPC_* (1 lần khi bark mở) SFX_HUB_npc_murmur = lầm rầm/ngân không lời theo giọng NPC (Ulla hum trầm ấm · Grem càu nhàu + ho · Calla thở dài ngắn · Hol lẩm bẩm không tròn chữ (điếc) · Lem cười khúc khích nhỏ · Mott tặc lưỡi đếm tiền · Răm rơm sột + giọng mũi hài); phát 1 lần khi bark mở + BarkShown (mỗi 3 ký tự 1 blip; 8 bộ: 7 NPC + hero; giọng NPC lấy SFX_… SFX_UI_bark_blip theo chữ
Bossgiọng không lời §2.4 (thở, gầm, ngâm); thẻ "X nhớ: bạn Gạt 72%" + 48 đối đáp hero↔boss = chữ, kèm 1 tiếng giọng boss
Kẻ địchgrunt/vocal chung loài (§6.3); không câu chữ
Ngôn ngữ giảKHÔNG tạo ngôn ngữ bịa có cấu trúc (tránh loc ngầm); murmur phải không nhận ra được âm tiết của ngôn ngữ thật nào
Ghi âmdiễn viên giọng thuê theo giờ hoặc giọng nhóm, ký hợp đồng chuyển nhượng quyền toàn cầu, mọi nền tảng; không giọng AI tổng hợp
Text barkhiện trên đầu nhân vật, pixel font, ≤ 1 dòng (≤ 48 ký tự EN), sống 2.5 s + 0.05 s/ký tự; ≤ 1 bark/4 s trong combat; ưu tiên: boss > Tro Nhớ callout > NPC > hero
Phụ đềbark + "NÓ ĐÃ ĐỌC BẠN: <thói quen>" + phụ đề tell (trợ năng) cùng hệ chữ; cỡ 100–150%
Ngân sáchhero 12 × 12 file = 144 · NPC 7 × 6 = 42 · boss/mini 13 × 6 = 78 (trong 8 sự kiện boss) · tổng ~264 file giọng không lời

1210. Ambience & hazard theo biome

10.1 Bed ambience (1 loop stereo ≥ 60 s/biome, SFX_<Bn>_amb_bed, bus Ambience, −30 LUFS-I) + spot ngẫu nhiên (sự kiện amb_spot riêng theo data/av/ENV_*.json, AmbienceSpot chọn 1 spot / 6–14 s, pan ngẫu nhiên ±0.6)

BiomeBedSpot (4–6)Cấm
B1 Đồi Mộ Trogió đồi khô qua cỏ, tro rơi xào nhẹ, hầm mộ vang thấp (Sân Hầm Tro: phòng đá)quạ khàn xa (gốc), bia đá nứt, xích cổng mộ, lửa ma lép bépchuông làng kêu trong bed (chuông chỉ là hazard)
B2 Đầm Vải Liệmnước nông vỗ, côn trùng đêm, vải ướt đung đưa, tre kẽo kẹtếch trầm, đò mục va, giọt nước, bọt bùntiếng mưa to che tell
B3 Lò Đúc Câmlò ầm 40–120 Hz ổn định (không swell, AUD-02), băng chuyền xa, xì hơibúa xa, xích cẩu, xỉ rơi, khuôn nguội "tách"đe ngân dài, chuông
B4 Thành Chuông Treogió vực cao, xích căng rên, chuông lớn rất xa (hum ≤ 150 Hz, ổn định)cờ phần phật, đá rơi xuống vực, cầu treo kẽo kẹt, chim thanchuông gió cao
B5 Đỉnh Chuông Câmtro rơi ngược (nhiễu đảo nhẹ, năng lượng > 1 kHz), gió đỉnh, vành chuông hum 55 Hz ổn địnhđồng xỉn co nhiệt, tro xoáyswell trầm
B6 Bờ Lặnggần im: nước gương liếm bờ −40 LUFS, không reverb, không vang ("không vọng" canon)1 giọt nước, 1 hơi thở xamọi tiếng vọng; reverb trên mọi bus khi ở B6 = 0; HeroAttack/HeroSkill −6 dB (§5.1)

Id bed + spot (7 bed + 29 spot; spec đủ field ở data/av/ENV_<Bn>.json):

BiomeBedSpot (amb_spot, bus Ambience)
B1RunStart/ActChanged biome=B1 + RoomStart B1 (phòng ngoài trời) SFX_B1_amb_bed · RoomStart B1 phòng hầm (crypt_yard, ossuary_ring, twin_crypts, cocoon… SFX_B1_amb_crypt_bed (phòng hầm crypt_yard/ossuary_ring/twin_crypts/cocoon_chapel, crossfade 1.5 s)AmbienceSpot biome=B1 (1 spot / 6–14 s, pan ngẫu nhiên ±0.6) · hoặc d… SFX_B1_amb_crow (gần dead_tree: 1 lần, pan theo cây) · AmbienceSpot biome=B1 (1 spot / 6–14 s, pan ngẫu nhiên ±0.6) SFX_B1_amb_stone_crack · AmbienceSpot biome=B1 (1 spot / 6–14 s, pan ngẫu nhiên ±0.6) SFX_B1_amb_gate_chain · AmbienceSpot biome=B1 (1 spot / 6–14 s, pan ngẫu nhiên ±0.6) · gần lò… SFX_B1_amb_ghostfire (ưu tiên trong 120 px lò lửa ma) · AmbienceSpot biome=B1 (1 spot / 6–14 s, pan ngẫu nhiên ±0.6) SFX_B1_amb_ash_gust
B2BiomeEnter B2 (mọi phòng B2 trừ cảnh tiện ích có bed riêng nhẹ hơn −3… SFX_B2_amb_bedAmbienceSpot B2 (bộ chọn spot: 1 spot/6–14 s, pan ±0.6, không phát tr… SFX_ENV_B2_spot_frog · AmbienceSpot B2 SFX_ENV_B2_spot_boat_knock · AmbienceSpot B2 + VFX_ENV_B2_drip_ring SFX_ENV_B2_spot_drip · AmbienceSpot B2 SFX_ENV_B2_spot_mud_bubble · AmbienceSpot B2 (ưu tiên khi phòng có ENV_B2_shroud_line) SFX_ENV_B2_spot_shroud_flap · AmbienceSpot B2 SFX_ENV_B2_spot_reed_rustle
B3BiomeEnter biome=B3 (vào phòng B3, fade 1.0 s) SFX_B3_amb_bedAmbienceSpot biome=B3 (lớp __spot của bed) mỗi 6–14 s SFX_ENV_B3_spot_hammer · AmbienceSpot biome=B3 mỗi 6–14 s SFX_ENV_B3_spot_crane_chain (−8 dB dưới móc cẩu, LP 3 kHz) · AmbienceSpot biome=B3 mỗi 6–14 s SFX_ENV_B3_spot_slag_fall · AmbienceSpot biome=B3 mỗi 6–14 s SFX_ENV_B3_spot_mold_crack · AmbienceSpot biome=B3 mỗi 6–14 s SFX_ENV_B3_spot_steam_far
B4BiomeEnter B4 → loop tới khi rời phòng (crossfade 1.5 s) SFX_B4_amb_bedAmbienceSpot biome=B4 (1 spot / 6–14 s, pan ngẫu nhiên ±0.6, trọng số… SFX_ENV_B4_spot_flag · AmbienceSpot biome=B4 (trọng số 20) + VFX_ENV_B4_rockfall_dust SFX_ENV_B4_spot_rockfall · AmbienceSpot biome=B4 (trọng số 25) SFX_ENV_B4_spot_bridge_creak · AmbienceSpot biome=B4 (trọng số 15) SFX_ENV_B4_spot_coal_crow · AmbienceSpot biome=B4 (trọng số 15) SFX_ENV_B4_spot_chain_clink
B5BiomeEnter biome=B5 (mọi phòng B5 trừ RM_B5_under_bell): bed SFX_B5_a… SFX_B5_amb_bed (mọi phòng B5 trừ Gầm Đại Chuông RM_B5_under_bell)AmbienceSpot biome=B5 (1 spot / 6–14 s, pan ngẫu nhiên ±0.6) SFX_ENV_B5_spot_bronze_tick · AmbienceSpot biome=B5 (1 spot / 6–14 s, pan ngẫu nhiên ±0.6) SFX_ENV_B5_spot_ash_swirl · AmbienceSpot biome=B5 (1 spot / 6–14 s, pan ngẫu nhiên ±0.6) SFX_ENV_B5_spot_dome_grit · AmbienceSpot biome=B5 (1 spot / 6–14 s, pan ngẫu nhiên ±0.6) SFX_ENV_B5_spot_chain_settle
B6BiomeEnter biome=B6 (cảnh đò giây 9) → loop tới BS_TRUE P2; fader bus… SFX_B6_amb_bedAmbienceSpot biome=B6: 1 spot / 6–14 s, pan ngẫu nhiên ±0.6 SFX_ENV_B6_spot_drop · AmbienceSpot biome=B6 (không phát trong r300 quanh EN_B6_02 để tránh … SFX_ENV_B6_spot_breath (không phát trong r300 quanh EN_B6_02) · AmbienceSpot biome=B6 SFX_ENV_B6_spot_pebble · AmbienceSpot biome=B6, chỉ khi hero trong 500 px quanh ENV_B6_last_fe… SFX_ENV_B6_spot_ferry_creak (chỉ trong 500 px quanh Đò cuối của Calla cập bến S: thân gỗ sơn tối, mũi cong, ván lên bờ 1 … ENV_B6_last_ferry)

Spot: cấm partial tonal 2.2–3.6 kHz decay > 60 ms (AUD-01) và swell < 140 Hz (AUD-02).

10.2 Hazard (46 sự kiện = 14 lõi + 32 thêm 2026-11-07 theo data/av/ENV_*.json; theo INV-18: dùng đúng Y/P/N, nhịp ≥ 1.0 s, trúng cả quái)

IdHazardLớp tellÂm riêng (thêm vào asset tell chung)
HazardTrigger hazardId=HZ_B1_open_grave (nắp bật cuối ấn tro 0.6 s; n… SFX_B1_hz_open_graveMộ Mở sinh quái— (spawn INV-14)đất mộ bật nắp + spawn_ash
HazardTrigger hazardId=HZ_B1_bell (ngân sau sway 0.25 s; cũng nguồn r… SFX_B1_hz_village_bellchuông làng gõ được → choáng r100— (do hero kích)đồng 220 Hz ngân 2 s (= objective_bell biến thể) + sóng
HazardTrigger hazardId=HZ_B1_collapse (lớp va chạm; tell P = SFX_SHAR… SFX_B1_hz_floor_collapsesàn sụpPđất sụt + đá rơi tại va chạm
HazardTrigger (phase windup → impact) HZ_B2_gas / wisp_pocket / wisp_… SFX_B2_hz_gas_pockettúi khí ma trơi nổ r60Pbọt sôi tăng → "phụt" lửa xanh
HazardTrigger (phase impact) HZ_B2_bridge / HZ_B2_bamboo_bridge; lớp … SFX_B2_hz_bamboo_collapsecầu tre sập 1.0 sPtre gãy loạt
FootstepHero/FootstepEnemyCluster khi chân trong ô HZ_B2_water / HZ_B… SFX_B2_hz_wadenước nông −15%—bước lội (thay bước hero/quái trong vùng)
HazardTrigger hazardId=HZ_B3_pour phase=impact (va chạm t=0; lớp thêm… SFX_B3_hz_pour_bronzerót đồngPđồng chảy xèo + hơi
HazardTrigger hazardId=HZ_B3_conveyor phase=state (loop khi đoạn băng… SFX_B3_hz_conveyorbăng chuyền 24 px/s—loop xích con lăn, ổn định
HazardTrigger hazardId=HZ_B3_hook phase=impact (hero bám móc t=0) SFX_B3_hz_crane_hookmóc cẩu (Lướt vào = quét bầy)—xích vụt + móc quét
HazardTrigger hazardId=HZ_B3_mold phase=impact (va chạm t=0) SFX_B3_hz_mold_dropkhuôn chuông rơiPkhuôn sắt rơi "rầm" (không ngân)
HazardTrigger hazardId=HZ_B4_wind phase=windup t = 0 (1.0 s trước thổ… SFX_B4_hz_wind_gustgió đẩy 30 px/s, cờ báo 1.0 s— (báo cờ)cờ phần phật mạnh lên 1.0 s → gió ào
HazardTrigger hazardId=HZ_B4_pendulum phase=impact t = 0 (lớp phụ ≤ −… SFX_B4_hz_pendulum_bellchuông con lắc quétPxích kẽo + chuông lớn 110 Hz vụt qua (không ngân sau va chạm)
HazardTrigger hazardId=HZ_B4_signal_bell phase=impact t = 0.3 s sau c… SFX_B4_hz_signal_bellchuông hiệu → choáng r120— (do hero kích)như B1 village_bell, 196 Hz
HazardTrigger hazardId=HZ_B5_ash_rise phase=state: cột mọc (t = 0.30 … SFX_B5_hz_ash_risetro rơi ngược (ải B5)—lớp bed tăng khi ải dày
HazardTrigger hazardId=HZ_B1_bone_field: thay bước chân hero/quái tro… SFX_B1_hz_bone_fieldBãi Xương Bãi Xương HZ_B1_bone_field (chậm)—bước trên xương vụn, thay bước hero/quái trong vùng (quái S: 20% bước), −27
HazardTrigger hazardId=HZ_B1_ghost_brazier (lò đổ; vùng N dùng SFX_SH… SFX_B1_hz_ghost_brazierLò Lửa Ma Đổ Lò Lửa Ma Đổ HZ_B1_ghost_brazierN (vùng = zone_n_loop)lò lửa ma đổ, −20
HazardTrigger hazardId=HZ_B1_toppling_stele (va chạm; tell P chung) SFX_B1_hz_stele_fallBia Đổ Bia Đổ HZ_B1_toppling_stele (windup 0.6 s)Pbia đá cao sập tại va chạm, ≤ −12 dB dưới tell_p_impact ở 0–50 ms
HazardTrigger (phase state) HZ_B2_bridge thân_trên_cầu ≥ 4 (loop tới … SFX_ENV_B2_bridge_creakCầu Tre Mục Cầu Tre Mục HZ_B2_bridge quá tải (≥ 4 thân trên cầu)— (báo phụ)loop kẽo kẹt tới < 4 thân hoặc sập; không swell, −27
HazardTrigger (phase impact) HZ_B2_mud_geyser; lớp trang trí riêng, p… SFX_ENV_B2_mud_geyserMạch Bùn Sôi Mạch Bùn Sôi HZ_B2_mud_geyser (0.6 s)Pbùn sôi phun, lớp trên tell_p_impact, −20
HazardTrigger (phase impact) HZ_B2_drift_wreck: đò vào làn (frame va … SFX_ENV_B2_drift_ramĐò Mục Trôi Đò Mục Trôi HZ_B2_drift_wreck (0.8 s)Pđò mục lao dọc kênh, frame va chạm đầu, −18
HazardTrigger (phase state) HZ_B2_mire: hero trong vùng (lớp phụ trên… SFX_ENV_B2_mire_loopBùn Lún Tro Bùn Lún Tro HZ_B2_mireNkết cấu bước lún trên zone_n_loop, chỉ vùng gần hero nhất, −28
HazardTrigger hazardId=HZ_B3_pour phase=state (vũng đồng nguội sống 3… SFX_ENV_B3_pour_pool_sizzlevũng đồng nguội sau Rót Đồng (sống 3.0 s)Nloop xèo nhỏ, tắt fade 0.3 s, ≤ 3 voice gần hero, −28
HazardTrigger hazardId=HZ_B3_mold phase=windup (t=0) SFX_ENV_B3_mold_chain_releaseKhuôn Rơi Khuôn Rơi HZ_B3_mold windup t = 0P (lớp phụ)xích tuột, −6 dB dưới tell_p_swell, không cao độ
HazardTrigger hazardId=HZ_B3_conveyor phase=windup (đảo chiều −1.0 s) SFX_ENV_B3_conveyor_clunkBăng Chuyền Băng Chuyền HZ_B3_conveyor đảo chiều −1.0 s— (báo)gỗ-sắt đục, −22
HazardTrigger hazardId=HZ_B3_hook phase=windup (hero chạm vùng bắt t=… SFX_ENV_B3_hook_latchMóc Cẩu Móc Cẩu HZ_B3_hook: hero chạm vùng bắt (trước swing)—"cạch" xác nhận bám, decay ≤ 60 ms, −20
HazardTrigger hazardId=HZ_B3_steam phase=impact (van bật t=0, loop 2.… SFX_ENV_B3_steam_hissVan Xả Hơi Van Xả Hơi HZ_B3_steam (loop 2.0 s)Nhơi xả mềm, không phồng to dần, −24
HazardTrigger hazardId=HZ_B3_furnace phase=impact (va chạm t=0, sau t… SFX_ENV_B3_furnace_roarPhả Hơi Lò Phả Hơi Lò HZ_B3_furnace (0.9 s)Pphả hơi lò tại va chạm, ngay sau đó spawn_ash (BURST), −17
HazardTrigger hazardId=HZ_B3_slag_cart phase=state (xe chạy; loop, sp… SFX_ENV_B3_cart_rumbleXe Goòng Xỉ Xe Goòng Xỉ HZ_B3_slag_cart (0.8 s)Y (tell_y_glint1 + tell_y_tinh)loop xe lăn, theo vị trí xe, −22
HazardTrigger hazardId=HZ_B4_wind phase=state (thổi 0–4.0 s, fade out… SFX_ENV_B4_hz_wind_blow_loopGió Vực Gió Vực HZ_B4_wind đang thổi 0–4.0 s—loop gió ổn định (AUD-02), fade ra 0.4 s, −24
HazardTrigger hazardId=HZ_B4_chain_whip phase=impact t = 0 SFX_ENV_B4_hz_chain_whipXích Neo Quất Xích Neo Quất HZ_B4_chain_whip (0.75 s)Pxích quất t = 0, −19
PropBroken biome=B4 propId=counterweight_winch (bị đánh → release) SFX_ENV_B4_hz_winch_releasetời Tời đối trọng: trục gỗ quấn xích + đối trọng sắt treo trên xà phía tr… ENV_B4_counterweight_winch bị đánh → nhả— (dẫn vào windup P 0.75 s)tời gỗ-sắt nhả, −21
HazardTrigger hazardId=HZ_B4_counterweight phase=impact t = 0 SFX_ENV_B4_hz_counterweight_dropĐối Trọng Tời Đối Trọng Tời HZ_B4_counterweight (0.75 s)Psắt rơi nghiền, không ngân (AUD-01), −16
HazardTrigger hazardId=HZ_B4_ash_drift phase=state (sống 6.0 s, gần h… SFX_ENV_B4_hz_ash_driftĐụn Tro Gió Đụn Tro Gió HZ_B4_ash_drift (sống 6.0 s)Nlớp ambience rất nhỏ, ≤ 1 voice gần hero, bus Ambience −32
HazardTrigger hazardId=HZ_B5_dome_shard phase=windup (lớp phụ của tel… SFX_ENV_B5_shard_fallMảnh Vòm Rơi Mảnh Vòm Rơi HZ_B5_dome_shard windup 0.8 sP (lớp phụ ≤ −12 dB trên tell_p_swell)đá rạn trên vòm + sỏi lả tả rơi dần, gió rơi nhanh dần 0.3 s cuối; dài = windup
HazardTrigger hazardId=HZ_B5_dome_shard phase=impact (tick va chạm) SFX_ENV_B5_shard_hitMảnh Vòm Rơi va chạmPva chạm, không ngân (đồng B5 câm), −18
HazardTrigger hazardId=HZ_B5_taut_chain phase=windup (lớp phụ tell P … SFX_ENV_B5_chain_tautXích Căng Xích Căng HZ_B5_taut_chain windup 1.0 sP (lớp phụ ≤ −12 dB trên tell_p_swell)tời gỉ quay lách cách 4 nhịp nhanh dần + xích kéo lê, rên 0.2 s cuối; pan theo trung điểm xích
HazardTrigger hazardId=HZ_B5_taut_chain phase=impact (tick va chạm) SFX_ENV_B5_chain_snapXích Căng va chạmPxích bật, −18
HazardTrigger hazardId=HZ_B5_mute_bell phase=impact: đòn hero trúng c… SFX_ENV_B5_mute_bell_thudChuông Làng Câm Chuông Làng Câm HZ_B5_mute_bell (do hero kích)—1 tiếng đục (transient) + sóng 0.3 s sau; không giống "tinh", −17
HazardTrigger hazardId=HZ_B5_censer_spill phase=impact: đòn trúng lư SFX_ENV_B5_censer_swingLư Tro Đổ Lư Tro Đổ HZ_B5_censer_spill: đòn trúng lư—lư văng, −20
HazardTrigger hazardId=HZ_B5_censer_spill phase=state: dòng tro đổ (t… SFX_ENV_B5_censer_pourLư Tro Đổ: dòng tro (t = 0.3 → 0.6) → vũngN (vùng = zone_n_loop)tro đổ chạm sàn, −22
HazardTrigger hazardId=HZ_B5_bell_inhale phase=windup: báo 1.0 s + ké… SFX_ENV_B5_inhaleChuông Hít Hơi Chuông Hít Hơi HZ_B5_bell_inhale: báo 1.0 s + kéo 3.0 s—gió kéo về giữa (pan) + hum; không dùng âm tell, −22
HazardTrigger hazardId=HZ_B6_mirror_shallows phase=state: bước chân h… SFX_ENV_B6_hz_wadeNước Gương Nông Nước Gương Nông HZ_B6_mirror_shallows—bước lội bị nước "uống", −12 dB dưới bước thường; quái ≤ 3 voice gần hero, −32
HazardTrigger hazardId=HZ_B6_hush_bloom phase=impact (lớp phụ trên SF… SFX_ENV_B6_hz_bloom_swallowHoa Lặng Hoa Lặng HZ_B6_hush_bloom (1.0 s)P (lớp phụ ≤ −12 dB trên tell_p_impact)âm bị hút vào rồi cắt bặt, −28
HazardTrigger hazardId=HZ_B6_drowned_bell phase=impact: tiếng đục t =… SFX_ENV_B6_hz_bell_thudChuông Chìm Chuông Chìm HZ_B6_drowned_bell (rise 0.3 s)—1 tiếng đục khô 165 Hz (B1 220, B4 196), cắt partial 2.2–3.6 kHz, −16
HazardTrigger hazardId=HZ_B6_under_reflection phase=impact: frame va … SFX_ENV_B6_hz_reflect_strikeBóng Đáy Gương Bóng Đáy Gương HZ_B6_under_reflection trúng khi KHÔNG bị ĐÁPY (tell_y_glint1/tell_y_tinh)kính nứt + nước xuyên, bus Enemy −22
HazardTrigger hazardId=HZ_B6_under_reflection phase=impact khi bị ĐÁP… SFX_ENV_B6_hz_reflect_shatterBóng Đáy Gương bị ĐÁP (sau answer_core)Yvỡ thành mảnh gương, sáng hơn reflect_strike, −20

10.3 Đạo cụ, mục tiêu, phòng & cảnh theo biome (64 sự kiện SFX_ENV_<Bn>_*, thêm 2026-11-07; spec đủ field ở data/av/ENV_<Bn>.json; bus World trừ ghi khác; hook theo §12.2)

BiomeĐạo cụ (PropBroken / PropCut / prop sống)Mục tiêu (ObjectiveFeed / ObjectiveState / ObjectiveProgress)Phòng · cổng · cảnh
B1 (17)PropBroken biome=B1 propId=gravestone_a|gravestone_c|stone_bench SFX_ENV_B1_prop_stone_break (bia/ghế đá) · _prop_wood_break (quan tài/bàn thờ/bó lúa) · _prop_urn_break (hũ tro) · _candle_snuff (nến sọ tắt) · _charm_tear (PropCut dây bùa giấy)VIGIL: _obj_brazier_feed (ĐÁP trong r80 quanh OBJ_BRAZIER, +15 HP) · _obj_brazier_low (loop khi HP lò ≤ 33%) · NEST: _obj_nest_crack (67%/34%) · _obj_nest_break · RESCUE: _cocoon_shake (mỗi 100 HP) · _cocoon_open · CHASE: _carrier_giggle (Lướt né 120 px) · _carrier_urn_break_crypt_door (GateSpawnOpen) · _iron_gate_slam (RoomLock, mở lại = ExitOpened (lối ra/cổng phòng mở) SFX_SHARED_door_open) · _room_ash_veil (RoomStart, màn tro 0.6 s) · _ash_wall_rise (GauntletWall, mỗi 600 px)
B2 (12)PropBroken ENV_B2_reed_clump (gộp: ≤ 1 lần/80 ms toàn cục) SFX_ENV_B2_reed_break (≤ 1 lần/80 ms toàn cục) · _wood_break · _jar_break · _boat_knock (đạn chặn trên thuyền lật/rễ đước/cọc neo) · _lantern_loop (đèn gần hero nhất, ≤ 1 voice, Ambience −32)_buoy_bell (BELLS, lớp trên ObjectiveBell (mục tiêu BELLS) + nguồn reuse SFX_B1_hz_village_bell (… SFX_SHARED_objective_bell) · _cocoon_shake · _nest_break (OBJ_NEST_B2) · _carrier_loop (OBJ_CARRIER_B2, pan theo bè)_room_enter · _gate_shroud (khoá/mở cổng MBS/BOS/ELT) · _dock_arrive (nút DOCK giữa Hồi II)
B3 (9)PropBroken biome=B3 propId=quench_trough (bị đòn nặng t=0) SFX_ENV_B3_quench_hiss (máng tôi bị đòn nặng) · _break_clay · _break_slag · _bell_thud (chuông câm bị đánh, decay ≤ 60 ms) · _bell_roll (lăn 0.5 s)—_room_enter · _room_clear (Ambience −28, bed lò hạ 3 dB trong 1.0 s, sau RoomCleared (+ stinger nhạc room_clear) SFX_SHARED_room_clear 0.3 s) · _furnace_breath (loop gần cửa lò, ≤ 2 nguồn, Ambience −30) · _ash_wall (GauntletWall Đường Xỉ)
B4 (9)PropBroken biome=B4 propId=crate_ropes SFX_ENV_B4_crate_break · _bell_post_break · _mirror_shatter · _crow_scatter (quạ bay, Ambience) · _bridge_step (bước hero trên ván, thay lớp bước đá, bus Hero −28)_cage_break (OBJ_NEST_B4)_room_chainlift (RoomStart) · _ash_door (xong phòng / lối ra GAUNTLET) · _abyss_fall (quái S/M rơi qua lan can gãy, bus EnemyHorde −24)
B5 (10)PropBroken biome=B5 propId=ENV_B5_prop_offering_altar SFX_ENV_B5_bronze_break (bàn lễ) · _urn_burst (hũ tro) · _sluice_open (Kênh Dẫn Hồn, Run sau mở B6 sau BS_FINAL (BS_TRUE). FLAG_SHORE_OPEN) · _ninh_handbell (chuông tay không kêu: im lặng là nội dung) · _candle_loop (nến người sống, r ≤ 96, Ambience −32)—Stinger: _segment_shift (Ải Kết: trụ 60 giây trước bầy trộn của 4 Hồi. WS_B5_TRIAL_01 t = 15/30/45 s, lượng tử theo phách 120 BPM) · _trial_ash_out (t = 60 s) · _bell_rim_reveal (Đại Chuông lộ diện → boss_intro của FINALE · B5 Đỉnh Chuông Câm (Kết, act V): ải 60 s trộn quái 4 Hồi (lớp theo I) + BS_FINAL… MUS_finale_crown) · _climb_arrive · _shard_socket_wake (BS_FINAL vào P3, 12 hốc)
B6 (7)PropBroken biome=B6 propId=ENV_B6_silver_reeds (≤ 2 voice, cooldown c… SFX_ENV_B6_reed_snap (sậy bạc, −32, ≤ 2 voice, cooldown chung 150 ms) · _cairn_topple · _wood_snap (mái chèo)—_crossing_oar (cảnh đò B5 → B6 15 s; giây 9 send reverb → 0) · _trial_end_hush (SHORE_TRIAL t = 45 s) · _flood_inward (2.0 s) · _first_ripple (BS_TRUE chết + 1.5 s, trước ENDING · END_QUIET_SHORE Bến Bình Yên (hạ BS_TRUE ở B6) · 210 s tuyến tính đi cùng 12 thẻ… MUS_end_quiet_shore; âm có vang duy nhất ở B6)

Đọc _slug = SFX_ENV_<Bn>_slug cùng hàng. B3: cú trúng đạo cụ chưa vỡ dùng HeroHitBatch hasHeavyTarget=true (Tinh Anh/mini/boss trong cụm) + đòn… SFX_SHARED_hit_heavy. Mọi âm bảng này qua quét AUD-01/AUD-02.

1311. Nguồn, định dạng, nhập Unity

11.1 Thang nguồn SFX (đúng thứ tự, theo skill create-sfx)

BậcKhiCông cụĐầu ra bắt buộc
1 Dùng lạiasset có sẵn (demo 33 clip đã có credit, SFX_SHARED_*) khớp briefasset_ref trong audio_sfx.csv0 file mới
2 FreesoundMCP bf-sfx kết nối, sfx_status = key acceptedsearch_sounds (query brief, max_duration, single_event, sort rating_desc, min_num_ratings 5, group_by_pack cho họ biến thể) → find_similar_sounds (biến thể) → get_download_links → make_sfx.py fetchchỉ CC0 (ưu tiên) hoặc CC BY; sfx-credits.json cạnh file; CC BY → dòng credit vào màn Credits (make_credits)
3 SynthFreesound trượt 2 vòng hoặc âm trừu tượng (tell, UI, ma, Tro Nhớ)make_sfx.py make --recipe <r> --element <e> (36 recipe: telegraph_cue → tell, dash_whoosh, hit_slash, hit_impact, explode, stomp_quake, chain_rattle, splash, aura_loop, roar, ui_*…).sfx.json (recipe + seed) để làm lại tất định
4 Foleychất liệu đặc thù không có ở bậc 2–3 (gỗ quan, xẻng đất, lư trầm, dây xu)thu tại chỗ 48 kHz/24 bit, 2 micfile gốc lưu Audio_Src/ (ngoài Assets/, Git LFS)
5 Thuê ngoàingân sách canon: SFX 4 PM + nhạc 4 PMhợp đồng chuyển quyền toàn cầu mọi nền tảngstem/WAV gốc + project file
  • Tell (tell_y_*, tell_p_*, tell_feint) = synth bậc 3 bắt buộc, recipe khoá trong .sfx.json, seed cố định → không bao giờ đổi âm giữa các bản build (người chơi đã học).
  • Nhạc: chỉ thuê/soạn (bậc 5) hoặc soạn nội bộ; KHÔNG lấy nhạc từ thư viện mẫu hay Freesound làm cue (được dùng mẫu CC0 đơn lẻ làm chất liệu).
  • Cấm: âm thanh/nhạc do AI sinh, API âm thanh trả phí, mẫu có giấy phép NonCommercial/ND/SA, trích âm từ game/phim khác.
  • Brief viết trước khi tìm (field brief); chọn theo khớp nguồn (đúng vật/chất liệu) trước, số đo sau (freesound.md §3 của skill).
  • Freesound: tuân hạn mức 60 yêu cầu/phút, 2.000/ngày; chỉ tải thứ game dùng.
  • Nghe duyệt: agent không nghe được → mọi âm vào hàng pending; dev nghe theo lô (make_sfx.py pending --audition → verdict ok|redo); tell + ĐÁP + Ult phải ok bởi người trước MS tương ứng.

11.2 Định dạng & mastering

LoạiMaster giaoFile runtimeUnity import
SFX one-shot ≤ 1.5 sWAV 44.1 kHz/24 bit mono (UI/stinger: stereo).ogg Vorbis 44.1 kHzLoad Type Decompress On Load, Vorbis quality 70, Force To Mono (trừ stereo), Preload Audio Data on
SFX 1.5–5 s (ult, boss)như trên.oggCompressed In Memory, quality 70
Loop SFX/ambienceWAV stereo, cắt đúng mẫu lặp.oggCompressed In Memory (≤ 20 s) / Streaming (> 20 s), quality 60
Nhạc stemWAV 44.1 kHz/24 bit stereo, mỗi stem dài đúng loop_samples.ogg quality 60 (~160 kbps)Streaming, Preload off, Load In Background on
  • Sample rate file 44.1 kHz; Project Settings › Audio: System Sample Rate = 0 (theo thiết bị), Speaker Mode Stereo.
  • Loop mẫu-chính-xác: file loop = đúng loop_samples, điểm 0 và cuối nối pha (zero-crossing không bắt buộc vì nối liền), không fade; intro tách file __intro. Phát nhạc bằng 2 AudioSource xen kẽ + PlayScheduled theo dspTime (không dùng loop = true cho stem streaming để tránh hở khe Vorbis); one-shot loop ngắn dùng loop = true.
  • Mastering mỗi file tới lufs_mmax bảng §4.3 (BS.1770, cửa sổ 400 ms), đỉnh ≤ −1 dBTP, DC 0, onset ≤ 12 ms, đuôi về −60 dB trước khi hết file (QA create-sfx: LOUDNESS CLICK_START CUT_TAIL LATE_ONSET TOO_LONG SILENT LOOP_SEAM phải PASS; PHONE_WEAK đọc là "Deck loa yếu").
  • Thư mục: Assets/_Project/Audio/{Music,SFX,Mixer}/… (khác đường mặc định mobile của skill → luôn truyền --out Assets/_Project/Audio/SFX/<ownerGroup>/<ownerId>). Credit gộp: Assets/_Project/Audio/sfx-credits.json → màn Credits.

11.3 Bộ nhớ & dung lượng (Steam Deck là trần)

  • SFX thường trú/Hồi ≤ 40 MB đã giải nén: hero đang chơi (~3 MB) + quái/Tinh Anh/mini/boss biome (~8 MB) + SHARED + UI (~10 MB) + hazard/ambience spot (~4 MB); dỡ biome trước khi vào Hồi kế (trong DOCK).
  • Nhạc streaming: ≤ 12 luồng, bộ đệm ≤ 6 MB.
  • Dung lượng cài đặt âm thanh 1.0 ≤ 400 MB (nhạc ~240 MB, SFX ~120 MB, giọng ~20 MB) [ASSUMED].

1412. Nối vào code (hook sự kiện → id)

12.1 Kiến trúc runtime (thay Systems/Sfx.cs demo)

ClassViệcGhi chú
AudioDbnạp audio_sfx.csv + audio_music.json (qua DataManager, chỉ đọc) → bảng id → SfxDefkhông hard-code tên clip trong gameplay
SfxPlayerpool 48 AudioSource one-shot + 4 ambience; Play(id, pos, ctx): cooldown/max_voices/steal/biến thể shuffle/pan/gain/pitch clock0 cấp phát GC/lần gọi
HordeAudiogom hit/kill/spawn mỗi frame (§6) rồi gọi SfxPlayerchạy sau Combat, trước render
TellAudiolịch "tinh"/swell theo PlayScheduled (§5.7), giữ chỗ voice tellđọc token INV-08
MusicDirectortrạng thái nhạc, I, stem, stinger, lượng tử ô, đồng bộ H12 (§3.4–3.5)12 AudioSource riêng, dspTime
AudioSettingsServiceslider, snapshot, trợ năng, hiệu chỉnh trễ; lưu ở DataPlayer (module Settings), mặc định trong SetupDefaultData()không Save() trong Update

Sự kiện dùng EasyEventManager với hằng EventName (rule third-party); gameplay chỉ bắn sự kiện, KHÔNG gọi thẳng AudioSource.

12.2 Bảng hook (EventName → id; {H} = hero đang chơi, {E} = enemy id, {B} = biome, {BOSS} = id mini/boss)

EventNamePayloadPhát
HeroAttackCutheroId, moveIndex, aspectSFX_{H}_a{n}_swing (bộ biến thể theo Dạng Rèn)
HeroHitBatchheroId, n, critCount, hasHeavyTarget, posHordeAudio §6.1 → SFX_{H}_hit + hit_multi/hit_mass/hit_crit/hit_heavy
HeroComboSpecialheroId, branchSFX_{H}_combo_special (H08: 9 lớp theo cặp ổ)
HeroDash / HeroDashRechargeheroIddash_base + SFX_{H}_dash / dash_recharge
HeroAnswerSuccessheroId, perfect, targetTieranswer_core + SFX_{H}_answer + send Answer
HeroAnswerWhiffheroIdanswer_whiff
HeroCounterheroIdSFX_{H}_counter
HeroHoldStart / HeroHoldEndheroId, cancelledSFX_{H}_hold_start + hold_loop / dừng loop + hold_end
HeroPerfectDodgeheroIdperfect_dodge + send Answer
HeroResourceheroId, kind=gain/full/spend, valueSFX_{H}_res_* (H05 Đà → pitch loop; H12 click khi bật)
SkillCastskillId (Hxx_SKnn), rankSFX_{skillId}_cast (+ __impact khi trúng)
UltActivateultIdult_core + SFX_{ultId}_<slug> + stinger ult_{H} + send Ult
UltGaugeFull—ult_ready
HeroDamaged / HeroLowHp / HeroDeath / HeroReviveamount, hpPcthero_hurt_impact + SFX_{H}_vo_hurt / hero_low_hp loop / hero_death + SFX_{H}_vo_death + DEATH / revive_ember
EnemyWindupStartenemyId, attackId, tellClass, windup, tImpactY: tell_y_glint1; P: tell_p_swell (độ dài = windup) + SFX_{E}_atk__{Ann} nếu giữ token
EnemyTellGlint2enemyId, tImpacttell_y_tinh lịch đúng T−0.12 s (đã lên lịch từ EnemyWindupStart; event này để kiểm)
EnemyFeintenemyIdtell_feint
EnemyImpactenemyId, tellClassSFX_{E}_impact; P → tell_p_impact
EnemyProjectileFire / EnemyProjectileReflectedenemyId, purpleproj_enemy_fire (+ tell_p_proj loop nếu tím) / proj_reflect
EnemyKilledBatchk, biome, elites[]HordeAudio §6.2
EnemySpawnMarkscountspawn_ash (gộp)
SummonVortexownerIdsummon_vortex
EliteSpawnenemyId, affixIdelite_affix (biến thể EM) + SFX_{E}_vocal + stinger elite_in
PoiseBrokenenemyIdpoise_break (+ SFX_{E}_broken nếu boss)
ShieldBroken / ShieldBlockedenemyIdshield_break / shield_block
AshVariantOnownerId, axisash_read + stinger ash_read (khựng 0.6 s, ≥ 1.0 s trước hiệu lực)
AshMesoShiftpctash_meso + stinger surge
BossIntro / BossPhase / BossDefeatedbossId, phaseSFX_{BOSS}_intro + SN_BOSS_INTRO + stinger / SFX_{BOSS}_phase + __stg_phase{n} / SFX_{BOSS}_death + __stg_victory
HazardTriggerhazardIdSFX_{B}_hz_* / SFX_ENV_{B}_* hazard §10.2 (+ tell chung nếu Y/P)
BiomeEnter / AmbienceSpotbiome, roomIdbed SFX_{B}_amb_bed (B1 phòng hầm: RoomStart B1 phòng hầm (crypt_yard, ossuary_ring, twin_crypts, cocoon… SFX_B1_amb_crypt_bed, crossfade 1.5 s) / 1 spot §10.1 mỗi 6–14 s; biome = B6 → fader HeroAttack/HeroSkill −6 dB + send reverb 0 (§5.1, §10.1)
PropBroken / PropCutbiome, propIdđạo cụ §10.3 theo propId (vd B1 gravestone_a → PropBroken biome=B1 propId=gravestone_a|gravestone_c|stone_bench SFX_ENV_B1_prop_stone_break; paper_charm_line → PropCut biome=B1 propId=paper_charm_line SFX_ENV_B1_charm_tear)
GateSpawnOpenbiome, propIdGateSpawnOpen biome=B1 propId=crypt_door SFX_ENV_B1_crypt_door (cửa hầm mở khi bầy tràn ra)
RoomLockbiomeRoomLock biome=B1 (hero vào phòng → 4 cổng sắt sập; mở lại dùng SFX_S… SFX_ENV_B1_iron_gate_slam · B2 RoomLock / ExitOpened phòng MBS/BOS/ELT B2 SFX_ENV_B2_gate_shroud; mở lại = ExitOpened (lối ra/cổng phòng mở) SFX_SHARED_door_open
GauntletWallbiomeGauntletWall biome=B1 (tường tro dựng sau hero mỗi 600 px) SFX_ENV_B1_ash_wall_rise · B3 GauntletWall biome=B3 (tường tro dựng sau hero t=0) SFX_ENV_B3_ash_wall
ObjectiveFeed / ObjectiveState / ObjectiveProgressobjective, state, pctcột "Mục tiêu" §10.3 (vd VIGIL feed → ObjectiveFeed objective=VIGIL (ĐÁP trong r80 quanh OBJ_BRAZIER) SFX_ENV_B1_obj_brazier_feed; VIGIL hp ≤ 33% → loop ObjectiveState objective=VIGIL hp<=33% (loop tới khi > 33% hoặc HP 0) SFX_ENV_B1_obj_brazier_low, dừng khi > 33% hoặc HP 0; NEST vỡ → ObjectiveProgress objective=NEST (tổ vỡ, đẩy r100) SFX_ENV_B1_obj_nest_break)
StatusApplied / StatusEndedstatusId, targetIsNearHerostatus_apply biến thể / dừng SFX_STS_{X}_loop
PickupCollectedtype, chainIndexxp_pickup (pitch chuỗi) / gold_pickup / heal_orb
LevelUp / DraftOpen / DraftPickraritylevel_up / DraftOpen (sau LevelUp; 3 thẻ rút ra lệch 60 ms; snapshot SN_DRAFT) SFX_UI_draft_open + SN_DRAFT / DraftPick rarity=COMMON|RARE|EPIC (biến thể 01 COMMON, 02 RARE, 03 EP… SFX_UI_card_pick (_legend, _cursed)
ResonanceTriggered / EvolutionTriggeredidresonance / evolution
ResonanceCalloutresId, tierResonanceCallout tier=I ('CỘNG HƯỞNG: <tên>' 1.2 s) SFX_UI_resonance_1 (bậc I) / ResonanceCallout tier=II ('CỘNG HƯỞNG II: <tên>' 1.2 s) SFX_UI_resonance_2 (bậc II)
EvolutionFuseevoIdEvolutionFuse (draft đóng → World ×0 0.8 s EVO1–3 / 1.5 s EVO4; 2 ico… SFX_UI_evo_fuse (01 EVO1–3, 02 EVO4) rồi evolution trên hero
LinchpinTakenedgeId (E37–E40)LinchpinTaken (nhặt Then Chốt H{xx}_E37–E40; callout 'THEN CHỐT: <tên… SFX_UI_linchpin (từ draft: sau card_pick_legend 0.4 s)
SkillCastDeniedskillIdSkillCastDenied (input kỹ năng khi đang hồi chiêu; HUD nháy ô 0.2 s, … SFX_UI_skill_denied
RewardPanelOpen / ShopPurchasekind / itemId, costRewardPanelOpen (thưởng phòng: chọn Relic 1/2 hoặc 1/3 ELT_RISK, thẻ … SFX_UI_reward_reveal / ShopPurchase (Sạp Rong SHP/DOCK, mua bằng Vàng Mã; Chợ Đò mở pool dùn… SFX_UI_shop_buy (thiếu Vàng Mã → UiError (hành động không được phép: thiếu tiền, khoá, ô đầy) SFX_UI_nav_error)
HeroSelectedheroId, kind=hero/loadoutHeroSelected (Lửa Canh: xác nhận hero / ult / Dạng Rèn / 2 kỹ năng kh… SFX_UI_hero_select (biến thể 01/02)
RoomStart / RoomCleared / ExitOpenednodeType, objectiveMusicDirector COMBAT / room_clear + stinger / door_open
MapOpen / MapNodeChosen—MapOpen (sau phòng xong / nút bản đồ) SFX_UI_map_open / MapNodeChosen (chọn nút CMB/ELT/CHL/EVT/SHP/RST/SEC/RSC/MBS/BOS/DOCK) SFX_UI_map_node
RunStart / ActChanged / DockEnteract, biomeMusicDirector cue biome / DOCK · Bến Giữa Hồi (nút DOCK sau boss Hồi I–IV, ≤ 20 s, Sạp Rong + chở đò Calla sang Hồi… MUS_dock_crossing; ActChanged act=VI biome=B6 = hook cảnh đò B5 → B6 (15 s): ActChanged act=VI biome=B6 (cảnh đò B5 → B6): loop suốt 15 s; giây 9 … SFX_ENV_B6_crossing_oar loop suốt cảnh, giây 9 send reverb → 0 (BiomeEnter B6 bắn ở giây 9)
FootstepHeroheroId, biome, surface (hazardId/propId dưới chân)thay bước thường theo mặt: B2 Nước Nông HZ_B2_water/Kênh Nông Vành Sân HZ_B2_shallow_water → FootstepHero/FootstepEnemyCluster khi chân trong ô HZ_B2_water / HZ_B… SFX_B2_hz_wade; B4 Ván cầu treo: 4 tấm ván ngang/ô, khe 1 px #25282f lộ vực tối bên dưới… ENV_B4_floor_plank → FootstepHero trên ENV_B4_floor_plank (thay lớp bước đá) SFX_ENV_B4_bridge_step
FootstepEnemyClusterbiome, surface, countbước gộp của cụm quái (crowd_bed §6) đổi lớp theo mặt: B2 nước → FootstepHero/FootstepEnemyCluster khi chân trong ô HZ_B2_water / HZ_B… SFX_B2_hz_wade (≤ 3 voice gần hero)
ProjectileBlockedbiome, propId, posđạn (hero/quái) bị đạo cụ chặn: B2 capsized_boat/mangrove_trunk/mooring_post → ProjectileBlocked trên capsized_boat / mangrove_trunk / mooring_post SFX_ENV_B2_boat_knock
PropAlivebiome, propId, activeđạo cụ sống có loop: B2 lantern_post/ferry_lantern_vigil → PropAlive lantern_post / ferry_lantern_vigil (chỉ đèn gần hero nhất, … SFX_ENV_B2_lantern_loop (chỉ đèn gần hero nhất, ≤ 1 voice); active=false → dừng loop
EnemyAbyssFallenemyId, biome, posquái S/M rơi qua lan can gãy B4 → EnemyAbyssFall (quái S/M rơi qua lan can gãy) SFX_ENV_B4_abyss_fall
HubStationInteractstationIdSFX_HUB_* tương ứng
HubArrive / ScarCleansed / StationUnlocked / EpitaphCandleLit / StatuePlaced · PaintingHung · MusicBoxPlacedstationId, itemIdHubArrive t=0 (mảnh lưỡi kéo về lửa) SFX_ENV_HUB_blade_return / _scar_cleanse / _station_unveil / _candle_light / _plinth_place (§7.2)
BarkShownspeakerId, charsBarkShown speaker=NPC_* (1 lần khi bark mở) SFX_HUB_npc_murmur (NPC) + BarkShown (mỗi 3 ký tự 1 blip; 8 bộ: 7 NPC + hero; giọng NPC lấy SFX_… SFX_UI_bark_blip
UiNavigate / UiConfirm / UiBack / UiError—SFX_UI_nav_*
CurrencyChangedcurId, deltaCurrencyChanged delta>0 curId ∈ {CUR_SOUL_ASH 01, CUR_ECHO_SHARD 02, … SFX_UI_currency_gain / _spend
UnlockGranted / MasteryRankUp / AchievementUnlockedidUnlockGranted (hero 01 · Dạng Rèn 02 · ult 03 · mode 04 · trang codex… SFX_UI_unlock / MasteryRankUp (lên MR01–MR20 / xong TT1–TT5) SFX_UI_mastery_rank / AchievementUnlocked (ACH_*; toast góc phải trên) SFX_UI_achievement
MourningBandChangedmrnId, totalMourningBandChanged (buộc/cởi MRN01–MRN15: lớp vải; tổng Độ Tang đổi:… SFX_UI_mourning_band
DeathRecapLine / EpitaphShown—DeathRecapLine / dòng 'Tro đã học' (INV-16), 1 lần/dòng, cách ≥ 0.25 s SFX_UI_recap_line / EpitaphShown (bia mộ đóng dấu cuối recap, TMB_Hxx) SFX_UI_epitaph
EndingStartendIdMUS_end_*

Tên hook trong data/av/ENV_*.json chưa đồng nhất; quy về EventName bảng này (2026-11-07): PropBreak / PropHit / PropTrigger → PropBroken · ObjectiveBellRing / ObjectiveCocoonShake / ObjectiveCarrierAlive → ObjectiveState · ObjectiveNestBreak → ObjectiveProgress · RoomEnter / RoomTransition → RoomStart · RoomClear → RoomCleared · GateLock → RoomLock · GateOpen → ExitOpened · BiomeAmbience → BiomeEnter · HazardFire / HazardImpact / HazardState → HazardTrigger (payload thêm phase = windup/impact/state). Luật hook: 1 EventName có thể phát nhiều id, 1 id không bị 2 EventName cùng phát trong 1 frame (khử trùng theo id/frame); payload thiếu → log Debug.LogWarning, không phát.

1513. Ngân sách âm thanh theo mốc (đếm sự kiện SFX theo §4.4; nhạc theo §3.7)

MốcHero (×28)Quái+Tinh Anh (×5)Mini/boss/kết (×8)Khác (S27 + UI37 + HUB + ENV biome + STS6)SFXCue nhạc
MS02 Next Fest M103 → 849 → 452 → 1627+37+16+30+6 = 1162616: title, hub, b1, boss_b1, miniboss_gate (D), death
MS03 EA M135 → 14018 → 905 → 4027+37+29+56+6 = 1554259: + dock, b2, boss_b2 (miniboss +E)
MS04 U1 M177 → 19627 → 1358 → 6427+37+29+82+6 = 18157611: + b3, boss_b3 (miniboss +C)
MS05 U2 M219 → 25237 → 18511 → 8827+37+29+105+6 = 20472913: + b4, boss_b4 (miniboss +B)
MS06 U3 M2611 → 30837 → 18512 → 9627+37+29+129+6 = 22881715: + finale_crown, end_bell_toll
MS07 1.0 M3212 → 33639 → 19513 → 10427+37+29+146+6 = 24588018 + 4 bộ _h12 (+ quiet_shore, end_quiet_shore, end_ash_crown)
  • ENV biome = mọi sự kiện data/av/ENV_<Bn>.json của biome đã có (bed + spot §10.1 · hazard §10.2 · đạo cụ/mục tiêu/phòng §10.3): B1 30 · B2 26 · B3 26 · B4 23 · B5 24 · B6 17 = 146; cộng dồn theo biome mở ở mốc. HUB: MS02 16 = 8 lõi (như bản trước) + 8 ambience hub §7.2 [ASSUMED], MS03+ đủ 29. UI 37 đủ từ MS02.
  • Canon: _bible.json sfx_events ~880 (DEC-2026-11-07-17: ~730 → ~880 do data AV thêm 150 sự kiện = UI +8, HUB +16, hazard +32, bed +1, spot 29, ENV khác 64). Data AV là nguồn đơn; bảng MS07 khớp canon.
  • File: SFX ~2.550 .ogg (880 sự kiện × ~2.9 biến thể TB) [ASSUMED] · nhạc ~281 file (stem + intro + stinger: biome 40, _h12 40, boss 50, mini 28, finale 27, quiet_shore 17, hub 19, ult stinger 48, còn lại 12) · giọng không lời ~264 file · ~45 phút nhạc soạn [ASSUMED].
  • Người-tháng (canon §10.1): âm thanh 6 PM nội bộ (gồm 0.5 PM/hero trong dòng hero) + thuê ngoài nhạc 4 PM + SFX 4 PM. Thứ tự cắt khi trễ: theo cut-line canon §10.2 (cắt nội dung thì âm của nó cắt theo); không bao giờ cắt tell, ĐÁP, gộp bầy, bộ _h12.

1614. Kiểm nghiệm (AT = acceptance test; chạy trước mỗi MS)

IdKiểmĐạt khi
AT-01Nghe mù tell: 10 người, 10 phút B1, màn đen 30% thời gian≥ 90% gọi đúng Y/P; 0 âm khác bị gọi là tell
AT-02Thời điểm "tinh": thu loopback, World 1.0 và 0.25đỉnh transient trong ±1 frame (16.7 ms) quanh T−0.12 s
AT-03Quét phổ audio_lint.py (FFT mọi asset không-tell)0 vi phạm AUD-01/AUD-02; chạy trong CI cùng quét từ cấm
AT-04Tải MS01b trên Deck§6.5 đạt hết
AT-05Độ to chương trình§5.8 đạt hết
AT-06Lặp nhạcmọi stem đúng loop_samples; điểm nối < −60 dB click; 30 phút không trôi pha
AT-07Đồng bộ H12lệch máy nhịp ↔ nhạc ≤ 5 ms sau 10 phút; Thương Xót ±0.16 s đúng
AT-08Creditmọi file Freesound có mục sfx-credits.json; bước build credits_check (doc 40 §5.7.1): mỗi id SFX nguồn Freesound CC BY trong audio_sfx.csv có đúng 1 dòng credits; thiếu → build FAIL
AT-09BS_TRUE P2 + P1 rẻ quạttell nghe rõ (≥ −20 LUFS ngắn hạn) khi mọi thứ khác bị bóp
AT-10Mono / loa Decktổng mono không làm tell giảm > 3 dB; SN_SMALL_SPEAKER tell vẫn nổi
AT-11Trễinput → onset âm p95 ≤ 40 ms (PC, Deck)
AT-12Nhận ra hero qua âm≥ 80% (khớp P6 canon)

17Quy tắc cho dev/AI

  • Đọc 00-Design-Bible.md INV-02/08/10/11/15/18 trước mọi việc âm thanh; số/id lấy theo _bible.json.
  • Tell chỉ dùng 6 asset SFX_SHARED_tell_*; không tạo âm tell riêng cho quái/boss/hazard; không ngẫu nhiên pitch tell; không cho tell vào bus khác EnemyTell.
  • Mọi âm mới qua quét AUD-01/AUD-02 trước khi merge; vi phạm = sửa âm, không xin ngoại lệ.
  • Không gọi AudioSource từ gameplay: bắn EventName (§12.2); thêm id = thêm hàng audio_sfx.csv theo mẫu §4.2, đủ field.
  • Âm lặp ≥ 3 biến thể + cooldown; mọi gộp bầy qua HordeAudio, không phát âm/quái.
  • Nhạc: tempo/key/stem đúng §3.2/§3.7; stem dài bằng nhau đúng loop_samples; đổi lớp chỉ ở vạch ô nhịp; nhạc không theo slow-mo.
  • Nguồn theo thang §11.1; chỉ CC0/CC BY; ghi credit cùng lượt; bỏ ứng viên Freesound có tên/tag nhắc tên game/thương hiệu (vừa tránh âm bắt chước, vừa giữ repo sạch từ cấm).
  • Không AI sinh âm/nhạc/giọng; không lời thoại đọc; không ngôn ngữ bịa.
  • Tên id/file ASCII, snake_case slug, không đổi id sau khi ship (đổi file, giữ id + GUID .meta).
  • Không viết tên game/studio/thương hiệu có thật vào brief, query lưu repo, tên file, ghi chú; mô tả bằng vật liệu/hành động.
  • Báo cáo mỗi lô âm: bậc nguồn, LUFS, QA, và "chưa ai nghe — đang chờ pending" cho tới khi dev verdict ok.

18Quyết định đã chốt

QQuyết địnhLý do
Middleware âm thanh?Unity AudioMixer + code riêng (SfxPlayer, MusicDirector)đủ cho stem lượng tử + duck; không phí bản quyền, port console dễ
"Tinh" phát khi nào?đỉnh transient đúng glint 2 = T−0.12 s; glint 1 có ping nhẹ riêngkhớp INV-02 (SFX "tinh" đi cùng glint 2), cho 0.12 s phản xạ nghe
"Ù" dài bao nhiêu?trải suốt windup tím, cắt cứng ở va chạmđộ to tăng = đồng hồ đếm ngược nghe được
Ai độc quyền dải phổ tell?AUD-01 (ping 2.2–3.6 kHz dài) + AUD-02 (swell < 140 Hz) chỉ cho telltương đương sở hữu màu INV-01 cho tai
Tell có bị duck/bóp?không, kể cả BS_TRUE "Nuốt Tiếng"canon "SFX bóp trừ tell"; công bằng P3/P4
Người nghe ở đâu?ở hero, pan 2D theo x màn ±0.6, không 3Dgóc 3/4 pixel, hero luôn giữa; mono-an toàn cho Deck
Bao nhiêu voice?64 thật / 256 ảo; 29 chỗ dành cho tell/ĐÁP/Ult/nhạc250 quái không được nuốt tell
Gộp bầy thế nào?hit theo n/frame, kill theo k/100 ms, bước chân = crowd_bed250 nguồn → 1 khối; CPU thấp
Nhạc thích nghi?5 stem/cue, I từ mật độ + token + Tinh Anh + HP, lượng tử ô, hysteresisphản ánh nguy hiểm thật, không nhảy lớp liên tục
Boss tempo?mọi boss Hồi + mini + finale = 120 BPMkhoá pha với máy nhịp H12, không cần bộ boss _h12
18 cue gồm gì?§3.7 (6 biome canon + 4 boss + mini + title + hub + dock + chết + 3 kết)khớp canon 18 + 18 hộp nhạc Nến Canh = 18 cue
Stinger tính là cue?không; asset con <cueId>__stg_<slug>giữ đúng số canon 18 + 4
Ambience đặt id gì?SFX_<Bn>_amb_bed (owner = biome)canon chỉ có tiền tố SFX_/MUS_; không thêm loại id
Giọng?chỉ giọng không lời + text barkcanon §13: không voice có nghĩa ở 1.0; 10 ngôn ngữ không tốn ghi âm
Tell làm bằng gì?synth tất định, seed khoáâm tell không bao giờ đổi giữa bản build
Định dạng?WAV 44.1/24 master → OGG Vorbis 44.1 kHz; SFX Decompress On Load, nhạc Streamingđộ trễ thấp cho SFX, RAM thấp cho nhạc trên Deck
LUFS chương trình?combat −16 LUFS-I ±1, menu −18, đỉnh −1 dBTPchuẩn PC/Deck; preset Loa nhỏ −14
Sự kiện môi trường từ data AV? (2026-11-07)liệt kê đủ id data/av/UI.json + ENV_*.json ở §7.1, §7.2, §10.1–10.3, hook §12.2; tổng 880 (§13)data là nguồn đơn; doc phải chỉ đúng id để dựng game không cần hỏi
B6 nghe khác thế nào? (2026-11-07)fader HeroAttack/HeroSkill −6 dB + reverb 0, không snapshot mới (§5.1)"nhỏ hơn một nửa" (Bờ Lặng CDX_b6); tell + ĐÁP giữ mức
Credit kiểm thế nào? (2026-11-07)AT-08 dùng bước build credits_check của doc 40 §5.7.1 (thiếu dòng credits → build FAIL)một luật kiểm, không lặp tiêu chí giữa doc 32 và doc 40
Mục tiêu CHASE B2 dùng id nào? (2026-11-07)OBJ_CARRIER_B2 (khớp encounters/B2); OBJ_CARRIER chỉ của B1id objective theo biome, data là nguồn đơn