2015-04-23 3 views
7

Я не могу получить скользящую смену объема через exponentialRampToValueAtTime из GainNode.Как работает функция audioParam.exponentialRampToValueAtTime?

Здесь не приводится пример:

var context = new AudioContext(), 
    osc = context.createOscillator(), 
    gain = context.createGain(); 

osc.frequency.value = 440; // A note 
osc.start(0); 
osc.connect(gain); 

gain.gain.value = 0; 
gain.connect(context.destination); 

gain.gain.cancelScheduledValues(0); 
gain.gain.setValueAtTime(0, context.currentTime); 
gain.gain.exponentialRampToValueAtTime(1, context.currentTime + 2); 

В моем понимании это должно постепенно увеличивать громкость, пока не достигнет 1 (100%) и весь этот процесс должен 2с. Правильно ли это предположение?

Если это так, то почему он остается на 0 в течение 2 секунд и внезапно переключается на полный объем?

Заранее благодарим за ваше время и усилие.

+0

Вы попробовали 'linearRampToValueAtTime'? –

+0

У меня есть, и он работает, но я читал, что линейка не звучит так же хорошо, как экспоненциальный рамп, поэтому я хотел попробовать это. Я пишу генератор конвертов, и я хочу проверить некоторые варианты. –

+0

Я предполагаю, что так оно и должно работать. Ускорьте быстро. –

ответ

8

Кажется, что эта функция не нравится 0. FF выбрасывает «SyntaxError: указана недопустимая или незаконная строка». Ниже код будет рампет правильно. См. На странице Plnkr.

var context = new AudioContext(), 
    osc = context.createOscillator(), 
    gain = context.createGain(); 

osc.frequency.value = 440.0; // A note 
osc.start(0); 
osc.connect(gain); 

gain.connect(context.destination); 

gain.gain.setValueAtTime(0.0001, context.currentTime); // <-- line of interest 

gain.gain.exponentialRampToValueAtTime(1, context.currentTime + 10); 

ОБНОВЛЕНИЕ: «Исключение NotSupportedError должны быть отброшены, если это значение меньше или равно 0, или если значение во время предыдущего события меньше или равно 0» согласно Web Audio specification , Как выяснено @cwilso (см. Комментарии).

+0

Ты абсолютно прав. Благодаря! Но разве это не ошибка? Я полагаю, вероятно, есть некоторое умножение, начиная с начального значения, и именно поэтому оно равно 0 до самого последнего шага. И поскольку функция замедляется экспоненциально, они, вероятно, просто устанавливают предоставленное значение (по направлению к которому движется слайд), когда оно немного ближе (незаметно). –

+0

Пример значения <1/Math.pow (2, bitdepth) равен 0. –

+2

Я думаю, что это проблема: https://github.com/WebKit/webkit/blob/master/Source/WebCore/Modules/webaudio/AudioParamTimeline .cpp # L232 и это: https://github.com/WebKit/webkit/blob/master/Source/WebCore/Modules/webaudio/AudioParamTimeline.cpp#L237 Это в Webkit, но это то же самое в Blink. –

0

The docs at Mozilla сказать, что значение должно быть положительным.

+0

Спасибо, но нет никакого смысла в этом отдельном ответе. И это верно для реализации FF, а не для webkit и Blink. Также «незаконная ошибка строки» ... это выглядит как «документированная ошибка» с предоставленным обходным решением. :) –

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – MZaragoza

+1

@MZaragoza: Но они действительно включали здесь важную роль. – BoltClock

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