GS_Audio
Audio management, event-based sound, music scoring, mixing, and Klatt voice synthesis for the GS_Play framework.
GS_Audio is the audio management gem for GS_Play. It provides a visual node-based audio event authoring system, a multi-layer music scoring system, mixing buses with effects chains, and a built-in Klatt formant voice synthesizer with 3D spatial audio. All audio features integrate with the GS_Play manager lifecycle and respond to standby mode automatically.
For architecture details, component properties, and extension patterns, see the GS_Audio API.
Quick Navigation
| I want to… | Feature | API |
|---|
| Manage the audio engine or control master volume | Audio Manager | API |
| Author sound events visually with filters, effects, routing, and phase lifecycle | Audio Event Graph | API |
| Configure mixing buses with filters, EQ, and environmental influence effects | Mixing & Effects | API |
| Layer music tracks dynamically based on gameplay state | Score Arrangement | API |
| Generate text-to-speech with configurable voice parameters and 3D spatial audio | Klatt Voice | API |
Installation
GS_Audio requires GS_Core and the MiniAudio gem. Add both to your project’s gem dependencies.
For a complete guided setup, follow the Simple Project Setup guide.
Quick Installation Summary
- Enable the GS_Audio gem in your project configuration.
- Create an Audio Manager prefab and add it to the Game Manager’s Managers list.
Audio Manager
The Audio Manager is the singleton controller for the entire audio system. It initializes the audio engine, manages mixing buses, loads audio event libraries, and coordinates score playback. Like all GS_Play managers, it extends the Manager base class and plugs into the Game Manager’s startup sequence automatically.
Audio Manager
API
Audio Event Graph
The Audio Event Graph is a visual node editor for authoring complex sound events. Build audio processing chains with source nodes, filter nodes, effects, and conditional routing — all connected in a graph that evaluates as a live data-flow pipeline. Supports phase lifecycle (Start / Loop / Finish) and runtime variable control for dynamic sound behavior.
Audio Event Graph
API
Mixing & Effects
The mixing system provides named audio buses with configurable effects chains. Each bus can have filters applied — low pass, high pass, band pass, notch, peaking EQ, shelving, delay, and reverb. Audio Bus Influence Effects allow environmental zones to dynamically modify bus effects based on the listener’s position.
Mixing & Effects
API
Score Arrangement
Score Arrangement Tracks are multi-layer music assets. Each arrangement defines a time signature, BPM, fade behavior, and a set of Score Layers — individual audio tracks that can be enabled or disabled independently. This allows dynamic music that adds or removes instrument layers based on gameplay state.
Score Arrangement
API
Klatt Voice Synthesis
GS_Play includes a built-in text-to-speech system based on Klatt formant synthesis. The Klatt Voice component converts text to speech in real time with configurable voice parameters — frequency, speed, waveform, formants, and pitch variance. The system supports 3D spatial audio and inline KTT tags for expressive delivery.
Klatt Voice
API
See Also
For the full API, component properties, and C++ extension guide:
For step-by-step project setup:
Get GS_Audio
GS_Audio — Explore this gem on the product page and add it to your project.
1 - Audio Manager
How to work with the GS_Play Audio Manager — engine initialization, bus routing, event library loading, and Audio Event Graph instance control.
The Audio Manager is the singleton controller for the entire audio system. It initializes the MiniAudio engine, manages mixing buses, loads audio event libraries, and coordinates score track playback. It also manages the instance lifecycle for Audio Event Graphs — pooling, firing, and releasing graph instances.
Like all GS_Play managers, it extends the Manager base class and responds to the Game Manager lifecycle automatically.
For component properties and API details, see the Framework API reference.

Contents
What It Manages
| Responsibility | What It Does |
|---|
| Engine lifecycle | Initializes and shuts down the MiniAudio audio engine. |
| Mixing buses | Creates and routes named audio buses with effects chains. |
| Audio Event Graphs | Pools and manages graph instances — fire-and-forget or manual lifecycle control. |
| Score playback | Manages Score Arrangement Track assets for dynamic music. |
| Master volume | Controls global and per-bus volume. |
Audio Event Graph Instances
The Audio Manager is the runtime entry point for the Audio Event Graph system. Two patterns are available:
Fire-and-Forget
The simplest pattern — the Manager handles everything automatically:
PlayAudioGraph(assetPath) → plays the graph → auto-cleans up when finished
Manual Instance Control
For sounds that need to be modified after starting — looping ambience, sounds driven by game state variables:
AcquireAudioGraph(assetPath) → instanceId
FireAudioGraph(instanceId)
SetAudioGraphVariable(instanceId, "paramName", value) ← update at any time
SetAudioGraphEntity(instanceId, entityId) ← 3D tracking
StopAudioGraph(instanceId) or FinishAudioGraph(instanceId)
ReleaseAudioGraph(instanceId)
The manager pools idle instances internally — acquiring and releasing is cheap.
Quick Reference
Audio Event Graph
| Need | Method |
|---|
| Fire-and-forget graph | PlayAudioGraph(assetPath) |
| Get a controllable instance | AcquireAudioGraph(assetPath) → instanceId |
| Start / restart an instance | FireAudioGraph(instanceId) |
| Stop an instance | StopAudioGraph(instanceId) |
| Fade out and stop | StopAudioGraphFade(instanceId, fadeTime) |
| Transition to Finish phase | FinishAudioGraph(instanceId) |
| Set a float variable | SetAudioGraphVariable(instanceId, name, value) |
| Set a bool variable | SetAudioGraphVariableBool(instanceId, name, value) |
| Enable looping | SetAudioGraphLooping(instanceId, true) |
| Track entity position (3D) | SetAudioGraphEntity(instanceId, entityId) |
| Release instance to pool | ReleaseAudioGraph(instanceId) |
Mixing & Score
| Need | Method |
|---|
| Set bus volume | SetMixerVolume(busName, volume) |
| Set master volume | SetMasterVolume(volume) |
| Play a score track | PlayScoreTrack(asset) |
| Stop the score track | StopScoreTrack() |
Glossary
| Term | Meaning |
|---|
| Audio Event Graph | A .audiograph node graph asset defining a sound event |
| Graph Instance | An independent runtime copy of an Audio Event Graph, pooled and reused by the Manager |
| Mixing Bus | A named audio channel with an effects chain for routing and processing sounds |
| Score Arrangement | A multi-layer music asset managed by the Audio Manager for dynamic playback |
For full definitions, see the Glossary.
See Also
Get GS_Audio
GS_Audio — Explore this gem on the product page and add it to your project.
2 - Audio Event Graph
How to author complex sound events visually using the Audio Event Graph editor — nodes, phase lifecycle, variables, and runtime control.
The Audio Event Graph is a visual node-based editor for authoring complex sound events. Instead of a single clip pool, you connect sources, filters, effects, and routing nodes into a graph that evaluates as a data-flow pipeline. Each .audiograph file is one sound event. At runtime, the graph maps directly to a live audio processing chain.
For component properties and C++ extension, see the Framework API reference.

Contents
How It Works
Nodes in an Audio Event Graph evaluate left to right in topological order. Connections carry AudioRoute values — handles to a point in the audio processing chain. The signal flows through:
- An Entry node gates which phase is active
- Source nodes create and output audio
- Filter and effect nodes process the signal
- Routing nodes (If/Switch) direct the signal based on variables
- The Output node wires everything to a mixing bus
Only nodes affected by a change re-evaluate — the rest are skipped. This makes variable-driven sound modification cheap even for complex graphs.
Phase Lifecycle

Every Audio Event Graph supports up to three phases:
| Phase | Entry Node | Use For |
|---|
| Start | Aud_StartNode | One-shot intro sounds, attack transient |
| Loop | Aud_LoopNode | Sustained loops, ambient audio |
| Finish | Aud_FinishNode | Fade-outs, release tails |
Phases transition automatically: Start fires once, Loop repeats while looping is enabled, Finish plays when FinishAudioGraph() is called. Not all phases are required — a simple one-shot only needs Start.
Entry nodes share routing freely. A source wired to both Start and Loop phases produces sound in both.
Nodes
Source Nodes

| Node | What It Does |
|---|
| Aud_SoundNode | Single audio asset playback |
| Aud_AudioPoolNode | Random clip selection from a pool |
Both support volume, pitch, delay, looping, and 3D spatialization.
Filter Nodes

LowPass, HighPass, BandPass, Notch, PeakingEQ, LowShelf, HighShelf — all take audio_in and output audio_out. Parameters (cutoff, Q, gain) can be set per-node or bound to graph variables.
Effect Nodes

| Node | What It Does |
|---|
| Aud_EchoNode | Echo / reverb tail |
| Aud_DelayNode | Delay effect |
Routing Nodes
IfNode and SwitchNode route AudioRoute values based on conditions or a selector variable. Use these for conditional audio paths — different sounds based on surface type, weather, or character state.
Output Node
Aud_OutputNode wires the final signal to a named mixing bus. Every graph needs exactly one Output node.
Using Variables
Declare variables in the Variable Panel. Bind them to filter parameter slots (right-click > Convert to Reference) or use If/Switch nodes to route based on them.
At runtime, setting a variable re-evaluates only the nodes that depend on it — the rest of the graph is untouched.
Common patterns:
| Variable | Type | Use |
|---|
underwater | Float | Bind to LowPass cutoff — muffles audio when > 0 |
surfaceType | Int | Drive a SwitchNode to select different footstep sources |
intensity | Float | Blend between effect parameters for emotional scoring |
Variables are set from gameplay code via the Audio Manager:
SetAudioGraphVariable(instanceId, "underwater", 0.8)
SetAudioGraphVariableBool(instanceId, "isSprinting", true)
Playing at Runtime
All Audio Event Graph playback goes through the Audio Manager.
Fire-and-Forget
For one-shot sounds with no runtime modification needed:
PlayAudioGraph("Assets/Audio/Explosion.audiograph")
Manual Control
For sounds that loop, need variable updates, or need explicit stopping:
AcquireAudioGraph(assetPath) — get an instance IDSetAudioGraphLooping(id, true) — if it loopsSetAudioGraphEntity(id, entityId) — for 3D trackingFireAudioGraph(id) — start playbackSetAudioGraphVariable(id, name, value) — update variables any timeStopAudioGraph(id) or FinishAudioGraph(id) — stop cleanlyReleaseAudioGraph(id) — return the instance to the pool
Quick Reference
| Task | How |
|---|
| Create a new graph | File > New in the Audio Event Graph Editor |
| Add a phase entry node | Drag Start / Loop / Finish node from the palette |
| Add a source | Drag Aud_SoundNode or Aud_AudioPoolNode |
| Chain a filter | Connect source audio_out → filter audio_in |
| Wire to output | Connect final node’s audio_out → Aud_OutputNode audio_in |
| Bind a variable to a slot | Right-click the slot > Convert to Reference |
| Play fire-and-forget | AudioManagerRequestBus::PlayAudioGraph(path) |
| Play with control | AcquireAudioGraph → FireAudioGraph → ReleaseAudioGraph |
| Update a variable | SetAudioGraphVariable(id, name, value) |
Glossary
| Term | Meaning |
|---|
| Audio Event Graph | A .audiograph file defining a sound event as a data-flow node graph |
| AudioRoute | The value type flowing between nodes — a handle to a point in the miniaudio processing chain |
| Phase | One of three lifecycle stages (Start / Loop / Finish) gated by entry nodes |
| Graph Instance | An independent runtime copy of a graph, pooled and managed by the Audio Manager |
| Dirty Propagation | The evaluation model — only nodes downstream of a changed variable re-run |
For full definitions, see the Glossary.
See Also
Get GS_Audio
GS_Audio — Explore this gem on the product page and add it to your project.
3 - Mixing & Effects
How to work with GS_Play audio mixing — named buses, effects chains, and environmental audio influence.
The mixing system provides named audio buses with configurable effects chains. Each bus can have multiple audio filters applied for real-time audio processing. Audio Bus Influence Effects allow environmental zones to dynamically modify bus parameters based on the listener’s position.
For component properties and filter types, see the Framework API reference.
GS_Audio is in Early Development. Full support planned soon: 2026.
Contents
Available Filters
| Filter | What It Does |
|---|
| Low Pass | Removes high frequencies. Simulates muffling (underwater, behind walls). |
| High Pass | Removes low frequencies. Simulates thin/tinny audio (radio, phone). |
| Band Pass | Passes a frequency band. Isolates specific ranges. |
| Notch | Removes a narrow frequency band. |
| Peaking EQ | Boosts or cuts a frequency band. |
| Low Shelf | Boosts or cuts frequencies below a threshold. |
| High Shelf | Boosts or cuts frequencies above a threshold. |
| Delay | Adds echo/delay effect. |
| Reverb | Adds room/space reverb. |
Environmental Audio Influence
Audio Bus Influence Effects allow spatial zones to modify bus effects dynamically. When the listener enters an influence zone (like a cave or tunnel), the zone’s effects are applied to the specified bus with priority-based stacking. Multiple overlapping zones resolve by priority.
Quick Reference
| Need | Bus | Method |
|---|
| Control mixer settings | GS_MixingRequestBus | Mixer control methods |
| Set master volume | AudioManagerRequestBus | SetMixerVolume |
Glossary
| Term | Meaning |
|---|
| Mixing Bus | A named audio channel that routes sound through an effects chain |
| Audio Filter | A real-time audio processing effect applied to a mixing bus |
| Audio Bus Influence Effect | A spatial zone that modifies bus effects based on listener position |
For full definitions, see the Glossary.
See Also
For the full API, component properties, and C++ extension guide:
For related systems:
Get GS_Audio
GS_Audio — Explore this gem on the product page and add it to your project.
4 - Score Arrangement
How to work with GS_Play score arrangements — multi-layer dynamic music with configurable time signatures and layer control.
Score Arrangement Tracks are multi-layer music assets for dynamic, adaptive game music. Each arrangement defines a time signature, tempo, fade behavior, and a set of independently controllable Score Layers. This enables music that responds to gameplay — adding percussion during combat, muting melody during dialogue, or transitioning between intensity levels.
For asset structure and playback API, see the Framework API reference.

GS_Audio is in Early Development. Full support planned soon: 2026.
Contents
How It Works
A Score Arrangement Track is a data asset containing:
| Field | What It Controls |
|---|
| Time Signature | Musical timing (4/4, 3/4, 6/8, etc.). |
| BPM | Tempo in beats per minute. |
| Fade Control | How layers fade in and out. |
| Score Layers | Individual audio tracks that play simultaneously. |
Each Score Layer is an independent audio stream within the arrangement. Layers can be enabled or disabled at runtime, creating dynamic music that evolves based on game state.
Supported Time Signatures
4/4, 4/2, 12/8, 2/2, 2/4, 6/8, 3/4, 3/2, 9/8
Glossary
| Term | Meaning |
|---|
| Score Arrangement Track | A multi-layer music data asset with time signature, tempo, and controllable layers |
| Score Layer | An individual audio stream within an arrangement that can be enabled or disabled at runtime |
| BPM | Beats per minute — the tempo of the arrangement |
For full definitions, see the Glossary.
See Also
For the full API, component properties, and C++ extension guide:
For related systems:
Get GS_Audio
GS_Audio — Explore this gem on the product page and add it to your project.
5 - Klatt Voice Synthesis
How to work with GS_Play Klatt voice synthesis — text-to-speech with 3D spatial audio, voice profiles, and inline parameter control.
GS_Play includes a built-in text-to-speech system based on Klatt formant synthesis. The KlattVoiceComponent converts text to speech in real time with configurable voice parameters. Voices are positioned in 3D space and attenuate with distance, making synthesized speech feel like it comes from the character speaking.
For component properties, voice parameter details, and the phoneme mapping system, see the Framework API reference.

Contents
How It Works
- Configure a voice using a KlattVoiceProfile — set frequency, speed, waveform, formants, and pitch variance.
- Assign a KlattPhonemeMap — maps text characters to ARPABET phonemes for pronunciation.
- Speak text from ScriptCanvas or C++ — the system converts text to phonemes and synthesizes audio in real time.
- Position in 3D — the voice component uses KlattSpatialConfig for 3D audio positioning relative to the entity.
Voice Configuration
| Parameter | What It Controls |
|---|
| Frequency | Base voice pitch. |
| Speed | Speech rate. |
| Waveform | Voice quality — Saw, Triangle, Sin, Square, Pulse, Noise, Warble. |
| Formants | Vocal tract resonance characteristics. |
| Pitch Variance | Random pitch variation for natural-sounding speech. |
| Declination | Pitch drop over the course of a sentence. |
KTT (Klatt Text Tags) allow inline parameter changes within speech text for expressive delivery:
"Hello <speed=0.5>world</speed>, how are <pitch=1.2>you</pitch>?"
The KlattCommandParser processes these tags during speech synthesis, enabling mid-sentence changes to speed, pitch, and other voice parameters.
For the complete tag reference — all attributes, value ranges, and reset behavior — see the Framework API: KTT Voice Tags.
Phoneme Maps
Two base phoneme maps are available:
| Map | Description |
|---|
| SoLoud_Default | Simple default mapping. |
| CMU_Full | Full CMU pronunciation dictionary mapping. |
Custom phoneme overrides allow project-specific word pronunciations (character names, fantasy terms) without modifying the base map.
3D Spatial Audio
The KlattSpatialConfig controls how synthesized speech is positioned in 3D:
- Voices attenuate with distance from the listener.
- The KlattVoiceSystemComponent tracks the listener position and updates all active voices.
- Multiple characters can speak simultaneously with correct spatial positioning.
Quick Reference
| Need | Bus | Method |
|---|
| Control a voice | KlattVoiceRequestBus | Voice synthesis methods (entity-addressed) |
| System-level voice control | KlattVoiceSystemRequestBus | Listener tracking, engine management |
Glossary
| Term | Meaning |
|---|
| Klatt Synthesis | A formant-based speech synthesis method that generates voice from frequency parameters |
| KTT Tags | Inline text tags that modify voice parameters mid-sentence during synthesis |
| Phoneme Map | A mapping from text characters to ARPABET phonemes for pronunciation |
| KlattSpatialConfig | Configuration for 3D audio positioning and distance attenuation of synthesized speech |
For full definitions, see the Glossary.
See Also
For the full API, component properties, and C++ extension guide:
For related systems:
Get GS_Audio
GS_Audio — Explore this gem on the product page and add it to your project.