2013-12-14 2 views
7

Я хочу быстро ослабить осциллятор, чтобы удалить поп/шипение, которое я получаю, просто останавливая его. Крис Уилсон предложил technique установить setTargetAtTime на коэффициент усиления.WebAudio: как работает timeConstant в setTargetAtTime?

Теперь я не совсем понять его последний параметр «timeConstant»:

То, что его блок? Секунды? Что мне нужно положить туда, чтобы добраться до целевого значения в 1 мс?

ответ

9

Этот парень Криса Уилсона, такая проблема. :)

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)); 
+1

timeConstant очень неинтуитивный для меня, исходя из css-переходов, где вы контролируете продолжительность перехода. Я понимаю, что ноль никогда не достигнут. Друг предложил прагматический подход к умножению экспоненциальной функции с очень медленно убывающей линейной функцией - например, y = 1- (x/10000) - чтобы в конечном итоге получить пересечение нуля. – mrflix

+0

Вы также можете использовать linearRampToValueAtTime или exponentialRampToValueAtTime - у тех, у кого есть конечные точки, как я думаю, вы ищите. – cwilso

+0

Привет, Крис, спасибо за ваше сообщение, которое дало мне понять, как работает setTargetAtTime, но .. Я хочу создать конверт с экспоненциальным расходом от 1 до 0,1 на 500 мс, а затем линейный выпуск от 0,1 до 0 для 500 мс , Насколько я понимаю, нет способа сообщить API продолжить линейный скачок от значения после разложения до 0. Нужно ли вручную вычислять ожидаемое значение, вызывать setValueAtTime (500 мс, вычисленное значение), а затем вызывать linearRampToValue ? Я извиняюсь за то, что не отвечаю на главный вопрос. спасибо за отзывы. –

1

хотя я понимаю й не может быть технически правильными (учитывая экспоненциальный характер постоянная времени), но я уже использовал эту формулу, чтобы «преобразовать» от нескольких секунд до «постоянная времени»

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

... это было только с помощью суда и ошибка, но она более или менее работает для меня

+0

@ cwilso Я не замечаю что-то, что может повредить вещи так, как я не ожидал?или (как и мой опыт до сих пор) будет ли это работать достаточно хорошо? – Nick

Смежные вопросы