A library for building big synthesizers and effects from small modules.
Add pcm-flow to your Cargo.toml
[dependencies]
pcm-flow = "0.1.0"
``` rust extern crate pcm_flow;
use pcmflow::graph::Graph; use pcmflow::processor::Processor;
fn main() { let mut graph = Graph::new(); let mixer = graph.addprocessor(Box::new(Mixer{})); let distortion = graph.addprocessor(Box::new(Distortion{})); let delay = graph.addprocessor(Box::new(Delay{ ringbuffer: vec![vec![0.0; 2]; 1000], index: 0})); graph.addconnection(&(distortion, 0), &(mixer, 0)).unwrap(); graph.addconnection(&(delay, 0), &(mixer, 1)).unwrap(); graph.setinputamt(1); graph.setoutputamt(1); graph.connectinput(0, (distortion, 0)).unwrap(); graph.connectinput(0, (delay, 0)).unwrap(); graph.connectoutput(0, (mixer, 0)).unwrap(); let mut input = vec![[3.1 ,3.1]]; let mut output = vec![[0.0, 0.0]]; graph.process(&mut input, &mut output) }
struct Mixer {}
impl Processor<[f32; 2]> for Mixer { fn process(&mut self, inputs: &mut Vec<[f32; 2]>, outputs: &mut Vec<[f32; 2]>) { for i in 0..2 { outputs[0][i] = inputs[0][i] + inputs[1][i]; } } fn inputsamt(&self) -> usize { 2 } fn outputsamt(&self) -> usize { 1 } }
struct Distortion {}
impl Processor<[f32; 2]> for Distortion { fn process(&mut self, inputs: &mut Vec<[f32; 2]>, outputs: &mut Vec<[f32; 2]>) { for i in 0..2 { outputs[0][i] = inputs[0][i].max(0.5).min(-0.5); } } fn inputsamt(&self) -> usize { 2 } fn outputsamt(&self) -> usize { 1 } }
struct Delay {
ringbuffer: Vec
impl Processor<[f32; 2]> for Delay { fn process(&mut self, inputs: &mut Vec<[f32; 2]>, outputs: &mut Vec<[f32; 2]>) { for i in 0..2 { outputs[0][i] = self.ringbuffer[i][self.index]; self.ringbuffer[i][self.index] = inputs[0][i]; self.index += 1; if self.index >= self.ringbuffer.len() { self.index = 0; } } } fn inputsamt(&self) -> usize { 2 } fn outputsamt(&self) -> usize { 1 } } ```