rill-digital-effects 0.6.0-M2

Digital signal effects for Rill - Delay, Distortion, Chorus, Reverb, etc.
Documentation
use rill_core::builtin::{BlockBuiltin, BuiltinKind, BuiltinSig, Registry};
use rill_core::math::Transcendental;
use rill_core::traits::algorithm::Algorithm;
use rill_core::traits::ProcessResult;

use super::pv_f32;
use crate::DistortionType;

struct DistortionBuiltin<T: Transcendental, const BUF_SIZE: usize> {
    inner: crate::Distortion<T, BUF_SIZE>,
}

impl<T: Transcendental, const BUF_SIZE: usize> Algorithm<T> for DistortionBuiltin<T, BUF_SIZE> {
    fn process(&mut self, input: Option<&[T]>, output: &mut [T]) -> ProcessResult<()> {
        Algorithm::process(&mut self.inner, input, output)
    }

    fn reset(&mut self) {
        Algorithm::reset(&mut self.inner);
    }

    fn init(&mut self, sample_rate: f32) {
        Algorithm::init(&mut self.inner, sample_rate);
    }
}

impl<T: Transcendental, const BUF_SIZE: usize> BlockBuiltin<T> for DistortionBuiltin<T, BUF_SIZE> {
    fn set_param(&mut self, index: usize, value: &rill_core::traits::ParamValue) {
        let v = pv_f32(value);
        match index {
            0 => self.inner.set_drive(v),
            1 => self.inner.set_output_gain(v),
            _ => {}
        }
    }
}

pub fn register_distortion_builtins<T: Transcendental + 'static>(reg: &mut Registry<T>) {
    reg.register_block(
        BuiltinSig::simple("distortion", 1, 1, 2, BuiltinKind::Block)
            .with_names(vec!["drive", "gain"]),
        |p, sr| {
            let mut d =
                crate::Distortion::<T, 64>::with_params(DistortionType::SoftClip, p[0] as f32, 1.0);
            d.set_output_gain(p[1] as f32);
            Algorithm::init(&mut d, sr);
            Box::new(DistortionBuiltin::<T, 64> { inner: d })
        },
    );
}