use tunes::prelude::*;
fn main() -> anyhow::Result<()> {
println!("\n📈 Example: ADSR Envelopes\n");
let engine = AudioEngine::new()?;
let mut comp = Composition::new(Tempo::new(120.0));
comp.track("pluck")
.envelope(Envelope::pluck()) .at(0.0)
.note(&[C4], 0.5);
comp.track("piano")
.envelope(Envelope::piano())
.at(0.6)
.note(&[E4], 0.5);
comp.track("pad")
.envelope(Envelope::pad())
.at(1.2)
.note(&[G4], 0.8);
comp.track("organ")
.envelope(Envelope::organ())
.at(2.2)
.note(&[C5], 0.5);
comp.track("custom")
.envelope(Envelope::new(
0.1, 0.2, 0.7, 0.5, ))
.at(3.0)
.note(&[E5], 0.8);
comp.track("sequence_pluck")
.envelope(Envelope::pluck())
.at(4.5)
.notes(&[C4, D4, E4, F4, G4], 0.2);
comp.track("sequence_pad")
.envelope(Envelope::pad())
.at(6.0)
.notes(&[C4, D4, E4, F4, G4], 0.4);
println!("✓ ADSR Envelope parameters:");
println!(" - Attack: Time to reach full volume");
println!(" - Decay: Time to drop to sustain level");
println!(" - Sustain: Level held while note plays");
println!(" - Release: Fade out time after note ends");
println!("\n✓ Built-in presets:");
println!(" - Envelope::pluck() - Fast percussive");
println!(" - Envelope::piano() - Natural piano-like");
println!(" - Envelope::pad() - Slow atmospheric");
println!(" - Envelope::organ() - Instant on/off");
println!("\n✓ Custom: Envelope::new(attack, decay, sustain, release)\n");
engine.play_mixer(&comp.into_mixer())?;
Ok(())
}