From 7f120de0b8d2d20441bbea54a537e71b3c7907ea Mon Sep 17 00:00:00 2001 From: Hails <26784904+Hailey-Ross@users.noreply.github.com> Date: Sat, 3 Oct 2026 18:34:48 -0600 Subject: [PATCH] Audio: world / NPC sources complete, ped speech, specs published - Ped speech plays: speech manager -> library -> the living world's two streams, with queue / interrupts and the near / far lines by distance; levels and filters from the retail mechanism (filters equal to the recomp's, gain median within 0.5 %). Silent and logged when the opt-in speech decode is absent. - NPC skater: wheels and clothing on its own instance and a bail grunt; tricks, treatment and footsteps stay off for NPCs as in retail. - Per-model ped data (shoe class, voice, far threshold) and traffic engine records per model exported by setup; traffic relative-speed input and front / rear sound points; world hosts process before the mixer tick. - Test mod: opt-in (off by default), higher world-object limits (48 per mod, 128 total), a per-second summary log. - Specs published in docs/hails-additions/audio-specs/; code comments point at them; test data paths behind env vars (no .local defaults). --- crates/skate-audio/examples/aems_replay.rs | 5 +- .../skate-audio/examples/grain_bed_render.rs | 2 +- .../skate-audio/examples/grain_chain_probe.rs | 2 +- crates/skate-audio/examples/mixmap_golden.rs | 4 +- .../skate-audio/examples/seam_pulse_probe.rs | 2 +- crates/skate-audio/src/bus/env.rs | 2 +- crates/skate-audio/src/bus/eqchain.rs | 2 +- crates/skate-audio/src/bus/flange.rs | 2 +- crates/skate-audio/src/bus/mod.rs | 4 +- crates/skate-audio/src/bus/submix.rs | 2 +- crates/skate-audio/src/bus/zones.rs | 2 +- crates/skate-audio/src/dsp/delay.rs | 2 +- crates/skate-audio/src/dsp/fss.rs | 2 +- crates/skate-audio/src/dsp/mod.rs | 2 +- crates/skate-audio/src/dsp/peaking.rs | 2 +- crates/skate-audio/src/dsp/reverb.rs | 2 +- crates/skate-audio/src/eval/mod.rs | 2 +- crates/skate-audio/src/eval/ops.rs | 2 +- crates/skate-audio/src/formats/abk.rs | 2 +- crates/skate-audio/src/formats/mod.rs | 2 +- crates/skate-audio/src/grain/bed.rs | 2 +- crates/skate-audio/src/grain/board.rs | 2 +- crates/skate-audio/src/grain/chain.rs | 2 +- crates/skate-audio/src/grain/format.rs | 2 +- crates/skate-audio/src/grain/mod.rs | 2 +- crates/skate-audio/src/grain/player.rs | 4 +- crates/skate-audio/src/lib.rs | 3 +- crates/skate-audio/src/mixer.rs | 49 +- crates/skate-audio/src/mixmap/format.rs | 2 +- crates/skate-audio/src/mixmap/mod.rs | 5 +- crates/skate-audio/src/mixmap/tables.rs | 14 +- crates/skate-audio/src/mixmap/tests.rs | 12 +- crates/skate-audio/src/player/clothing.rs | 2 +- crates/skate-audio/src/player/contacts.rs | 16 +- crates/skate-audio/src/player/footsteps.rs | 2 +- crates/skate-audio/src/player/globals.rs | 2 +- crates/skate-audio/src/player/mod.rs | 2 +- crates/skate-audio/src/player/rolling.rs | 2 +- crates/skate-audio/src/player/state.rs | 2 +- crates/skate-audio/src/player/step_on.rs | 2 +- crates/skate-audio/src/player/treatment.rs | 2 +- crates/skate-audio/src/player/tricks.rs | 2 +- crates/skate-audio/src/splice/format.rs | 2 +- crates/skate-audio/src/splice/tests.rs | 11 +- crates/skate-audio/src/world/keys.rs | 23 +- crates/skate-audio/src/world/mod.rs | 6 +- crates/skate-audio/src/world/owners.rs | 2 +- crates/skate-audio/src/world/peds.rs | 15 +- crates/skate-audio/src/world/skaters.rs | 95 +- crates/skate-audio/src/world/speech.rs | 4 +- .../skate-audio/src/world/speech_manager.rs | 34 +- crates/skate-audio/src/world/speech_player.rs | 486 ++++++++++ crates/skate-audio/src/world/speech_rules.rs | 2 +- crates/skate-audio/src/world/traffic.rs | 82 +- crates/skate-audio/tests/disc_banks.rs | 14 +- crates/skate-audio/tests/dsp_oracle.rs | 11 +- crates/skate-audio/tests/offboard_levels.rs | 15 +- crates/skate-audio/tests/player_tricks.rs | 31 +- crates/skate-audio/tests/private_data/mod.rs | 38 + crates/skate-audio/tests/rolling_banks.rs | 18 +- crates/skate-audio/tests/world_sources.rs | 11 +- crates/skate-audio/tests/world_speech.rs | 4 +- crates/skate-game/src/game_audio/ambience.rs | 4 +- .../src/game_audio/crossfade_groups.rs | 2 +- crates/skate-game/src/game_audio/e2e.rs | 2 +- crates/skate-game/src/game_audio/emitters.rs | 2 +- crates/skate-game/src/game_audio/grain_bed.rs | 6 +- crates/skate-game/src/game_audio/library.rs | 24 + crates/skate-game/src/game_audio/mod.rs | 12 +- crates/skate-game/src/game_audio/native.rs | 34 +- .../skate-game/src/game_audio/npc_skaters.rs | 177 +++- .../src/game_audio/npc_skaters/tests.rs | 104 +- .../skate-game/src/game_audio/player_audio.rs | 4 +- .../src/game_audio/random_programs.rs | 2 +- .../skate-game/src/game_audio/random_sets.rs | 2 +- .../skate-game/src/game_audio/skate_events.rs | 9 +- crates/skate-game/src/game_audio/timing.rs | 2 +- .../skate-game/src/game_audio/world_bridge.rs | 97 +- .../src/game_audio/world_sources.rs | 441 ++++++++- .../skate-game/src/game_audio/world_speech.rs | 692 ++++++++++++++ crates/skate-game/src/modding/world_audio.rs | 13 +- crates/skate-game/src/world_audio.rs | 55 +- crates/skate-mods/src/api.lua | 2 +- crates/skate-mods/src/lib.rs | 17 +- crates/skate-mods/src/schema.rs | 13 + crates/skate-mods/src/tests/general_api.rs | 30 + crates/skate-mods/src/vm.rs | 18 +- crates/skate-mods/src/world_audio.rs | 21 +- docs/hails-additions/02-long-paths.md | 2 +- docs/hails-additions/11-audio.md | 352 ++++--- .../13-recomp-research-hooks.md | 2 +- docs/hails-additions/15-world-audio.md | 241 ++++- docs/hails-additions/PULL-REQUESTS.md | 7 +- docs/hails-additions/README.md | 1 + docs/hails-additions/audio-specs/README.md | 58 ++ .../audio-specs/aems-board-layers-spec.md | 205 ++++ .../audio-specs/aems-bus-leftovers-spec.md | 341 +++++++ .../audio-specs/aems-env-bus-spec.md | 385 ++++++++ .../audio-specs/aems-eqchain-buses-spec.md | 232 +++++ .../audio-specs/aems-evaluator-spec.md | 896 ++++++++++++++++++ .../audio-specs/aems-grain-chain-spec.md | 212 +++++ .../aems-offboard-clothing-spec.md | 267 ++++++ .../audio-specs/aems-reference.md | 199 ++++ .../audio-specs/aems-tricks-treatment-spec.md | 119 +++ .../audio-specs/aems-voice-graph-spec.md | 734 ++++++++++++++ .../audio-specs/ems-emitters-re.md | 344 +++++++ .../audio-specs/grain-player-spec.md | 550 +++++++++++ .../audio-specs/mixmap-spec.md | 610 ++++++++++++ .../audio-specs/npc-livingworld-re.md | 553 +++++++++++ .../audio-specs/ragdoll-contact-spec.md | 111 +++ .../audio-specs/rwaudio-prior-work.md | 145 +++ .../audio-specs/world-audio-hookin-spec.md | 688 ++++++++++++++ .../audio-specs/world-npc-skater-audio.md | 94 ++ .../audio-specs/world-ped-audio.md | 93 ++ .../audio-specs/world-speech.md | 234 +++++ .../audio-specs/world-traffic-audio.md | 144 +++ mods/world-audio-test/main.lua | 38 +- mods/world-audio-test/mod.json | 3 +- sdk/AGENTS.md | 2 +- sdk/skate.lua | 14 +- tools/asset_pipeline/audio_export.py | 6 +- tools/asset_pipeline/world_audio.py | 102 +- 122 files changed, 10368 insertions(+), 485 deletions(-) create mode 100644 crates/skate-audio/src/world/speech_player.rs create mode 100644 crates/skate-audio/tests/private_data/mod.rs create mode 100644 crates/skate-game/src/game_audio/world_speech.rs create mode 100644 docs/hails-additions/audio-specs/README.md create mode 100644 docs/hails-additions/audio-specs/aems-board-layers-spec.md create mode 100644 docs/hails-additions/audio-specs/aems-bus-leftovers-spec.md create mode 100644 docs/hails-additions/audio-specs/aems-env-bus-spec.md create mode 100644 docs/hails-additions/audio-specs/aems-eqchain-buses-spec.md create mode 100644 docs/hails-additions/audio-specs/aems-evaluator-spec.md create mode 100644 docs/hails-additions/audio-specs/aems-grain-chain-spec.md create mode 100644 docs/hails-additions/audio-specs/aems-offboard-clothing-spec.md create mode 100644 docs/hails-additions/audio-specs/aems-reference.md create mode 100644 docs/hails-additions/audio-specs/aems-tricks-treatment-spec.md create mode 100644 docs/hails-additions/audio-specs/aems-voice-graph-spec.md create mode 100644 docs/hails-additions/audio-specs/ems-emitters-re.md create mode 100644 docs/hails-additions/audio-specs/grain-player-spec.md create mode 100644 docs/hails-additions/audio-specs/mixmap-spec.md create mode 100644 docs/hails-additions/audio-specs/npc-livingworld-re.md create mode 100644 docs/hails-additions/audio-specs/ragdoll-contact-spec.md create mode 100644 docs/hails-additions/audio-specs/rwaudio-prior-work.md create mode 100644 docs/hails-additions/audio-specs/world-audio-hookin-spec.md create mode 100644 docs/hails-additions/audio-specs/world-npc-skater-audio.md create mode 100644 docs/hails-additions/audio-specs/world-ped-audio.md create mode 100644 docs/hails-additions/audio-specs/world-speech.md create mode 100644 docs/hails-additions/audio-specs/world-traffic-audio.md diff --git a/crates/skate-audio/examples/aems_replay.rs b/crates/skate-audio/examples/aems_replay.rs index dde2b51b..9ad272d5 100644 --- a/crates/skate-audio/examples/aems_replay.rs +++ b/crates/skate-audio/examples/aems_replay.rs @@ -1,7 +1,6 @@ //! Replay a post script through the native evaluator with the oracle's mock voice device and print -//! every device call, in the same format as the local PoC probe (`.claude/skills/aems-port/tools/ -//! poc/aems_golden.rs`), so the two outputs can be diffed line by line -//! (`.claude/skills/aems-port/tools/golden_compare.py`). +//! every device call, in the same format as the local PoC probe (`aems_golden.rs`, local, not +//! published), so the two outputs can be diffed line by line (a local diff script, not published). //! //! usage: aems_replay