From 79c11cd45b515280e96ebced3751aad1a1846bed Mon Sep 17 00:00:00 2001 From: Weird Constructor Date: Sun, 8 Aug 2021 12:51:31 +0200 Subject: [PATCH] Fixed some more bugs in the reverb --- src/dsp/dattorro.rs | 46 ++++++++++++++++++++++++++----------------- src/dsp/helpers.rs | 20 ++++++++++++++----- src/dsp/mod.rs | 2 +- src/dsp/node_pverb.rs | 10 +++++----- 4 files changed, 49 insertions(+), 29 deletions(-) diff --git a/src/dsp/dattorro.rs b/src/dsp/dattorro.rs index 985f251..b5ca217 100644 --- a/src/dsp/dattorro.rs +++ b/src/dsp/dattorro.rs @@ -50,13 +50,20 @@ const DAT_LEFT_TAPS_TIME_MS : [f64; 7] = [ ]; const DAT_RIGHT_TAPS_TIME_MS : [f64; 7] = [ - 353.0 / DAT_SAMPLES_PER_MS, - 3627.0 / DAT_SAMPLES_PER_MS, - 1228.0 / DAT_SAMPLES_PER_MS, - 2673.0 / DAT_SAMPLES_PER_MS, - 2111.0 / DAT_SAMPLES_PER_MS, - 335.0 / DAT_SAMPLES_PER_MS, - 121.0 / DAT_SAMPLES_PER_MS, + 266.0 / DAT_SAMPLES_PER_MS, + 2974.0 / DAT_SAMPLES_PER_MS, + 1913.0 / DAT_SAMPLES_PER_MS, + 1996.0 / DAT_SAMPLES_PER_MS, + 1990.0 / DAT_SAMPLES_PER_MS, + 187.0 / DAT_SAMPLES_PER_MS, + 1066.0 / DAT_SAMPLES_PER_MS, +// 353.0 / DAT_SAMPLES_PER_MS, +// 3627.0 / DAT_SAMPLES_PER_MS, +// 1228.0 / DAT_SAMPLES_PER_MS, +// 2673.0 / DAT_SAMPLES_PER_MS, +// 2111.0 / DAT_SAMPLES_PER_MS, +// 335.0 / DAT_SAMPLES_PER_MS, +// 121.0 / DAT_SAMPLES_PER_MS, ]; const DAT_LFO_FREQS_HZ : [f64; 4] = [ 0.1, 0.15, 0.12, 0.18 ]; @@ -296,25 +303,25 @@ impl DattorroReverb { { let left_apf1_delay_ms = self.apf1[0].1 - + (self.lfos[0].next_unipolar() as f64 + + (self.lfos[0].next_bipolar() as f64 * DAT_LFO_EXCURSION_MS * DAT_LFO_EXCURSION_MOD_MAX * params.mod_depth()); let right_apf1_delay_ms = self.apf1[1].1 - + (self.lfos[1].next_unipolar() as f64 + + (self.lfos[1].next_bipolar() as f64 * DAT_LFO_EXCURSION_MS * DAT_LFO_EXCURSION_MOD_MAX * params.mod_depth()); let left_apf2_delay_ms = self.apf2[0].1 - + (self.lfos[2].next_unipolar() as f64 + + (self.lfos[2].next_bipolar() as f64 * DAT_LFO_EXCURSION_MS * DAT_LFO_EXCURSION_MOD_MAX * params.mod_depth()); let right_apf2_delay_ms = self.apf2[1].1 - + (self.lfos[3].next_unipolar() as f64 + + (self.lfos[3].next_bipolar() as f64 * DAT_LFO_EXCURSION_MS * DAT_LFO_EXCURSION_MOD_MAX * params.mod_depth()); @@ -373,9 +380,9 @@ impl DattorroReverb { let out_hpf = self.input_hpf.process(out_lpf); // HPF => Pre-Delay - let out_pre_delay = out_hpf; -// self.pre_delay.cubic_interpolate_at(params.pre_delay_time_ms()); -// self.pre_delay.feed(out_hpf); +// let out_pre_delay = out_hpf; + let out_pre_delay = + self.pre_delay.next_cubic(params.pre_delay_time_ms(), out_hpf); // Pre-Delay => 4 All-Pass filters let mut diffused = out_pre_delay; @@ -384,8 +391,8 @@ impl DattorroReverb { } // Mix between diffused and pre-delayed intput for further processing - let tank_feed = out_pre_delay; -// crossfade(out_pre_delay, diffused, params.input_diffusion_mix()); + let tank_feed = + crossfade(out_pre_delay, diffused, params.input_diffusion_mix()); // First tap for the output self.left_sum += tank_feed; @@ -408,8 +415,12 @@ impl DattorroReverb { let left = self.delay2[0].0.next_cubic(self.delay2[0].1, left); if self.dbg_count % 48 == 0 { - println!("APFS dcy={:8.6}; {:8.6} {:8.6} {:8.6} {:8.6}", + println!("APFS dcy={:8.6}; {:8.6} {:8.6} {:8.6} {:8.6} | {:8.6} {:8.6} {:8.6} {:8.6}", decay, + self.apf1[0].2, + self.apf1[1].2, + self.apf2[0].2, + self.apf2[1].2, left_apf1_delay_ms, right_apf1_delay_ms, left_apf2_delay_ms, right_apf2_delay_ms); println!("DELY1/2 {:8.6} / {:8.6} | {:8.6} / {:8.6}", @@ -458,7 +469,6 @@ impl DattorroReverb { self.dbg_count += 1; -// (left_out * 0.5, right_out * 0.5) (left_out * 0.5, right_out * 0.5) } } diff --git a/src/dsp/helpers.rs b/src/dsp/helpers.rs index 1c123df..389757f 100644 --- a/src/dsp/helpers.rs +++ b/src/dsp/helpers.rs @@ -265,8 +265,8 @@ impl SplitMix64 { /// * `v2` - signal 2, range -1.0 to 1.0 /// * `mix` - mix position, range 0.0 to 1.0, mid is at 0.5 #[inline] -pub fn crossfade(v1: f32, v2: f32, mix: f32) -> f32 { - v1 * (1.0 - mix) + v2 * mix +pub fn crossfade(v1: F, v2: F, mix: F) -> F { + v1 * (f::(1.0) - mix) + v2 * mix } /// Constant power crossfade. @@ -768,6 +768,16 @@ impl DelayBuffer { res } + /// Combines [DelayBuffer::linear_interpolate_at] and [DelayBuffer::feed] + /// into one convenient function. + #[inline] + pub fn next_linear(&mut self, delay_time_ms: F, input: F) -> F { + let res = self.linear_interpolate_at(delay_time_ms); + self.feed(input); + res + } + + /// Shorthand for [DelayBuffer::cubic_interpolate_at]. #[inline] pub fn tap_c(&self, delay_time_ms: F) -> F { @@ -888,10 +898,10 @@ impl AllPass { #[inline] pub fn next(&mut self, time_ms: F, g: F, v: F) -> F { - let s = self.delay.nearest_at(time_ms); - let input = v + -g * s; + let s = self.delay.linear_interpolate_at(time_ms); + let input = v + g * s; self.delay.feed(input); - input * g + s + input * -g + s } } diff --git a/src/dsp/mod.rs b/src/dsp/mod.rs index 42e4ee2..6eba0cf 100644 --- a/src/dsp/mod.rs +++ b/src/dsp/mod.rs @@ -781,7 +781,7 @@ macro_rules! node_list { ( 4 dcy n_id d_id r_id f_def stp_d 0.0, 1.0, 0.25) ( 5 ilpf n_pit d_pit r_fq f_freq stp_d -1.0, 0.5647131, 22050.0) ( 6 ihpf n_pit d_pit r_fq f_freq stp_d -1.0, 0.5647131, 0.0) - ( 7 idif n_id d_id r_id f_def stp_d 0.0, 1.0, 1.0) + ( 7 dif n_id d_id r_id f_def stp_d 0.0, 1.0, 1.0) ( 8 dmix n_id d_id r_id f_def stp_d 0.0, 1.0, 1.0) ( 9 mspeed n_id d_id r_id f_def stp_d 0.0, 1.0, 0.0) (10 mshp n_id d_id r_id f_def stp_d 0.0, 1.0, 1.0) diff --git a/src/dsp/node_pverb.rs b/src/dsp/node_pverb.rs index b7dc3a9..d329e3f 100644 --- a/src/dsp/node_pverb.rs +++ b/src/dsp/node_pverb.rs @@ -19,7 +19,7 @@ pub struct DatParams { dcy: ProcBuf, ilpf: ProcBuf, ihpf: ProcBuf, - idif: ProcBuf, + dif: ProcBuf, dmix: ProcBuf, mspeed: ProcBuf, mshp: ProcBuf, @@ -50,7 +50,7 @@ impl DattorroReverbParams for DatParams { denorm::PVerb::ihpf(&self.ihpf, self.frame) as f64 } fn diffusion(&self) -> f64 { - denorm::PVerb::idif(&self.idif, self.frame) as f64 + denorm::PVerb::dif(&self.dif, self.frame) as f64 } fn input_diffusion_mix(&self) -> f64 { denorm::PVerb::dmix(&self.dmix, self.frame) as f64 @@ -102,8 +102,8 @@ impl PVerb { "PVerb ilpf\n\nRange: (0..1)"; pub const ihpf : &'static str = "PVerb ihpf\n\nRange: (0..1)"; - pub const idif : &'static str = - "PVerb idif\n\nRange: (0..1)"; + pub const dif : &'static str = + "PVerb dif\n\nRange: (0..1)"; pub const dmix : &'static str = "PVerb dmix\n\nRange: (0..1)"; pub const mspeed : &'static str = @@ -171,7 +171,7 @@ impl DspNode for PVerb { dcy: *inp::PVerb::dcy(inputs), ilpf: *inp::PVerb::ilpf(inputs), ihpf: *inp::PVerb::ihpf(inputs), - idif: *inp::PVerb::idif(inputs), + dif: *inp::PVerb::dif(inputs), dmix: *inp::PVerb::dmix(inputs), mspeed: *inp::PVerb::mspeed(inputs), mshp: *inp::PVerb::mshp(inputs),