use itertools::Itertools; mod flags; mod syn; mod tone; fn main() { let flags = flags::Flags::new(); let mut syn = syn::Syn::new( flags.debug, flags.sound_font, flags.sample_rate, ); // Play some tones (middle C, E, G). // 16 channels actually // 60=c 64=e 67=g //up to 128velocity though dont go below 50 tbh // 12 tones per octave syn.tone_on(0, tone::new("c").i32(), 127); play(syn, flags.sample_rate, flags.bpm, flags.smallest_note); } fn play(mut s: syn::Syn, sample_rate: usize, bpm: usize, smallest_note: usize) { let params = tinyaudio::prelude::OutputDeviceParameters { channels_count: 2, sample_rate: sample_rate, channel_sample_count: sample_rate / bpm * 60 / smallest_note, }; let sample_count = (params.channel_sample_count) as usize; let mut left: Vec = vec![0_f32; sample_count]; let mut right: Vec = vec![0_f32; sample_count]; let _device = tinyaudio::prelude::run_output_device(params, { move |data| { s.render(&mut left[..], &mut right[..]); // put in a state of rendering the next loop of these notes for (i, value) in left.iter().interleave(right.iter()).enumerate() { data[i] = *value; } } }) .unwrap(); // Wait it out std::thread::sleep(std::time::Duration::from_secs(2)); }