tiramisu/audio
Audio playback for sound effects and music.
Tiramisu supports both global (2D) audio that plays at constant volume, and
positional (3D) audio that varies based on distance from the camera/listener.
Audio is added to the scene graph as scene.audio nodes.
Loading Audio
let load_sfx = audio.load_audio(
url: "sounds/jump.wav",
on_success: SoundLoaded,
on_error: SoundFailed,
)
Playing Global Audio (2D)
scene.audio(
id: "background-music",
audio: audio.GlobalAudio(
buffer: music_buffer,
config: audio.config()
|> audio.with_state(audio.Playing)
|> audio.with_loop(True)
|> audio.with_volume(0.5)
|> audio.with_group(audio.Music),
),
)
Playing Positional Audio (3D)
scene.audio(
id: "waterfall",
audio: audio.PositionalAudio(
buffer: waterfall_buffer,
config: audio.playing(),
ref_distance: 1.0,
rolloff_factor: 1.0,
max_distance: 100.0,
),
)
Audio Groups
Group audio for volume control (SFX, Music, Voice, Ambient, or Custom).
Types
Type of audio (global or positional)
pub type Audio {
GlobalAudio(buffer: savoiardi.AudioBuffer, config: Config)
PositionalAudio(
buffer: savoiardi.AudioBuffer,
config: Config,
ref_distance: Float,
rolloff_factor: Float,
max_distance: Float,
)
}
Constructors
-
GlobalAudio(buffer: savoiardi.AudioBuffer, config: Config)Global audio (2D, same volume everywhere)
-
PositionalAudio( buffer: savoiardi.AudioBuffer, config: Config, ref_distance: Float, rolloff_factor: Float, max_distance: Float, )Positional audio (3D, volume based on distance)
Arguments
- ref_distance
-
Maximum hearing distance
- rolloff_factor
-
How quickly audio fades with distance
- max_distance
-
Maximum distance where audio can be heard
Opaque handle to a THREE.Audio or THREE.PositionalAudio object
pub type AudioSource
Audio playback state
pub type AudioState {
Playing
Stopped
Paused
}
Constructors
-
PlayingAudio is playing
-
StoppedAudio is stopped (reset to beginning)
-
PausedAudio is paused (can be resumed)
Audio buffer type wrapping the Web Audio API AudioBuffer
pub type Buffer =
savoiardi.AudioBuffer
Audio playback configuration
pub type Config {
AudioConfig(
state: AudioState,
volume: Float,
loop: Bool,
playback_rate: Float,
fade: FadeConfig,
group: option.Option(Group),
on_end: option.Option(fn() -> Nil),
)
}
Constructors
-
AudioConfig( state: AudioState, volume: Float, loop: Bool, playback_rate: Float, fade: FadeConfig, group: option.Option(Group), on_end: option.Option(fn() -> Nil), )Arguments
- state
-
Playback state (Playing, Stopped, Paused)
- volume
-
Volume (0.0 to 1.0)
- loop
-
Whether to loop the audio
- playback_rate
-
Playback rate (1.0 = normal speed)
- fade
-
Fade configuration for state transitions
- group
-
Audio group for volume control (optional)
- on_end
-
Callback when audio ends (for non-looping audio)
Fade configuration for smooth transitions
pub type FadeConfig {
NoFade
Fade(duration: duration.Duration)
}
Constructors
-
NoFadeNo fade (instant transition)
-
Fade(duration: duration.Duration)Fade in/out over specified milliseconds
Audio group categories for volume control
pub type Group {
SFX
Music
Voice
Ambient
Custom(String)
}
Constructors
-
SFXSound effects (footsteps, gunshots, etc.)
-
MusicBackground music
-
VoiceVoice lines and dialogue
-
AmbientAmbient sounds (wind, rain, etc.)
-
Custom(String)Custom group with a name
Values
pub fn global(
buffer: savoiardi.AudioBuffer,
config: Config,
) -> Audio
Create global audio (2D, same volume everywhere)
pub fn load_audio(
url url: String,
on_success on_success: fn(savoiardi.AudioBuffer) -> msg,
on_error on_error: msg,
) -> effect.Effect(msg)
Load an audio file from URL
pub fn positional(
buffer: savoiardi.AudioBuffer,
config: Config,
) -> Audio
Create a default positional audio configuration
pub fn with_fade(
config: Config,
duration: duration.Duration,
) -> Config
Set fade configuration
pub fn with_max_distance(audio: Audio, distance: Float) -> Audio
Set maximum distance for positional audio
pub fn with_on_end(
config: Config,
callback: fn() -> Nil,
) -> Config
Set callback to be called when audio ends (for non-looping audio)
This is useful for one-shot sounds like SFX where you need to know when the sound has finished playing.
Example
audio.config()
|> audio.with_state(audio.Playing)
|> audio.with_on_end(fn() {
// Audio finished playing
io.println("SFX finished!")
})
pub fn with_playback_rate(config: Config, rate: Float) -> Config
Set playback rate in config (1.0 = normal, 2.0 = double speed, etc.)
pub fn with_ref_distance(audio: Audio, distance: Float) -> Audio
Set reference distance for positional audio
pub fn with_rolloff_factor(audio: Audio, factor: Float) -> Audio
Set rolloff factor for positional audio
pub fn with_state(config: Config, state: AudioState) -> Config
Set playback state (Playing, Stopped, Paused)