From 52d457e587ee22b17bbaf792528c4091259131f0 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Tue, 6 Feb 2024 23:17:58 +0100 Subject: [PATCH] refactor: move OpAmp saturator into dsp --- examples/svfmixer/src/dsp.rs | 41 ++++++++++++++++++++++++++++++++---- examples/svfmixer/src/lib.rs | 38 +++++---------------------------- 2 files changed, 42 insertions(+), 37 deletions(-) diff --git a/examples/svfmixer/src/dsp.rs b/examples/svfmixer/src/dsp.rs index d453772..44a7075 100644 --- a/examples/svfmixer/src/dsp.rs +++ b/examples/svfmixer/src/dsp.rs @@ -1,12 +1,14 @@ -use crate::OpAmp; use enum_map::{enum_map, Enum, EnumMap}; use nalgebra::SMatrix; +use nih_plug::util::db_to_gain_fast; use valib::dsp::blocks::ModMatrix; use valib::dsp::parameter::{HasParameters, Parameter, SmoothedParam}; use valib::dsp::DSP; use valib::filters::svf::Svf; use valib::oversample::Oversampled; +use valib::saturators::{Clipper, Saturator, Slew}; use valib::simd::{AutoSimd, SimdValue}; +use valib::Scalar; type Sample = AutoSimd<[f32; 2]>; @@ -81,16 +83,47 @@ impl HasParameters for DspInner { impl DSP<1, 1> for DspInner { type Sample = Sample; - fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { self.filter .set_cutoff(Sample::splat(self.params[DspParam::Cutoff].next_sample())); self.filter.set_r(Sample::splat( - self.params[DspParam::Resonance].next_sample(), + 1.0 - self.params[DspParam::Resonance].next_sample(), )); self.mod_matrix.weights.x = Sample::splat(self.params[DspParam::LpGain].next_sample()); self.mod_matrix.weights.y = Sample::splat(self.params[DspParam::BpGain].next_sample()); self.mod_matrix.weights.z = Sample::splat(self.params[DspParam::HpGain].next_sample()); - self.mod_matrix.process(self.filter.process(x)) + let drive = Sample::splat(db_to_gain_fast(self.params[DspParam::Drive].next_sample())); + let [out] = self.mod_matrix.process(self.filter.process([x * drive])); + [out / drive] + } +} + +#[derive(Debug, Clone, Copy)] +struct OpAmp(Clipper, Slew); + +impl Default for OpAmp { + fn default() -> Self { + Self(Default::default(), Default::default()) + } +} + +impl Saturator for OpAmp +where + Clipper: Saturator, + Slew: Saturator, +{ + fn saturate(&self, x: T) -> T { + self.1.saturate(self.0.saturate(x)) + } + + fn sat_diff(&self, x: T) -> T { + self.0.sat_diff(x) * self.1.sat_diff(self.0.saturate(x)) + } + + fn update_state(&mut self, x: T, y: T) { + let xc = self.0.saturate(x); + self.0.update_state(x, xc); + self.1.update_state(xc, y); } } diff --git a/examples/svfmixer/src/lib.rs b/examples/svfmixer/src/lib.rs index 9dacf4e..5a45bd7 100644 --- a/examples/svfmixer/src/lib.rs +++ b/examples/svfmixer/src/lib.rs @@ -7,7 +7,7 @@ use valib::dsp::parameter::HasParameters; use valib::dsp::utils::{slice_to_mono_block, slice_to_mono_block_mut}; use valib::dsp::DSPBlock; use valib::oversample::Oversample; -use valib::saturators::{Clipper, Saturator, Slew}; +use valib::saturators::Saturator; use valib::simd::SimdValue; use valib::{dsp::DSP, Scalar}; @@ -67,6 +67,7 @@ impl PluginParams { ) .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) .with_string_to_value(formatters::s2v_f32_gain_to_db()) + .with_unit(" dB") .bind_to_parameter(dsp.get_parameter(DspParam::Drive)), fc: FloatParam::new( "Frequency", @@ -94,7 +95,7 @@ impl PluginParams { ) .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .with_unit("dB") + .with_unit(" dB") .bind_to_parameter(dsp.get_parameter(DspParam::LpGain)), bp_gain: FloatParam::new( "BP Gain", @@ -108,7 +109,7 @@ impl PluginParams { ) .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .with_unit("dB") + .with_unit(" dB") .bind_to_parameter(dsp.get_parameter(DspParam::BpGain)), hp_gain: FloatParam::new( "HP Gain", @@ -122,41 +123,12 @@ impl PluginParams { ) .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .with_unit("dB") + .with_unit(" dB") .bind_to_parameter(dsp.get_parameter(DspParam::HpGain)), } } } -#[derive(Debug, Clone, Copy)] -struct OpAmp(Clipper, Slew); - -impl Default for OpAmp { - fn default() -> Self { - Self(Default::default(), Default::default()) - } -} - -impl Saturator for OpAmp -where - Clipper: Saturator, - Slew: Saturator, -{ - fn saturate(&self, x: T) -> T { - self.1.saturate(self.0.saturate(x)) - } - - fn sat_diff(&self, x: T) -> T { - self.0.sat_diff(x) * self.1.sat_diff(self.0.saturate(x)) - } - - fn update_state(&mut self, x: T, y: T) { - let xc = self.0.saturate(x); - self.0.update_state(x, xc); - self.1.update_state(xc, y); - } -} - struct SvfMixerPlugin { params: Arc, dsp: Dsp,