// moonaudio — pure MoonBit audio decoding and DSP toolkit.
// Copyright 2026 Sakuraqwq1
// Licensed under the Apache License, Version 2.0.
///|
/// Smallest useful end-to-end example: build a signal, encode it, decode it
/// back through the generic facade and inspect the result.
///
/// Run with `moon run examples/basic`.
fn main {
let tone = make_tone() catch {
(error : @audio.AudioError) => {
println("error: \{error.message()}")
return
}
}
println(
"built : \{tone.sample_rate} Hz, \{tone.channels} ch, \{tone.frames()} frames",
)
let encoded = @wav.encode(tone) catch {
(error : @audio.AudioError) => {
println("error: \{error.message()}")
return
}
}
println("encoded: \{encoded.length()} bytes")
let container = match @moonaudio.sniff(encoded) {
Some(container) => container.to_name()
None => "unknown"
}
println("sniffed: \{container}")
let decoded = @moonaudio.decode(encoded) catch {
(error : @audio.AudioError) => {
println("error: \{error.message()}")
return
}
}
println(
"decoded: \{decoded.frames()} frames, peak \{decoded.peak()}, rms \{decoded.rms()}",
)
println("source : \{@moonaudio.version()}")
}
///|
/// A short 440 Hz sine wave at 44.1 kHz.
fn make_tone() -> @audio.AudioBuffer raise @audio.AudioError {
let buffer = @audio.AudioBuffer::silence(44100, 1, 4410)
for frame = 0; frame < 4410; frame = frame + 1 {
let phase = 2.0 * @math.PI * 440.0 * frame.to_double() / 44100.0
buffer.data[frame] = 0.5 * @math.sin(phase)
}
buffer
}