Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WebAudio: how does timeConstant in setTargetAtTime work?

I want to rapidly fade out an oscillator in order to remove the pop/hiss I get from simply stoping it. Chris Wilson proposed the technique to set setTargetAtTime on the gain.

Now I don't quite grasp its last parameter 'timeConstant':

What's its unit? Seconds? What do I have to put in there to get to the target-value in 1ms?

like image 679
mrflix Avatar asked Dec 14 '13 21:12

mrflix


2 Answers

That Chris Wilson guy, such a trouble. :)

setTargetAtTime is an exponential falloff. The parameter is a time constant:

"timeConstant is the time it takes a first-order linear continuous time-invariant system to reach the value 1 - 1/e (around 63.2%) given a step input response (transition from 0 to 1 value)."

So, for every "timeconstant" length of time, the level will drop by a bit over 2/3rds (presuming the gain was 1, and you're setting a target of 0. At some point, the falloff becomes so close to zero, it's below the noise threshold, and you don't need to worry about this. It won't ever "get to the target value" - it successively approximates it, although of course at some point the difference falls below the precision you can represent in a float.

I'd suggest experimenting a bit, but here's a quick guess to get you started:

// only setting this up as a var to multiply it later - you can hardcode.
// initial value is 1 millisecond - experiment with this value if it's not fading
// quickly enough.
var timeConstant = 0.001; 

gain = ctx.createGain();
// connect up the node in place here
gain.gain.setTargetAtTime(0, ctx.currentTime, timeConstant);

// by my quick math, 8x TC should take you to around 2.5% of the original level 
// - more than enough to smooth the envelope off.
myBufferSourceNode.stop( ctx.currentTime + (8 * timeConstant) );
like image 194
cwilso Avatar answered Dec 26 '22 08:12

cwilso


though I realize this might not be technically correct ( given the exponential nature of the time constant ) but i've been using this formula to "convert" from seconds to "time constant"

function secondsToTimeConstant( sec ){
    return ( sec * 2 ) / 10;
}

...this was just via trial and error, but it more or less has been working out for me

like image 34
Nick Briz Avatar answered Dec 26 '22 10:12

Nick Briz