@@ -97,20 +97,24 @@ export const getADSRValues = (params, curve = 'linear', defaultValues) => {
9797 return [ Math . max ( a ?? 0 , envmin ) , Math . max ( d ?? 0 , envmin ) , Math . min ( sustain , envmax ) , Math . max ( r ?? 0 , releaseMin ) ] ;
9898} ;
9999
100- export function createFilter ( context , type , frequency , Q , att , dec , sus , rel , fenv , start , end , fanchor = 0.5 ) {
100+ export function createFilter ( context , type , frequency , Q , att , dec , sus , rel , fenv , start , end , fanchor ) {
101101 const curve = 'exponential' ;
102102 const [ attack , decay , sustain , release ] = getADSRValues ( [ att , dec , sus , rel ] , curve , [ 0.005 , 0.14 , 0 , 0.1 ] ) ;
103103 const filter = context . createBiquadFilter ( ) ;
104104
105105 filter . type = type ;
106106 filter . Q . value = Q ;
107107 filter . frequency . value = frequency ;
108-
108+ // envelope is active when any of these values is set
109+ const hasEnvelope = att ?? dec ?? sus ?? rel ?? fenv ;
109110 // Apply ADSR to filter frequency
110- if ( ! isNaN ( fenv ) && fenv !== 0 ) {
111+ if ( hasEnvelope !== undefined ) {
112+ fenv = nanFallback ( fenv , 1 , true ) ;
113+ fanchor = nanFallback ( fanchor , 0 , true ) ;
111114 const offset = fenv * fanchor ;
115+ const min = clamp ( 2 ** - offset * frequency , 0 , 20000 ) ;
112116 const max = clamp ( 2 ** ( fenv - offset ) * frequency , 0 , 20000 ) ;
113- getParamADSR ( filter . frequency , attack , decay , sustain , release , frequency , max , start , end , curve ) ;
117+ getParamADSR ( filter . frequency , attack , decay , sustain , release , min , max , start , end , curve ) ;
114118 return filter ;
115119 }
116120 return filter ;
0 commit comments