File tree Expand file tree Collapse file tree 1 file changed +20
-9
lines changed
Expand file tree Collapse file tree 1 file changed +20
-9
lines changed Original file line number Diff line number Diff line change 11use embassy_time:: Duration ;
22use midly:: num:: u7;
33
4+ use crate :: Curve ;
5+
46pub 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
8890pub 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
You can’t perform that action at this time.
0 commit comments