Audio
Audio is a CoreObject that wrap sound files. Most properties are exposed in the UI and can be set when placed in the editor, but some functionality (such as playback with fade in/out) requires Lua scripting.
Properties
| Property Name | Return Type | Description | Tags | 
|---|---|---|---|
isPlaying | 
boolean | 
Returns if the sound is currently playing. | Read-Only | 
length | 
number | 
Returns the length (in seconds) of the Sound. | Read-Only | 
currentPlaybackTime | 
number | 
Returns the playback position (in seconds) of the sound. | Read-Only | 
isSpatializationEnabled | 
boolean | 
Default true. Set to false to play sound without 3D positioning. | Read-Write | 
isAttenuationEnabled | 
boolean | 
Default true, meaning sounds will fade with distance. | Read-Write | 
isOcclusionEnabled | 
boolean | 
Default true. Changes attenuation if there is geometry between the player and the audio source. | Read-Write | 
isAutoPlayEnabled | 
boolean | 
Default false. If set to true when placed in the editor (or included in a template), the sound will be automatically played when loaded. | Read-Only | 
isTransient | 
boolean | 
Default false. If set to true, the sound will automatically destroy itself after it finishes playing. | Read-Write | 
isAutoRepeatEnabled | 
boolean | 
Loops when playback has finished. Some sounds are designed to automatically loop, this flag will force others that don't. Useful for looping music. | Read-Write | 
pitch | 
number | 
Default 1. Multiplies the playback pitch of a sound. Note that some sounds have clamped pitch ranges (0.2 to 1). | Read-Write | 
volume | 
number | 
Default 1. Multiplies the playback volume of a sound. Note that values above 1 can distort sound, so if you're trying to balance sounds, experiment to see if scaling down works better than scaling up. | Read-Write | 
radius | 
number | 
Default 0. If non-zero, will override default 3D spatial parameters of the sound. Radius is the distance away from the sound position that will be played at 100% volume. | Read-Write | 
falloff | 
number | 
Default 0. If non-zero, will override default 3D spatial parameters of the sound. Falloff is the distance outside the radius over which the sound volume will gradually fall to zero. | Read-Write | 
fadeInTime | 
number | 
Sets the fade in time for the audio. When the audio is played, it will start at zero volume, and fade in over this many seconds. | Read-Write | 
fadeOutTime | 
number | 
Sets the fadeout time of the audio. When the audio is stopped, it will keep playing for this many seconds, as it fades out. | Read-Write | 
startTime | 
number | 
The start time of the audio track. Default is 0. Setting this to anything else means that the audio will skip ahead that many seconds when played. | Read-Write | 
stopTime | 
number | 
The stop time of the audio track. Default is 0. A positive value means that the audio will stop that many seconds from the start of the track, including any fade out time. | Read-Write | 
Functions
| Function Name | Return Type | Description | Tags | 
|---|---|---|---|
Play() | 
None | 
Begins sound playback. | None | 
Stop() | 
None | 
Stops sound playback. | None | 
FadeIn(number time) | 
None | 
Starts playing and fades in the sound over the given time. | None | 
FadeOut(number time) | 
None | 
Fades the sound out and stops over time seconds. | None | 
Examples
Example using:
Play
In this example, a small script is placed as the child of an audio object in the hierarchy. After a 3 second wait we play the sound. For best results place audio objects inside a client context.
local SFX = script.parent
Task.Wait(3)
SFX:Play()
See also: CoreObject.parent | Task.Wait
Example using:
Play
Stop
FadeIn
FadeOut
isPlaying
In this example, a random song from a folder containing a list of songs is picked and played for 10 seconds before another song is picked at random.
-- Client script
-- The folder containing a list of songs to pick from.
local musicFolder = script:GetCustomProperty("music"):WaitForObject()
-- The time a song is allowed to player for.
local allowedPlayTime = 10
-- If the song should fade in and out.
local fadeInOut = true
-- Duration of the fade in and out.
local fadeInTime = 1
local fadeOutTime = 1
local songs = musicFolder:GetChildren()
local current
local totalPlayTime = 0
-- Attempt to find a song that wasn't played previously.
local function GetRandomSong()
    local song
    if current == nil then
        song = songs[math.random(1, #songs)]
    else
        if #songs == 1 then
            song = songs[1]
        else
            repeat
                song = songs[math.random(1, #songs)]
            until song ~= current
        end
    end
    return song
end
local function PlaySong()
    if current ~= nil then
        if fadeInOut then
            current:FadeOut(fadeOutTime)
        else
            current:Stop()
        end
    end
    totalPlayTime = 0
    current = GetRandomSong()
    if fadeInOut then
        current:FadeIn(fadeInTime)
    else
        current:Play()
    end
end
-- Keep track of how long the song has been playing for.
function Tick(dt)
    if current ~= nil then
        if totalPlayTime > allowedPlayTime then
            PlaySong()
        else
            if not current.isPlaying then
                totalPlayTime = 0
            else
                totalPlayTime = totalPlayTime + dt
            end
        end
    end
end
PlaySong()
See also: CoreObject.GetCustomProperty | CoreLua.Tick
Example using:
pitch
isPlaying
Play
In this client script the pitch of a piano note is modified over time to give it a vibrato-like effect.
local SFX = script:GetCustomProperty("PianoSampledInstrument01"):WaitForObject()
local PITCH_CHANGE = 200
local DURATION = 0.25
local elapsedTime = 0
function PlayWithLinearVibrato()
    SFX.pitch = 0
    SFX:Play()
    elapsedTime = 0
end
function Tick(deltaTime)
    if SFX.isPlaying and elapsedTime < DURATION then
        elapsedTime = elapsedTime + deltaTime
        if elapsedTime > DURATION then
            elapsedTime = DURATION
        end
        -- Linear modification of pitch over time
        SFX.pitch = PITCH_CHANGE * elapsedTime / DURATION
        print("pitch = " .. SFX.pitch)
    end
end
Task.Wait(1)
PlayWithLinearVibrato()
See also: CoreObject.GetCustomProperty | CoreObjectReference.WaitForObject | CoreLua.Tick | Task.Wait
Example using:
volume
In this example, two UI buttons are setup to control the volume of a music object. The script is placed as a child of the music object and the buttons are added to the script as custom properties.
local MUSIC = script.parent
local PLUS_BUTTON = script:GetCustomProperty("PlusButton"):WaitForObject()
local MINUS_BUTTON = script:GetCustomProperty("MinusButton"):WaitForObject()
MUSIC:Play()
function IncreaseVolume()
    MUSIC.volume = MUSIC.volume + 0.1
end
function DecreaseVolume()
    MUSIC.volume = MUSIC.volume - 0.1
end
PLUS_BUTTON.clickedEvent:Connect(IncreaseVolume)
MINUS_BUTTON.clickedEvent:Connect(DecreaseVolume)
See also: UIButton.clickedEvent | CoreObject.parent