1use std::f64::consts::PI;
2
3#[derive(Clone, Copy, PartialEq, Debug, serde::Deserialize, serde::Serialize)]
7pub enum WaveForm {
8 Sine,
9 Square,
10 Sawtooth,
11 Triangle,
12 Rest, }
14
15pub(crate) 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 WaveForm::Rest => 0.0, }
38}