dirtydata_dsp_matrix/
lib.rs1pub struct MatrixMixer {
4 num_in: usize,
5 num_out: usize,
6 gains: Vec<f32>, }
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}