@@ -14,8 +14,8 @@ use crate::{MAX_CHANNELS, RENDER_QUANTUM_SIZE};
14
14
15
15
use super :: { AudioNode , ChannelConfig , ChannelConfigOptions } ;
16
16
17
- fn get_computed_freq ( freq : f32 , detune : f32 ) -> f32 {
18
- freq * ( detune / 1200. ) . exp2 ( )
17
+ fn get_computed_freq ( freq : f32 , detune : f32 , sample_rate : f32 ) -> f32 {
18
+ freq * ( detune / 1200. ) . exp2 ( ) . clamp ( 0. , sample_rate / 2. )
19
19
}
20
20
21
21
/// Biquad filter coefficients normalized against a0
@@ -490,7 +490,8 @@ impl BiquadFilterNode {
490
490
let q = self . q ( ) . value ( ) ;
491
491
492
492
// get coefs
493
- let computed_freq = get_computed_freq ( frequency, detune) ;
493
+ let computed_freq = get_computed_freq ( frequency, detune, sample_rate) ;
494
+
494
495
let Coefficients { b0, b1, b2, a1, a2 } = calculate_coefs (
495
496
type_,
496
497
sample_rate as f64 ,
@@ -614,7 +615,7 @@ impl AudioProcessor for BiquadFilterRenderer {
614
615
let gain = params. get ( & self . gain ) ;
615
616
let sample_rate_f64 = f64:: from ( sample_rate) ;
616
617
// compute first coef and fill the coef list with this value
617
- let computed_freq = get_computed_freq ( frequency[ 0 ] , detune[ 0 ] ) ;
618
+ let computed_freq = get_computed_freq ( frequency[ 0 ] , detune[ 0 ] , sample_rate ) ;
618
619
let coef = calculate_coefs (
619
620
type_,
620
621
sample_rate_f64,
@@ -635,7 +636,7 @@ impl AudioProcessor for BiquadFilterRenderer {
635
636
. zip ( gain. iter ( ) . cycle ( ) )
636
637
. skip ( 1 )
637
638
. for_each ( |( ( ( ( coefs, & f) , & d) , & q) , & g) | {
638
- let computed_freq = get_computed_freq ( f, d) ;
639
+ let computed_freq = get_computed_freq ( f, d, sample_rate ) ;
639
640
* coefs = calculate_coefs (
640
641
type_,
641
642
sample_rate_f64,
@@ -703,15 +704,16 @@ mod tests {
703
704
704
705
#[ test]
705
706
fn test_computed_freq ( ) {
707
+ let sample_rate = 48000. ;
706
708
let g_sharp = 415.3 ;
707
709
let a = 440. ;
708
710
let b_flat = 466.16 ;
709
711
710
712
// 100 cents is 1 semi tone up
711
- let res = get_computed_freq ( a, 100. ) ;
713
+ let res = get_computed_freq ( a, 100. , sample_rate ) ;
712
714
assert_float_eq ! ( res, b_flat, abs <= 0.01 ) ;
713
715
// -100 cents is 1 semi tone below
714
- let res = get_computed_freq ( a, -100. ) ;
716
+ let res = get_computed_freq ( a, -100. , sample_rate ) ;
715
717
assert_float_eq ! ( res, g_sharp, abs <= 0.01 ) ;
716
718
}
717
719
0 commit comments