From c7e88b7d605fd19d9ff54681a42fd69d079d92b1 Mon Sep 17 00:00:00 2001 From: Grant Shangreaux Date: Sat, 13 Nov 2021 19:55:09 -0600 Subject: Add: Envelope Iterator implementation and click to trigger note --- klangfarbrs/src/lib.rs | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) (limited to 'klangfarbrs/src/lib.rs') diff --git a/klangfarbrs/src/lib.rs b/klangfarbrs/src/lib.rs index 8bd1e50..fc5e6f9 100644 --- a/klangfarbrs/src/lib.rs +++ b/klangfarbrs/src/lib.rs @@ -17,8 +17,8 @@ mod phasor; mod osc; use osc::{Osc, Waveform}; -pub mod adsr; -use adsr::Envelope; +pub mod envelope; +use envelope::Envelope; /// Aliasing some types to distinguish various audio properties. type Sample = f32; @@ -47,7 +47,6 @@ pub struct MonoSynth { pub fm_frequency: Hz, pub fm_depth: Amplitude, fm_osc: Osc, - current_envelope_position: usize, } #[methods] @@ -72,13 +71,12 @@ impl MonoSynth { phasor_bend: Vector2::new(0.0, 0.0), continuous: true, duration: 0, - envelope: Envelope::new(500, 1000, 0.5, 4000, sprt), + envelope: Envelope::new(30, 500, 0.5, 1000, sprt), cutoff: 0.0, frequency_modulation: false, fm_frequency: 10.0, fm_depth: 0.1, fm_osc: Osc::new(freq * 2.0, sprt), - current_envelope_position: 0, } } @@ -166,6 +164,11 @@ impl MonoSynth { self.envelope = Envelope::new(attack, decay, sustain, release, self.sample_rate); } + #[export] + fn trigger(&mut self, _owner: &Node) { + self.envelope.index = 0; + } + #[export] pub fn frames(&mut self, _owner: &Node, samples: i32) -> TypedArray { let mut frames = TypedArray::new(); @@ -189,22 +192,9 @@ impl MonoSynth { // } if !self.continuous { - let pos = self.current_envelope_position; - let atk = self.envelope.attack.len(); - let atkdcy = atk + self.envelope.decay.len(); - - if pos < atk { - sample = sample * self.envelope.attack[pos] - } else if pos >= atk && pos < atkdcy { - sample = sample * self.envelope.decay[pos - atk] - } else if pos < self.envelope.len() { - sample = sample * self.envelope.release[pos - atkdcy] - } - - self.current_envelope_position += 1; - - if self.current_envelope_position >= self.envelope.len() { - self.current_envelope_position = 0; + sample *= match self.envelope.next() { + Some(a) => a, + None => 0.0, } } -- cgit v1.2.3