# QUAD GOD audio: cue map

Chiptune SFX and music for QUAD GOD, **125 SFX cues** (73 keep STACKED's names 1:1, 52 new) and **9 music files**. Everything is synthesised in our own code (`tools/audio/`: `chip.py` DSP + voices, `sfx.py` cue registry, `music.py` sequencer + compositions, `gate.py` measurement gate, `docs.py` this file). No samples, recordings or AI models. Listening page: https://games.bet-llm.com/quadgod/audio/

Palette: band-limited pulse waves (12.5 / 25 / 50 % duty), a 4-bit NES-style triangle, 15-bit LFSR noise (long + metallic short mode) for drums, and 2-operator FM ("16-bit" brass / bells) that comes in for the big moments (QUAD, MEGA/EPIC wins, trophy, final match). Home key D major (SFX arpeggios, base theme A, wins). The **QUAD motif** B–C#–D–F# (three steps up and a leap: four blocks) is the signature in `clear_4`, `quad_chain_*`, `bonus_trigger`, base A's intro/turnaround and the attract jingle. All melodies are original; no Korobeiniki, no Russian-folk tune, no game melody.

## Levels and formats

- **SFX:** mono MP3 44.1 kHz 128 kbps. One-shots are matched on **max momentary loudness (400 ms, BS.1770) to −16 LUFS**, true peak ≤ −1.5 dBTP (rendered to −2.2 for MP3 overshoot headroom). Clicks shorter than ~0.25 s cannot reach −16 LUFS-M without being squashed, so they are peak-limited (max 6 dB of limiting) and land quieter; the gate allows them down to −26. Loops (`*_loop`, `tease_heartbeat`) are matched on integrated loudness to −16 LUFS and also ship as `.ogg`.
- **Music:** stereo MP3 160 kbps + OGG Vorbis (VBR ≈ q6), **−18 LUFS integrated, ≤ −2 dBTP** (ffmpeg's meter reads the MP3s at −18.3 because the MP3 low-pass trims a little top end; the OGGs read −17.8). Loops are bar-aligned and seamless: tempi are chosen so a beat is a whole number of samples (140/135/120/150/126 BPM), echo/reverb tails are folded into bar 1, and the limiter and filters run circularly over three tiled copies so there is no gain step at the seam.
- **Gapless loops:** the MP3s carry the LAME gapless header; ffmpeg decodes them to exactly the sample counts below (the gate checks this). If a browser decodes extra padding, `audio.js loopPoints()` (forked from STACKED) uses the `samples` value to set `loopStart/loopEnd`. The `.ogg` files are written by libsndfile/libvorbis with exact granule positions and decode to exactly `samples` in libvorbis-based decoders; note that ffmpeg-based Vorbis decoders drop the first 128 samples of any Vorbis stream, so the MP3 + `loopPoints` path is the safe default for WebAudio.
- **Suggested volume** = `vol` for `Audio.play(name, {vol})` on STACKED's SFX bus (0.8). Music on the music bus (0.4); duck under big wins (`Audio.duck`).

## Front-end notes (fork of STACKED `game/src/audio.js`)

- Every STACKED cue name exists, so the forked front end plays a chiptune sound wherever STACKED played a construction one. The per-piece `land_*` keys keep STACKED's piece-type mapping (`Audio.land(type)`); they are now pitched chip thunks.
- New calls worth wiring: `combo_${Math.min(10, combo)}` (STACKED stops at 6), `quad_chain_${Math.min(5, chainIndex)}` for `quad.chainIndex ≥ 2`, `mult_step_${rung}` instead of `levelup`, `pu_sting_<fill|warp|bomb|rumble|glitch|token>` after `pu_reveal`, controller cues (`pad_button`, `pad_dpad`, `input_tick`, `rotate`, `mash_loop`), the ALL-NIGHTER clock (`clock_tick`, `clock_flip`, `dawn_chime`), the TOURNAMENT set, `bet_up`/`bet_down`/`buy_confirm`.
- `aliases.json` maps QUAD GOD-flavoured names to the shipped keys (e.g. `crown_1 → hardhat_1`, `claw_slide → crane_winch`), so the fork can call `Audio.play(ALIAS[n] || n)` and use either name. No duplicate files.
- ALL-NIGHTER: `music_longboi` + `music_longboi_heat` are the same 32 bars sample-for-sample, so STACKED's `scene("longboi")` + `heatMix(h)` equal-power crossfade works unchanged; drive `h` from the ladder (×1 → 0, ×10 → 1). TOURNAMENT: do the same with `music_topout` + `music_topout_final` (identical 48-bar grid), e.g. `h = 1` for THE LEGEND's match, or ramp it with the rival's HP.
- `pu_wreck` (BOMB) keeps STACKED's timing: the blast lands at **0.70 s**.

## STACKED → QUAD GOD name mapping (all 73 STACKED cues)

Same key, new chiptune sound. "QUAD GOD use" is the event it now stands for.

| STACKED cue | STACKED sound (construction) | QUAD GOD use (chiptune) |
|---|---|---|
| `reel_spin_loop` | Top-slot reel spinning | `reveal` / `fsSpin`: loop while the power-up reel (marquee) spins; stop on the last window. |
| `reel_stop` | One top-slot cell locking | Each reel window that stops empty (`null`). rate 0.95–1.1 by column. |
| `reel_stop_pu` | Cell lock when it holds a power-up | A reel window that stops on a power-up (before its fanfare). |
| `hardhat_1` | First HARD HAT | First gold-crown scatter (`"SCAT"`) window stops. |
| `hardhat_2` | Second HARD HAT | Second crown (start anticipation: `antic_riser` + `tease_riser_loop`). |
| `hardhat_3` | Third HARD HAT | Third+ crown (bonus coming: `bonusTrigger` follows). |
| `antic_riser` | Anticipation riser | Anticipation after 2 crowns while the remaining windows slow down. |
| `crane_winch` | Crane winch whir | The claw slides the piece over its column before each `drop` (skip in turbo). |
| `crane_winch_loop` | Crane winch motor, seamless 1.2 s loop, for longer hook moves | Long claw moves (tease hover travel); fade in/out 80 ms. |
| `crane_creak` | Steel cable / boom creak | Tease wobble (`drop.tease`): the hanging piece sways. |
| `crane_creak2` | Shorter rusty creak | Variant of `crane_creak` (alternate randomly). |
| `crane_release` | Hook releases the piece | Claw lets go: start of every `drop` fall. |
| `crane_swing` | Crane swings the piece sideways | Near-miss slide (`tease.taken:false`, piece slips one column), sideways claw moves. |
| `land_girder` | I piece | `drop` lands, `piece.type` **I** (the Long Boi piece). |
| `land_glass` | O piece | `drop` lands, **O**. |
| `land_hazard` | T piece | `drop` lands, **T**. |
| `land_brick` | S piece | `drop` lands, **S**. |
| `land_plate` | Z piece | `drop` lands, **Z**. |
| `land_neon` | J piece | `drop` lands, **J**. |
| `land_concrete` | L piece | `drop` lands, **L**. |
| `clear_1` | Single line clear | `clear` with `lines` 1 (also each row of a BOMB `powerup`). |
| `clear_2` | Double | `clear` with `lines` 2. |
| `clear_3` | Triple | `clear` with `lines` 3. |
| `clear_4` | QUAD | `clear` with `lines` ≥ 4 (QUAD) and every Long Boi `quad`. |
| `combo_1` | Combo step 1 sting | Optional light layer on the first `clear` (combo 1). |
| `combo_2` | Combo step 2 sting | `clear.combo` = 2. |
| `combo_3` | Combo step 3 sting | `clear.combo` = 3. |
| `combo_4` | Combo step 4 sting | `clear.combo` = 4. |
| `combo_5` | Combo step 5 sting | `clear.combo` = 5. |
| `combo_6` | Combo step 6 sting | `clear.combo` = 6. |
| `pu_reveal` | Generic power-up "tool engaged" sting under the name banner | `powerup` fanfare start (cell pop + 8-bit name banner), every kind. Then the per-kind `pu_sting_*`. |
| `pu_grow` | GROW | FILL effect (`kind:"GROW"`): cells grow in. Picked up by `Audio.cue("pu_grow")`. |
| `pu_swap` | SWAP | WARP effect (`kind:"SWAP"`): block teleports `from` → `to`. |
| `pu_quake` | QUAKE | RUMBLE effect (`kind:"QUAKE"`): column gravity, board shakes. |
| `pu_morph` | MORPH | GLITCH effect (`kind:"MORPH"`): a cell scrambles into another piece colour. |
| `pu_wreck` | WRECKING BALL | BOMB effect (`kind:"WRECK"`): the blast lands at **0.7 s** — sync the row smash there. |
| `pu_rivet` | RIVET | ×TOKEN effect (`kind:"RIVET"`): token stamps onto the board. |
| `rivet_single` | One rivet set into the board | Each ×TOKEN placed / each "×n" tick of the token banner (and finale tokens). |
| `charged_hum_loop` | Charged row glow | Loop while charged rows glow (full rows left by FILL/RUMBLE/WARP until the next `clear`). |
| `beeper` | Reversing-truck beeper, 3 beeps | `drop.tease` hover: 3 lock-on beeps (same key `Audio.beeper()` looks for). |
| `beeper_loop` | Reversing-truck beeper as a seamless loop | Hold during a long tease hover or the 2-crown anticipation; stop on resolve. |
| `beeper_synth_loop` | Alt | Alternative softer hover loop (radar ping) instead of `beeper_loop`. |
| `tease_heartbeat` | Tease heartbeat | Loop during the `drop.tease` hover (with `beeper`). |
| `tease_slowmo` | Slow-mo whoosh | Entering the tease slow-motion (camera nudges in). |
| `tease_lock` | Blueprint locks in | `tease.taken:true`: target brackets lock on the perfect spot, right before the payoff drop. |
| `nearmiss` | Near miss "aww" clank | `tease.taken:false`: after the slip to the real spot (the gamer grabs his head). |
| `perfect_clear` | Perfect clear | `perfectClear`. |
| `longboi_fall` | LONG BOI incoming | `quad` / Long Boi: the gold I piece starts falling (0.9 s), then `longboi_slam` on impact. |
| `longboi_slam` | LONG BOI arrival | Long Boi impact (then `clear_4` for the QUAD). |
| `levelup` | LONG BOI level up | `multStep` (generic). Prefer `mult_step_1..5` by ladder rung. |
| `retrigger` | +Spins retrigger | `retrigger` (+3 spins: "the clock pushes past dawn"). |
| `overload_alarm_loop` | TOP OUT OVERLOAD | Held alarm while LONG BOI INCOMING hangs over the open column (STACKED: TOP OUT danger). Stop on the drop. |
| `overload_detonate` | TOP OUT overload detonation | STACKED TOP OUT detonation; in QUAD GOD use for the biggest BOMB / trophy-stack blow-up if wanted. |
| `ceiling_break` | Ceiling break | STACKED TOP OUT ceiling break; in QUAD GOD free for the dawn break-through / any "level up through the roof" moment. |
| `win_big` | BIG WIN | BIG WIN ≥ 15× (only when the round total beats its cost). |
| `win_super` | SUPER WIN | SUPER WIN ≥ 30×. |
| `win_mega` | MEGA WIN | MEGA WIN ≥ 50×. |
| `win_epic` | EPIC / MAX WIN | EPIC ≥ 100× and MAX. |
| `coin_shower` | Coin win | Gold pops / `setWin` once the cumulative win beats the bet; under win tiers. |
| `coin_shower_loop` | Coin win loop | Loop under long win count-ups; stop with `countup_end`. |
| `countup_tick` | Count-up tick | Each count-up step (rate-limit to ~15/s; `Audio.tick()`). |
| `countup_end` | Count-up lands on the final number | Count-up lands on `finalWin.amount`. |
| `bonus_intro_longboi` | LONG BOI intro | ALL-NIGHTER intro card (`bonusStart` `bonus:"allnighter"`; STACKED key for its first bonus). |
| `bonus_intro_topout` | TOP OUT intro | TOURNAMENT intro card (`bonusStart` `bonus:"tournament"`; STACKED key for its second bonus). |
| `bonus_outro` | Bonus end / end of shift | `bonusEnd` (outro card / count-up start). |
| `shift_start` | DOUBLE SHIFT starts | STACKED DOUBLE SHIFT start (no QUAD GOD equivalent; kept so the fork never misses a key). |
| `shift_roll` | Each SHIFT roll begins | STACKED DOUBLE SHIFT roll (no QUAD GOD equivalent). |
| `shift_end` | DOUBLE SHIFT over | STACKED DOUBLE SHIFT end (no QUAD GOD equivalent). |
| `ui_click` | Button click | Buttons. |
| `ui_tick` | Bet +/- and menu tick | Sliders, menu steps (STACKED also uses it for bet ±; prefer `bet_up` / `bet_down`). |
| `ui_open` | Panel open | Open buy / autoplay / rules / menu panels. |
| `ui_error` | Not allowed / insufficient funds | Disabled action / insufficient balance. |
| `returned_tick` | RETURNED $X | "RETURNED $X" (0 < win < cost): this tick only, no fanfare, no coins. |

Music keys: `music_base` → base A (`music_base_B` = candidate B), `music_longboi` → ALL-NIGHTER chill, `music_longboi_heat` → ALL-NIGHTER hype, `music_topout` → TOURNAMENT, `music_fanfare` → big-win fanfare. New: `music_topout_final`, `music_trophy`, `music_attract`.

## Power-up reel

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `reel_spin_loop` | `sfx/reel_spin_loop.mp3` | `reveal` / `fsSpin`: loop while the power-up reel (marquee) spins; stop on the last window. | 0.45 | 0.75 s loop (33075 smp) | Marquee reel spinning: 16 ticks/s of bright pulse clicks alternating two pitches over a soft 50 % pulse motor buzz with a chasing-bulb shimmer. Seamless 0.75 s loop. |
| `reel_stop` | `sfx/reel_stop.mp3` | Each reel window that stops empty (`null`). rate 0.95–1.1 by column. | 0.6 | 0.18 s | One reel window locking: short descending pulse "tchk" + noise click + small triangle thump (0.2 s). |
| `reel_stop_pu` | `sfx/reel_stop_pu.mp3` | A reel window that stops on a power-up (before its fanfare). | 0.7 | 0.48 s | Window locks on a power-up: reel_stop + a bright two-note ping (A6 → E7) with a little echo (0.45 s). |

## Crown scatters

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `hardhat_1` | `sfx/hardhat_1.mp3` | First gold-crown scatter (`"SCAT"`) window stops. Alias: `crown_1`. | 0.8 | 1.48 s | Crown 1: one FM bell ding (D6) with a pulse edge and a few high sparkles (≈1 s). |
| `hardhat_2` | `sfx/hardhat_2.mp3` | Second crown (start anticipation: `antic_riser` + `tease_riser_loop`). Alias: `crown_2`. | 0.85 | 1.83 s | Crown 2: two rising bell dings (D6–F#6), more sparkle, soft upward pulse sweep under it (≈1.2 s). |
| `hardhat_3` | `sfx/hardhat_3.mp3` | Third+ crown (bonus coming: `bonusTrigger` follows). Alias: `crown_3`. | 0.9 | 2.56 s | Crown 3+: four-note bell arpeggio D6–F#6–A6–D7 into a D-major pulse chord, sub thump and noise crash (≈1.6 s). |
| `antic_riser` | `sfx/antic_riser.mp3` | Anticipation after 2 crowns while the remaining windows slow down. | 0.7 | 2.02 s | Anticipation riser (2.0 s): pulse wave climbing 3 octaves with an accelerating tremolo, a climbing per-frame arpeggio and a rising noise wash. Ends open. |

## Claw & controller

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `crane_winch` | `sfx/crane_winch.mp3` | The claw slides the piece over its column before each `drop` (skip in turbo). Alias: `claw_slide`. | 0.45 | 0.44 s | Claw slide: servo "zzzip" (25 % pulse with a 30 Hz buzz, pitch up then settling) + soft noise swish (0.42 s). |
| `crane_winch_loop` | `sfx/crane_winch_loop.mp3` | Long claw moves (tease hover travel); fade in/out 80 ms. | 0.35 | 0.60 s loop (26460 smp) | Claw servo hum: steady 25 % pulse buzz (+ a thin octave-up 12.5 % layer) with a 30 Hz flutter, seamless 0.6 s loop. |
| `crane_creak` | `sfx/crane_creak.mp3` | Tease wobble (`drop.tease`): the hanging piece sways. | 0.5 | 0.92 s | Tease wobble: 12.5 % pulse bending ±3 semitones at 3 Hz ("wee-ooo-wee"), triangle under it (0.9 s). |
| `crane_creak2` | `sfx/crane_creak2.mp3` | Variant of `crane_creak` (alternate randomly). | 0.5 | 0.57 s | Shorter, faster wobble variant (0.55 s, 5 Hz, slightly higher). |
| `crane_release` | `sfx/crane_release.mp3` | Claw lets go: start of every `drop` fall. Alias: `claw_release`. | 0.5 | 0.16 s | Claw opens: two quick clicks (noise + pulse "tch-tk") and a short downward blip (0.18 s). |
| `crane_swing` | `sfx/crane_swing.mp3` | Near-miss slide (`tease.taken:false`, piece slips one column), sideways claw moves. | 0.55 | 0.37 s | Sideways slip: quick pulse "whoop" glide down-up with a noise swish (0.35 s). |
| `pad_button` | `sfx/pad_button.mp3` | **new** · Gamer presses a face button (every drop flick; input-log ticks). rate 0.9–1.15 for variety. | 0.4 | 0.06 s | Controller button press: tiny plastic click (noise tick) + a 15 ms bright pulse blip (0.06 s). |
| `pad_dpad` | `sfx/pad_dpad.mp3` | **new** · D-pad tap (claw moves a column; input arrows). | 0.4 | 0.07 s | D-pad tap: softer, lower click (900 Hz blip + rubber thock) (0.06 s). |
| `input_tick` | `sfx/input_tick.mp3` | **new** · Each input-log arrow that pops beside the piece during a tease. | 0.45 | 0.06 s | Input-log arrow pop: 25 ms 12.5 % pulse chirp sliding up (2.2 → 3.1 kHz). |
| `mash_loop` | `sfx/mash_loop.mp3` | **new** · Loop while the gamer leans in and mashes (tease hover). Stop on resolve. | 0.35 | 0.50 s loop (22050 smp) | Button mashing: 14 presses per 0.5 s loop alternating two buttons (clicks + blips), slightly uneven like real mashing. |
| `rotate` | `sfx/rotate.mp3` | **new** · Piece rotates on the claw (each quarter turn). | 0.45 | 0.10 s | Rotate blip: two quick 25 % pulse chirps stepping up a fourth (0.09 s). |

## Landings

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `land_girder` | `sfx/land_girder.mp3` | `drop` lands, `piece.type` **I** (the Long Boi piece). | 0.7 | 0.37 s | I piece lands: deepest thunk (triangle drop to 48 Hz) + low pulse "dunk" + soft grit (0.3 s). |
| `land_glass` | `sfx/land_glass.mp3` | `drop` lands, **O**. | 0.7 | 0.30 s | O piece lands: thunk + high 12.5 % "tink" (B6) (0.25 s). |
| `land_hazard` | `sfx/land_hazard.mp3` | `drop` lands, **T**. | 0.7 | 0.30 s | T piece lands: thunk + mid pulse blip (0.25 s). |
| `land_brick` | `sfx/land_brick.mp3` | `drop` lands, **S**. | 0.65 | 0.30 s | S piece lands: thunk + crunchy low-clock noise (0.25 s). |
| `land_plate` | `sfx/land_plate.mp3` | `drop` lands, **Z**. | 0.65 | 0.30 s | Z piece lands: thunk + metallic short-mode noise "tang" (0.25 s). |
| `land_neon` | `sfx/land_neon.mp3` | `drop` lands, **J**. | 0.7 | 0.30 s | J piece lands: thunk + a quick downward zap (2 kHz → 400 Hz) (0.25 s). |
| `land_concrete` | `sfx/land_concrete.mp3` | `drop` lands, **L**. | 0.7 | 0.34 s | L piece lands: heavier thunk + low rumble grit (0.3 s). |
| `hard_drop` | `sfx/hard_drop.mp3` | **new** · Fast/turbo slam drop (piece falls straight down), or any drop the front end wants to punch. | 0.75 | 0.47 s | Hard-drop slam: 60 ms falling pulse zip into a heavy thunk + 8-bit crunch + tiny rumble (0.45 s). |

## Line clears

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `clear_1` | `sfx/clear_1.mp3` | `clear` with `lines` 1 (also each row of a BOMB `powerup`). | 0.75 | 0.43 s | Single: 3-note rising pulse arpeggio D6–F#6–A6 (45 ms steps) + a high zap sweep (0.5 s). |
| `clear_2` | `sfx/clear_2.mp3` | `clear` with `lines` 2. | 0.8 | 0.46 s | Double: 4-note arpeggio D6–F#6–A6–D7 with an octave sparkle layer (0.6 s). |
| `clear_3` | `sfx/clear_3.mp3` | `clear` with `lines` 3. | 0.85 | 1.00 s | Triple: 6-note run A5–D6–F#6–A6–D7–F#7 into a short D-major pulse chord (0.9 s). |
| `clear_4` | `sfx/clear_4.mp3` | `clear` with `lines` ≥ 4 (QUAD) and every Long Boi `quad`. | 0.9 | 2.71 s | QUAD fanfare sting (2.3 s): the QUAD GOD four-note motif B5–C#6–D6–F#6 on pulse lead + FM brass, D-major brass chord, kick + sub, noise crash, sparkle arps. |

## Combo ladder

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `combo_1` | `sfx/combo_1.mp3` | Optional light layer on the first `clear` (combo 1). | 0.48 | 0.47 s | Combo ×1: two-note pulse blip (root + fifth) on step 1 of the D-major pentatonic ladder (D5). |
| `combo_2` | `sfx/combo_2.mp3` | `clear.combo` = 2. | 0.51 | 0.47 s | Combo ×2: two-note pulse blip (root + fifth) on step 2 of the D-major pentatonic ladder (E5). |
| `combo_3` | `sfx/combo_3.mp3` | `clear.combo` = 3. | 0.54 | 0.59 s | Combo ×3: two-note pulse blip (root + fifth) on step 3 of the D-major pentatonic ladder (F#5); + octave ping. |
| `combo_4` | `sfx/combo_4.mp3` | `clear.combo` = 4. | 0.57 | 0.59 s | Combo ×4: two-note pulse blip (root + fifth) on step 4 of the D-major pentatonic ladder (A5); + octave ping. |
| `combo_5` | `sfx/combo_5.mp3` | `clear.combo` = 5. | 0.6 | 1.11 s | Combo ×5: two-note pulse blip (root + fifth) on step 5 of the D-major pentatonic ladder (B5); + octave ping; + FM bell. |
| `combo_6` | `sfx/combo_6.mp3` | `clear.combo` = 6. | 0.63 | 1.12 s | Combo ×6: two-note pulse blip (root + fifth) on step 6 of the D-major pentatonic ladder (D6); + octave ping; + FM bell. |
| `combo_7` | `sfx/combo_7.mp3` | **new** · `clear.combo` = 7. (STACKED stops at 6: map `combo_min(10, n)`.) | 0.66 | 1.11 s | Combo ×7: two-note pulse blip (root + fifth) on step 7 of the D-major pentatonic ladder (E6); + octave ping; + FM bell; + sparkle. |
| `combo_8` | `sfx/combo_8.mp3` | **new** · `clear.combo` = 8. | 0.69 | 1.11 s | Combo ×8: two-note pulse blip (root + fifth) on step 8 of the D-major pentatonic ladder (F#6); + octave ping; + FM bell; + sparkle. |
| `combo_9` | `sfx/combo_9.mp3` | **new** · `clear.combo` = 9. | 0.72 | 1.17 s | Combo ×9: two-note pulse blip (root + fifth) on step 9 of the D-major pentatonic ladder (A6); + octave ping; + FM bell; + sparkle; + brass triad. |
| `combo_10` | `sfx/combo_10.mp3` | **new** · `clear.combo` = 10 or more. | 0.72 | 1.22 s | Combo ×10: two-note pulse blip (root + fifth) on step 10 of the D-major pentatonic ladder (B6); + octave ping; + FM bell; + sparkle; + brass triad. |

## QUAD + chains

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `quad_chain_2` | `sfx/quad_chain_2.mp3` | **new** · `quad.chainIndex` = 2 (QUAD CHAIN ×n), layered after `clear_4`. | 0.85 | 2.45 s | QUAD CHAIN ×2: chain-link clink, then the QUAD motif transposed up a tone, pulse + FM brass, brass triad hit, kick + crash, sparkle (≈1.6 s). |
| `quad_chain_3` | `sfx/quad_chain_3.mp3` | **new** · `quad.chainIndex` = 3 (QUAD CHAIN ×n), layered after `clear_4`. | 0.85 | 2.44 s | QUAD CHAIN ×3: chain-link clink, then the QUAD motif transposed up a major third, pulse + FM brass, brass triad hit, kick + crash, sparkle (≈1.6 s). |
| `quad_chain_4` | `sfx/quad_chain_4.mp3` | **new** · `quad.chainIndex` = 4 (QUAD CHAIN ×n), layered after `clear_4`. | 0.85 | 2.46 s | QUAD CHAIN ×4: chain-link clink, then the QUAD motif transposed up a fourth, pulse + FM brass, brass triad hit, kick + crash, sparkle (≈1.6 s). |
| `quad_chain_5` | `sfx/quad_chain_5.mp3` | **new** · `quad.chainIndex` = 5 or more (QUAD CHAIN ×n), layered after `clear_4`. | 0.85 | 2.44 s | QUAD CHAIN ×5: chain-link clink, then the QUAD motif transposed up a fifth, pulse + FM brass, brass triad hit, kick + crash, sparkle (≈1.6 s). |

## Power-ups

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `pu_reveal` | `sfx/pu_reveal.mp3` | `powerup` fanfare start (cell pop + 8-bit name banner), every kind. Then the per-kind `pu_sting_*`. | 0.6 | 0.75 s | Generic power-up: fast per-frame rising arpeggio sweep (D5 → D7, 0.4 s) + sparkle ping on top. |
| `pu_sting_fill` | `sfx/pu_sting_fill.mp3` | **new** · FILL (`kind:"GROW"`) name banner. | 0.7 | 0.56 s | FILL sting: quick five-note scale climb D5–E5–F#5–G5–A5 landing on a held D6 with vibrato ("filling up"), 0.8 s. |
| `pu_sting_warp` | `sfx/pu_sting_warp.mp3` | **new** · WARP (`kind:"SWAP"`) name banner. | 0.7 | 0.99 s | WARP sting: portamento swoop up an octave and back with a duty sweep (phasey), ending on a bright double blip (0.7 s). |
| `pu_sting_bomb` | `sfx/pu_sting_bomb.mp3` | **new** · BOMB (`kind:"WRECK"`) name banner. | 0.75 | 0.91 s | BOMB sting: crackling fuse (band-passed noise ticks) under a descending minor triad A5–F5–D5 and a low "uh-oh" triangle pair (0.9 s). |
| `pu_sting_rumble` | `sfx/pu_sting_rumble.mp3` | **new** · RUMBLE (`kind:"QUAKE"`) name banner. | 0.75 | 0.89 s | RUMBLE sting: low triangle octave trill (D2–D3, 16/s) + snare roll crescendo, then three rising pulse stabs D5–F#5–A5 (0.9 s). |
| `pu_sting_glitch` | `sfx/pu_sting_glitch.mp3` | **new** · GLITCH (`kind:"MORPH"`) name banner. | 0.7 | 0.76 s | GLITCH sting: stuttering, bit-crushed pulse fragments at scrambled pitches that snap into a clean D-major blip pair (0.8 s). |
| `pu_sting_token` | `sfx/pu_sting_token.mp3` | **new** · ×TOKEN (`kind:"RIVET"`) name banner. | 0.7 | 1.23 s | ×TOKEN sting: two coin dings (A6, D7) + FM bell "×" shimmer and a sparkle tail (0.8 s). |
| `pu_grow` | `sfx/pu_grow.mp3` | FILL effect (`kind:"GROW"`): cells grow in. Picked up by `Audio.cue("pu_grow")`. | 0.8 | 1.02 s | FILL effect: stepped rising "gulp" (pulse steps up the D-major scale every 45 ms over a rising glide) + bubbly blips, locking with a thunk (1.0 s). |
| `pu_swap` | `sfx/pu_swap.mp3` | WARP effect (`kind:"SWAP"`): block teleports `from` → `to`. | 0.8 | 0.79 s | WARP effect: "zwip" up-sweep, 120 ms gap with a warble, "zwop" down-sweep, small pop (0.8 s). |
| `pu_quake` | `sfx/pu_quake.mp3` | RUMBLE effect (`kind:"QUAKE"`): column gravity, board shakes. | 0.85 | 1.52 s | RUMBLE effect (1.5 s): dark low-clock LFSR rumble pulsing at 8 Hz + triangle sub wobble + three heavy thumps + debris ticks. |
| `pu_morph` | `sfx/pu_morph.mp3` | GLITCH effect (`kind:"MORPH"`): a cell scrambles into another piece colour. | 0.8 | 1.02 s | GLITCH effect (1.0 s): sample-and-hold random-pitch 12.5 % pulse at 30 steps/s, bit-crushed, chopped by a stutter gate, resolving into a clean rising blip. |
| `pu_wreck` | `sfx/pu_wreck.mp3` | BOMB effect (`kind:"WRECK"`): the blast lands at **0.7 s** — sync the row smash there. | 0.9 | 2.22 s | BOMB effect (2.2 s): fuse crackle with a rising whistle for 0.7 s, then a big 8-bit explosion (falling-clock noise + sub drop + crunch) with debris blips. |
| `pu_rivet` | `sfx/pu_rivet.mp3` | ×TOKEN effect (`kind:"RIVET"`): token stamps onto the board. | 0.8 | 0.44 s | ×TOKEN effect: metallic "chink" (short-mode noise) + stamp thunk + coin ding arpeggio up (0.6 s). |
| `rivet_single` | `sfx/rivet_single.mp3` | Each ×TOKEN placed / each "×n" tick of the token banner (and finale tokens). Alias: `token_tick`. | 0.6 | 0.24 s | One token tick: short metallic chink + single coin ding (0.25 s). |
| `charged_hum_loop` | `sfx/charged_hum_loop.mp3` | Loop while charged rows glow (full rows left by FILL/RUMBLE/WARP until the next `clear`). | 0.3 | 1.50 s loop (66150 smp) | Charged row glow: soft D3 50 % pulse with slow PWM + triangle an octave down + 4 Hz shimmer, seamless 1.5 s loop. |

## Tease

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `beeper` | `sfx/beeper.mp3` | `drop.tease` hover: 3 lock-on beeps (same key `Audio.beeper()` looks for). | 0.55 | 0.68 s | Target lock-on: three 50 % pulse beeps E6, E6, A6 (last one higher), 90 ms each, 0.26 s apart (0.85 s). |
| `beeper_loop` | `sfx/beeper_loop.mp3` | Hold during a long tease hover or the 2-crown anticipation; stop on resolve. | 0.5 | 0.50 s loop (22050 smp) | Lock-on beep loop: one 50 % pulse E6 beep + gap, seamless 0.5 s loop. |
| `beeper_synth_loop` | `sfx/beeper_synth_loop.mp3` | Alternative softer hover loop (radar ping) instead of `beeper_loop`. | 0.4 | 0.80 s loop (35280 smp) | Radar ping loop: soft triangle+pulse ping A5 with two echoes, seamless 0.8 s loop. |
| `tease_heartbeat` | `sfx/tease_heartbeat.mp3` | Loop during the `drop.tease` hover (with `beeper`). | 0.6 | 0.90 s loop (39690 smp) | Heartbeat: chip lub-dub (triangle/sine thumps 60/50 Hz with a noise tap), seamless 0.9 s loop (~67 bpm). |
| `tease_slowmo` | `sfx/tease_slowmo.mp3` | Entering the tease slow-motion (camera nudges in). | 0.6 | 1.12 s | Time slows (1.1 s): a D-major per-frame arpeggio whose step rate slows down while the whole chord glides down an octave, low-passing as it falls. |
| `tease_lock` | `sfx/tease_lock.mp3` | `tease.taken:true`: target brackets lock on the perfect spot, right before the payoff drop. | 0.65 | 0.64 s | Brackets lock: two clamp ticks, then a bright "ch-ching" (D6 + A6 pulse chord) with an echo (0.55 s). |
| `nearmiss` | `sfx/nearmiss.mp3` | `tease.taken:false`: after the slip to the real spot (the gamer grabs his head). | 0.6 | 0.72 s | Near-miss "whomp": falling pulse+triangle glide (420 → 75 Hz) with a heavy body, a smaller second "womp", deflating noise (0.9 s). |
| `tease_riser_loop` | `sfx/tease_riser_loop.mp3` | **new** · Tension bed while a tease / 2-crown anticipation holds; crossfade out on resolve. | 0.45 | 2.00 s loop (88200 smp) | Endless riser: a chip Shepard tone (five 12.5 % pulse octaves gliding up one octave per loop, bell-shaped level so it never tops out) + 8 ticks per loop. Seamless 2.0 s loop. |

## Big moments

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `perfect_clear` | `sfx/perfect_clear.mp3` | `perfectClear`. | 0.85 | 2.92 s | Perfect clear (2.2 s): sparkling D-major pulse arpeggio up two octaves, FM bell chord, echo shimmer and a soft crash. |
| `longboi_fall` | `sfx/longboi_fall.mp3` | `quad` / Long Boi: the gold I piece starts falling (0.9 s), then `longboi_slam` on impact. | 0.75 | 0.92 s | LONG BOI falling: classic falling whistle (50 % pulse 1.9 kHz → 260 Hz over 0.9 s) with rising wind noise. |
| `longboi_slam` | `sfx/longboi_slam.mp3` | Long Boi impact (then `clear_4` for the QUAD). | 0.95 | 2.69 s | LONG BOI slam (2.6 s): kick + sub boom + 8-bit explosion, D power chord (pulse stack + triangle D2), noise crash, then a two-note FM brass "LONG-BOI" call (D4 → A4). |
| `longboi_alarm` | `sfx/longboi_alarm.mp3` | **new** · "LONG BOI INCOMING" banner (one-shot). For a held alarm use `overload_alarm_loop`. | 0.7 | 1.62 s | LONG BOI INCOMING alarm (1.7 s): two cycles of an 8-bit klaxon (50 % pulse alternating A5/E5 at 8 Hz over a sweeping siren). |
| `levelup` | `sfx/levelup.mp3` | `multStep` (generic). Prefer `mult_step_1..5` by ladder rung. | 0.8 | 1.65 s | Multiplier up: three rising pulse notes A5–C#6–E6 into a held A6 with echo + kick (1.0 s). |
| `mult_step_1` | `sfx/mult_step_1.mp3` | **new** · `multStep` to ×2 (ALL-NIGHTER ladder rung 1; finale ladder: rung min(5, step)). | 0.78 | 1.73 s | Multiplier step to ×2: major arpeggio + held octave, rooted a step higher each rung (≈1.2 s). |
| `mult_step_2` | `sfx/mult_step_2.mp3` | **new** · `multStep` to ×3 (ALL-NIGHTER ladder rung 2; finale ladder: rung min(5, step)). | 0.81 | 1.69 s | Multiplier step to ×3: major arpeggio + held octave, rooted a step higher each rung, crash (≈1.2 s). |
| `mult_step_3` | `sfx/mult_step_3.mp3` | **new** · `multStep` to ×5 (ALL-NIGHTER ladder rung 3; finale ladder: rung min(5, step)). | 0.84 | 1.72 s | Multiplier step to ×5: major arpeggio + held octave, rooted a step higher each rung, FM brass doubling, crash (≈1.2 s). |
| `mult_step_4` | `sfx/mult_step_4.mp3` | **new** · `multStep` to ×8 (ALL-NIGHTER ladder rung 4; finale ladder: rung min(5, step)). | 0.87 | 1.70 s | Multiplier step to ×8: major arpeggio + held octave, rooted a step higher each rung, FM brass doubling, crash, sparkle (≈1.2 s). |
| `mult_step_5` | `sfx/mult_step_5.mp3` | **new** · `multStep` to ×10 (ALL-NIGHTER ladder rung 5; finale ladder: rung min(5, step)). | 0.9 | 1.68 s | Multiplier step to ×10: major arpeggio + held octave, rooted a step higher each rung, FM brass doubling, crash, sparkle, sub boom (≈1.2 s). |
| `retrigger` | `sfx/retrigger.mp3` | `retrigger` (+3 spins: "the clock pushes past dawn"). | 0.8 | 1.25 s | +Spins: two quick rising arpeggios (D–F#–A–D, then E–G#–B–E) and a bright chord blip (1.1 s). |
| `overload_alarm_loop` | `sfx/overload_alarm_loop.mp3` | Held alarm while LONG BOI INCOMING hangs over the open column (STACKED: TOP OUT danger). Stop on the drop. | 0.45 | 1.60 s loop (70560 smp) | 8-bit siren: 25 % pulse sweeping 600 ↔ 950 Hz twice per loop + klaxon blips on the beat, seamless 1.6 s loop. |
| `overload_detonate` | `sfx/overload_detonate.mp3` | STACKED TOP OUT detonation; in QUAD GOD use for the biggest BOMB / trophy-stack blow-up if wanted. | 1.0 | 3.12 s | 8-bit chain explosion (3 s): three booms rolling into each other, debris blips, long falling-clock rumble. |
| `ceiling_break` | `sfx/ceiling_break.mp3` | STACKED TOP OUT ceiling break; in QUAD GOD free for the dawn break-through / any "level up through the roof" moment. | 0.9 | 1.57 s | Break-through (2.0 s): smash (noise crunch + thump), shattering glitter blips, then a big rising per-frame arpeggio warp. |

## Bonus

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `bonus_trigger` | `sfx/bonus_trigger.mp3` | **new** · `bonusTrigger` (3 crowns → ALL-NIGHTER, 4+ → TOURNAMENT, or a buy), before the intro card. | 0.9 | 3.77 s | Bonus trigger fanfare (2.8 s): snare roll, the QUAD motif on pulse + FM brass in D, a G–A–D brass cadence, kick, crash and sparkle. |
| `bonus_intro_longboi` | `sfx/bonus_intro_longboi.mp3` | ALL-NIGHTER intro card (`bonusStart` `bonus:"allnighter"`; STACKED key for its first bonus). Alias: `allnighter_intro`. | 0.85 | 4.31 s | ALL-NIGHTER intro (3.2 s): three night-time FM bell chimes (C6–Ab5–F5), a dreamy F-minor 12.5 % arpeggio rising, then a riser into a hit (kick + Fm chord). |
| `bonus_intro_topout` | `sfx/bonus_intro_topout.mp3` | TOURNAMENT intro card (`bonusStart` `bonus:"tournament"`; STACKED key for its second bonus). Alias: `tournament_intro`. | 0.85 | 4.13 s | TOURNAMENT intro (3.0 s): two ominous FM brass D-minor hits with sub thumps, a snare roll, then a "versus" slam (boom + Dm power chord + crash). |
| `bonus_outro` | `sfx/bonus_outro.mp3` | `bonusEnd` (outro card / count-up start). | 0.8 | 3.02 s | Bonus over (2.4 s): a falling-then-rising pulse phrase (A6–F#6–D6 … E6–F#6–D6) over G–A–D triangle bass, ending on a soft D chord with echo. |
| `shift_start` | `sfx/shift_start.mp3` | STACKED DOUBLE SHIFT start (no QUAD GOD equivalent; kept so the fork never misses a key). | 0.6 | 0.54 s | Clock-in: chip "ka-chunk" (two thunks) + a short 50 % buzzer (A3+Bb3 for 0.3 s) (0.7 s). |
| `shift_roll` | `sfx/shift_roll.mp3` | STACKED DOUBLE SHIFT roll (no QUAD GOD equivalent). | 0.5 | 0.23 s | Soft ratchet: four quick descending ticks (0.3 s). |
| `shift_end` | `sfx/shift_end.mp3` | STACKED DOUBLE SHIFT end (no QUAD GOD equivalent). | 0.6 | 0.77 s | Buzzer + two short whistle blips (0.8 s). |

## ALL-NIGHTER

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `clock_tick` | `sfx/clock_tick.mp3` | **new** · The red digital clock advances (each `fsSpin`, before the drops). | 0.5 | 0.03 s | Digital clock tick: 10 ms square tick at 1 kHz + plastic click (0.06 s). |
| `clock_flip` | `sfx/clock_flip.mp3` | **new** · Clock digits flip to the new time (`fsSpin.clock`), right after `clock_tick`. | 0.5 | 0.16 s | Clock flip: two-blip digital chirp (B5 → E6) (0.15 s). |
| `clock_tick_loop` | `sfx/clock_tick_loop.mp3` | **new** · Optional quiet tick-tock bed in pauses (intro card, between spins). | 0.25 | 1.00 s loop (44100 smp) | Tick-tock: alternating 1.2 kHz / 900 Hz clock ticks (pulse + triangle body, faint slap echo) twice a second, seamless 1.0 s loop. |
| `dawn_chime` | `sfx/dawn_chime.mp3` | **new** · Last spin / 6:00 AM: dawn light (and `bonusEnd` of ALL-NIGHTER if the night ends). | 0.8 | 4.34 s | Alarm-clock dawn (3.2 s): 1 s of 8-bit alarm bell (FM bell + pulse trilling at 16 Hz), then a bright sunrise D-major arpeggio climbing to a held chord with sparkle. |

## TOURNAMENT

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `hit_jab` | `sfx/hit_jab.mp3` | **new** · `hit` with `source:"clear"`, `lines` 1–3 (jab), as damage flies to the rival HP bar. rate up for 2/3 lines. | 0.75 | 0.22 s | Jab: noise smack + short falling pulse blip + punchy thump (0.25 s). |
| `hit_special` | `sfx/hit_special.mp3` | **new** · `hit` with `source:"quad"` (SPECIAL MOVE cut-in). | 0.9 | 1.50 s | SPECIAL MOVE (1.3 s): 0.35 s charge-up (rising pulse + noise), then a huge hit (crunch + boom + high zap) with a ringing echo. |
| `hp_drain` | `sfx/hp_drain.mp3` | **new** · Rival HP bar drains after a `hit` (one-shot, ≈0.8 s). | 0.5 | 0.69 s | HP drain: 10 quick descending blips (25 % pulse, a semitone apart) (0.8 s). |
| `hp_drain_loop` | `sfx/hp_drain_loop.mp3` | **new** · Loop while a long HP drain animates (big hits / finale); stop when the bar settles. | 0.4 | 0.40 s loop (17640 smp) | HP drain loop: 25 % "bloop" blips at 10/s alternating E6/C#6, seamless 0.4 s loop. |
| `ko_bell` | `sfx/ko_bell.mp3` | **new** · `ko`: the freeze — three bell strikes (with `crowd_roar`). | 0.9 | 1.68 s | Boxing-style bell (1.6 s): three fast FM bell strikes (inharmonic 2.76 ratio, ringing) — ding-ding-ding. |
| `crowd_roar` | `sfx/crowd_roar.mp3` | **new** · `ko` (with `ko_bell`), big SPECIAL hits, `champion`. | 0.7 | 3.01 s | Crowd roar (3 s), built only from noise: 18 formant-filtered LFSR "voices" swelling in and out, scattered claps and three chip whistles. |
| `crowd_roar_loop` | `sfx/crowd_roar_loop.mp3` | **new** · Arena bed under the KO celebration / trophy finale; fade in/out 0.3 s. | 0.4 | 3.00 s loop (132300 smp) | Crowd bed: the same noise-built crowd as a seamless 3.0 s loop (all swells and claps wrap). |
| `ko_hit` | `sfx/ko_hit.mp3` | **new** · `ko`: the "K.O.!" impact on the freeze frame (before `ko_bell`). | 0.95 | 1.42 s | K.O. impact (1.6 s): huge crunch + boom, then the sound "freezes" (a held, bit-crushed pulse drone dropping away) with a ringing high blip. |
| `decision` | `sfx/decision.mp3` | **new** · `decision`: spins ran out — judges' cards. | 0.8 | 3.85 s | Judges' decision (2.8 s): 1.4 s snare-roll crescendo, three card-flip blips (rising), then a neutral-bright resolving chord (G → D) on pulse + brass. |
| `round_ready` | `sfx/round_ready.mp3` | **new** · `matchStart`: the "READY" banner (no voice). | 0.7 | 0.68 s | "READY": two 50 % pulse alert tones A5 → D6 with a shimmer (0.6 s). |
| `round_fight` | `sfx/round_fight.mp3` | **new** · The "FIGHT" banner right after `round_ready` (no voice). | 0.85 | 1.12 s | "FIGHT": harsh D power-chord hit (pulse stack + triangle), noise burst, kick and an upward zap (0.8 s). |
| `bracket_advance` | `sfx/bracket_advance.mp3` | **new** · Bracket screen between matches: the line advances to the next round. | 0.7 | 1.02 s | Bracket advance (1.0 s): 8-step rising 16th blip run (line drawing) + a lock-in D–A chord blip. |
| `walkout_sting` | `sfx/walkout_sting.mp3` | **new** · Rival walk-out card (name, portrait, taunt). | 0.8 | 2.28 s | Rival walk-out (1.8 s): swelling noise into an ominous FM brass D-minor (add ♭6) stab with triangle low D and a tom pair. |
| `glitch_corrupt` | `sfx/glitch_corrupt.mp3` | **new** · `glitch` (THE LEGEND): per corrupted cell (flicker + pop in/out). | 0.6 | 0.44 s | Glitch corruption (0.6 s): bit-crushed stutter of scrambled blips + digital noise bursts + a down-pitched "pop". |
| `trophy_fanfare` | `sfx/trophy_fanfare.mp3` | **new** · `finale` (TROPHY SPIN) intro, before the trophy music. | 0.9 | 6.79 s | Trophy fanfare (≈5.5 s): F-major FM brass anthem phrase (C–F–A–C … ) doubled by a pulse lead, march bass, kick/snare, crashes, sparkle. |
| `champion_fanfare` | `sfx/champion_fanfare.mp3` | **new** · `champion` (WORLD CHAMPION, 10,000× max win) only. | 1.0 | 10.38 s | WORLD CHAMPION (≈9 s): snare roll, the full F-major anthem (two phrases up to F6) on FM brass + pulse + octave pulse, Dm–Bb–F cadence, boom, crowd roar, sparkle shower. |

## Wins

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `win_big` | `sfx/win_big.mp3` | BIG WIN ≥ 15× (only when the round total beats its cost). | 0.9 | 3.28 s | BIG WIN (≈3 s): NES fanfare: pulse lead A–B–C# pickup → D, A, D → held F#6 with vibrato, triangle bass, noise snare roll + crash, pulse chord stabs. |
| `win_super` | `sfx/win_super.mp3` | SUPER WIN ≥ 30×. | 0.9 | 3.27 s | SUPER WIN (≈3.2 s): the answering phrase, one step up (G–F#–E → F#, D, E → A6 over G–A–D), with octave + echo pulse voices; same key and tempo as BIG so it stacks on its tail. |
| `win_mega` | `sfx/win_mega.mp3` | MEGA WIN ≥ 50×. | 0.95 | 3.83 s | MEGA WIN (≈3.6 s): the QUAD motif phrase climbing to D7, now with 16-bit FM brass chords under the pulse voices + heavier kick/crash. |
| `win_epic` | `sfx/win_epic.mp3` | EPIC ≥ 100× and MAX. | 1.0 | 4.20 s | EPIC / MAX WIN (≈4.5 s): key lift to E major (C#–D#–E → G#, F#, G#, B → E7) on pulse + FM brass, sub boom and a sparkle shower. |
| `coin_shower` | `sfx/coin_shower.mp3` | Gold pops / `setWin` once the cumulative win beats the bet; under win tiers. | 0.6 | 1.17 s | 8-bit coin burst (1.4 s): ~16 coin dings (triad flick into a ringing top note) on D-major pentatonic pitches, dense then thinning, with echo. |
| `coin_shower_loop` | `sfx/coin_shower_loop.mp3` | Loop under long win count-ups; stop with `countup_end`. Alias: `coin_tally_loop`. | 0.45 | 1.00 s loop (44100 smp) | Coin tally loop: 12 coin dings per second cycling a rising 4-note pattern (E6, F#6, A6, B6), seamless 1.0 s loop. |
| `countup_tick` | `sfx/countup_tick.mp3` | Each count-up step (rate-limit to ~15/s; `Audio.tick()`). | 0.5 | 0.07 s | Count-up tick: tiny single coin blip (A6, 45 ms). |
| `countup_end` | `sfx/countup_end.mp3` | Count-up lands on `finalWin.amount`. | 0.7 | 1.35 s | Count-up lands: "ka-ching": stamp thunk + D-major chord ding (pulse + FM bell) (0.8 s). |

## UI

| cue | file | when | vol | length | sound (what it is) |
|---|---|---|---|---|---|
| `ui_click` | `sfx/ui_click.mp3` | Buttons. | 0.5 | 0.06 s | Button click: short 2 kHz pulse click + tick + tiny body (0.05 s). |
| `ui_tick` | `sfx/ui_tick.mp3` | Sliders, menu steps (STACKED also uses it for bet ±; prefer `bet_up` / `bet_down`). | 0.5 | 0.06 s | Menu tick: short 25 % blip at 2.6 kHz with a soft octave-down tick (0.04 s). |
| `ui_open` | `sfx/ui_open.mp3` | Open buy / autoplay / rules / menu panels. | 0.5 | 0.15 s | Panel open: two-note up blip (E5 → B5) (0.14 s). |
| `ui_error` | `sfx/ui_error.mp3` | Disabled action / insufficient balance. | 0.5 | 0.23 s | Not allowed: low 50 % pulse double buzz (Bb3, 2× 0.09 s). |
| `bet_up` | `sfx/bet_up.mp3` | **new** · Bet + (replace `ui_tick` on `betUp`). | 0.5 | 0.12 s | Bet up: two-note rising blip (A5 → D6) (0.1 s). |
| `bet_down` | `sfx/bet_down.mp3` | **new** · Bet − (replace `ui_tick` on `betDown`). | 0.5 | 0.12 s | Bet down: two-note falling blip (D6 → A5) (0.1 s). |
| `buy_confirm` | `sfx/buy_confirm.mp3` | **new** · Bonus buy confirmed (before `bonusTrigger`). | 0.7 | 0.62 s | Buy confirm (0.7 s): coin-in ding + insert "chunk" + a quick D-major confirm arpeggio. |
| `spin_press` | `sfx/spin_press.mp3` | **new** · SPIN pressed (optional; STACKED plays nothing here). | 0.5 | 0.13 s | Spin press: chunky start blip (pulse glide 300 → 900 Hz) + body thump + a small high tick (0.12 s). |
| `returned_tick` | `sfx/returned_tick.mp3` | "RETURNED $X" (0 < win < cost): this tick only, no fanfare, no coins. | 0.6 | 0.14 s | Neutral soft tok: triangle pluck at 600 Hz, no sparkle (0.12 s). |

## Music

Pick one base candidate; everything else has one version. Manifest keys for a forked `pack_assets.py` MUSIC dict:

```python
MUSIC = {'base': {'A': 'music/mus_base_a.mp3', 'B': 'music/mus_base_b.mp3'},
         'longboi': {'A': 'music/mus_allnighter.mp3'}, 'longboi_heat': {'A': 'music/mus_allnighter_hype.mp3'},
         'topout': {'A': 'music/mus_tournament.mp3'}, 'topout_final': {'A': 'music/mus_tournament_final.mp3'},
         'trophy': {'A': 'music/mus_trophy.mp3'}, 'fanfare': {'A': 'music/mus_fanfare.mp3'}, 'attract': {'A': 'music/mus_attract.mp3'}}
```

| candidate | file | BPM | loop | description |
|---|---|---|---|---|
| `music_base` · Base game theme, candidate **A** (default) | `music/mus_base_a.mp3` | 140 | 82.286 s = 3628800 smp, 48 bars | PLAYER ONE: bright heroic arcade theme, 140 BPM, D major. 4-bar intro teasing the QUAD motif, hook A (pulse lead, rock beat, octave bass, rhythmic arps), A' with a harmony voice, B in B minor/C (syncopated, 16th hats), C: soaring long-note lead over fast two-octave arps and four-on-the-floor, A'' full, 4-bar QUAD-motif turnaround. Key: D major. |
| `music_base_B` · Base game theme, candidate **B** | `music/mus_base_b.mp3` | 135 | 78.222 s = 3449600 smp, 44 bars | HIGH SCORE: syncopated chip-funk, 135 BPM, E dorian (Em7–A vamp, Cmaj7–D–Bm–B7 turn). Funk triangle bass, staccato 12.5 % hook, B section half-time with a 50 % "flute" lead and pad, C: call-and-response riff doubled an octave down over four-on-the-floor. Key: E dorian. |
| `music_longboi` · ALL-NIGHTER theme, chill (STACKED key for its first bonus track) | `music/mus_allnighter.mp3` | 120 | 64.000 s = 2822400 smp, 32 bars | LATE NIGHT (chill): 120 BPM, F minor (Fm7–Dbmaj7–Bbm7–C7). Soft 12.5 % lead with long ping-pong echo, pulse pad, triangle bass on roots/fifths, lazy kick/snare + shaker, plucked arps; C section on an FM electric-piano bell. Key: F minor. |
| `music_longboi_heat` · ALL-NIGHTER hype layer: crossfade by the ladder (STACKED heat key) | `music/mus_allnighter_hype.mp3` | 120 | 64.000 s = 2822400 smp, 32 bars | LATE NIGHT (hype): the same 32 bars sample-synced, with four-on-the-floor + clap, 16th hats, octave bass, per-frame arps, FM brass doubling the hook. Crossfade chill → hype as the multiplier climbs. Key: F minor. |
| `music_topout` · TOURNAMENT theme (STACKED key for its second bonus track) | `music/mus_tournament.mp3` | 150 | 76.800 s = 3386880 smp, 48 bars | BRACKET BATTLE: driving battle theme, 150 BPM, D minor with harmonic-minor C#. Pedal-tone 16th riff intro, heroic pulse hook over Dm–Bb–C–A, harmony on the repeat, long-note bridge, riff breakdown, tom outro. Key: D minor (+C#). |
| `music_topout_final` · TOURNAMENT final-match variant (new key; same grid, crossfade) | `music/mus_tournament_final.mp3` | 150 | 76.800 s = 3386880 smp, 48 bars | BRACKET BATTLE (final match): same 48 bars sample-synced, FM brass doubling every melody, riff doubled an octave up, 16th galloping bass, 8th kicks + clap, per-frame arps, crash every 4 bars, fills every 4. Key: D minor (+C#). |
| `music_trophy` · Trophy finale loop (new key) | `music/mus_trophy.mp3` | 126 | 60.952 s = 2688000 smp, 32 bars | WORLD STAGE: triumphant march, 126 BPM, F major. A on chip lead + harmony, A' handed to 16-bit FM brass with an octave pulse sparkle, B with FM pad + timpani toms, A'' brass + chip + two-octave arps. Key: F major. |
| `music_fanfare` · Big-win fanfare tail, one-shot (STACKED key) | `music/mus_fanfare.mp3` | 140 | one-shot 7.7 s | Big-win fanfare tail (one-shot): rising D-major run, G–A stabs, FM brass + pulse line D6…, tom fill, final D chord with two-octave sparkle arps and a 2–3 s tail. Key: D major. |
| `music_attract` · Intro / attract jingle, one-shot (new key) | `music/mus_attract.mp3` | 140 | one-shot 7.8 s | Intro / attract jingle (one-shot): power-on sweep, two quick G/A arps, the QUAD motif B–C#–D–F# answered by E–F#–G–B–A, landing on D with brass and sparkle. Key: D major. |

## Validation (nobody has listened yet: these are measurements)

`tools/audio/gate.py` decodes every shipped file (156 files: MP3s plus the OGG twins) and measures it independently of the renderer: loudness and true peak with **ffmpeg's own EBU R128 meter**, spectral flatness and RMS with **the exact aucheck.py algorithm**, plus mud ratio (150–500 Hz energy share), centroid, DC, clipping, loop length and seam click, and for music an **in-key ratio** (share of spectral-peak energy on the declared scale) and a **tuning offset** in cents against A440. Result: **156 / 156 pass**. Full numbers: `gate_report.json`.

Thresholds: flatness < 0.45 and RMS > −40 dB (aucheck); SFX true peak ≤ −1.5 dBTP, one-shot max-momentary −16 ± 1 (short transients ≥ −26), loops integrated −16 ± 1; music −18 ± 0.6 LUFS integrated, ≤ −2.0 dBTP, in-key ≥ 0.75, |tuning| ≤ 10 cents, mud ≤ 0.35, loops 60–120 s; loops decode to exactly their sample count with a seam jump ≤ 1.5 × the 99th-percentile sample step; no clipped samples.

| music | I LUFS | TP dBTP | flatness | in-key | tuning | mud | centroid Hz | seam |
|---|---|---|---|---|---|---|---|---|
| `base_a` | -18.3 | -5.9 | 0.238 | 0.955 | -0.0 c | 0.095 | 1131 | 0.073 |
| `base_b` | -18.3 | -4.8 | 0.246 | 0.895 | +0.3 c | 0.136 | 1082 | 0.012 |
| `allnighter` | -18.3 | -5.5 | 0.133 | 0.956 | -0.1 c | 0.22 | 925 | 0.075 |
| `allnighter_hype` | -18.3 | -6.0 | 0.259 | 0.939 | +1.4 c | 0.189 | 1103 | 0.029 |
| `tournament` | -18.3 | -6.8 | 0.216 | 0.975 | +0.1 c | 0.139 | 1106 | 0.01 |
| `tournament_final` | -18.3 | -6.3 | 0.304 | 0.914 | +0.3 c | 0.095 | 1205 | 0.152 |
| `trophy` | -18.3 | -6.3 | 0.225 | 0.968 | +0.8 c | 0.096 | 1335 | 0.665 |
| `fanfare` | -18.2 | -7.0 | 0.333 | 0.981 | -0.0 c | 0.086 | 1862 | — |
| `attract` | -18.3 | -7.4 | 0.315 | 0.983 | -0.6 c | 0.101 | 2064 | — |

