1use std::f64::consts::PI;
2
3#[derive(Clone, PartialEq)]
8pub enum WaveForm {
9 Sine,
10 Square,
11 Sawtooth,
12 Triangle,
13}
14
15pub fn generate_sample(waveform: &WaveForm, phase: f64) -> f64 {
18 match waveform {
19 WaveForm::Sine => (phase * 2.0 * PI).sin(),
21 WaveForm::Square => {
22 if phase < 0.5 {
23 1.0
24 } else {
25 -1.0
26 }
27 }
28 WaveForm::Sawtooth => 2.0 * phase - 1.0,
29 WaveForm::Triangle => {
30 if phase < 0.5 {
31 -1.0 + 4.0 * phase
32 } else {
33 1.0 - 4.0 * (phase - 0.5)
34 }
35 }
36 }
37}