Migrating from Sound¶
Roblox marks Sound, SoundGroup and SoundEffect as discouraged. They still work, but new features (wiring, acoustic simulation, voice routing, TTS, STT, scheduled playback) exist only in audio objects.
The big differences¶
Legacy Sound |
Audio objects | |
|---|---|---|
| Structure | One object does it all; its parent decides 2D or 3D | Separate player, emitter, listener and output, joined by wires |
| 3D | Automatic when parented to a part | Explicit AudioEmitter, heard by an AudioListener |
| Grouping | SoundGroup (volume plus effects) |
Any effect or AudioFader used as a bus |
| Effects | SoundEffect children, ordered by Priority |
Effect nodes wired in series, so order is the wiring |
| Voice | Separate, internal | Just another stream (AudioDeviceInput) |
| Listener | One, global (SoundService:SetListener) |
Any number, with interaction groups |
| Level metering | Sound.PlaybackLoudness |
AudioAnalyzer (RMS, peak, spectrum) |
| Timing | Frame-based | Play(atTime) against the sample clock |
| Wall muffling | None | Acoustic simulation |
Property map¶
Sound |
Audio objects |
|---|---|
SoundId |
AudioPlayer.Asset |
Volume (0–10) |
AudioPlayer.Volume (0–10) |
PlaybackSpeed |
AudioPlayer.PlaybackSpeed |
Looped |
AudioPlayer.Looping |
TimePosition, TimeLength |
Same names |
PlaybackRegion, LoopRegion |
Same names |
Playing |
IsPlaying (read-only; use Play() / Stop()) |
Play() / Stop() |
Play() / Stop(), but Stop doesn't rewind |
Pause() / Resume() |
Stop() / Play() |
IsLoaded / Loaded |
IsReady / watch IsReady |
Ended, DidLoop |
Ended, Looped |
PlayOnRemove |
Play from a temporary instance and destroy it on Ended |
PlaybackLoudness |
AudioAnalyzer.RmsLevel / PeakLevel |
RollOffMode, RollOffMinDistance, RollOffMaxDistance |
AudioEmitter.DistanceAttenuationMode + DistanceAttenuationBounds, or a custom curve |
SoundGroup |
AudioFader (or any effect) that sources wire into |
SoundService:PlayLocalSound(s) |
A client-side AudioPlayer → AudioDeviceOutput |
SoundService.AmbientReverb |
AudioReverb on the listener path, or acoustic simulation |
SoundService.RolloffScale, DopplerScale, DistanceFactor |
No direct equivalent; shape emitter curves instead |
Effect map¶
SoundEffect |
Audio object |
|---|---|
ChorusSoundEffect |
AudioChorus |
CompressorSoundEffect |
AudioCompressor (sidechain is a wired pin, not a SideChain property) |
DistortionSoundEffect |
AudioDistortion |
EchoSoundEffect |
AudioEcho |
EqualizerSoundEffect |
AudioEqualizer (or AudioFilter for precise bands) |
FlangeSoundEffect |
AudioFlanger |
PitchShiftSoundEffect |
AudioPitchShifter |
ReverbSoundEffect |
AudioReverb |
TremoloSoundEffect |
AudioTremolo |
| — | New: AudioFilter, AudioGate, AudioLimiter, AudioFader, AudioAnalyzer, channel mixer and splitter |
Converting a part sound¶
local part = workspace.Generator
local player = Instance.new("AudioPlayer")
player.Asset = "rbxassetid://0000000"
player.Looping = true
player.Parent = part
local emitter = Instance.new("AudioEmitter")
emitter.DistanceAttenuationMode = Enum.DistanceAttenuationMode.InverseTapered
emitter.DistanceAttenuationBounds = NumberRange.new(10, 80)
emitter.Parent = part
local wire = Instance.new("Wire")
wire.SourceInstance = player
wire.TargetInstance = emitter
wire.Parent = part
player:Play()
Make sure a listener exists (SoundService › ListenerLocation = Camera or Character), or nothing is heard.
Character sounds¶
Set SoundService.CharacterSoundsUseNewApi = Enabled and the default footsteps, jumps and other character sounds use AudioPlayer + AudioEmitter. They then get acoustic simulation and can be processed like anything else.