@@ -8,6 +8,10 @@ pub enum DistortionMode {
88 HardClip ,
99 Asymmetric ,
1010 Sigmoid ,
11+ ArcTan ,
12+ Polynomial ,
13+ DiodeLike ,
14+ WaveFold ,
1115}
1216
1317pub struct Amp {
@@ -20,6 +24,7 @@ pub struct Amp {
2024 highpass_prev : f32 ,
2125 distorted_prev : f32 ,
2226 mode : DistortionMode ,
27+ level : f32 ,
2328}
2429
2530#[ derive( Debug , Clone , Copy , Serialize , Deserialize ) ]
@@ -30,6 +35,7 @@ pub struct AmpConfig {
3035 pub lowpass_cutoff : f32 ,
3136 pub highpass_cutoff : f32 ,
3237 pub mode : DistortionMode ,
38+ pub level : f32 ,
3339}
3440
3541impl Amp {
@@ -41,6 +47,7 @@ impl Amp {
4147 lowpass_cutoff,
4248 highpass_cutoff,
4349 mode,
50+ level,
4451 } = config;
4552
4653 let rc_lp = 1.0 / ( 2.0 * PI * lowpass_cutoff) ;
@@ -59,6 +66,7 @@ impl Amp {
5966 highpass_prev : 0.0 ,
6067 distorted_prev : 0.0 ,
6168 mode,
69+ level,
6270 }
6371 }
6472
@@ -75,16 +83,47 @@ impl Amp {
7583 DistortionMode :: HardClip => gated. clamp ( -1.0 , 1.0 ) ,
7684 DistortionMode :: Asymmetric => gated. tanh ( ) + 0.3 * gated,
7785 DistortionMode :: Sigmoid => gated / ( 1.0 + gated. abs ( ) ) ,
86+
87+ DistortionMode :: ArcTan => gated. atan ( ) * ( 2.0 / PI ) ,
88+
89+ DistortionMode :: Polynomial => {
90+ let x = gated;
91+ let poly = ( 3.0 * x - x. powi ( 3 ) ) * 0.5 ;
92+ poly. clamp ( -1.0 , 1.0 )
93+ }
94+
95+ DistortionMode :: DiodeLike => {
96+ if gated >= 0.0 {
97+ gated / ( 1.0 + gated. abs ( ) )
98+ } else {
99+ 0.3 * gated
100+ }
101+ }
102+
103+ DistortionMode :: WaveFold => foldback ( gated, 1.0 ) ,
78104 } ;
79105
106+ // Highpass filter (removing DC or very low freq)
80107 let highpassed =
81108 self . highpass_alpha * ( self . highpass_prev + distorted - self . distorted_prev ) ;
82109 self . distorted_prev = distorted;
83110 self . highpass_prev = highpassed;
84111
112+ // Lowpass filter (smooth out harshness at very high freq)
85113 let filtered = self . lowpass_prev + self . lowpass_alpha * ( highpassed - self . lowpass_prev ) ;
86114 self . lowpass_prev = filtered;
87115
88- filtered
116+ // Apply final level
117+ filtered * self . level
118+ }
119+ }
120+
121+ fn foldback ( mut x : f32 , limit : f32 ) -> f32 {
122+ while x > limit {
123+ x = 2.0 * limit - x;
124+ }
125+ while x < -limit {
126+ x = -2.0 * limit - x;
89127 }
128+ x
90129}
0 commit comments