rs_audio/
waveform.rs

1use std::f64::consts::PI;
2
3/**
4This enum is used for declaring waveform types.<br>
5Types:
6- <b>Sine</b><br>
7The standard note
8- <b>Square</b>
9- <b>Sawtooth</b>
10- <b>Triangle</b>
11- <b>Rest</b><br>
12Silence
13*/
14#[derive(Clone, Copy, PartialEq, Debug, serde::Deserialize, serde::Serialize)]
15pub enum WaveForm {
16    Sine,
17    Square,
18    Sawtooth,
19    Triangle,
20    Rest, // silence
21}
22
23impl Default for WaveForm {
24    fn default() -> Self {
25        Self::Sine
26    }
27}
28
29// generates a sample using a waveform
30// only intended for use by the library
31pub(crate) fn generate_sample(waveform: &WaveForm, phase: f64) -> f64 {
32    match waveform {
33        // equations
34        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, // silence
51    }
52}