Skip to main content

dirtydata_dsp_matrix/
lib.rs

1//! Matrix Mixing and Routing
2
3pub struct MatrixMixer {
4    num_in: usize,
5    num_out: usize,
6    gains: Vec<f32>, // Flat MxN matrix
7}
8
9impl MatrixMixer {
10    pub fn new(num_in: usize, num_out: usize) -> Self {
11        Self {
12            num_in,
13            num_out,
14            gains: vec![0.0; num_in * num_out],
15        }
16    }
17
18    pub fn set_gain(&mut self, input: usize, output: usize, gain: f32) {
19        if input < self.num_in && output < self.num_out {
20            self.gains[output * self.num_in + input] = gain;
21        }
22    }
23
24    pub fn process(&self, inputs: &[f32], outputs: &mut [f32]) {
25        for (o_idx, out) in outputs.iter_mut().enumerate().take(self.num_out) {
26            let mut sum = 0.0;
27            for (i_idx, &val) in inputs.iter().enumerate().take(self.num_in) {
28                sum += val * self.gains[o_idx * self.num_in + i_idx];
29            }
30            *out = sum;
31        }
32    }
33}
34
35pub struct MorphMixer {
36    pub x: f32,
37    pub y: f32,
38}
39
40impl MorphMixer {
41    pub fn new() -> Self {
42        Self { x: 0.5, y: 0.5 }
43    }
44
45    pub fn process(&self, a: f32, b: f32, c: f32, d: f32) -> f32 {
46        let top = a * (1.0 - self.x) + b * self.x;
47        let bottom = c * (1.0 - self.x) + d * self.x;
48        top * (1.0 - self.y) + bottom * self.y
49    }
50}