---
mvp: no
subsystem: audio
---

# Audio

**Headline finding:** there is no embedded audio in BNO 5-8.

The `extracted/client-5-8/sounds/` directory is **absent** — Phase 1 extraction did not produce a `sounds/` tree because the source `.gmd` carried zero Sound resources. This matches RESEARCH.md Pitfall 8 ("Audio Caveat — extracted/client-5-8/ has NO sounds/, fonts/, timelines/ dirs"). The `tools/asset-catalog/src/load.ts` `safeReadDir` defensively handles the absence — `summary.soundCount === 0` in `docs/extracted-engine/asset-catalog/index.json`.

## What the runtime grep finds

A grep across `extracted/client-5-8/scripts/*.gml` for the canonical GM audio entry points returns:

- **`sound_play`** — 0 matches in scripts. (Spot-checks across `objects/*/events/*.gml` also produced no matches.)
- **`playmidi`** — 0 matches.
- **`sound_load`** — 0 matches.
- **`external_define`** — appears in script `0014 dllinit`, but for **39dll networking** (`socket_dll.dll` symbol bindings), NOT for audio DLL bindings. See [client-networking.md](client-networking.md).

The conclusion is unambiguous: BNO 5-8 has no functional audio system. Music and SFX are not part of the client. This is a meaningful product decision (or an unfinished feature) — competitors in the BN-fan-game space typically had at least background MIDI loops.

## Why this matters for the rebuild

Audio is **explicitly out of MVP scope** (CLI-08 hard milestone is "two players walk + chat", no audio dimension). Phase 6 ships silent. Phase 7 PAR-08 (or similar) is the natural slot for adding music + SFX, but it is essentially a clean-sheet design rather than a port — there is nothing to port from.

If a future player or contributor surfaces an audio archive (e.g. someone recovered MIDIs from a beta build or the maya-project has them), Phase 7 can fold them in. For now: silence is correct.

## Scripts referenced in this subsystem

<!-- AUTOGEN:scripts:start -->
| Script ID | Name | Lines | Used in objects |
|-----------|------|-------|------------------|
<!-- AUTOGEN:scripts:end -->

## Objects referenced in this subsystem

<!-- AUTOGEN:objects:start -->
| Object ID | Name | Sprite | Mask | Events |
|-----------|------|--------|------|--------|
<!-- AUTOGEN:objects:end -->

## Engine functions used

<!-- AUTOGEN:gml-functions:start -->
| GML function | Call sites | Sample script | Wiki link |
|--------------|------------|---------------|-----------|
| `sound_play` | 0 | — | [wiki/07-gml-core-functions](../../decomp/wiki/07-gml-core-functions.md) |
| `playmidi` | 0 | — | [wiki/07-gml-core-functions](../../decomp/wiki/07-gml-core-functions.md) |
| `sound_load` | 0 | — | [wiki/07-gml-core-functions](../../decomp/wiki/07-gml-core-functions.md) |
<!-- AUTOGEN:gml-functions:end -->

The autogen `gml-functions` table below confirms zero call sites for `sound_play`, `playmidi`, and `sound_load` — the absence is the headline finding (Pitfall 8 mitigation).

## Rebuild guidance

- **Phase 6 ships silent.** Don't try to invent audio for the MVP.
- **Phase 7+ is clean-sheet.** Pick a web-audio library (Howler.js, Tone.js, native WebAudio) at that point. No port constraints.
- **Don't model `sounds/` in the asset pipeline.** The Phase 6 AST-01 atlas builder doesn't need a sound-track equivalent; it's an image-only pipeline.

## See also

- [.planning/phases/02-client-engine-documentation/02-RESEARCH.md](../../.planning/phases/02-client-engine-documentation/02-RESEARCH.md) — Audio Caveat (lines 989-1006)
- [client-networking.md](client-networking.md) — confirms `external_define` usage is networking, not audio
- [save-load.md](save-load.md) — settings.bno has a sound-toggles section despite zero audio (vestigial UI)
