use rodio::source::SineWave;
use crate::WaveForm;
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct Note {
pub freq: f64, pub dur: f64,
pub vol: f32,
pub wave: WaveForm, }
impl Default for Note {
fn default() -> Self {
Note {
freq: 440.0,
dur: 3.0,
vol: 0.20,
wave: WaveForm::Sine,
}
}
}
impl Note {
pub fn rest(dur: f64) -> Self {
Note {
freq: 0.0,
dur,
vol: 0.0,
wave: WaveForm::Rest,
}
}
pub(crate) fn to_approx_sine(&self) -> SineWave {
let effective_freq = match self.wave {
WaveForm::Sine => self.freq,
WaveForm::Square => self.freq * 1.27, WaveForm::Sawtooth => self.freq * 1.5, WaveForm::Triangle => self.freq * 1.16, WaveForm::Rest => 0.0, };
SineWave::new(effective_freq as f32)
}
}