2016-11-12 7 views
0

я только заметил, что это, кажется, не представляется возможным изменить gain.value в виде gainNode с помощью метода setValueAtTime() или setValueCurveAtTime(), когда нет генератора подключен или когда генератор еще не начался.Web Audio: значение коэффициента изменения до генератора начинает

setValueAtTime после того, что генератор начинает

Например, в этом случае, setValueAtTime будет работать, как ожидалось:

var context = new AudioContext(); 

var gain = context.createGain(); 
gain.connect(context.destination); 

var osc = context.createOscillator(); 
osc.frequency.value = 300; 
osc.connect(gain); 

osc.start(); 

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

Начнется осциллятора и усиление 1 в течение 1 секунды. Затем gain.gain.value переместится на 0.

setValueAtTime до того, что генератор начинает

Однако, если мы устанавливаем коэффициент усиления с setValueAtTime до осциллятор начинает

var context = new AudioContext(); 

var gain = context.createGain(); 
gain.connect(context.destination); 

var osc = context.createOscillator(); 
osc.frequency.value = 300; 
osc.connect(gain); 

osc.start(context.currentTime + 1); 

gain.gain.setValueAtTime(0, context.currentTime); 

gain.gain.value пробудет до 1.

Установите gain.gain.value без setValueAtTime

Странно, что это haviour не видно, если мы устанавливаем коэффициент усиления непосредственно

var context = new AudioContext(); 

var gain = context.createGain(); 
gain.connect(context.destination); 

var osc = context.createOscillator(); 
osc.frequency.value = 300; 
osc.connect(gain); 

osc.start(context.currentTime + 1); 

gain.gain.value = 0; 

Значение усиления всегда будет оставаться на 0.

+0

Когда я играл с API, я вспоминаю, что нужно подключить генератор к 'gain.gain' (' osc.connect (gain.gain) '), что, вероятно, не имеет ничего общего с проблемой, и я «Не совсем уверен, но вы могли бы попробовать это. – schroffl

ответ

1

Если вы используете Chrome, то это, вероятно, bug in Chrome. Chrome фактически возвращает вычисляемое значение в getter, но если узел не имеет ввода, но все еще подключен к месту назначения, автоматизация AudioParam не запускается. Они должны быть, и значения могут быть проверены с помощью геттера .value.

+0

Я думаю, что вы правы! – hhh

0

AudioParam.value не вычисленное значение - то есть, он не будет говорить вам ток значение того, что действительно на самом деле IS, то, что последний параметр AudioParam.value. (cf https://webaudio.github.io/web-audio-api/#widl-AudioParam-value). Если вы хотите знать, каково текущее значение AudioParam, вам нужно будет перенаправить его на аудиоузел и собрать данные (например, через скриптовый процессор). В вашем первом примере я не думаю, что значение gain.gain.value должно идти 0.

Фактическое значение AudioParam в любой момент времени может зависеть не только от планировщика и значения. узлами connect() ed для AudioParam; было бы дорого вычислить эти значения и перенести их обратно в AudioParam.

+0

Спасибо за ваш ответ! Интересно, я думал, что '.value' соответствует фактическому текущему значению. Но как я могу изменить значение узла усиления перед подключением или до того, как генератор начнет (если это возможно)? – hhh

+0

С другой стороны, см. Https://github.com/WebAudio/web-audio-api/issues/318#issuecomment-248006232, в котором в основном говорится, что он должен вернуть вычисленное значение. И так как спецификация также говорит, что установщик '.value 'такой же, как' setValueAtTime', вы не сможете проверять значение когда-либо, если это не вычисленное значение. –

+0

Ну, скажи мне, ты теперь редактор.:) Но спецификация точно говорит: «Эффект установки этого атрибута эквивалентен вызову setValueAtTime() с текущим текущим временем AudioContext и запрошенным значением. Последующие обращения к получателю этого атрибута возвратят то же значение». Это означает, что набор значений должен иметь тот же эффект, что и setValueAtTime, и если вы установили значение, оно вернет это значение (а не последующее setValueAtTime или результат рампы). Он никогда не говорит «это вычисленное значение», и эта проблема была отброшена на v2. :( – cwilso