@@ -100,6 +100,7 @@ class AudioFilter
100100
101101 @:noCompletion private inline function set_frequency (value : Float ): Float
102102 {
103+ value = Math .min (Math .max (value , 0 ), 24000 );
103104 if (frequency != value )
104105 {
105106 frequency = value ;
@@ -113,6 +114,7 @@ class AudioFilter
113114 {
114115 #if lime_openal
115116 var linearValue = Math .max (Math .min ((frequency - 140 ) / 19860 , 1 ), 0 );
117+ var shelfLinear = 1.0 + Math .min ((frequency - 140 ) / 140 , 0 ) - Math .max ((frequency - 20000 ) / 4000 , 0 );
116118
117119 switch (type )
118120 {
@@ -122,21 +124,24 @@ class AudioFilter
122124 {
123125 AL .filteri (__alFilter , AL .FILTER_TYPE , AL .FILTER_LOWPASS );
124126 AL .filterf (__alFilter , AL .LOWPASS_GAINHF , linearValue );
127+ AL .filteri (__alFilter , AL .LOWPASS_GAIN , shelfLinear );
125128 }
126129
127130 case HIGHPASS :
128131 __filterDisconnected = frequency <= 0 ;
129132 if (! __filterDisconnected )
130133 {
131134 AL .filteri (__alFilter , AL .FILTER_TYPE , AL .FILTER_HIGHPASS );
132- AL .filterf (__alFilter , AL .HIGHPASS_GAINLF , 1 - linearValue );
135+ AL .filterf (__alFilter , AL .HIGHPASS_GAINLF , 1 - Math .pow (linearValue , 0.25 ));
136+ AL .filteri (__alFilter , AL .HIGHPASS_GAIN , shelfLinear * Math .pow (linearValue , 0.5 ));
133137 }
134138
135139 case BANDPASS :
136140 __filterDisconnected = false ;
137141 AL .filteri (__alFilter , AL .FILTER_TYPE , AL .FILTER_BANDPASS );
138- AL .filterf (__alFilter , AL .LOWPASS_GAINHF , linearValue );
139- AL .filterf (__alFilter , AL .HIGHPASS_GAINLF , 1 - linearValue );
142+ AL .filterf (__alFilter , AL .BANDPASS_GAINHF , linearValue );
143+ AL .filterf (__alFilter , AL .BANDPASS_GAINLF , 1 - Math .pow (linearValue , 0.35 ));
144+ AL .filteri (__alFilter , AL .BANDPASS_GAIN , shelfLinear );
140145
141146 default :
142147 __filterDisconnected = true ;
0 commit comments