Guidance / API reference
Version History
v3.1.0 (dev) - October 2026
- Dev snapshots for testing in other projects; see
CHANGELOG.mdat the package root and “Changes since 3.0.0” inBETA_KNOWN_ISSUES.mdfor what changed. - Scoped parameters: AudioParameter assets, AudioEmitter, per-play values on
AudioHandle, globalSetParameter/RampParameter,AudioEvent.Post(AudioEmitter),AudioManager.Post, andAudioManager.UpdateMode/Tick. The string RTPC API is the global scope. Blend Containers read their parameter per play, once a frame;BlendContainer.UpdateBlendis obsolete. - Parameter curves, regions and pitch follow: ParameterCurve (volume dB, pitch cents, low- and high-pass Hz) on any container and Blend entry; Blend
Layout(Volume Curves or Regions),Crossfadeshape andAutoLayout;PitchFollowParameterwith per-entryrootValue,followPitchandfollowRangeSemitones;GainStack.CurveGain; per-voice filters for filter curves. - Nested containers: every play keeps a tree of the containers it reached, so nested Blends read their parameters per play and late voices get their Blend’s curve and Volume. New
AudioContainer.UsesParentPositioning/UsesParentOutput. - Listening points:
AudioManager.AddListeningPoint/RemoveListeningPoint/ListeningPoints/DriveUnityListener, AudioListeningPoint, andListenerUtil.TryGetPosition. With a point registered the scene is never searched; without one, the search warns once and runs at most once a frame. - Parameter smoothing: ParameterSlew (None, Rate, Ease with separate rise and fall) on
AudioParameter, per-emitter and per-play overrides,SnapParameter/SnapAllParameters, and the Bypass Slew While parameter. - Virtual voices keep their place: positions in samples on the audio clock at the voice’s pitch (
AudioVoice.VirtualSamples), a short fade around virtualizing and realizing (GainStack.RealizeGain,GetGainWithoutRealize), andAudioContainer.DopplerLevel. - The play is the unit of the voice pool: whole-play steals after making room (
AudioContainer.EstimateVoiceCount), plays real or virtual as a whole with stickiness, one start time per play,BlendContainer.LoopMode/SilentLayers/SilentThresholdDb(Loopobsolete),AudioEvent.Persistent, Unity voice-limit warnings andAudioSource.priority. - No forced multiplayer code: the
SFXSYSTEM_DISABLE_NETCODEdefine leaves the netcode assemblies out;PropagationManagerhears from the registered listening point. - Named emitter points: AudioEmitter
Points,Post(event, "Exhaust")/Post(event, number),FindPoint,SetPoint,GetPointOffset/GetPointPosition,EmitterPoint;Velocity,SetVelocity,ClearVelocity;AudioEvent.Post(AudioEmitter, point)andAudioManager.Post(event, emitter, point). - Switches per sound, following while they play: AudioSwitchGroup assets (names still work), with
DrivenBy,RangesandHysteresis;SetSwitch/ClearSwitch/TryGetSwitch/GetEffectiveSwitchonAudioEmitterandAudioHandle;AudioManager.SetSwitch(AudioSwitchGroup, value),ClearSwitch,GetSwitch(AudioSwitchGroup);SwitchContainer.SwitchGroup,WhenSwitchChangesandCrossfadeTime;GainStack.SwitchGain. - Distance assets and built-in values: AudioAttenuation (volume, low-pass, high-pass and spread over metres, Max Distance),
AudioContainer.Attenuation,ContainerOverrides.attenuation,AudioHandle.SetAttenuation/ClearAttenuation;AudioParameter.ValueFrom(ParameterSource: Distance, ApproachSpeed, Angle) andIsBuiltIn.AudioContainer.MaxDistance’s setter writes a runtime override. - Audition outside Play mode: Window > Audio System > Audition and AudioAudition (
AuditionLayer,AuditionInputs): play a container tree with parameter sliders, switch values, a sweep and a layer readout while editing it. - One-shots per emitter:
AudioEvent.MaxInstancesPerEmitter/CooldownPerEmitter; PostValues and thePostoverloads that take it (event, emitter, manager);AudioManager.RandomNumbers(AudioRandomSource: Pepper’s own streams by default, or Unity);AudioEmitter.RandomSeed/SetRandomSeed; Random containers’ Avoid Repeat Last per emitter. - Bus property curves:
AudioBus.ParameterCurves(Volume, Low Pass, High Pass on global values),LowPassParameter/HighPassParameter(exposed mixer cutoffs),CurveVolumeGain,LowPassHz,HighPassHz; the bus inspector’s Add Low Pass / High Pass buttons. - Lifecycle, teardown and pause (3.1.0-dev.5):
AudioManager.PersistAcrossScenesand Pepper’s own “AudioVoices” root (switching the manager off changes nothing);AudioManager.Inertfor dedicated servers;AudioEmitter.WhenDisabled(EmitterDisableMode: Keep, Stop, Pause) andStopFadeSeconds;EventAction.scope(ActionScope: All, ThisEmitter);AudioBus.Pause/Resume/IsPaused/WhilePaused(BusPauseBehaviour);AudioEvent.TimeModeandAudioBus.DuckingTimeMode(AudioTimeMode: Scaled, Unscaled). Finished handles ignore newOnStarted/OnStopping/OnLoopsubscriptions. - Tools (3.1.0-dev.6): the Audition plays events too, runs any number of sweeps (
SweepMode), replays recordings and shows written values (AudioAudition); the Live View withAudioManager.GetPlaysDebug,AudioPlayDebugInfo,VoiceVirtualReason, the newAudioVoiceDebugInfofields,AudioHandle’s value listing andAudioEmitter.AllEnabled;AudioEmitterRecorderandAudioParameterRecording; Loop Analysis; the Engine Builder; the Container Validator’s project-wide rules andValidateEvent; folder import rules (no settings asset ships in the package);AudioStatistics.poolSize; undoable bus faders. - Routing, mix and positions (3.1.0-dev.7): offsets that stick:
AudioEmitter.VolumeOffsetDb/PitchOffsetCents,AudioHandle.SetVolumeOffset/VolumeOffsetDb/VolumeScale/PitchOffset,PostValues.WithVolumeOffset/WithPitchOffset/VolumeOffset,GainStack.EmitterGain,PitchStack.Emitter, and a handle’sSetVolumeScale/SetPitchOffsetreaching voices it starts later; posting anywhere on an emitter (AudioEmitter.Post(evt, localOffset, values),AudioEvent.PostAtOffset,AudioManager.Post(evt, emitter, localOffset, values)) and moving a playing sound (AudioHandle.SetLocalOffset/SetWorldPosition); timed posts (Post(emitter, startDsp, startOffsetSeconds, values)on the event, emitter and manager) andAudioEvent.EstimateDuration(AudioDuration); Pepper’s Doppler (AudioContainer.Doppler,DopplerExaggeration,DopplerMaxCents,DopplerMode,DopplerMath),AudioEmitter.Teleport,AudioListeningPoint.ClearVelocity; ducks combining by the deepest (AudioBus.ApplyDucking);AudioState.VolumeMode(StateVolumeMode: SetLevel, Offset),AudioManager.ClearState,AudioBus.StateOffsetDb/PlayerVolumeDb/IsMuted,AudioManager.MasterVolumeDb/SetMasterVolumeDb/IsAllMuted;SetBusVolumewith an unknown name changes nothing. - Many cars and split screen (3.1.0-dev.8):
AudioManager.SpatialMode(AudioSpatialMode: Unity, Pepper), Pepper panning and attenuating 3D sounds from every listening point by itsWeightandPanWidth(GainStack.SpatialGain), reproducing Unity’s 3D at one point;AudioManager.SetPrimaryListeningPoint/PrimaryListeningPoint,AudioListeningPoint.IsPrimary; a point whose transform is destroyed is removed; each play measured from its own point, gliding over 100 ms when it changes;AudioBus.MaxRealVoices/RealVoiceCount;AudioManager.StealFadeSeconds(steals fade); Low priority weighs 1/8 in importance; every pooled voice carries its low- and high-pass from the start;AudioVoiceDebugInfo.listeningPoint/pepperPanned/spatialGainDb/pan.
v3.0.0 - July 2026
- New subsystem: Multiplayer (Netcode) — backend-agnostic networked audio. Post a sound on one machine and every player hears it; no audio crosses the wire, only a ~36-byte descriptor each machine plays locally. Install one netcode stack and its adapter lights up automatically; a backend you didn’t install never compiles. See Manual chapter 17 and API → Netcode (Multiplayer).
NetworkedAudioManagerfaçade —PostNetworkedEvent/PostNetworkedLoop/StopNetworked, server-authoredPostServer*, scheduled/quantized cues- Emitter binding (sound follows a moving
NetworkObject), shared loop lifetime + late-join snapshot, cross-client variation parity (seed on the wire) - Competitive hardening — server authority/validation, proximity culling (= don’t-send), per-event
Unreliable Delivery - Musical sync —
NetworkClock(network-time ↔ local dsp) +NetworkMusicTransport(tempo/phase), loop phase-lock tiers (Tier 2 experimental — not for production yet) NetworkAudioSettingsscene component; Network Audio Debug window; per-event Multiplayer foldout onAudioEvent- Adapters: NGO 2.x (
SFXSYSTEM_NGO) and FishNet v4 (FISHNET). Verified on FishNet, one PC and two PCs; NGO has had light testing only.
- New subsystem: Audio Loading & Memory — tiered, opt-in control over clip RAM footprint and load timing. Default direct-reference path is unchanged and zero-overhead. See Manual chapter 16 and API → Loading.
AudioClipWarmer+AudioManager.WarmClip/WarmClips/WarmContainer— front-load clip audio data ahead of first play (no extra package)IAudioClipSourceseam (AudioClipSources.Active, defaultDirectClipSource) — containers resolve clips through it; per-entryaddressonWeightedAudioClip/SequenceEntry/RoutingEntry- Optional Addressables backend (gated on
com.unity.addressables): load/unload a region’s clips by zone viaZoneAudioBank+AddressableAudioRuntime, voice-safe refcounted residency (banks + voices + pins), drop-on-cold, linger - Addressable Audio Authoring window (convert clips in one click) + Loading Validator window. Voice-hold correctness verified; build-scale RAM profiling pending.
- Additive — no v2.5.0 APIs changed. Both subsystems are inert until opted into (netcode: install a stack + add a transport; loading: use the warmer or install Addressables).
v2.5.0 - May 2026
- New subsystem: Occlusion Mixer Slot Pool — per-bus pre-built mixer-slot pools replace per-source
AudioLowPassFilters. Eliminates the per-acquire biquad-reset click; cutoff modulation is a stable mixer-side write. See Manual chapter 14.OcclusionLayout+OcclusionSlottypesAudioManager.AcquireOcclusionSlot/ReleaseOcclusionSlotand slot-pool diagnostics- Multi-ray partial occlusion (
occlusionRayCount,occlusionRaySpreadMeters) — N-level edge gradient instead of binary - Per-frame exponential smoothing via
occlusionGainSmoothingSeconds/occlusionCutoffSmoothingSeconds - Occlusion Layout Builder window (
Window > Audio System > Occlusion Layout)
- New subsystem: Reverb Send Buses & Per-Zone Reverb — source-side routing + listener-side bus-character driver. SFX voices contribute to the reverb of the room they’re fired in; each bus’s character is defined by its
ReverbSendBusasset (the single source of truth, since the 2026-05-21 unification). See Manual chapter 15.ReverbSendBus(one acoustic-space identity per asset) +ReverbSendBusRegistryAudioReverbProfile(six SFX Reverb character params, authored on the bus SO)AudioZone.ReverbBus(routing target; character lives on theReverbSendBusSO, not the zone)- Convolution reverb option (Phase 3.2, Windows x64, beta) —
ReverbSendBus.UseConvolutionswaps the parametric SFX Reverb for a native impulse-response convolution plugin. See Manual §15.14. AudioManager.WriteReverbSendsImmediate— synchronous on-Play write so first audio frame carries correct routingAudioContaineropt-in flags:AllowReverbSend,ReverbSendLevelDb,StaticEmitter,ExplicitReverbBus- Reverb Send Buses window (
Window > Audio System > Reverb Send Buses) + per-asset Generate/Validate/Apply/Pull inspector
- AudioContainer routing flags —
UseOcclusion,UsePropagation,AllowReverbSendopt SFX containers into the new slot pool.UseOcclusionenables raycast occlusion;UsePropagationcomposes propagation cutoff into the same voice via most-muffled-wins (min cutoff, multiplicative gain). The two routing/muffling subsystems now integrate cleanly with the propagation subsystem from v2.3.0. - Soft zone boundaries —
AudioZone.entryFadeMeterssmooths reverb sends, listener-side reverb character, andBaseVolumeDbacross the zone surface. 0 (default) preserves the v2.3.0 binary boundary. - Outside-the-graph behavior —
PropagationManager.silenceOutsideGraphtoggle picks between whitelist mode (outside = audible, default) and complete-coverage mode (outside = silent + muffled). - Reachability-preserving culler —
PropagationProximityCullernow keeps zones reachable through near portals active even when individually out of activation-radius range. Two-zone-via-portal scenes no longer fall silent on tight radii. - Higher default solve rate —
PropagationManager.solveRateHzdefault 8 → 15 (≈ 67 ms cache step). Fast zone-trigger crossings and partially-closed-portal transitions no longer surface audible step changes. - Lower default open low-pass —
AudioPortal.openLowPassHzdefault 18000 → 12000. A portal without a door source is now audibly distinct from full transparency on typical speakers, surfacing authoring mistakes early.
v2.3.0 - April 2026
- New subsystem:
AudioSystem.Propagation— zone/portal graph-based routing for ambient beds AudioZone/AudioPortalMonoBehaviours (authoring)AmbientSource/AmbientEmitter(declaration + pooled persistent voice)PropagationManagersingleton +AudioListenerZoneTrackerIPortalDoorSourceinterface for portable door integrationPropagationProximityCullerfor large-level scale (per-node activation radius + global caps)- Pure Dijkstra solver with reusable buffers (allocation-free hot path)
- Blend-region crossfading for pop-free doorway traversal
- Additive — does not modify any v2.2.0 APIs
v2.2.0 - March 2026
- Runtime container override system (3D settings)
- Per-voice control on AudioMultiHandle
- RTPC transitions with
TransitionRTPC() StopAllSounds(),PauseAll(),UnpauseAll()MuteAll(bool)replaces separate Mute/Unmute methods- AudioStatistics replaces Statistics struct
- VoiceStealBehavior: added
Furthest, removedNone - GainStack: added
DuckingGain,ApplyToSource(),Reset() - SequenceContainer:
AutoAdvance,PlayNext() - AudioBus: ducking system, effect sends
- AudioState: structured property classes
- Multi-position emitter components
IRTPCListenerinterfaceListenerUtilutility classAudioVoiceDebugInfofor runtime debugging
v2.0.0 - January 2026
- AudioEventRegistry system
- Quick Sound Setup Wizard (5 modes), now Sound Builder (Simple)
- AudioEvent Inspector validation
- Batch import support
v1.0 - Initial release
- Complete audio middleware system
- 5 container types
- Event system with multi-actions
- Hierarchical bus mixing
- State management
- Multi-position audio
- Voice virtualization & LOD
- Occlusion system
End of API Reference
For tutorials, see Cookbook in the User Guide For deep knowledge, see Manual in the User Guide For quick start, see Quick Start in the User Guide
Pepper.SFX v3.0.0 - Professional Audio Middleware for Unity
From the Pepper.SFX 3.1 guides (API_REFERENCE.md). Something wrong or unclear? Tell me.