AudioParam#setTargetAtTime
は3番目の引数に指定した timeConstant によって指数的に目標の値に漸近します。大きな値にすれば変化はゆっくりになるのですが、時には何秒程度でこの値に近づいて欲しいという感じで値を決めたいときもあります。
パラメータの値は次の式で求められますので、それを変換してやれば時間と目標値から timeConstant の値を求める関数を作ることができます。
v(t) = V1 + (V0 - V1) * exp(-(t - T0) / timeConstant)
/**
* calcTimeConstant
* @param {number} v0 現在の値
* @param {number} v1 目標の値
* @param {number} dur 変化の時間(秒)
* @param {number} precision 精度 (0.0-1.0)
* @return {number} timeConstant
*/
function calcTimeConstant(v0, v1, dur, precision) {
var vT = v0 + (v1 - v0) * precision;
return -dur / Math.log((vT - v1) / (v0 - v1));
}
4番目の引数 "精度" は指定した時間に目標の値にどのくらい近くなるかです。1.0 に近づくにつれて早い時間で目標の値に近くなります。0.99くらいにしておけば良いです。
1.0 から 0.1 まで 500ミリ秒 で変化させるの図。
このサイトで実際に値がどのようになるのかいろいろ試すことができます。