tiramisu/audio

Audio module - spatial and global audio playback with Web Audio API.

Provides type-safe audio playback configuration using the Web Audio API. Supports both global (2D) and positional (3D) audio with volume groups, fade transitions, and playback control.

Core Concepts

Quick Example

import tiramisu/audio
import tiramisu/scene
import tiramisu/asset

// Global audio (background music)
let music_config =
  audio.playing()
  |> audio.with_loop(True)
  |> audio.with_volume(0.5)
  |> audio.with_group(audio.Music)
  |> audio.with_fade(1000)  // 1 second fade in

scene.Audio(
  id: "bg-music",
  audio: audio.global(music_buffer, music_config),
  transform: transform.identity,
)

// Positional audio (footsteps)
let sfx_config =
  audio.playing()
  |> audio.with_group(audio.SFX)
  |> audio.with_on_end(fn() { io.println("Step complete!") })

scene.Audio(
  id: "footstep",
  audio:
    audio.positional(footstep_buffer, sfx_config)
    |> audio.with_ref_distance(2.0)
    |> audio.with_rolloff_factor(1.5)
    |> audio.with_max_distance(50.0),
  transform: transform.at(position: player_position),
)

Audio Groups

Audio groups allow batch volume control for categories of sounds:

Set group volumes using the debug module or custom controls.

Positional Audio

Positional audio uses distance-based volume falloff:

Position is determined by the Audio scene node’s transform.

Types

Type of audio (global or positional)

pub type Audio {
  GlobalAudio(buffer: AudioBuffer, config: AudioConfig)
  PositionalAudio(
    buffer: AudioBuffer,
    config: AudioConfig,
    ref_distance: Float,
    rolloff_factor: Float,
    max_distance: Float,
  )
}

Constructors

  • GlobalAudio(buffer: AudioBuffer, config: AudioConfig)

    Global audio (2D, same volume everywhere)

  • PositionalAudio(
      buffer: AudioBuffer,
      config: AudioConfig,
      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

Audio buffer type (opaque, wraps Web Audio API AudioBuffer)

pub type AudioBuffer

Audio playback configuration

pub type AudioConfig {
  AudioConfig(
    state: AudioState,
    volume: Float,
    loop: Bool,
    playback_rate: Float,
    fade: FadeConfig,
    group: option.Option(AudioGroup),
    on_end: option.Option(fn() -> Nil),
  )
}

Constructors

  • AudioConfig(
      state: AudioState,
      volume: Float,
      loop: Bool,
      playback_rate: Float,
      fade: FadeConfig,
      group: option.Option(AudioGroup),
      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)

Audio group categories for volume control

pub type AudioGroup {
  SFX
  Music
  Voice
  Ambient
  Custom(String)
}

Constructors

  • SFX

    Sound effects (footsteps, gunshots, etc.)

  • Music

    Background music

  • Voice

    Voice lines and dialogue

  • Ambient

    Ambient sounds (wind, rain, etc.)

  • Custom(String)

    Custom group with a name

Opaque handle to a THREE.Audio or THREE.PositionalAudio object

pub type AudioSource

Audio playback state

pub type AudioState {
  Playing
  Stopped
  Paused
}

Constructors

  • Playing

    Audio is playing

  • Stopped

    Audio is stopped (reset to beginning)

  • Paused

    Audio is paused (can be resumed)

Fade configuration for smooth transitions

pub type FadeConfig {
  NoFade
  Fade(duration_ms: Int)
}

Constructors

  • NoFade

    No fade (instant transition)

  • Fade(duration_ms: Int)

    Fade in/out over specified milliseconds

Values

pub fn config() -> AudioConfig

Create default audio config (stopped, no fade)

pub fn global(buffer: AudioBuffer, config: AudioConfig) -> Audio

Create global audio (2D, same volume everywhere)

pub fn playing() -> AudioConfig

Create audio config that starts playing

pub fn positional(
  buffer: AudioBuffer,
  config: AudioConfig,
) -> Audio

Create a default positional audio configuration

pub fn with_fade(
  config: AudioConfig,
  duration_ms: Int,
) -> AudioConfig

Set fade configuration

pub fn with_group(
  config: AudioConfig,
  group: AudioGroup,
) -> AudioConfig

Set audio group in config

pub fn with_loop(config: AudioConfig, loop: Bool) -> AudioConfig

Set looping in config

pub fn with_max_distance(audio: Audio, distance: Float) -> Audio

Set maximum distance for positional audio

pub fn with_no_fade(config: AudioConfig) -> AudioConfig

Set no fade (instant transitions)

pub fn with_on_end(
  config: AudioConfig,
  callback: fn() -> Nil,
) -> AudioConfig

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_paused(config: AudioConfig) -> AudioConfig

Set audio to paused

pub fn with_playback_rate(
  config: AudioConfig,
  rate: Float,
) -> AudioConfig

Set playback rate in config (1.0 = normal, 2.0 = double speed, etc.)

pub fn with_playing(config: AudioConfig) -> AudioConfig

Set audio to playing

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: AudioConfig,
  state: AudioState,
) -> AudioConfig

Set playback state (Playing, Stopped, Paused)

pub fn with_stopped(config: AudioConfig) -> AudioConfig

Set audio to stopped

pub fn with_volume(
  config: AudioConfig,
  volume: Float,
) -> AudioConfig

Set volume in config (0.0 to 1.0)

Search Document