#![allow(unused)]
use ptcrab::data::WriteTo;
use ptcrab::ptvoice::{PtvEnvelope, PtvUnit, PtvWave, Ptvoice};
use ptcrab::{Key, Tuning, Volume};
use anyhow::Result as AnyResult;
use std::env::args;
use std::f32::consts::TAU;
use std::fs::File;
fn main() -> AnyResult<()> {
let wave_saw = PtvWave::coordinate_from_points(Box::new([(0, 0), (0, 64), (255, -64)]));
let wave_sine3 = PtvWave::coordinate_from_function(31, |x| (x * TAU).sin().powi(3));
let wave_osc = PtvWave::oscillator_from_pairs(Box::new([
(1, 128), (2, -64), (4, 32), ]));
let envelope_attack = PtvEnvelope::new(Box::new([(100, 128)]), 50);
let envelope_pulse = PtvEnvelope::new(Box::new([(79, 0), (80, 128), (240, 128), (241, 0)]), 1);
let unit_1 = PtvUnit {
tuning: 0.9995.into(),
wave: Some(wave_sine3),
envelope: Some(envelope_attack),
..Default::default()
};
let unit_2 = PtvUnit {
volume: 32.into(),
wave: Some(wave_osc),
envelope: Some(envelope_pulse),
..Default::default()
};
let ptv = Ptvoice::new(Box::new([unit_1, unit_2]));
if let Some(filename) = args().nth(1) {
let mut file = File::create(filename)?;
ptv.write_to(&mut file)?;
} else {
println!("{:?}", ptv);
}
Ok(())
}