Skip to main content

boomie/
waveform.rs

1#[derive(Debug, Clone, Copy, PartialEq)]
2pub enum WaveformType {
3    Sine,
4    Square,
5    Triangle,
6    Sawtooth,
7    Noise,
8}
9
10impl WaveformType {
11    pub fn generate_sample(&self, phase: f32) -> f32 { // Phase should be in the range [0.0, 1.0)
12        match self {
13            WaveformType::Sine => (phase * std::f32::consts::TAU).sin(),
14            WaveformType::Square => if (phase * 2.0) % 1.0 < 0.5 { 1.0 } else { -1.0 },
15            WaveformType::Sawtooth => (phase * 2.0) % 1.0 * 2.0 - 1.0,
16            WaveformType::Noise => fastrand::f32() * 2.0 - 1.0, // WaveformType::Noise => (((phase * 1235.647).sin() * 43758.5453).fract() * 2.0 - 1.0), <- possible replacement
17            WaveformType::Triangle => {
18                let p = (phase * 2.0) % 1.0;
19                if p < 0.5 { p * 4.0 - 1.0 } else { 3.0 - p * 4.0 }
20            }
21        }
22    }
23}