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