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 { 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::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}