///|
/// Quick one-liner helper to generate a Laser sound effect WAV byte array.
pub fn play_laser_wav(seed : UInt32) -> Bytes {
let params = SfxParams::laser(seed)
let buffer = params.synthesize(44100)
encode_wav_16bit(buffer)
}
///|
/// Quick one-liner helper to generate a Jump sound effect WAV byte array.
pub fn play_jump_wav(seed : UInt32) -> Bytes {
let params = SfxParams::jump(seed)
let buffer = params.synthesize(44100)
encode_wav_16bit(buffer)
}
///|
/// Quick one-liner helper to generate a Coin pickup sound effect WAV byte array.
pub fn play_coin_wav(seed : UInt32) -> Bytes {
let params = SfxParams::coin(seed)
let buffer = params.synthesize(44100)
encode_wav_16bit(buffer)
}
///|
/// Quick one-liner helper to generate an Explosion sound effect WAV byte array.
pub fn play_explosion_wav(seed : UInt32) -> Bytes {
let params = SfxParams::explosion(seed)
let buffer = params.synthesize(44100)
encode_wav_16bit(buffer)
}
///|
/// Quick one-liner helper to generate a Hit / Hurt sound effect WAV byte array.
pub fn play_hit_wav(seed : UInt32) -> Bytes {
let params = SfxParams::hit(seed)
let buffer = params.synthesize(44100)
encode_wav_16bit(buffer)
}
///|
/// Quick one-liner helper to generate a Powerup sound effect WAV byte array.
pub fn play_powerup_wav(seed : UInt32) -> Bytes {
let params = SfxParams::powerup(seed)
let buffer = params.synthesize(44100)
encode_wav_16bit(buffer)
}
///|
/// Quick one-liner helper to generate a Blip click sound effect WAV byte array.
pub fn play_blip_wav(seed : UInt32) -> Bytes {
let params = SfxParams::blip(seed)
let buffer = params.synthesize(44100)
encode_wav_16bit(buffer)
}
///|
/// Quick one-liner helper to generate a Periodic Repeating Burst sound effect WAV byte array.
pub fn play_burst_wav(seed : UInt32) -> Bytes {
let params = SfxParams::burst(seed)
let buffer = params.synthesize(44100)
encode_wav_16bit(buffer)
}
///|
/// Generates a complete, self-contained interactive HTML5 audio playground page with embedded base64 sounds.
pub fn generate_html_playground() -> String {
let laser_uri = SfxParams::laser(1U).synthesize(44100).to_data_uri()
let jump_uri = SfxParams::jump(2U).synthesize(44100).to_data_uri()
let coin_uri = SfxParams::coin(3U).synthesize(44100).to_data_uri()
let explosion_uri = SfxParams::explosion(4U).synthesize(44100).to_data_uri()
let hit_uri = SfxParams::hit(5U).synthesize(44100).to_data_uri()
let powerup_uri = SfxParams::powerup(6U).synthesize(44100).to_data_uri()
let blip_uri = SfxParams::blip(7U).synthesize(44100).to_data_uri()
let burst_uri = SfxParams::burst(8U).synthesize(44100).to_data_uri()
let fanfare_score = Score::victory_fanfare()
let fanfare_buffer = render_score(
fanfare_score,
140,
Square(0.5),
ADSR::organ(),
44100,
)
let fanfare_uri = fanfare_buffer.to_data_uri()
// New features: FM presets
let fm_piano_uri = fm_electric_piano(440.0, 1.2, 44100).to_data_uri()
let fm_bell_uri = fm_bell(880.0, 1.5, 44100).to_data_uri()
let fm_bass_uri = fm_slap_bass(110.0, 0.8, 44100).to_data_uri()
// New features: MML melody
let mml_uri = render_mml(
"T140 O4 C8 E8 G8 > C8 < B8 G8 C2",
Square(0.5),
ADSR::organ(),
44100,
).to_data_uri()
// New features: Stereo Panning Demo (Laser panned Left, Coin panned Right)
let mixer_demo = Mixer::new(44100)
mixer_demo.add_track(SfxParams::laser(1U).synthesize(44100), 0.0, 0.85, -0.9)
mixer_demo.add_track(SfxParams::coin(3U).synthesize(44100), 0.25, 0.85, 0.9)
let stereo_demo_uri = mixer_demo.render_stereo().to_data_uri()
let sb = StringBuilder()
sb.write_string("\n\n\n")
sb.write_string(" \n")
sb.write_string(
" moon_sfx - Procedural Retro Audio Playground \n",
)
sb.write_string(" \n\n\n\n")
sb.write_string(" 🎮 moon_sfx Audio Playground
\n")
sb.write_string(
" Pure MoonBit Procedural 8-bit Retro Game Sound FX & Chiptune Synthesizer
\n",
)
sb.write_string(" \n")
let add_card = fn(
name : String,
tag : String,
desc : String,
uri : String,
) -> Unit {
sb.write_string(" \n")
sb.write_string(" " + tag + "\n")
sb.write_string(
" " + name + "
\n",
)
sb.write_string(
" " +
desc +
"
\n",
)
sb.write_string(
" \n",
)
sb.write_string(" \n")
sb.write_string(" \n")
}
add_card(
"Laser Shoot", "SFXR PRESET", "High-frequency downward frequency sweep with square/sawtooth timbre.",
laser_uri,
)
add_card(
"Jump", "SFXR PRESET", "Ascending frequency jump with snappy square wave decay.",
jump_uri,
)
add_card(
"Coin / Pickup", "SFXR PRESET", "Two-tone arpeggio frequency step simulating retro coin collecting.",
coin_uri,
)
add_card(
"Explosion", "SFXR PRESET", "Low-pass filtered white noise with punch sustain and heavy decay.",
explosion_uri,
)
add_card(
"Hit / Hurt", "SFXR PRESET", "Crunchy noise burst with rapid downward frequency plunge.",
hit_uri,
)
add_card(
"Powerup", "SFXR PRESET", "Triumphant ascending saw slide accompanied by vibrato modulation.",
powerup_uri,
)
add_card(
"UI Blip", "SFXR PRESET", "Ultra-short high pitch click designed for menu navigation.",
blip_uri,
)
add_card(
"Repeating Burst", "REPEAT & PHASER", "Rapid cycle-repeating burst demonstrating periodic repeat speed and phaser sweep.",
burst_uri,
)
add_card(
"Victory Fanfare", "SEQUENCER MELODY", "Multi-note 8-bit victory melody rendered via the built-in MML sequencer.",
fanfare_uri,
)
add_card(
"FM Electric Piano", "FM SYNTHESIS", "Yamaha DX7 style 1:1 harmonic ratio FM electric piano with percussive metallic chime.",
fm_piano_uri,
)
add_card(
"FM Crystal Bell", "FM SYNTHESIS", "Inharmonic metallic church bell with resonant physical frequency modulation.",
fm_bell_uri,
)
add_card(
"FM Slap Bass", "FM SYNTHESIS", "Sega Genesis 16-bit YM2612 style funk slap bass with sharp 2nd harmonic transient.",
fm_bass_uri,
)
add_card(
"MML Retro Melody", "MML COMPILER", "Rendered directly from string 'T140 O4 C8 E8 G8 > C8 < B8 G8 C2'.",
mml_uri,
)
add_card(
"Stereo Spatial Mixer", "STEREO PANNING", "Left-to-right constant-power spatial separation: Laser on Left (-0.9), Coin on Right (+0.9).",
stereo_demo_uri,
)
sb.write_string(" \n")
sb.write_string("\n\n\n")
sb.to_string()
}