1use std::f64::consts::PI;
2
3#[derive(Clone, Copy, PartialEq, Debug, serde::Deserialize, serde::Serialize)]
15pub enum WaveForm {
16 Sine,
17 Square,
18 Sawtooth,
19 Triangle,
20 Rest, }
22
23impl Default for WaveForm {
24 fn default() -> Self {
25 Self::Sine
26 }
27}
28
29pub(crate) fn generate_sample(waveform: &WaveForm, phase: f64) -> f64 {
32 match waveform {
33 WaveForm::Sine => (phase * 2.0 * PI).sin(),
35 WaveForm::Square => {
36 if phase < 0.5 {
37 1.0
38 } else {
39 -1.0
40 }
41 }
42 WaveForm::Sawtooth => 2.0 * phase - 1.0,
43 WaveForm::Triangle => {
44 if phase < 0.5 {
45 -1.0 + 4.0 * phase
46 } else {
47 1.0 - 4.0 * (phase - 0.5)
48 }
49 }
50 WaveForm::Rest => 0.0, }
52}