Audio coverage review — 2026-09-15
Current sourcing inventory: Audio Cue Sheet and the sound library now distinguish live cues, available unused takes, missing proposals and historical references. Use that sheet for sourcing; this document preserves the implementation audit below.
The largest gaps were missing event hooks, not missing music. This review
traced Sim events through Game, UI actions and the actual Sound methods at
baseline 14710cb, before the September 15 cue pass. File/line references
in the BEFORE sections refer to that revision; function names remain the
navigation anchors as the implementation changes.
This is a code/asset coverage audit. Asset presence proves neither a good performance nor a good mix. Physical-phone listening, voice direction and subjective approval remain separate from automated coverage checks.
Implementation status
The September 15 engine and cue wiring are implemented and verified by the full Node suite and real Chrome audio matrix. The verification record below separates those checks from physical-phone listening and voice production.
No soundtrack master, catalog loop, boss-score timing, enemy model, map, combat balance or HUD control needs changing for this work. The existing sample-clock and pause contracts in MUSIC-ENGINE.md remain authoritative.
September 15 coverage added
- Four shikigami arrival/bite/exit identities, actual Ren palm casts, distinct special casts and Paper Doll's explosion. Clean Sweep does not double the primary cast cue.
- Nine short boss entrance identities. Attack warnings and releases use
families: charges, ranged casts, sweeps, zones, summons and impacts. Spiral
bosses now emit
enemyVolley; Pouncer wind-up and Conductor gathering emiteliteTell. These are three presentation-event additions, with no new RNG draws or AI/balance changes. - The closest actual tell per simulation batch supplies the warning. Stable
order breaks ties; the game does not infer an attack by scanning enemy state
or queue sounds that become stale.
View.audioPansupplies camera-relative stereo position. The mixer limits repetition and simultaneous voices. - Mana, non-weapon bonus drops, weapon formation/binding, card acceptance, knockout and bounded rally recovery accents. During the normal live-combat exorcism, weapon formation waits for the seal callback; no separate pickup sting is stacked on its initial death rupture. The no-exorcism fallback still sounds the drop. Existing exorcism/music resolution remains intact.
- Knockout suppresses the incoming student's misleading hurt/tag VO in that event batch. No Sora boss-kill line is guessed from the active student; no new recording or attribution system is included.
- Critical hits, large kills and pickups now have repeat gates; procedural
sources disconnect on
ended. Field Report, Club Card and Docs & FAQ no longer call the shared menu click twice.
The remaining voice work and deliberate quiet areas below are still a backlog. The BEFORE matrices are retained as the audit record, not a claim that those hooks remain missing after this pass.
BEFORE: prioritized findings
| Priority | Finding and player consequence | Baseline evidence | Bounded response |
|---|---|---|---|
| 1 | All four current shikigami lacked dedicated arrival, bite and departure sounds. A long-cooldown summon could feel absent despite its model and damage. | sim.js:787,887,921 emits shiki/shikiout/shikibite; Game._dispatchEvents has no cases. Sound.summon() is reached only by the obsolete elective.id === 'kuroinu' branch at game.js:2399. |
Wire the three real events, retain e.who after tags, use a strong arrival, limited bite accent and quiet exit. |
| 2 | Ren's palm had no cast sound when it missed; successful attacks relied on generic impacts. | _cone, sim.js:2953, emits cone; Game ignores it even though Sound.shoot('cone') already exists at audio.js:716. |
Connect actual primary casts, without also sounding the same Clean Sweep cone twice. |
| 3 | Four bosses' signature attack paths were effectively silent, and several other attacks borrowed unrelated player sounds. | Boss matrix below; especially _bossAI, sim.js:1204,1285,1292, and the spit/burst exclusion at game.js:2370. |
Distinguish warning, release and impact; sound a sequence, not every projectile. |
| 4 | Critical hits and large kills bypassed repetition limits. A dense hit could mask the new warnings and allocate many nodes. | Sound.hit, audio.js:730: three sources per crit before the normal-hit gate. Sound.kill, audio.js:740: only small kills gated. Both buses feed the same compressor at audio.js:84. |
Gate/coalesce common impacts and bound the new cue layer. A compressor is not an event-priority system. |
| 5 | Permanent teammate knockout sounded like ordinary damage followed by a voluntary tag. | Sim._die, sim.js:1772; game.js:2428 only toasts the knockout. Forced swap plays the normal tag sound. |
One outgoing-student knockout cue; suppress conflicting same-batch hurt/tag VO. Keep final crew death distinct. |
| 6 | Specials and run weapons looked more distinct than they sounded. | Most elective events map to dash; decoyboom uses nonexistent Sound.boom and always falls back to dash. weaponBlast/weaponChill/weaponImpact, orbpop, chains and signature procs have no dedicated dispatcher sound. |
First separate an actual explosion from a dash; expand a few event families with caps rather than one sample per weapon/proc. |
| 7 | Mana lacked a distinct collection identity; rare rewards mostly reused basic upgrade/kill feedback. | sim.js:3346 collects ce; Sound.pickup, audio.js:746, gives it the generic fallback pitch. Weapon binding and card acceptance use upgrade. |
Give recovered energy a recognizable short cue; preserve the exorcism's reward reveal before adding another celebratory layer. |
| 8 | Some advertised VO paths had no assets, while existing boss-kill recordings were unused. | Game._onTag requests <id>_tag; no tag assets or load entries exist. _loadTracks loads Sora boss-kill reads; no Game caller uses them. |
Keep missing optional VO harmless; prioritize the production backlog below and use existing reads only with correct attribution. |
The lethal-hit ownership edge matters: _hurt queues an event and _die
can switch students before dispatch. The old hurt handler reads the now-active
student, so the incoming survivor can speak the outgoing student's hurt line.
Do not infer the speaker of a knockout from sim.character after that swap.
BEFORE: all nine bosses
Every boss already had the generic entrance sting, boss-song handoff, the authored pressure layer below 40% HP and the three-stage exorcism. Only the last living boss starts the encounter's defeat cadence. The table describes attack coverage in addition to that shared presentation.
| Boss | Attack path | Actual sound before this pass |
|---|---|---|
| The Janitor | Sweep preparation / rotating sweep | Generic surge / player dash. |
| Hall Monitor | Searchlight capture, summoned wisps, aimed shot | No capture-edge sound; summon ignored; shoot('spit') deliberately filtered out. |
| Pop Quiz | Spiral preparation / spiral emission | windup ignored; spiral pulses create bullets without an audio event. |
| The Substitute | Vanish / appear / slam | Player dash / player shoot('orb') / large kill. |
| Exam Season | Three fuse zones / detonations | Player shoot('volley') / ordinary kill; same-batch gates collapse repeats. |
| Detention | Closing cage / collapse | Full generic boss entrance sting / ordinary kill. |
| Group Project | Spiral preparation / spiral emission | Same silent quiz kit as Pop Quiz. |
| Parent-Teacher Night | Searchlight / summon / aimed shot | Same silent spotlight kit as Hall Monitor. |
| The Vice Principal | Vanish / appear / slam | Same borrowed teleport sounds as Substitute. |
Source: boss identities in config.js:142; attacks in Sim._bossAI,
sim.js:1159; existing dispatch at game.js:2449. Shared kit/color data
cannot by itself identify the actual boss. New identity-specific cues need
the event's real boss name or stable identity, without an extra RNG draw.
BEFORE: the rest of the game
| System | Covered | Gap or restraint |
|---|---|---|
| Primary combat | Bolt, orb, volley, normal/critical hit, kill, chain-count milestone | Ren cone unwired. Chains, splash, orb expiration and run-weapon secondary effects use incidental damage audio. |
| Movement and crew | Flash Step, manual/forced tag, rejection cues | Tag VO unavailable. Knockout lacks a distinct cue. No footstep loop is required. |
| Specials | Cast acknowledgement; decoy explosion fallback | Most casts share dash; there is no meaningful explosion identity for Paper Doll. |
| Shikigami | Generic damage and kills; denial/cooldown feedback | Actual summon/bite/exit events ignored. Readiness is visual only. |
| Domains | Large cast sound, character cast VO, Ren crush and Kaito strike accents | Readiness/expiry have no dedicated cue. Frequent fields and damage ticks should not each sound. |
| Ordinary enemies | Hit/kill sounds | windup, telegraph, charge, smash and hostile firing are unhandled/suppressed. Warning cues should take precedence over ambient enemy chatter. |
| Elites | Arrival surge, defeat upgrade, generic damage |
Bulwark guard changes, Pouncer wind-up and Conductor gathering change state without audio events. Conductor release is filtered spit. |
| Pickups and economy | XP, Coin/heal pickup variants; purchase, denial, upgrade | Mana generic. Coin/heal bursts are ungated; Sora's heal VO can be requested repeatedly in one collection burst. |
| Boss rewards | Exorcism release/sever/seal; weapon bind and card acceptance upgrade |
Ground drops mostly visual; new sounds must not pile over all three exorcism beats and the defeat cadence. |
| Cards and progression | Purchase, slots/locks/buyback, banked-level ping, level-up arpeggio, selected upgrade | Passive/trigger card procs generally visual. Pull-card flips have no synchronized reveal/rarity sound. Generic upgrade events are handled at the committing UI/controller path, not in the event switch. |
| Recovery/risk | Hurt, exhaustion denial, revive, death and stopped music | Rally is deliberately quiet; permanent KO is not well distinguished. |
| Waves/time | Surge, recoil breath, banked level, approaching bell, held bell, clear and win VO | Generic sounds repeat across unrelated events; the held-bell warning is distinct from actual completion in the controller. |
| Room/School Run | Start/resume music, pause/resume, checkpoint stop and next-room restart | No additional reward song, route jingle or checkpoint drone; these are not missing technical integrations. |
| UI | Shared button activation, keyboard/gamepad navigation, toggles, buy/deny, back | Field Report/Club Card/Docs & FAQ callbacks duplicate the shared click. Mouse hover intentionally avoids a beep per crossed button. |
Game._onWin/_announceWin defer the clear cue until the exorcism finishes.
_onExorcismCue supplies the three SFX beats; bossDefeated supplies the
short music ending. Neither is a reason to add a second full reward track.
Sound.setIntensity affects only procedural fallback music, not the authored
songs. Manual pause keeps the song playing, cancels boss pressure cues and
ducks ambience; level selection uses the existing turntable behavior. None
of these is a request to alter the loop engine.
Voice and sound-art backlog
The files below existed at baseline; optional failures are intentional no-ops. Counts include alternate takes, not different event types.
| Student | Domain | Death | Win | Dash | Hurt | Heal | Boss kill | Tag / shikigami |
|---|---|---|---|---|---|---|---|---|
| Ren | 5 | 2 | 1 | 1 | — | — | — | None |
| Yui | 3 | 1 | 1 | — | — | — | — | None |
| Kaito | 5 | 2 | 1 | 2 | 1 | — | — | None |
| Sora | 4 | 1 | 2 | 3 | 1 | 3 | 3, loaded but unused | None |
Presence was checked against assets/vo/, _loadTracks and VO_ALTS; it
does not imply every take has been auditioned in this review. No boss spoken
entrance/death lines are currently supplied. Prioritize future production:
- Optional signature boss vocal punctuation: cast one entrance and one death for a single boss before recording all nine. Keep the threat cue intelligible, avoid lengthy taunts, and allow an unvoiced identity cue.
- Crew essentials: Yui dash plus Ren/Yui hurt reads; then concise tag lines for all four. Author variants only after the first set works in the full mix. Existing Sora boss-kill reads need reliable killer/owner data, especially for delayed attacks and tags, before activation.
- Shikigami sound art: review four synthesized identities first. Only commission short creature calls or texture layers where synthesis leaves a specific gap; avoid four long samples, voices on every bite or loops.
- Reward polish: one brief card seal/flip, then a rare-card accent tied to the actual reveal. Rewards must already be committed; skipping animation never changes ownership. No Rive work before the parked review date.
- Contextual crew dialogue: keep the separately proposed checkpoint exchanges in IDEAS.md; this pass does not add conversations.
The nested-click cleanup identified at baseline (ui.js:730,736,1134) was
completed in this pass; it is not remaining sound-production work.
Deliberate quiet and technical boundaries
- No cue per ambient enemy spawn, trail sprite, sparkle, every damage number, every field tick, every card proc or every mana-regeneration increment.
- No always-on creature loop, readiness alarm loop, extra music bed, reverb convolution or another full-song buffer for this pass.
- Warning selection is bounded and favors a relevant nearby threat. Stereo placement supplements the existing visual telegraph; mute and mono remain playable. Panning uses camera-relative position, not raw world X.
- The new combat cue layer targets a maximum of 16 active/retiring voices; this is its own cap, not a claim that the entire legacy mixer has 16 voices. Use already available synthesis/noise; no fetch/decode during a cast.
- New cue tails must cancel on pause, menus, mute, title and run replacement. Cleanup must cover sources scheduled for the future as well as audible ones. Resume never replays expired warnings. All timing follows the appropriate audio/presentation clock, without gameplay delays or reloads.
- Keep the separate boss-score cap/timing contract unchanged. Existing authored music and published sound-library captures are not regenerated.
For implementation details, the primary Web Audio specification defines StereoPannerNode and scheduled source start/stop/ended behavior. These API contracts support the implementation; they do not establish this game's mobile performance or subjective mix quality.
Verification record
- Baseline audit: all literal Sim event names compared with Game dispatcher cases; UI activation paths, assets and Sound methods inspected. No code changed during that audit.
- September 15 implementation:
npm testpassed 1,173/1,173, including the 76 scoped checks, 14 new dispatcher tests and six new audio Node tests. The real Chrome matrix passed 144 checks at 48/44.1 kHz across 41 recipe variants, producing 51 review WAVs. Peak usage was 14 native sources / two warning groups, with zero added fetches, retained sources or browser errors. These receipts verify the new cue layer, independently of the historical boss-score matrix. The browser harness supports an external report-directory override; this run used the Codex visualization workspace'saudio-cues-20260915directory. - Chris handles physical gameplay listening. Browser output and deterministic tests do not prove phone-speaker clarity, comfortable listening levels or approval of a voice performance. No APK publication is part of this pass.