1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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)
}
}
|