Skip to content

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



Last update: December 23, 2021