Skip to main content

dirtydata_runtime/nodes/
destruction.rs

1use super::base::*;
2use dirtydata_core::types::ConfigSnapshot;
3use dirtydata_dsp_destruction::*;
4
5pub struct BitCrushNode {
6    inner: BitCrush,
7}
8
9impl BitCrushNode {
10    pub fn new() -> Self { Self { inner: BitCrush::new() } }
11}
12
13impl DspNode for BitCrushNode {
14    fn process(&mut self, inputs: &[f32], outputs: &mut [[f32; 2]], config: &ConfigSnapshot, _ctx: &ProcessContext) {
15        let bits = config.get("bits").and_then(|v| v.as_float()).unwrap_or(8.0) as f32;
16        let sr_div = config.get("sr_div").and_then(|v| v.as_float()).unwrap_or(1.0) as f32;
17        
18        for (i, output) in outputs.iter_mut().enumerate() {
19            let input = if i * 2 < inputs.len() { inputs[i * 2] } else { 0.0 };
20            let out = self.inner.process(input, bits, sr_div);
21            *output = [out, out];
22        }
23    }
24}
25
26pub struct WaveShaperNode {
27    inner: WaveShaper,
28}
29
30impl WaveShaperNode {
31    pub fn new() -> Self { Self { inner: WaveShaper {} } }
32}
33
34impl DspNode for WaveShaperNode {
35    fn process(&mut self, inputs: &[f32], outputs: &mut [[f32; 2]], config: &ConfigSnapshot, _ctx: &ProcessContext) {
36        let amount = config.get("amount").and_then(|v| v.as_float()).unwrap_or(0.5) as f32;
37        
38        for (i, output) in outputs.iter_mut().enumerate() {
39            let input = if i * 2 < inputs.len() { inputs[i * 2] } else { 0.0 };
40            let out = self.inner.process(input, amount);
41            *output = [out, out];
42        }
43    }
44}
45
46pub struct PllNode {
47    inner: Pll,
48}
49
50impl PllNode {
51    pub fn new() -> Self { Self { inner: Pll::new() } }
52}
53
54impl DspNode for PllNode {
55    fn process(&mut self, inputs: &[f32], outputs: &mut [[f32; 2]], config: &ConfigSnapshot, ctx: &ProcessContext) {
56        let lock_speed = config.get("lock_speed").and_then(|v| v.as_float()).unwrap_or(0.1) as f32;
57        
58        for (i, output) in outputs.iter_mut().enumerate() {
59            let input = if i * 2 < inputs.len() { inputs[i * 2] } else { 0.0 };
60            let out = self.inner.process(input, lock_speed, ctx.sample_rate);
61            *output = [out, out];
62        }
63    }
64}