2015-08-27 1 views
6

поведение я собираюсь описать происходит в Chrome 44, но делает не происходит в Firefox 40.Web Audio осцилляторы неожиданно скользят с одной частоты на другую в Chrome

При создании генератора, установите его до частоты 220 Гц, а затем смените частоту на 440 Гц секунду позже, вы можете услышать отчетливый эффект портаменто: вместо мгновенного изменения с 220 до 440 генератор скользит от исходной частоты до новой.

Приведенный ниже код иллюстрирует это явление:

var ac = new AudioContext(); 
 

 
var osc = ac.createOscillator(); 
 
osc.connect(ac.destination); 
 

 
osc.type = 'sawtooth'; 
 

 
osc.frequency.value = 220; 
 
osc.start(0); 
 

 
window.setTimeout(function() { 
 
    osc.frequency.value = 440; 
 
}, 1000); 
 

 
window.setTimeout(function() { 
 
    osc.stop(0); 
 
}, 2000);

я просмотрел документацию для объекта OscillatorNode, и нет никакого упоминания об этом поведении.

Я также искал Google, и (на удивление) я не могу найти никаких других упоминаний об этом явлении.

Что происходит? Это не похоже на правильное поведение. Если бы мне нужна частота glide, я бы использовал метод linearRampToValueAtTime(). Установка частоты непосредственно на определенное значение должна просто ... сделать это.

Это просто ошибка? Я знаю, что этот API все еще находится в движении, но это кажется довольно вопиющим, чтобы быть ошибкой - это не пропустит самое поверхностное тестирование. Но я также не могу представить, чтобы Google реализовал его таким образом сознательно.

Самое главное: есть ли обходной путь?

+0

Он работает «правильно» в Firefox, это проблема веб-кита, поэтому это также работает с Opera и Safari. –

ответ

4

Довольно уверен, что это ошибка.

Я не могу найти что-либо в спецификации, согласно которой прямое назначение value на AudioParam должно выполнять любую интерполяцию.

Возможно, что это исчезло, потому что обычно люди, вероятно, изменяют значение с помощью методов автоматизации. Который подводит меня к вашему вопросу об обходных решениях ...

Если вам действительно нужна явная задержка, вы можете просто сделать это (обратите внимание, что нет setTimeout).

// change the value to 440Hz 1 second from now 
osc.frequency.setValueAtTime(440, ac.currentTime + 1); 

Если вы хотите, чтобы иметь возможность немедленно изменить частоту (например, в ответ на действия пользователя), вы можете просто сделать это:

osc.frequency.setValueAtTime(440, 0); 

Надежда, что помогает.

Кстати, вы должны рассмотреть вопрос о выдаче для этого вопроса (https://code.google.com/p/chromium/issues/list).

+1

Спасибо! Это обходное решение работает для меня. Я, наверное, должен был подумать об этом сам, но ... знаешь. Я попытаюсь вспомнить, что завтра выйдет сообщение об ошибке. Ура! – greenie2600

+0

Нет проблем. Для чего это стоит, поведение присутствует и в Chrome Canary (Chrome 47), что немного удивительно. Обычно я не вижу ошибок веб-аудио, которые так долго остаются. –

+0

Кстати, почему люди обычно изменяют значение с помощью методов автоматизации? Следует ли держать время в напряжении? (Я полагаю, что стрельба вручную меняется в то время, когда они нужны, не так точна/надежна, как планировать их заранее с помощью setValueAtTime() и т. П. Но в тех случаях, когда вы отвечаете на ввод пользователя - например, входящий MIDI-событие или изменение параметра с помощью встроенного браузера - у вас действительно нет выбора.) – greenie2600

4

Это встроенный эффект «размытия», который рабочая группа несколько раз переходила вперед и назад. По состоянию на июнь РГ окончательно решила удалить размытие (статус: https://github.com/WebAudio/web-audio-api/issues/76). Так что да, это хром «ошибка» - https://code.google.com/p/chromium/issues/detail?id=496282). Пока это не исправлено, используйте setValueAtTime(), как предложил Кевин.

+1

Спасибо за разъяснение, Крис. Я столкнулся с упоминанием о размывании, глядя на это, но мог найти его только в ссылке на GainNode - поэтому не хотел делать прыжок, возможно, он также использовался для осцилляторов. –

+0

Да, в настоящее время это происходит для .value на всех AudioParams. – cwilso

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

  • Нет связанных вопросов^_^