Skip to content

Commit 18f64cc

Browse files
ArthurGibertchmanie
authored andcommitted
fix(slew & follower): extend slew range, added passthrough a minimum
1 parent 8a04a7a commit 18f64cc

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

libfp/src/utils.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use embassy_time::Duration;
22
use midly::num::u7;
33

4+
use crate::Curve;
5+
46
pub const fn bpm_to_clock_duration(bpm: f32, ppqn: u8) -> Duration {
57
Duration::from_nanos((1_000_000_000.0 / (bpm as f64 / 60.0 * ppqn as f64)) as u64)
68
}
@@ -86,22 +88,31 @@ pub fn attenuverter(input: u16, modulation: u16) -> u16 {
8688

8789
/// Slew limiter
8890
pub fn slew_limiter(prev: f32, input: u16, rise_rate: u16, fall_rate: u16) -> f32 {
89-
let min_slew = 200.0;
91+
let curve = Curve::Exponential;
92+
let min_slew = 50.0;
9093
let max_slew = 0.5;
9194
let delta = input as i32 - prev as i32;
9295
if delta > 0 {
93-
let step = (4095 - rise_rate) as f32 / min_slew + max_slew;
94-
if prev + step < input as f32 {
95-
prev + step
96+
let step = curve.at(4095 - rise_rate) as f32 / min_slew + max_slew;
97+
if step < (4095.0 / min_slew + max_slew) - 10.0 {
98+
if prev + step < input as f32 {
99+
prev + step
100+
} else {
101+
input as f32
102+
}
96103
} else {
97-
input as f32
104+
input.clamp(0, 4095) as f32
98105
}
99106
} else if delta < 0 {
100-
let step = (4095 - fall_rate) as f32 / min_slew + max_slew;
101-
if prev - step > input as f32 {
102-
prev - step
107+
let step = curve.at(4095 - fall_rate) as f32 / min_slew + max_slew;
108+
if step < (4095.0 / min_slew + max_slew) - 10.0 {
109+
if prev - step > input as f32 {
110+
prev - step
111+
} else {
112+
input as f32
113+
}
103114
} else {
104-
input as f32
115+
input.clamp(0, 4095) as f32
105116
}
106117
} else {
107118
input.clamp(0, 4095) as f32

0 commit comments

Comments
 (0)