From dcfc4e82386f41bd36c3b102512bd225fc5331b6 Mon Sep 17 00:00:00 2001 From: Graham Northup Date: Wed, 20 Sep 2017 01:49:04 -0400 Subject: more of the same for the night :) --- src/synth/rel.rs | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/synth/rel.rs (limited to 'src/synth/rel.rs') diff --git a/src/synth/rel.rs b/src/synth/rel.rs new file mode 100644 index 0000000..76b6c04 --- /dev/null +++ b/src/synth/rel.rs @@ -0,0 +1,78 @@ +use std::{cmp, mem}; +use super::*; + +#[derive(Debug)] +pub enum RelOp { + Greater, + GreaterEqual, + Equal, + NotEqual, + LessEqual, + Less, +} + +#[derive(Debug)] +pub struct Rel { + pub left: GenBox, + pub right: GenBox, + pub op: RelOp, + pub buf: SampleBuffer, +} + +impl Generator for Rel { + fn eval<'a>(&'a mut self, params: &Parameters) -> &'a SampleBuffer { + let left_buf = self.left.eval(params); + let right_buf = self.right.eval(params); + + match left_buf.rate { + Rate::Sample => { + self.buf.rate = Rate::Sample; + + let bound = match right_buf.rate { + Rate::Sample => cmp::min(left_buf.len(), right_buf.len()), + Rate::Control => left_buf.len(), + }; + for i in 0..bound { + let val = left_buf[i]; + let thres = match right_buf.rate { + Rate::Sample => right_buf[i], + Rate::Control => right_buf.first(), + }; + self.buf[i] = if match self.op { + RelOp::Greater => val > thres, + RelOp::GreaterEqual => val >= thres, + RelOp::Equal => val == thres, + RelOp::NotEqual => val != thres, + RelOp::LessEqual => val <= thres, + RelOp::Less => val < thres, + } { + 1.0 + } else { + 0.0 + }; + } + }, + Rate::Control => { + let val = left_buf.first(); + let thres = right_buf.first(); + self.buf.set(if match self.op { + RelOp::Greater => val > thres, + RelOp::GreaterEqual => val >= thres, + RelOp::Equal => val == thres, + RelOp::NotEqual => val != thres, + RelOp::LessEqual => val <= thres, + RelOp::Less => val < thres, + } { + 1.0 + } else { + 0.0 + }); + }, + } + + &self.buf + } + fn set_buffer(&mut self, buf: SampleBuffer) -> SampleBuffer { + mem::replace(&mut self.buf, buf) + } +} -- cgit v1.2.3-70-g09d2