use super::code::ToneCode;
pub struct ToneSynth {
code: ToneCode,
delay: f64,
next_sample: u64,
}
impl ToneSynth {
pub fn new(code: ToneCode, delay_seconds: f64) -> Self {
ToneSynth {
code,
delay: delay_seconds,
next_sample: 0,
}
}
pub fn position(&self) -> u64 {
self.next_sample
}
pub fn fill(&mut self, out: &mut [f32]) {
let rate = f64::from(self.code.sample_rate());
for (i, sample) in out.iter_mut().enumerate() {
let t = (self.next_sample + i as u64) as f64 / rate - self.delay;
*sample = self.code.signal_at(t) as f32;
}
self.next_sample += out.len() as u64;
}
}
pub fn synthesize(code: &ToneCode, delay_seconds: f64, start: u64, count: usize) -> Vec<f32> {
let mut synth = ToneSynth {
code: code.clone(),
delay: delay_seconds,
next_sample: start,
};
let mut out = vec![0.0; count];
synth.fill(&mut out);
out
}