This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

GS_Audio

The GS audio framework — event-based playback, mixing and the full DSP effect palette, HRTF spatialization, and the premium Audio Pro tier adding visual graph authoring, geometric acoustics, scoring and voice synthesis.

Audio in GS_Play is two gems, and the line between them is the free/premium product line.

  • GS_Audio — the base gem. Free. The engine, audio events, pooling, mixing, the full DSP effect palette, the listener, and HRTF spatialization with distance attenuation.
  • GS_AudioPro — the premium gem. Depends on the base. Adds the visual Audio Event Graph, procedural scoring, Klatt voice synthesis, and geometric acoustics.

Every page in this section marks features Base or Pro, because that tag tells you which gem a feature ships in.

For usage guides and setup examples, see The Basics: GS_Audio.

 

Contents


Start Here: the Signal Model

Before the feature pages, read the Audio Signal Model. It covers the two-plane architecture, what miniaudio, Steam Audio and SoLoud each actually do, the canonical order stages run in, and the vocabulary the rest of these pages use.

It also explains the one thing most likely to trip you up: spatialization is a property of a source, not a mix effect.

Audio Signal Model


What Lives Where

CapabilityGS_Audio (Base, free)GS_AudioPro (Premium)
Audio engine, node graph and outputYesuses the base engine
Audio events, libraries, pooling and instancingYes—
Mixing buses, volume channels, influence systemYes—
DSP effectsall 22 effect types, authored on componentsthe same processors, authored as graph nodes
SpatializationHRTF binaural + distance attenuationadds occlusion and reflections
The listenerYes, including split spatial/orientation targets—
Visual Audio Event Graph—Yes
Procedural scoring—Yes
Klatt voice synthesis—Yes
Geometric acoustics—Yes

One processor, two authoring skins: each DSP effect exists once and is surfaced twice — as a component-authored mix effect in the base gem, and as a graph node in Pro. They are the same processor wearing different authoring surfaces.


Audio Management

Base. The Audio Manager is the singleton that owns the audio engine, the mixing channels, the loaded event libraries and the listener. It extends GS_ManagerComponent and participates in the standard manager lifecycle — including headless deployment, if you want audio in a project with no Game Manager.

ComponentPurpose
Audio ManagerMaster audio controller — engine lifecycle, project settings, the listener, mixing channels, event libraries.

Audio Manager API


Audio Events

Base. A named sound the game can fire, authored in a .aev library. An event declares only what plays — pooling, concurrency, distance, tracking and spatialization are shared machinery every event type inherits.

PagePurpose
Audio EventsEvent libraries, the three event types, pooling and concurrency, and how to write a new event type.
SFXR ProfilesProcedural chiptone assets, sfxr.me import, and randomized profile pools.

Three kinds of event ship: file pools (a set of clips, one picked at random per fire), procedural noise, and sfxr chiptones. All three are pooled the same way, so variation costs nothing at the call site.

Audio Events API SFXR Profiles


Mixing & Effects

Base. Named volume channels built on custom miniaudio nodes, each with its own level and an optional effects chain, plus environmental influence that lets world volumes push effects onto channels with priority stacking.

This is the free tier’s authoring surface for the DSP palette — all 22 effect types, configured on components and routed by name rather than wired on a canvas.

PagePurpose
Mixing & EffectsVolume channels, environmental influence, and the mixing request bus.
Mix EffectsThe 22 effect types, named chains, order-independent wiring, runtime control.

Mixing & Effects API Mix Effects


Spatialization

Base. HRTF binaural placement and distance attenuation, applied automatically to every 3D source. There is no spatializer to author — place a source and it is spatialized.

PagePurpose
SpatializationHow a sound is placed, the bounded distance curve, HRTF settings, and the limits worth knowing.

Spatialization API


Audio Pro

Premium. GS_AudioPro extends every base feature and adds four of its own. It subclasses the base Audio Manager, so a project moves onto Pro by swapping one component rather than rebuilding its audio setup.

FeaturePurpose
Audio Event GraphVisual node editor for authoring complex sound events — sources, filters, effects, routing and phase lifecycle.
Score ArrangementMulti-layer procedural music — time signature, tempo, fade control and runtime layer selection.
Klatt Voice SynthesisFormant text-to-speech with 3D spatial audio and configurable voice profiles.
Geometric acousticsReal occlusion and reflections computed from world geometry and acoustic materials.

Pro’s buses are separate from the base gem’s. Scoring is on AudioScoreRequestBus, graphs on AudioGraphRequestBus, voice on the Klatt buses — none of them on AudioManagerRequestBus.


Dependencies

GS_Audio (Base)

  • GS_Core (required)
  • MiniAudio gem (required)
  • Steam Audio — vendored, loaded at runtime, for HRTF spatialization and distance attenuation
  • SoLoud — vendored. The gem’s DSP effect and source node implementations derive from SoLoud, and its generators feed the effect nodes.

GS_AudioPro (Premium)

  • GS_Audio (required)
  • SoLoud — used further as the synthesis engine behind Klatt voice

Installation

  1. Enable the GS_Audio gem in your project configuration.
  2. Ensure GS_Core and the MiniAudio gem are also enabled.
  3. Create an Audio Manager prefab and add it to the Game Manager’s Startup Managers list — or tick Headless on the manager if your project has no Game Manager.

For the premium tier, enable GS_AudioPro as well and use the Pro Audio Manager component on your manager prefab in place of the base one.


See Also

For conceptual overviews and usage guides:

For related resources:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

1 - Audio Signal Model

How GS audio is put together — the two-plane architecture, the roles of miniaudio, SoLoud and Steam Audio, the canonical signal chain, and the vocabulary the rest of the audio docs use.

This page is the model every other audio page assumes. It describes how sound is put together in GS_Play — what processes audio, what merely computes numbers, the order stages run in, and the words used for each part.

Read it before the feature pages. Several parts of the audio API look arbitrary until you know the model, and one of them (spatialization) is deliberately not where most engines put it.

For usage guides and setup examples, see The Basics: GS_Audio.

 

Contents


Two Planes

Audio is two planes that meet at nodes.

PlaneRuns onCarriesOwned by
Audio planethe audio threadactual soundminiaudio, always
Control planethe game thread, per framenumbersthe framework and your game code

The audio plane is the ground floor and the only floor that reaches the speakers. Everything audible is a node in one miniaudio graph. Fan-in sums automatically; you route by attaching one node’s output to another’s input.

The control plane never carries audio. It writes numbers that the audio plane reads — the listener transform, a source’s position, an occlusion factor, reverb decay times, a binaural direction.

Control plane writes; audio plane reads. That decoupling is what keeps the system tractable, and it is the one sentence to leave this page with.


What Each Library Does

Three libraries are involved, and they are not peers. Confusing their roles is the most common way to misread the system.

LibraryOn the audio planeOn the control planeTier
miniaudioThe substrate, mixer and output device. Everything is one of its nodes.Built-in listener, per-sound position and panner.Base
Steam AudioDSP nodes — binaural, direct, reflection — that pass audio through like any other effect. Not the ground floor, and not a source.An entire scoped simulation, analogous to a physics world. You register geometry, sources and a listener; it computes acoustic parameters; those parameters drive the DSP nodes.Base (binaural + distance) / Pro (geometry)
SoLoudThe lineage of the DSP layer. The base gem’s effect and source node implementations derive from SoLoud’s, and its generators and synthesis feed the effect nodes. In Pro it also acts as a source, rendering speech to PCM and relaying it in through a custom node.Emission position pushed to the voice node each frame.Base (DSP layer) / Pro (voice synthesis)

The rule: anything that makes sound becomes, or feeds, a miniaudio node. SoLoud and Steam Audio both relay into miniaudio; neither bypasses it.

SoLoud ships in the base gem. The framework’s own effect and source nodes were extracted into a header-only layer so they can be wired directly into the miniaudio graph, but they remain derivative of SoLoud and are sourced from it — the attribution belongs to the free tier, not only to Pro. Pro then uses SoLoud further as the synthesis engine behind Klatt voice.

Steam Audio is worth stating twice, because it is the one people misplace. Its simulation is a parallel world you connect into. It produces numbers. Nodes consume those numbers. miniaudio moves the audio.


The Canonical Chain

Every sound travels the same path from emission to speakers:

Emission          Source + local tone shaping (EQ, filters, per-emitter mix nodes)
    |
    v
Environment       Manual Reverb  XOR  Steam reflections/occlusion   <-- SAME layer
    |
    v
Binaural / HRTF   the "ears" stage — ALWAYS LAST before volume, if spatial
    |
    v
Volume Channel    grouped, options-driven gain
    |
    v
Master  ->  speakers

Two rules hold everywhere:

Manual reverb and Steam reflections are the same conceptual layer — the environment. Manual reverb fakes the room. Steam reflections are the room, derived from real geometry. Use one or the other. Stacking them double-reverbs the sound.

Binaural/HRTF is always the last stage before the volume channel. It is the ears. Nothing spatial happens after it.

Worked cases:

CaseChain
Non-spatial (2D) soundEmission -> Reverb -> Volume Channel — no binaural stage
Full geometric acoustics (Pro)Emission -> Steam {distance + occlusion + reflections + binaural} -> Volume Channel — manual reverb is dropped
MixedEmission -> Reverb -> Binaural -> Volume Channel — a faked room, a real direction

Vocabulary

The audio docs use these four words precisely. Source → Spatialization → Volume Channel → Master.

TermMeaning
SourceAn emission — a position plus its effects channel — or a selected destination. “2D” means pure stereo, with no spatial consideration at all.
SpatializationEverything that happens to a sound as it travels from its emission point to the listener: direction, distance, occlusion, environment. It is a property of the source, not a mix effect.
Volume ChannelFinal amplification of grouped sound types — voice, environment, combat SFX — into Master. Driven by the options system.
MasterThe single output everything sums into before the device.

Spatialization and volume channels are orthogonal. A voice line, a footstep and a magic blast all get position-based spatialization, and all three route to different volume channels. One is about where the sound is; the other is about what kind of sound it is.


Spatialization

Most audio middleware lets you drop a spatializer into an effects chain. GS does not. Spatialization is a property of the source, and the framework applies it for you.

Where it happens. Each 3D sound instance gets its own spatializer node, placed between the source and its volume channel — the Binaural stage in the chain above. It is always the last thing before volume.

One spatializer, never two. A 3D source is spatialized by either miniaudio’s built-in spatializer or Steam Audio’s binaural path, decided by the project’s spatialization mode on the Audio Manager. The two are alternatives. They are never stacked, because a fixed HRTF layered over a positional pan cancels the spatial presence the pan was already producing.

It is applied procedurally. You do not author it per sound. The framework inserts the node, recomputes direction each frame from the source-to-listener vector on the control plane, and handles distance attenuation alongside it. Every 3D source therefore behaves the same way, whether it came from an event, a graph or a voice — consistent and reliable, with nothing to wire up and nothing to get wrong.

Channel discipline is why the position is fixed. Binaural is mono- or stereo-in and always stereo-out, so it has to sit at a defined point in the chain rather than anywhere a designer drops it.


Frame Size — the Audio Timestep

Steam Audio effects want exactly one block of samples per call. A mismatch is audible as crunching.

The framework therefore treats frame size as a fixed audio timestep. By default it queries the miniaudio device period and matches it, rather than adapting with a ring buffer. This is exposed on the Audio Manager as Auto (recommended) versus Fixed.

Think of it the way you think of a physics timestep: a rate the whole simulation agrees on, not a per-effect setting.


See Also

For the systems this model describes:

For conceptual overviews and usage guides:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

2 - Audio Manager

The base audio controller — engine lifecycle, project settings, the authoritative listener, mixing channels, event libraries, and the accessors GS_AudioPro builds on.

Base — ships in GS_Audio.

The Audio Manager is the singleton that owns the audio system. It initializes the engine, builds the mixing channel graph, loads your event libraries, and carries the listener that all spatialization is measured against.

It extends GS_ManagerComponent, so it participates in the standard manager lifecycle — including headless deployment if your project has no Game Manager. Like every manager it responds to standby, pausing audio while a blocking operation such as a stage change completes.

FieldValue
ComponentGS_AudioManagerComponent
TypeId{F28721FD-B9FD-4C04-8CD1-6344BD8A3B78}
ExtendsGS_Core::GS_ManagerComponent
Request BusAudioManagerRequestBus (Single / Single)

For usage guides and setup examples, see The Basics: GS_Audio.

Audio Manager component in the O3DE Inspector

 

Contents


What It Owns

The base manager does not tick. Per-frame work belongs to the systems that need it.


The Listener

There is no separate listener component. The manager carries the listener, and you point it at an entity. One listener, unambiguous.

MethodEffect
SetListenerBoth position and facing follow this entity.
SetListenerSpatialTargetPosition only — proximity and distance are computed from here.
SetListenerOrientationTargetFacing only — direction and HRTF are computed from here.
GetListenerReturns the current listener entity.
GetListenerSpatialTargetReturns the current spatial target.
GetListenerOrientationTargetReturns the current orientation target.
GetListenerTransformReturns the resolved listener transform.

Splitting the listener for third-person

The split targets exist for third-person games, and they are the recommended setup for one.

In third person, the camera and the character are in different places, and the two halves of “where is the listener” want different answers. Proximity should follow the character — how close a sound is to you is about your body, not your camera. Direction should follow the camera — what is on your left is about where you are looking.

Set them separately and the manager switches to computing both, which is what produces the result the framework was tuned for. Set only SetListener and both follow one entity, which is correct for first-person.


Project Settings

GS_AudioProjectSettings is a reflected block on the manager, so the component panel is the configuration UI. TypeId {2B7F4C19-8E63-4A05-9D2C-6F1A8B3E7D40}.

SettingDefaultDescription
SpatializationBinauralStereo (HRTF off) or Binaural (Steam Audio HRTF).
HRTF InterpolationNearestNearest is cheap and suits point sources. Bilinear costs more and suits wide-band material.
HRTF Volume1.0Level of the binaural path.
Frame Size ModeAutoAuto matches the audio device period. Recommended — a mismatched frame size is audible as crunching.
Fixed Frame Size512Used only in Fixed mode.
Default Min Distance1.0Metres.
Default Max Distance100.0Metres.

HRTF settings are hidden unless spatialization is Binaural; the fixed frame size is hidden unless the mode is Fixed.

Geometry settings are not here — they are additive on the Pro manager, and the base gem never reflects them.


API Reference

Request Bus: AudioManagerRequestBus

Singleton bus — single address, single handler. Call via Broadcast.

Libraries and playback

MethodParametersDescription
AddAudioLibraryAZ::Data::Asset<AudioEventLibrary>Load a library and register its events.
RemoveAudioLibraryconst AZStd::string& nameUnregister a library’s events.
PlayEvent2Dconst AZStd::string& eventNameFire an event with no spatialization.
PlayEventAtLocationconst AZStd::string& eventName, const AZ::Vector3& positionFire at a world position.
PlayEventOnEntityconst AZStd::string& eventName, AZ::EntityId entityFire on an entity and track it.

Volume and channels

MethodParametersDescription
ChangeMasterVolumefloat volumeSet the master output level.
ChangeChannelVolumeconst AZStd::string& channel, float volumeSet a named volume channel’s level.
GetMixingChannelNames—Enumerate the configured channel names.
GetMixingBusconst AZStd::string& channelRetrieve a channel’s mixing bus.

These are the natural attachment point for the options system’s audio sliders.

Environmental influence

MethodParametersDescription
ApplyAudioEffectInfluenceinfluencer, effectsImpose an effect set on channels while the influencer applies.
RemoveAudioEffectInfluenceinfluencerRemove that influencer’s contribution.

See Mixing & Effects for how influences stack.

Mix effect routing

Runtime control of named mix effect chains — RerouteMixEffect, SetMixEffectParam, SetMixEffectParamOn and the registration and wiring calls. Documented in full on the Mix Effects page.

Listener

The seven listener methods are tabled under The Listener.


Extending with GS_AudioPro

Worth understanding even if you never write a gem against it, because it is a clean example of how GS gems layer.

GS_AudioPro does not subclass the base manager’s internals or reach into its private state. It fetches primitives across a small accessor surface and attaches its own nodes to them:

AccessorReturnsUsed for
GetEnginethe miniaudio enginecreating sounds
GetGraphthe node graphallocating nodes
GetEndpointthe terminal nodeattaching output
GetMixingBusa volume channelrouting into a channel
GetSteamAudioContextthe shared Steam Audio contextreusing one context
GetSteamAudioHrtfthe shared HRTFreusing one HRTF
GetSteamAudioFrameSizethe audio timestepmatching block size
GetAudioProjectSettingsthe settings blockreading base configuration

Two accessors run the other way and are null in a base-only install — this is how the base gem stays standalone while Pro enriches it:

AccessorPurpose
RegisterSpatialSim / GetSpatialSimPro registers its geometric simulator; the base per-voice spatializer consumes occlusion values from it if one is present.
GetReverbSendNodeThe tap base voices use to feed Pro’s geometry-driven reverb.

The interface those two are typed against is declared in the base gem and implemented in Pro. That is the entire enrichment mechanism: base defines the socket, Pro supplies the plug, and nothing breaks when the plug is absent.

The Pro manager subclasses the base one and declares itself incompatible with it, so the two cannot coexist on an entity. A project running Pro puts the Pro manager component on its manager prefab in place of the base one, and authors everything — channels, libraries, project settings — on that single component.


See Also

For related systems:

For conceptual overviews and usage guides:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

3 - Audio Events

The .aev event library and the polymorphic audio event types — file pools, procedural noise, and sfxr chiptones — with shared pooling, concurrency, spatial tracking and extension hooks.

Base — ships in GS_Audio.

An audio event is a named sound the game can fire. Events live in .aev event libraries, which are loaded onto the Audio Manager; firing one is a matter of naming it.

The important structural fact: an event declares only what plays. Everything else — pooling, concurrency limits, distance falloff, 3D tracking, spatialization, re-fire suppression — is shared machinery that every event type inherits. That is what makes adding a new kind of sound source cheap.

For usage guides and setup examples, see The Basics: GS_Audio.

 

Contents


Event Libraries

AudioEventLibrary

A loadable collection of events, authored in the Asset Editor.

FieldValue
Extension.aev
TypeId{04218A1E-4399-4A7F-9649-ED468B5EF76B}
ExtendsAZ::Data::AssetData

Libraries are assigned to the Audio Manager and can also be added or removed at runtime:

MethodParametersDescription
AddAudioLibraryAZ::Data::Asset<AudioEventLibrary>Loads a library and registers its events by name.
RemoveAudioLibraryconst AZStd::string& nameUnregisters a library’s events.

Both are on AudioManagerRequestBus.


Event Types

GS_AudioEvent is an abstract base, and a library holds AZStd::vector<GS_AudioEvent*>. When you add an event in the Asset Editor, the type dropdown offers every registered subtype.

This is the framework’s standard polymorphic array authoring shape: a raw-pointer vector of a reflected abstract base, where the serializer supplies the type picker and the owning container owns its elements.

TypeSource of soundAuthored fields
GS_AudioEvent_PoolSound file assetsSound Pool — a pool of MiniAudio::SoundAsset. One is picked at random per fire. A single file is simply a pool of one.
GS_AudioEvent_NoiseProcedural noiseNoise Type (White / Pink / Brownish / Blueish) and Duration Seconds. Setting the event to loop overrides duration and runs continuously.
GS_AudioEvent_SfxrProcedural chiptoneProfiles — a pool of .sfxrprofile assets, randomized per fire. The profile’s envelope defines the length.

The pooling model is the reason to prefer pools over single assets. Five mutated explosion profiles in one Sfxr event, or five recorded footstep variants in one Pool event, means the sound never repeats identically — with no logic on the calling side.


Shared Configuration

Every event type carries these, regardless of what produces its sound.

FieldDefaultDescription
Event NameThe name PlayEvent* resolves.
Mixing ChannelWhere this event routes — a volume channel or a named mix effect chain. Both live in the same namespace.
Base Volume100Event volume before channel gain.
Distance Min/Max(1, 20)Metres. Full volume within min, attenuating out to max.
Outer Volume0Level beyond the max distance.
Is 2DfalsePure stereo, no spatial consideration.
LoopfalseRepeat until stopped.
Concurrent Event Limit5Maximum simultaneous voices for this event.
Instance Pad Size3Spare voices kept in the pool.
Event Repeat Hold0.05Seconds of re-fire suppression, so a rapid trigger cannot machine-gun the sound.
Pitch ModulationzeroPer-fire pitch jitter. The Pitch mix effect gives finer control over the same idea.

Firing Events

All three are on AudioManagerRequestBus, and all three resolve the event by name across every loaded library.

MethodParametersDescription
PlayEvent2Dconst AZStd::string& eventNameFires with no spatialization.
PlayEventAtLocationconst AZStd::string& eventName, const AZ::Vector3& positionFires at a fixed world position.
PlayEventOnEntityconst AZStd::string& eventName, AZ::EntityId entityFires on an entity and tracks it — the voice follows the entity as it moves.

Instancing and Pooling

Each event owns a flat pool of voices, and the model is identical across every event type.

  • A fire takes an idle voice from the pool, or produces one if none is free.
  • Active, paused and tracking sets are maintained per event. The tracking set maps a voice to the entity it follows for 3D updates.
  • The pool is trimmed on an interval — by default every 10 seconds — so a burst of sound does not permanently inflate memory.
  • The concurrency limit is enforced per event, so one over-eager emitter cannot flood the mixer.

Routing survives late changes. When a mix effect registers after an event has already preloaded, the manager re-points every pooled and future instance at the new target. In practice this means you can add a MixEffectComponent at runtime and voices that were already pooled will follow it — you are not required to have the routing in place before sounds exist.


Spatialization

Resolved once at preload; the project’s spatialization mode does not change at runtime.

When binaural is active, a 3D voice routes through its own Steam Audio binaural node instead of miniaudio’s spatializer, and the event pushes the listener transform as it ticks. The shared Steam Audio context and HRTF are borrowed from the Audio Manager rather than created per event.

See Spatialization for the behaviour, and the Audio Signal Model for why this is a property of the source rather than an effect.


Writing a New Event Type

Subclass GS_AudioEvent and implement a small set of virtuals. Everything in Shared Configuration, Instancing and Pooling and Spatialization is inherited.

HookRequiredPurpose
CreateInstance(engine, targetNode)YesProduce one fresh playable voice attached to the target node.
IsSourceReady()YesWhether the source can currently produce instances.
HasContent()YesWhether the event has authored content. An event with none is a silent no-op.
AcquireAssets()NoRe-acquire referenced assets with PreLoad behaviour.
QueueLoad()NoKick off asynchronous asset loads.
PreloadSource(engine)NoRegister or prepare source data against the engine.
UnloadSource()NoFree source data.

The four optional hooks exist for asset-backed sources. A generator — noise, sfxr, or anything you synthesise — leaves them as no-ops and is simply ready once the engine exists. The asset machinery is optional, not assumed.

Reflect your subclass and it appears in the event type dropdown automatically. There is no registry to add it to.


See Also

For related systems:

For conceptual overviews and usage guides:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

4 - SFXR Profiles

The .sfxrprofile asset — procedural chiptone sound effects as first-class assets, with sfxr.me import and randomized profile pools.

Base — ships in GS_Audio.

.sfxrprofile assets are procedural sound effects built on the DrPetter sfxr model — the classic generator behind coin pickups, laser shots, jumps and explosions. Each profile is a complete sound described entirely by parameters, so it takes no audio files and no disk space worth measuring.

For usage guides and setup examples, see The Basics: GS_Audio.

 

Contents


The Model

One .sfxrprofile is one sound, stored as an explicit parameter set.

There is deliberately no preset enum and no preset-plus-seed mode. The canonical sfxr presets were baked out into asset files instead of kept as a runtime option, so every sound in a project is inspectable and editable the same way — including the ones that came with the gem.

SfxrParamSet carries 24 parameters: the wave type plus 23 floats covering envelope, frequency, vibrato, arpeggio, duty cycle, retrigger, phaser, filters and volume.

Wave typeValue
Square0
Saw1
Sine2
Noise3

The field layout matches the sfxr.me / jsfxr Serialize JSON field for field, which is what makes the import below a straight paste.

Three sfxr parameters are not stored — master volume, vibrato delay, and the filter enable flag — because jsfxr does not export them. The runtime supplies sfxr’s defaults for all three.


Importing from sfxr.me

The asset carries an Import from sfxr.me group with a multi-line paste field.

  1. Design your sound at sfxr.me or any jsfxr-based tool.
  2. Press Serialize and copy the JSON.
  3. Paste it into the import field on the profile asset.
  4. The parameters populate on change. Save the asset.

This is the recommended authoring loop: the browser tool has instant preview and randomize/mutate buttons, and the result lands in your project in one paste.

Three things to know:

  • If the pasted JSON reports oldParams: false, a warning is emitted. Sfxr.me emits true, which is what the framework’s parameter model matches.
  • The inspector may need a reselect to repaint after a paste. The values are imported correctly — this is a display refresh issue, not an import failure.
  • Wave Type is authored as a spin box over 0-3 rather than a named dropdown, because the underlying field is a plain integer.

Profile Pools

Profiles are consumed as pools, not one at a time. Both consumers hold a vector of profile assets and pick one at random per fire:

ConsumerGemNotes
GS_AudioEvent_SfxrBaseFires through a pooled voice with a per-voice random number generator.
Aud_SfxrNodeProThe Audio Event Graph node form, using the node’s own generator.

An empty pool is silent — the event reports that it has no content. A single profile is just a pool of one.

The authoring idiom this enables is the point of the whole system: generate five mutated explosions and drop them all in one pool, and the explosion never sounds identical twice. Mutation is a single button in sfxr.me, so building the pool costs about a minute.


Shipped Profiles

GS_Audio ships 27 profiles in Assets/SFXR Profiles/:

  • 7 canonical presets — Coin, Laser, Explosion, Powerup, Hurt, Jump, Blip.
  • 20 named custom profiles.

These are free-tier gem content. A new project has working sound effects before it has any audio assets of its own.


See Also

For related systems:

For conceptual overviews and usage guides:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

5 - Mixing & Effects

Named volume channels built on custom miniaudio nodes, environmental influence with priority stacking, and the component-authored mix effect layer.

Base — ships in GS_Audio.

Mixing has two parts, and it is worth separating them from the start.

Volume channels are the grouping layer — voice, environment, combat SFX — each with its own level, feeding Master. This is the layer your options menu drives.

Mix effects are the processing layer — filters, EQ, delay, reverb, character effects — authored as named chains on components and routed by name. This is the free tier’s authoring surface for the DSP palette, and it is not a reduced one: it exposes the same 22 processors that Audio Pro exposes as graph nodes.

For usage guides and setup examples, see The Basics: GS_Audio.

 

Contents


Volume Channels

GS_MixingBus

A custom miniaudio node that mixes its inputs, applies a level, and optionally runs an effects chain.

FieldValue
TypeId{26E5BA8D-33E0-42E4-BBC0-6A3B2C46F52E}

The Audio Manager owns a named set of these. GetMixingChannelNames enumerates them and ChangeChannelVolume sets a level.

This is the Volume Channel stage of the canonical signal chain: grouped sound types feeding Master. It is orthogonal to spatialization — a voice line, a footstep and a spell all get positional audio, and all three route to different channels.

Channels are the natural attachment point for the options system’s audio sliders, which is exactly what the shipped audio apply targets do.


Environmental Influence

An entity in the world can temporarily impose an effect set on channels — walk into a cave and everything gains reverb; walk out and it lifts.

MethodParametersDescription
ApplyAudioEffectInfluenceinfluencer, effectsPush an effect set onto channels on behalf of an influencing entity.
RemoveAudioEffectInfluenceinfluencerRemove that entity’s contribution.

Influences stack by priority and are keyed by the entity that applied them, so removal is unambiguous even when several influences overlap. Two overlapping zones resolve by priority rather than by whichever fired last.


Mix Effects

The processing layer. A MixEffectComponent holds an ordered chain of effects, registers it under a name, and feeds its output somewhere — another chain, or a volume channel. Sources route in by naming that chain as their mixing channel.

Twenty-two effect types are available, in four families: biquad filters, time and space, character and modulation, and utility.

Mix Effects API


API Reference

Request Bus: GS_MixingRequestBus

Channel control. Singleton bus — single address, single handler.

MethodParametersReturnsDescription
SetBusVolumeconst AZStd::string& busName, float volumevoidSets the level of a named channel (0.0 to 1.0).
GetBusVolumeconst AZStd::string& busNamefloatReturns the current level of a named channel.
MuteBusconst AZStd::string& busName, bool mutevoidMutes or unmutes a named channel.
IsBusMutedconst AZStd::string& busNameboolReturns whether a named channel is muted.
ApplyBusEffectsconst AZStd::string& busName, const AudioBusEffects& effectsvoidApplies an effects chain to a channel, replacing any existing chain.
ClearBusEffectsconst AZStd::string& busNamevoidRemoves all effects from a channel.
PushInfluenceEffectsconst AZStd::string& busName, const AudioBusInfluenceEffects& effectsvoidPushes environmental influence effects onto a channel with priority stacking.
PopInfluenceEffectsconst AZStd::string& busName, int priorityvoidRemoves influence effects at the given priority level.

Master and per-channel volume are also reachable from AudioManagerRequestBus via ChangeMasterVolume and ChangeChannelVolume.


Data Structures

TypePurpose
BusEffectsPair {#bus-effects-pair}Maps a channel name to an effects chain. This is how channels are authored on the Audio Manager.
AudioBusEffects {#audio-bus-effects}An effects chain applied to a channel.
AudioBusInfluenceEffects {#audio-bus-influence-effects}An effect set contributed by a world influencer, carrying its priority.

See Also

For related systems:

For conceptual overviews and usage guides:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

5.1 - Mix Effects

The MixEffectComponent and all 22 mix effect types — named effect chains, order-independent wiring, local and global routing, and the runtime control surface.

Base — ships in GS_Audio.

Mix effects are the DSP processing layer of the free tier. You build a chain of effects on a component, give it a name, and point sources at that name.

Twenty-two effects are available. They are the same processors Audio Pro exposes as graph nodes — one processor, two authoring surfaces. Choosing the free tier does not reduce what you can do to a signal; it changes how you author it.

For usage guides and setup examples, see The Basics: GS_Audio.

 

Contents


MixEffectComponent

Drop it on an entity and it holds an ordered chain of effects — a polymorphic list where each entry’s concrete type is chosen from a dropdown.

FieldValue
TypeId{9F2A6C13-4D85-4E70-B1C6-3A8E5D7F2049}
Authored fieldMeaning
NameThe routing name registered for the head of the chain. Sources and other chains target this.
EffectsThe ordered chain. Index 0 receives the input; each effect feeds the next.
Output TargetWhere the tail of the chain feeds — another chain’s Name, or a volume channel.

The chain runs top to bottom. Index 0 is what gets registered under Name; the last entry feeds Output Target.

Setup is idempotent, and teardown unwires and destroys the nodes while keeping the authored list — so the component re-activates cleanly.


How Chains Route

Sources route in by name. An audio event’s Mixing Channel field can name either a volume channel or a mix effect chain. They share one namespace, so a source does not need to know which kind of thing it is pointing at.

Any number of chains can live on one entity, each with its own Name. Point one chain’s Output Target at another chain’s Name to compose them.

Wiring is order-independent. If a chain’s target does not exist yet, the connection is deferred and resolves when the target registers. You do not have to think about component activation order, and a missing target is not an error — it is a connection waiting to be made.

Routing catches up with sounds that already exist. When a chain registers after events have preloaded, already-pooled voices are re-pointed at the new target. Adding a MixEffectComponent at runtime works, and the sounds that were already playing through that channel follow it.

Local and global routing

Both patterns are supported and they coexist:

  • Global named channels — everything funnels through shared, named mix targets. Best for project-wide treatments.
  • Local chains on the emitting entity — the component lives on the emitter, scoping its effects to that one emission. Best for per-character or per-object colour.

The 22 Effects

Biquad filters

EffectDescription
Low PassAttenuates frequencies above the cutoff. Muffling, distance, underwater.
High PassAttenuates frequencies below the cutoff. Thinning, radio and telephone effects.
Band PassPasses only a band, attenuating everything outside it.
NotchAttenuates a narrow band while passing everything else. The inverse of band pass.
Peaking EQBoosts or cuts around a centre frequency with configurable bandwidth.
Low ShelfBoosts or cuts everything below a threshold by a fixed amount. Bass adjustment.
High ShelfBoosts or cuts everything above a threshold by a fixed amount. Treble adjustment.

Time and space

EffectDescription
EchoFeedback delay — repeats that decay over time.
ReverbSimulated room ambience.
BinauralFixed-direction HRTF placement. See the caution below.

Character and modulation

EffectDescription
Wave ShaperNon-linear distortion and saturation.
LofiBit depth and sample rate reduction.
RobotizeVocoder-style robotic character.
FlangerSweeping comb filtering from a modulated short delay.
ChorusThickening from multiple detuned delayed copies.
Ring ModRing modulation — metallic, inharmonic tones.
TremoloRhythmic amplitude modulation.
PitchPitch shifting that preserves tempo.

Utility

EffectDescription
PannerStereo placement.
CompressorDynamic range compression.
DC RemovalRemoves DC offset from a signal.
AmplifyStraight gain.

Runtime Control

Chains are drivable at runtime through AudioManagerRequestBus, so ScriptCanvas can change a treatment while it is playing.

MethodEffect
RerouteMixEffectRe-point a chain’s tail at a new output target.
SetMixEffectParamSet a parameter on the chain head.
SetMixEffectParamOnSet a parameter on a named effect inside the chain.
ResolveMixTargetResolve a name to its node.
RegisterMixEffect / UnregisterMixEffectManual node registration. Advanced.
WireMixSource / UnwireMixSourceManual wiring. Advanced.
RegisterMixEffectControl / UnregisterMixEffectControlControl-surface registry.

Environmental treatment is per-emission and rapidly modifiable by design. A character moving through a space changes its effects continuously, and that change isolates to the environmental portion of the signal regardless of which volume channel the sound belongs to.


Two Cautions


See Also

For related systems:

For conceptual overviews and usage guides:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

6 - Spatialization

HRTF binaural spatialization and distance attenuation in the base gem — how a 3D sound is placed, the distance curve, HRTF interpolation modes, and the limits worth knowing.

Base — ships in GS_Audio.

Spatialization is what makes a sound feel like it is coming from somewhere. In GS_Audio it is powered by Steam Audio and it is automatic: place a source in the world and it is spatialized, with no per-sound setup and nothing to wire into an effects chain.

This page covers what the base gem does. Occlusion and geometry-driven reflections — sound genuinely blocked and reverberated by world geometry — are Audio Pro features.

For usage guides and setup examples, see The Basics: GS_Audio.

 

Contents


How a Sound Is Placed

Each 3D sound instance gets its own spatializer node, inserted between the source and its volume channel. Direction is recomputed every frame from the source-to-listener vector.

A source uses either miniaudio’s built-in spatializer or Steam Audio’s binaural path, depending on the project’s spatialization mode. Never both — a fixed HRTF layered over a positional pan cancels the spatial presence the pan was already producing.

The listener that all of this measures against lives on the Audio Manager, including the split spatial/orientation setup that lets proximity follow your character while direction follows your camera.

See the Audio Signal Model for where this sits in the chain and why it is a property of the source rather than an effect.


Distance

Distance is handled alongside direction: attenuation plus air absorption, both derived from the source-to-listener distance and the event’s authored Distance Min/Max.

The framework uses a bounded distance curve rather than the raw inverse-distance model:

SignalBehaviour
Direct (the dry sound)Full within min distance, attenuating to true silence at and beyond max distance.
Reverb sendFlat until 75% of max distance, then eased smoothly to zero at max.

The reason to state this plainly: a pure inverse-distance model never reaches zero and ignores a maximum distance, which leaves a faint version of every sound audible forever. The bounded curve trades physical exactness for a max distance that actually means something. An event’s Distance Min/Max therefore controls both how far the dry sound carries and how far it feeds the environment.

It is a chosen curve, not a physical simulation.


Configuration

All of it lives on the Audio Manager’s project settings, so the manager’s component panel is the configuration surface.

SettingDefaultNotes
SpatializationBinauralStereo turns HRTF off and uses miniaudio’s spatializer. Binaural uses Steam Audio HRTF.
HRTF InterpolationNearestNearest is cheap and good for point sources. Bilinear costs more and is better for wide-band material such as noise.
HRTF Volume1.0Level of the binaural path.
Default Min / Max Distance1.0 / 100.0Metres. Per-event distances override these.

HRTF settings are hidden in the editor unless spatialization is set to Binaural.

The spatialization back-end is resolved when sounds preload and does not change at runtime.


Limits Worth Knowing

These are expected behaviour for the technique, not defects — worth knowing before you evaluate the result.

  • Front/back and elevation cues are subtle. The HRTF is generic, with no head tracking and no per-listener personalization. Left/right positioning is clear and reliable; “above and behind me” is not something a generic HRTF conveys strongly.
  • Distance attenuation is a chosen curve, as described above, rather than physically exact falloff.
  • Nothing blocks sound in the base gem. A sound behind a wall is quieter with distance but is not occluded — geometry is not consulted. Occlusion and geometry-driven reverb are Audio Pro features.

See Also

For related systems:

For conceptual overviews and usage guides:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

7 - Audio Pro

GS_AudioPro — the premium audio gem. Visual graph authoring, procedural scoring, Klatt voice synthesis and geometric acoustics, layered onto everything the free gem already does.

GS_AudioPro is the premium audio gem. It requires GS_Audio and extends it — every base feature keeps working exactly as documented, and Pro adds four capabilities of its own.

Added by ProWhat it gives you
Audio Event GraphAuthor a sound as a visual node graph instead of a component chain.
Score ArrangementMulti-layer adaptive music that responds to game state.
Klatt Voice SynthesisGenerated speech — hundreds of distinct voices, no recordings.
Geometric AcousticsOcclusion and reverb derived from real world geometry.

 

Contents


How Pro Attaches to the Base Gem

GS_ProAudioManagerComponent subclasses the base Audio Manager, which in turn subclasses GS_ManagerComponent. It declares itself incompatible with the base manager, so the two cannot coexist on one entity — a project runs one or the other.

Pro never reaches into the base gem’s internals. It fetches primitives across the accessor seam — the engine, the node graph, the output endpoint, volume channels, the shared Steam Audio context — and attaches its own nodes to them.

Two accessors run the other way, and they are the whole enrichment mechanism:

  • Pro registers its spatial simulator, and the base gem’s per-voice spatializer starts consuming occlusion values from it.
  • Pro exposes a reverb send, and base voices tap into it to feed geometry-driven reverb.

Both are null in a base-only install. The interface they are typed against is declared in the base gem and implemented in Pro — base defines the socket, Pro supplies the plug, and nothing breaks when the plug is absent.

Configuration follows the same shape. The base project settings stay where they are; Pro adds its geometry settings additively on the Pro manager. The base gem never reflects Pro’s knobs.


Enabling Audio Pro

  1. Enable the GS_AudioPro gem alongside GS_Audio.
  2. Put the Pro Audio Manager component on your manager prefab in place of the base one.
  3. Assign your graph libraries and score tracks on that component.

Everything the base manager configures — volume channels, event libraries, project settings — is authored on the Pro component too, since it inherits them. Pro’s geometry settings appear alongside them.

A project runs one manager or the other; the two cannot coexist on an entity.


Bus Map

BusGemCarries
AudioManagerRequestBusBaseListener, event libraries, PlayEvent*, volume, mixing, mix effect routing
AudioGraphRequestBusProEverything to do with .audiograph documents
AudioGraphPlayerRequestBusProPer-entity graph playback, addressed by entity
AudioScoreRequestBusProEverything to do with score arrangements
KlattVoiceSystemRequestBus / KlattVoiceRequestBusProVoice synthesis, system-wide and per-entity

In ScriptCanvas, Pro’s nodes sit under the GS_Play/GS_AudioPro category, with each bus grouped under its own feature name. Base nodes remain under GS_Play/GS_Audio.


Features

Audio Event Graph

Build a sound as a node graph — sources, filters, effects and conditional routing on a canvas, with a Start / Loop / Finish phase lifecycle and runtime variables that reshape the sound while it plays. The same DSP processors the base gem exposes as mix effects appear here as nodes.

Audio Event Graph

Score Arrangement

Multi-layer music assets. An arrangement defines time signature, tempo and fade behaviour and holds layers that can be brought in and out independently, so the score follows game state instead of looping past it.

Score Arrangement

Klatt Voice Synthesis

Formant text-to-speech with 3D spatial audio. It generates voice from parameters rather than playing recordings, so a project can give hundreds of characters distinct voices with no audio assets and no recording sessions.

Klatt Voice

Geometric Acoustics

Sound occluded by the geometry between it and the listener, and reverb derived from the room the listener is actually standing in — driven by authored acoustic volumes and O3DE shapes with material presets.

Geometric Acoustics


See Also

For the base gem this builds on:

For conceptual overviews and usage guides:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

7.1 - Audio Event Graph

Visual graph editor for authoring complex sound events with filters, effects, routing, and phase lifecycle.

The Audio Event Graph is an FMOD-style visual editor for authoring complex sound events. Each .audiograph file defines one sound event as a node graph — sources, filters, effects, and routing all connected visually. At runtime, the graph maps directly to a miniaudio processing pipeline.

The Audio Event Graph uses the gs_graphcanvas framework with a DataFlowGraph topology. Nodes evaluate in topological order with dirty-propagation — only nodes affected by a change are re-evaluated.

Audio Event Graph Editor in O3DE Editor

 

Contents


Opening the Editor

Open the Audio Event Graph editor from the O3DE Editor menu: GS Tools > Audio Event Graph Editor.

Each graph is a standalone .audiograph file — use File > New to create one, or File > Open to load an existing graph. Multiple graphs can be open simultaneously in separate tabs.


How It Works

Audio Event Graphs use a data-flow model. Connections carry AudioRoute values — handles that represent a point in the miniaudio processing chain. The signal flows left to right:

  1. Entry nodes gate which phase is active (Start, Loop, or Finish)
  2. Source nodes create sound instances and output an AudioRoute
  3. Filter and effect nodes process the audio and pass it along
  4. Routing nodes (If/Switch) direct the signal based on conditions or variables
  5. The Output node wires the final AudioRoute to a mixing bus

Variables can be set from gameplay code at any time, causing affected nodes to re-evaluate without restarting the entire graph.


Node Catalog

Entry Nodes (Phase Gates)

NodePurpose
Aud_StartNodeActive during the Start phase
Aud_LoopNodeActive during the Loop phase
Aud_FinishNodeActive during the Finish phase

Entry nodes output a gate signal. Downstream nodes only produce audio when their entry gate is active.

Source Nodes

Source Nodes in Audio Event Editor

NodePurposeKey Properties
Aud_SoundNodeSingle audio asset playbackVolume, pitch, delay, looping, 3D spatialization
Aud_AudioPoolNodeRandom selection from a pool of audio assetsSame as SoundNode, plus asset pool list
Aud_NoiseNodeProcedural noise generationNoise colour, duration
Aud_SfxrNodeProcedural chiptone from a pool of SFXR profilesProfile pool, picked at random per fire

Filter Nodes

Filter Nodes in Audio Event Editor

NodeFilter Type
Aud_LowPassFilterNodeLow-pass filter
Aud_HighPassFilterNodeHigh-pass filter
Aud_BandPassFilterNodeBand-pass filter
Aud_NotchFilterNodeNotch (band-reject) filter
Aud_PeakingEQNodePeaking EQ
Aud_LowShelfFilterNodeLow shelf filter
Aud_HighShelfFilterNodeHigh shelf filter

All filter nodes take an audio_in input and produce an audio_out output. Filter parameters (cutoff frequency, Q factor, gain) are configurable per-node or bindable to variables.

Time & Space Nodes

Effect Nodes in Audio Event Editor

NodePurpose
Aud_EchoNodeFeedback delay — repeats that decay over time
Aud_ReverbNodeSimulated room ambience

Character & Modulation Nodes

NodePurpose
Aud_WaveShaperNodeNon-linear distortion and saturation
Aud_LofiNodeBit depth and sample rate reduction
Aud_RobotizeNodeVocoder-style robotic character
Aud_FlangerNodeSweeping comb filtering from a modulated short delay
Aud_ChorusNodeThickening from multiple detuned delayed copies
Aud_RingModNodeRing modulation — metallic, inharmonic tones
Aud_TremoloNodeRhythmic amplitude modulation

Utility Nodes

NodePurpose
Aud_PannerNodeStereo placement
Aud_CompressorNodeDynamic range compression
Aud_DCRemovalNodeRemoves DC offset from a signal
Aud_AmplifyNodeStraight gain

These are the same processors the base gem exposes as mix effects — one DSP, two authoring surfaces. Two mix effects have no node form: Binaural, because spatialization is automatic and per-source, and Pitch.

Structure Nodes

NodePurpose
Aud_MixNodeSums several audio routes into one
Aud_SplitNodeFans one audio route out to several destinations

Routing Nodes

The built-in gs_graphcanvas IfNode and SwitchNode work with AudioRoute values. Use them for conditional audio paths based on game state variables (e.g., play different sounds based on surface type or weather).

Terminal Node

NodePurpose
Aud_OutputNodeWires the final audio chain to the mixing bus

Every graph needs exactly one Output node.


Phase Lifecycle

Audio Event Graph Lifecycle Nodes

Audio Event Graphs support a three-phase lifecycle for structured sound playback:

  1. Start — Initial playback. The Aud_StartNode gate is active. One-shot intro sounds play here.
  2. Loop — Repeating section. The Aud_LoopNode gate is active. Ambient loops and sustained sounds live here.
  3. Finish — Outro/tail. The Aud_FinishNode gate is active. Fade-outs and release tails play here.

Phases transition automatically: Start plays once, then Loop repeats (if looping is enabled), then Finish plays when FinishAudioGraph() is called. Not all phases are required — a simple one-shot sound only needs a Start node.


Using Variables

Variables let gameplay code control sound behavior at runtime. Common uses:

  • Filter parameters — Bind a filter’s cutoff frequency to a variable, then adjust it from code (e.g., underwater muffling)
  • Routing conditions — Use a variable as the condition for an If/Switch node to select different sound paths
  • Source selection — Gate different source nodes based on game state

Declare variables in the Variable Panel, then either bind them to input slots (right-click > Convert to Reference) or use Get/Set variable nodes.

At runtime, set variables via the Audio Manager API:

AudioManagerRequestBus::Broadcast(&AudioManagerRequests::SetAudioGraphVariable, instanceId, "underwater", 0.8f);

Setting a variable marks dependent nodes dirty and re-evaluates only the affected portion of the graph.


Extending with Custom Nodes

To add a custom audio node:

  1. Create a class inheriting from BaseNode and IDataFlowNode
  2. Register it with GS_AUTO_REGISTER_NODE_FOR(MyAudioNode, "audiograph")
  3. Implement Process(GraphExecutionContext& context)
  4. Follow the empty any pattern for inactive outputs:
void MyAudioNode::Process(GraphExecutionContext& context)
{
    auto inputAny = context.GetInputValueAny(this, "audio_in");
    if (inputAny.empty())
    {
        context.SetOutputValueAny(this, "audio_out", AZStd::any{});  // CRITICAL: truly empty
        return;
    }
    // Process audio...
    context.SetOutputValue(this, "audio_out", outputRoute);
}

The empty any pattern ensures that inactive paths don’t mask valid audio from other connections in multi-input slots.

For full details on node creation, see gs_graphcanvas Nodes.


Playing a Graph

There are three ways to reach a graph. They form an escalation ladder — most projects should use the last one.

ApproachSurfaceUse when
Player componentAudioGraphPlayerComponent on an entityAlmost always. No handles to manage.
LibraryPlayGraph(name) / AcquireGraph(name)You want named access across a project.
Raw pathPlayAudioGraph(assetPath)Low-level. You manage the path yourself.

AudioGraphPlayerComponent

The recommended surface. Drop it on an entity, point it at a graph, and it handles the rest.

Authored fieldMeaning
GraphThe .audiograph to play.
Auto PlayStart on activation.
SpatializeTrack this entity’s own transform.
LoopingRun the Loop phase.

It acquires lazily on the first Play or variable set, applies spatialization and looping, and holds its own handle — there is no acquire/release to write. Its per-entity bus offers Play, Finish, Stop, and SetVariable in float, int, bool and string forms.

With no Pro manager present it is inert and warns rather than failing.

Graph libraries

An AudioGraphLibrary (.agl) maps names to graphs, so gameplay code refers to "door_creak" rather than a path. Libraries are assigned to the Pro manager and can be added or removed at runtime.

Because .audiograph is a source-only file — no builder, no product asset — the library uses a custom picker that browses source files directly rather than the product catalog. This is the same approach ScriptCanvas uses for .scriptcanvas, and it is worth copying if you build an asset that references source files.

Current limitation: the picker stores an absolute source path.


Instance Lifecycle

This is the behaviour most likely to surprise you, so it is worth stating plainly.

There are two kinds of instance:

  • Fire-and-forget — created by PlayGraph / PlayAudioGraph, destroyed when it stops.
  • Owned — created by AcquireGraph / AcquireAudioGraph, and kept until you explicitly release it.

For an owned instance, Stop, Finish, a fade-out or a natural end all quiesce it to idle rather than destroying it. Sounds stop, pooled resources return, entry gates deactivate and the phase resets — but the instance, its variables and its spatial and loop configuration are all retained. Only ReleaseAudioGraph or manager shutdown actually destroys it.

The reason: a play → loop → end → replay cycle should keep its variables across calls. What you hear is identical to destruction; the difference is that replaying does not mean reconfiguring.

GetGraph(name) returns the live instance for a name, acquiring on first call. Repeat calls return the same id, and because owned instances persist, a handle normally stays valid for the lifetime of whatever is holding it.

All instance ids are 64-bit unsigned integers, and 0 means failure.


Runtime API

Everything below is on AudioGraphRequestBus — a GS_AudioPro bus, not the Audio Manager’s.

Named access: AddGraphLibrary, RemoveGraphLibrary, PlayGraph(name), AcquireGraph(name), GetGraph(name)

Raw path: PlayAudioGraph(assetPath), AcquireAudioGraph(assetPath)

Transport: FireAudioGraph(id), StopAudioGraph(id), StopAllAudioGraphs(), FinishAudioGraph(id), StopAudioGraphFade(id, fadeTime), ReleaseAudioGraph(id)

Variables: SetAudioGraphVariable (float), SetAudioGraphVariableInt, SetAudioGraphVariableBool, SetAudioGraphVariableString — each taking (instanceId, name, value)

Spatialization: SetAudioGraphEntity(id, entity), SetAudioGraphPosition(id, position), ClearAudioGraphSpatialization(id)

State: SetAudioGraphLooping(id, bool), IsAudioGraphActive(id)

Per-entity playback goes through AudioGraphPlayerRequestBus instead, addressed by entity id.


See Also

7.2 - Score Arrangement

Multi-layer musical score system for dynamic music – tempo, time signatures, fade control, and layer selection.

The Score Arrangement system provides multi-layer dynamic music for GS_Play projects. A ScoreArrangementTrack asset defines a musical score with configurable tempo, time signature, fade behavior, and multiple layers that can be enabled or disabled at runtime. This allows game music to adapt to gameplay state – adding or removing instrumental layers, changing intensity, or crossfading between sections.

Score tracks are assigned to the Pro Audio Manager and controlled through AudioScoreRequestBus. They are not on the base audio manager’s bus.

For usage guides and setup examples, see The Basics: GS_Audio.

Score Arrangement asset in the O3DE Asset Editor

 

Contents


Data Model

ScoreArrangementTrack

A multi-layer musical score asset. Each track defines the musical structure and contains one or more layers that play simultaneously.

FieldValue
TypeId{DBB48082-1834-4DFF-BAD2-6EA8D83F1AD0}
ExtendsAZ::Data::AssetData
ReflectionRequires GS_AssetReflectionIncludes.h — see Serialization Helpers
FieldTypeDescription
Track NameAZStd::stringIdentifier for this score track.
Time SignatureTimeSignaturesThe time signature for this score (e.g. 4/4, 3/4, 6/8).
BPMfloatTempo in beats per minute.
Fade In TimefloatDuration in seconds for the score to fade in when playback begins.
Fade Out TimefloatDuration in seconds for the score to fade out when playback stops.
LoopboolWhether the score loops back to the beginning when it reaches the end.
LayersAZStd::vector<ScoreLayer>The musical layers that compose this score.
Active LayersAZStd::vector<int>Indices of layers that are active (audible) at the start of playback.

ScoreLayer

A single musical layer within a score arrangement. Each layer represents one track of audio (e.g. drums, bass, melody) that can be independently enabled or disabled.

FieldValue
TypeId{C8B2669A-FAEA-4910-9218-6FE50D2E588E}
FieldTypeDescription
Layer NameAZStd::stringIdentifier for this layer within the score.
Audio AssetAZ::Data::Asset<AudioClipAsset>The audio clip for this layer.
VolumefloatBase volume level for this layer (0.0 to 1.0).
Fade TimefloatDuration in seconds for this layer to fade in or out when toggled.

TimeSignatures (Enum)

Supported musical time signatures for score arrangement tracks.

FieldValue
TypeId{6D6B5657-746C-4FCA-A0AC-671C0F064570}
ValueBeats per MeasureBeat UnitDescription
FourFour4Quarter note4/4 – Common time. The most widely used time signature.
FourTwo4Half note4/2 – Four half-note beats per measure.
TwelveEight12Eighth note12/8 – Compound quadruple meter. Four groups of three eighth notes.
TwoTwo2Half note2/2 – Cut time (alla breve). Two half-note beats per measure.
TwoFour2Quarter note2/4 – Two quarter-note beats per measure. March time.
SixEight6Eighth note6/8 – Compound duple meter. Two groups of three eighth notes.
ThreeFour3Quarter note3/4 – Waltz time. Three quarter-note beats per measure.
ThreeTwo3Half note3/2 – Three half-note beats per measure.
NineEight9Eighth note9/8 – Compound triple meter. Three groups of three eighth notes.

API Reference

Request Bus: AudioScoreRequestBus

Singleton bus – single address, single handler. Implemented by the Pro Audio Manager.

MethodParametersDescription
AddScoreArrangementTrackAZ::Data::Asset<ScoreArrangementTrack>Register a score track.
RemoveScoreArrangementTrackconst AZStd::string& scoreNameUnregister a score track.
PlayScorescoreName, fadeTime = 0Start a score with its authored active layers.
PlayScoreAndTracksscoreName, vector<trackName>, fadeTime = 0Start a score with a specific layer set.
PlayTracktrackName, fadeTime = 0Bring one layer in.
StopTracktrackName, fadeTime = 0Take one layer out.
StopScorefadeTime = 0Stop the whole score.

The adaptive-music loop is PlayScore once, then PlayTrack and StopTrack as game state changes. Layers stay in time with each other because they share the arrangement’s tempo and time signature – bringing a percussion layer in mid-bar does not knock it out of sync.


See Also

For conceptual overviews and usage guides:

For component references:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

7.3 - Geometric Acoustics

Occlusion and reflections derived from world geometry — acoustic volumes and shapes, 15 material presets, listener-centric reverb, and an honest account of what is and is not simulated.

The base gem places sounds by direction and distance. Geometric acoustics adds the room: sound muffled by the geometry between it and the listener, and reverb derived from the space the listener is actually standing in rather than an effect an author dialled in.

Geometry is authored, not inferred. You mark up the acoustically significant parts of a level with volumes and shapes carrying material presets — you do not hand the simulation your render meshes.

 

Contents


Turning It On

Geometric acoustics is off by default. It is enabled on the Pro manager’s settings, which are additive to the base project settings.

SettingDefaultMeaning
Geometry EnabledfalseMaster switch for the whole system.
Occlusion EnabledtrueMuffle sounds behind geometry.
Occlusion Type—Raycast or Volumetric.
Occlusion Radius1.0Source sphere radius for volumetric occlusion, in metres.
Max Occlusion Samples16Rays used when sampling an occlusion volume.
Reflections EnabledtrueDerive reverb from geometry.
Reflection ModeListenerSee reflections.
Reflection Wet1.0How much reverb is added to the dry signal.
Reflection Smooth Time0.75Seconds to ease toward a new room. 0 snaps.
Reflection Order1Recursion depth, 0–4.
Simulation Update Rate30.0 HzHow often the simulator recomputes.

Authoring Geometry

Two components mark up a level. Both carry a material preset, plus a custom material for the Custom case.

ComponentWhat it contributes
Audio GeometryAn authored box volume.
Audio Shape GeometryReads an existing O3DE Shape component. A Quad becomes a single-layer plane, a Box becomes a box, and anything else falls back to its bounding box.

The Shape variant is usually the faster path — a wall you have already blocked out with a Shape becomes acoustically real by adding one component.

Registration goes through a request bus that takes raw vertices rather than entities. That is deliberate: it is what will let streaming systems fold geometry in and out of the simulation without the acoustics layer knowing anything about entity lifetimes.


Acoustic Materials

Fifteen presets, plus Custom.

GroupPresetsCharacter
Hard / reflectiveGeneric, Brick, Concrete, Ceramic, Glass, Plaster, Wood, Metal, RockBounce sound. Long, bright reverb.
AbsorptiveGravel, CarpetSoak sound up. Short, dull reverb.
Soft barriersCurtain, Blanket, Door, DrapeTransmit meaningfully — they muffle rather than silence.
Custom—Dial all seven coefficients by hand: absorption low/mid/high, scattering, and transmission low/mid/high.

The soft-barrier group is the interesting one for designers. A curtain over a doorway does not block the sound behind it, it dulls it — which is the effect people usually reach for a low-pass filter to fake.


Occlusion

Each voice is simulated against the geometry between it and the listener, and muffled accordingly.

ModeBehaviourCost
RaycastA single ray. A source is occluded or it is not.Cheap.
VolumetricSamples a sphere of the configured radius.Higher, scaling with sample count.

Volumetric is what gives partial occlusion at edges — a sound leaking around a doorframe rather than switching off as it passes behind the jamb. If occlusion feels binary and abrupt, this is the setting to change.

Occlusion ducks the direct signal.


Reflections

Reverb is derived from the geometry around the listener — one shared room, recomputed as the listener moves through the level. Reflection Mode has a PerSource value reserved for future work; it currently falls back to Listener.

Two behaviours are worth understanding because they are deliberate design choices, not side effects:

Reverb eases between rooms. Crossing a geometry boundary blends the reverb toward the new room over the Reflection Smooth Time rather than snapping. Set it to 0 if you want an instant change.

Reverb does not fade with distance. Each voice taps its raw source into a wet-only reverb, so the room stays constant across its whole volume while only the dry signal falls off with distance. This is what makes a large room sound like the same room from either end of it. The reverb send does taper at the far edge of a sound’s range — flat until three quarters of max distance, then eased to zero — so an event’s distance settings still bound how far it feeds the room.


How It Stays Safe

Worth knowing if you are budgeting for this system.

Reflections use a parametric reverb model — a handful of decay-time floats — rather than convolution. No impulse response ever crosses to the audio thread, and there is no ambisonic decode in the path.

The reflection simulation runs on a worker thread at up to 15 Hz, committing its results under a mutex. Occlusion and direct-path values are lock-free single-writer floats. Everything else stays on the main thread.

The practical consequence: enabling geometric acoustics adds a bounded, predictable cost rather than a per-sound one that scales alarmingly.


What This Does Not Do

State these to yourself before evaluating the result — each is a deliberate v1 boundary, not a defect.

  • Reverb cannot tell your room from the one next door. It is listener-centric, so a source sealed in an adjacent room still contributes to the same shared reverb. Distinguishing them is what per-source reflections would do, and that is not built.
  • An occluded source still feeds the room. Occlusion ducks the direct signal only. Within max distance, a muffled source still excites the reverb.
  • Geometry is what you author. Render meshes and PhysX colliders are not consulted — v1 is authored volumes and O3DE Shapes.
  • No offline baking. There are no precomputed reverb probes.
  • Reverb is the tail, not early reflections. The parametric model gives you the decay, not discrete early reflections.
  • CPU only. There is no GPU acceleration path.

See Also

For related systems:

For conceptual overviews and usage guides:


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

7.4 - Klatt Voice Synthesis

Custom text-to-speech via Klatt formant synthesis with 3D spatial audio, phoneme mapping, and voice profiling.

The Klatt Voice Synthesis system provides custom text-to-speech using Klatt formant synthesis with full 3D spatial audio. Speech is generated by SoLoud and relayed into the miniaudio graph through a custom node, so it travels the same signal chain as every other sound – see the Audio Signal Model.

All types on this page are in the GS_AudioPro namespace.

The system has two layers:

  • KlattVoiceSystemComponent – A singleton that manages the shared SoLoud engine instance and tracks the 3D audio listener position.
  • KlattVoiceComponent – A per-entity component that generates speech, queues segments, applies voice profiles, and emits spatialized audio from the entity’s position.

Voice characteristics are defined through KlattVoiceProfile assets containing frequency, speed, waveform, formant, and phoneme mapping configuration. Phoneme maps convert input text to ARPABET phonemes for the Klatt synthesizer, with support for custom pronunciation overrides.

For usage guides and setup examples, see The Basics: GS_Audio.

Klatt Voice Profile asset in the O3DE Asset Editor

 

Contents


Components

KlattVoiceSystemComponent

Singleton component that manages the shared SoLoud engine and 3D listener tracking.

FieldValue
TypeId{F4A5D6E7-8B9C-4D5E-A1F2-3B4C5D6E7F8A}
ExtendsAZ::Component, AZ::TickBus::Handler
BusKlattVoiceSystemRequestBus (Single/Single)

KlattVoiceComponent

Per-entity voice component with spatial audio, phoneme mapping, and segment queue.

FieldValue
TypeId{4A8B9C7D-6E5F-4D3C-2B1A-0F9E8D7C6B5A}
ExtendsAZ::Component, AZ::TickBus::Handler
Request BusKlattVoiceRequestBus (Single/ById, entity-addressed)
Notification BusKlattVoiceNotificationBus (Multiple/Multiple)

API Reference

Request Bus: KlattVoiceSystemRequestBus

System-level voice management. Singleton bus – Single address, single handler.

MethodParametersReturnsDescription
GetSoLoudEngine–SoLoud::Soloud*Returns a pointer to the shared SoLoud engine instance.
SetListenerPositionconst AZ::Vector3& positionvoidUpdates the 3D audio listener position for spatial voice playback.
SetListenerOrientationconst AZ::Vector3& forward, const AZ::Vector3& upvoidUpdates the 3D audio listener orientation.
GetListenerPosition–AZ::Vector3Returns the current listener position.
IsEngineReady–boolReturns whether the SoLoud engine has been initialized and is ready.

Request Bus: KlattVoiceRequestBus

Per-entity voice synthesis controls. Entity-addressed bus – Single handler per entity ID.

MethodParametersReturnsDescription
Speakconst AZStd::string& textvoidConverts text to speech and plays it. Uses the component’s configured voice profile.
SpeakWithParamsconst AZStd::string& text, const KlattVoiceParams& paramsvoidConverts text to speech using the specified voice parameters instead of the profile defaults.
StopSpeaking–voidImmediately stops any speech in progress and clears the segment queue.
IsSpeaking–boolReturns whether this entity’s voice is currently producing speech.
QueueSegmentconst AZStd::string& textvoidAdds a speech segment to the queue. Queued segments play in order after the current segment finishes.
ClearQueue–voidClears all queued speech segments without stopping current playback.
SetVoiceProfileconst AZ::Data::Asset<KlattVoiceProfile>& profilevoidChanges the voice profile used by this component.
GetVoiceProfile–AZ::Data::Asset<KlattVoiceProfile>Returns the currently assigned voice profile asset.
SetSpatialConfigconst KlattSpatialConfig& configvoidUpdates the 3D spatial audio configuration for this voice.
GetSpatialConfig–KlattSpatialConfigReturns the current spatial audio configuration.
SetVolumefloat volumevoidSets the output volume for this voice (0.0 to 1.0).
GetVolume–floatReturns the current output volume.

Notification Bus: KlattVoiceNotificationBus

Events broadcast by voice components. Multiple handler bus – any number of components can subscribe.

EventParametersDescription
OnSpeechStartedconst AZ::EntityId& entityIdFired when an entity begins speaking.
OnSpeechFinishedconst AZ::EntityId& entityIdFired when an entity finishes speaking (including all queued segments).
OnSegmentStartedconst AZ::EntityId& entityId, int segmentIndexFired when a new speech segment begins playing.
OnSegmentFinishedconst AZ::EntityId& entityId, int segmentIndexFired when a speech segment finishes playing.

Data Types

KlattVoiceParams

Core voice synthesis parameters controlling the Klatt formant synthesizer output.

FieldValue
TypeId{8A9C7F3B-4E2D-4C1A-9B5E-6D8F9A2C1B4E}
FieldTypeDescription
Base FrequencyfloatFundamental frequency (F0) in Hz. Controls the base pitch of the voice.
SpeedfloatSpeech rate multiplier. 1.0 is normal speed.
DeclinationfloatPitch declination rate. Controls how pitch drops over the course of an utterance.
WaveformKlattWaveformGlottal waveform type used by the synthesizer.
Formant ShiftfloatShifts all formant frequencies up or down. Positive values raise pitch character, negative values lower it.
Pitch VariancefloatAmount of random pitch variation applied during speech for natural-sounding intonation.

KlattVoiceProfile

A voice profile asset combining synthesis parameters with a phoneme mapping.

FieldValue
TypeId{2CEB777E-DAA7-40B1-BFF4-0F772ADE86CF}
ReflectionRequires GS_AssetReflectionIncludes.h — see Serialization Helpers
FieldTypeDescription
Voice ParamsKlattVoiceParamsThe synthesis parameters for this voice profile.
Phoneme MapAZ::Data::Asset<KlattPhonemeMap>The phoneme mapping asset used for text-to-phoneme conversion.

KlattVoicePreset

A preset configuration for quick voice setup.

FieldValue
TypeId{2B8D9E4F-7C6A-4D3B-8E9F-1A2B3C4D5E6F}
FieldTypeDescription
Preset NameAZStd::stringDisplay name for this preset.
ProfileKlattVoiceProfileThe voice profile configuration stored in this preset.

KlattSpatialConfig

3D spatial audio configuration for voice positioning.

FieldValue
TypeId{7C9F8E2D-3A4B-5F6C-1E0D-9A8B7C6D5E4F}
FieldTypeDescription
Enable 3DboolWhether this voice uses 3D spatialization. When false, audio plays as 2D.
Min DistancefloatDistance at which attenuation begins. Below this distance the voice plays at full volume.
Max DistancefloatDistance at which the voice reaches minimum volume.
Attenuation ModelintThe distance attenuation curve type (linear, inverse, exponential).
Doppler FactorfloatIntensity of the Doppler effect applied to this voice. 0.0 disables Doppler.

KlattPhonemeMap

Phoneme mapping asset for text-to-ARPABET conversion with custom overrides.

FieldValue
TypeId{F3E9D7C1-2A4B-5E8F-9C3D-6A1B4E7F2D5C}
ReflectionRequires GS_AssetReflectionIncludes.h — see Serialization Helpers
FieldTypeDescription
Base MapBasePhonemeMapThe base phoneme dictionary to use as the foundation for conversion.
OverridesAZStd::vector<PhonemeOverride>Custom pronunciation overrides for specific words or patterns.

PhonemeOverride

A custom pronunciation rule that overrides the base phoneme map for a specific word or pattern.

FieldValue
TypeId{A2B5C8D1-4E7F-3A9C-6B2D-1F5E8A3C7D9B}
FieldTypeDescription
WordAZStd::stringThe word or pattern to match.
PhonemesAZStd::stringThe ARPABET phoneme sequence to use for this word.

Enumerations

KlattWaveform

Glottal waveform types available for the Klatt synthesizer.

FieldValue
TypeId{8ED1DABE-3347-44A5-B43A-C171D36AE780}
ValueDescription
SawSawtooth waveform. Bright, buzzy character.
TriangleTriangle waveform. Softer than sawtooth, slightly hollow.
SinSine waveform. Pure tone, smooth and clean.
SquareSquare waveform. Hollow, reed-like character.
PulsePulse waveform. Variable duty cycle for varied timbres.
NoiseNoise waveform. Breathy, whisper-like quality.
WarbleWarble waveform. Modulated tone with vibrato-like character.

BasePhonemeMap

Available base phoneme dictionaries for text-to-ARPABET conversion.

FieldValue
TypeId{D8F2A3C5-1B4E-7A9F-6D2C-5E8A1B3F4C7D}
ValueDescription
SoLoud_DefaultThe default letter-to-phoneme mapping built into SoLoud. Covers standard English pronunciation.
CMU_FullThe full CMU Pronouncing Dictionary — over 130,000 entries. Not yet functional.

KTT Voice Tags

KTT (Klatt Text Tags) are inline commands embedded in strings passed to KlattVoiceComponent::SpeakText. They are parsed by KlattCommandParser::Parse and stripped from the spoken text before synthesis begins — they are never heard.

Format: <ktt attr1=value1 attr2=value2>

Multiple attributes can be combined in a single tag. Attribute names are case-insensitive. String values may optionally be wrapped in quotes. An empty value (e.g. speed=) resets that parameter to the voice profile default.


speed=X

Override the speech speed multiplier from this point forward.

Range0.1 – 5.0
Default resetspeed= (restores profile default)
1.0Normal speed
Normal speech <ktt speed=2.0> fast bit <ktt speed=> back to default.

decl=X / declination=X

Pitch declination — how much pitch falls over the course of the utterance. Both decl and declination are accepted.

Range0.0 – 1.0
0.0Steady pitch (no fall)
0.8Strong downward drift
Rising <ktt decl=0.0> steady <ktt decl=0.8> falling voice.

waveform="TYPE"

Change the glottal waveform used by the synthesizer, setting the overall character of the voice.

ValueCharacter
sawDefault, neutral voice
triangleSofter, smoother
sin / sinePure tone, robotic
squareHarsh, mechanical
pulseRaspy, textured
noiseWhispered, breathy
warbleWobbly, character voice
<ktt waveform="noise"> whispered section <ktt waveform="saw"> normal voice.

vowel=X

First formant (F1) frequency multiplier. Shifts the quality of synthesised vowel sounds.

1.0Normal
> 1.0More open vowel quality
< 1.0More closed vowel quality
<ktt vowel=1.4> different vowel colour here.

accent=X

Second formant (F2) frequency multiplier. Shifts accent or dialect colouration.

1.0Normal
< 1.0Shifted accent colouring
<ktt accent=0.8> shifted accent here.

pitch=X

F0 pitch variance amount. Controls how much pitch varies during synthesis.

1.0Normal variance
> 1.0More expressive intonation
< 1.0Flatter, more monotone
<ktt pitch=2.0> very expressive speech <ktt pitch=0.1> flat monotone.

pause=X

Insert a pause of X seconds at this position in the voice playback. Value is required — there is no default.

Hello.<ktt pause=0.8> How are you?

Combined Example

Dialogue string using typewriter text commands and KTT voice tags together:

[b]Warning:[/b] [color=#FF0000]do not[/color] proceed.[pause=1]
<ktt waveform="square" pitch=1.8>This is a mechanical override.<ktt pause=0.5><ktt waveform="saw" pitch=1.0>
[speed=3]Resuming normal protocol.[/speed]

See Also

For conceptual overviews and usage guides:

For component references:

  • Audio Manager – Manager lifecycle that the voice system participates in

Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.

8 - Third Party Implementations

Integration guides for third-party audio systems with GS_Audio.

This section will contain integration guides for connecting third-party audio middleware and tools with the GS_Audio system.

For usage guides and setup examples, see The Basics: GS_Audio.


Get GS_Audio

GS_Audio — Explore this gem on the product page and add it to your project.