From c2ef13956710352267ae1583c11efbc745fecfd7 Mon Sep 17 00:00:00 2001 From: Grant Shangreaux Date: Mon, 1 Nov 2021 19:45:51 -0500 Subject: Add: triangle and sawtooth waveforms --- klangfarbrs/src/lib.rs | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'klangfarbrs') diff --git a/klangfarbrs/src/lib.rs b/klangfarbrs/src/lib.rs index 7954eb2..059d59f 100644 --- a/klangfarbrs/src/lib.rs +++ b/klangfarbrs/src/lib.rs @@ -26,23 +26,35 @@ pub struct Osc { pub enum Waveform { Sine, Square, - // Triangle, - // Saw, + Triangle, + Sawtooth, // Noise, } /// Generates the next sample for an oscillator based on its waveform. fn generate_sample(osc: &Osc) -> f32 { + let phase = osc.phase; + match osc.waveform { Waveform::Sine => { - (TAU * osc.phase).sin() + (TAU * phase).sin() }, Waveform::Square => { - if osc.phase < 0.5 { + if phase < 0.5 { -1.0 } else { 1.0 } + }, + Waveform::Triangle => { + if phase < 0.5 { + 4.0 * phase - 1.0 + } else { + 4.0 * (1.0 - phase) - 1.0 + } + }, + Waveform::Sawtooth => { + 2.0 * phase - 1.0 } } } @@ -95,6 +107,16 @@ impl Osc { self.waveform = Waveform::Square } + #[export] + fn triangle(&mut self, _owner: &Node) { + self.waveform = Waveform::Triangle + } + + #[export] + fn sawtooth(&mut self, _owner: &Node) { + self.waveform = Waveform::Sawtooth + } + #[export] pub fn set_sample_rate(&mut self, _owner: &Node, sample_rate: f32) { self.sample_rate = sample_rate; -- cgit v1.2.3