Этот парень Криса Уилсона, такая проблема. :)
setTargetAtTime - экспоненциальный спад. Параметр представляет собой постоянную времени:
«timeConstant - это время, когда требуется линейная непрерывная непрерывная система первого порядка для достижения значения 1 - 1/e (около 63,2%) с учетом входного отклика шага (переход от От 0 до 1). "
Итак, для каждого временного периода времени уровень будет уменьшаться на 2/3rds (предполагается, что коэффициент усиления равен 1, и вы устанавливаете цель 0. В какой-то момент спад становится так близко к нулю, он ниже порога шума, и вам не нужно беспокоиться об этом. Он никогда не «достигнет целевого значения» - он последовательно приближается к нему, хотя, конечно, в какой-то момент разница падает ниже точность можно представить в виде поплавка
Я предлагаю экспериментировать немного, но вот быстрый думаю, чтобы вы начали:.
// 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));
timeConstant очень неинтуитивный для меня, исходя из css-переходов, где вы контролируете продолжительность перехода. Я понимаю, что ноль никогда не достигнут. Друг предложил прагматический подход к умножению экспоненциальной функции с очень медленно убывающей линейной функцией - например, y = 1- (x/10000) - чтобы в конечном итоге получить пересечение нуля. – mrflix
Вы также можете использовать linearRampToValueAtTime или exponentialRampToValueAtTime - у тех, у кого есть конечные точки, как я думаю, вы ищите. – cwilso
Привет, Крис, спасибо за ваше сообщение, которое дало мне понять, как работает setTargetAtTime, но .. Я хочу создать конверт с экспоненциальным расходом от 1 до 0,1 на 500 мс, а затем линейный выпуск от 0,1 до 0 для 500 мс , Насколько я понимаю, нет способа сообщить API продолжить линейный скачок от значения после разложения до 0. Нужно ли вручную вычислять ожидаемое значение, вызывать setValueAtTime (500 мс, вычисленное значение), а затем вызывать linearRampToValue ? Я извиняюсь за то, что не отвечаю на главный вопрос. спасибо за отзывы. –