pcm-flow

A library for building big synthesizers and effects from small modules.

Usage

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>, index: usize, }

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 } } ```