Pepper.SFX
All Guidance pages

Guidance / API reference

Version History

v3.1.0 (dev) - October 2026

  • Dev snapshots for testing in other projects; see CHANGELOG.md at the package root and “Changes since 3.0.0” in BETA_KNOWN_ISSUES.md for what changed.
  • Scoped parameters: AudioParameter assets, AudioEmitter, per-play values on AudioHandle, global SetParameter/RampParameter, AudioEvent.Post(AudioEmitter), AudioManager.Post, and AudioManager.UpdateMode/Tick. The string RTPC API is the global scope. Blend Containers read their parameter per play, once a frame; BlendContainer.UpdateBlend is 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), Crossfade shape and AutoLayout; PitchFollowParameter with per-entry rootValue, followPitch and followRangeSemitones; 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, and ListenerUtil.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), and AudioContainer.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 (Loop obsolete), AudioEvent.Persistent, Unity voice-limit warnings and AudioSource.priority.
  • No forced multiplayer code: the SFXSYSTEM_DISABLE_NETCODE define leaves the netcode assemblies out; PropagationManager hears 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) and AudioManager.Post(event, emitter, point).
  • Switches per sound, following while they play: AudioSwitchGroup assets (names still work), with DrivenBy, Ranges and Hysteresis; SetSwitch / ClearSwitch / TryGetSwitch / GetEffectiveSwitch on AudioEmitter and AudioHandle; AudioManager.SetSwitch(AudioSwitchGroup, value), ClearSwitch, GetSwitch(AudioSwitchGroup); SwitchContainer.SwitchGroup, WhenSwitchChanges and CrossfadeTime; 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) and IsBuiltIn. 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 the Post overloads 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.PersistAcrossScenes and Pepper’s own “AudioVoices” root (switching the manager off changes nothing); AudioManager.Inert for dedicated servers; AudioEmitter.WhenDisabled (EmitterDisableMode: Keep, Stop, Pause) and StopFadeSeconds; EventAction.scope (ActionScope: All, ThisEmitter); AudioBus.Pause / Resume / IsPaused / WhilePaused (BusPauseBehaviour); AudioEvent.TimeMode and AudioBus.DuckingTimeMode (AudioTimeMode: Scaled, Unscaled). Finished handles ignore new OnStarted / OnStopping / OnLoop subscriptions.
  • 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 with AudioManager.GetPlaysDebug, AudioPlayDebugInfo, VoiceVirtualReason, the new AudioVoiceDebugInfo fields, AudioHandle’s value listing and AudioEmitter.AllEnabled; AudioEmitterRecorder and AudioParameterRecording; Loop Analysis; the Engine Builder; the Container Validator’s project-wide rules and ValidateEvent; 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’s SetVolumeScale / SetPitchOffset reaching 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) and AudioEvent.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; SetBusVolume with 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 its Weight and PanWidth (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).
    • NetworkedAudioManager façade — PostNetworkedEvent / PostNetworkedLoop / StopNetworked, server-authored PostServer*, 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)
    • NetworkAudioSettings scene component; Network Audio Debug window; per-event Multiplayer foldout on AudioEvent
    • 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)
    • IAudioClipSource seam (AudioClipSources.Active, default DirectClipSource) — containers resolve clips through it; per-entry address on WeightedAudioClip / SequenceEntry / RoutingEntry
    • Optional Addressables backend (gated on com.unity.addressables): load/unload a region’s clips by zone via ZoneAudioBank + 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 + OcclusionSlot types
    • AudioManager.AcquireOcclusionSlot / ReleaseOcclusionSlot and 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 ReverbSendBus asset (the single source of truth, since the 2026-05-21 unification). See Manual chapter 15.
    • ReverbSendBus (one acoustic-space identity per asset) + ReverbSendBusRegistry
    • AudioReverbProfile (six SFX Reverb character params, authored on the bus SO)
    • AudioZone.ReverbBus (routing target; character lives on the ReverbSendBus SO, not the zone)
    • Convolution reverb option (Phase 3.2, Windows x64, beta) — ReverbSendBus.UseConvolution swaps 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 routing
    • AudioContainer opt-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, AllowReverbSend opt SFX containers into the new slot pool. UseOcclusion enables raycast occlusion; UsePropagation composes 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.entryFadeMeters smooths reverb sends, listener-side reverb character, and BaseVolumeDb across the zone surface. 0 (default) preserves the v2.3.0 binary boundary.
  • Outside-the-graph behavior — PropagationManager.silenceOutsideGraph toggle picks between whitelist mode (outside = audible, default) and complete-coverage mode (outside = silent + muffled).
  • Reachability-preserving culler — PropagationProximityCuller now 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.solveRateHz default 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.openLowPassHz default 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 / AudioPortal MonoBehaviours (authoring)
  • AmbientSource / AmbientEmitter (declaration + pooled persistent voice)
  • PropagationManager singleton + AudioListenerZoneTracker
  • IPortalDoorSource interface for portable door integration
  • PropagationProximityCuller for 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, removed None
  • GainStack: added DuckingGain, ApplyToSource(), Reset()
  • SequenceContainer: AutoAdvance, PlayNext()
  • AudioBus: ducking system, effect sends
  • AudioState: structured property classes
  • Multi-position emitter components
  • IRTPCListener interface
  • ListenerUtil utility class
  • AudioVoiceDebugInfo for 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.