dirtydata_runtime/nodes/
destruction.rs1use 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}