rs_audio/
waveform.rs

1use std::f64::consts::PI;
2
3/**
4This enum is used for declaring waveform types.<br>
5*/
6#[derive(Clone, Copy, PartialEq, Debug, serde::Deserialize, serde::Serialize)]
7pub enum WaveForm {
8    Sine,
9    Square,
10    Sawtooth,
11    Triangle,
12    Rest, // silence
13}
14
15// generates a sample using a waveform
16// only intended for use by the library
17pub(crate) fn generate_sample(waveform: &WaveForm, phase: f64) -> f64 {
18    match waveform {
19        // equations
20        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, // silence
37    }
38}