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