2016-08-07 5 views
2

Я изменяю параметр delayTime audio для параметра delayNode. Я попытался с помощью свойства значения непосредственно, как в:В веб-аудио, в чем разница между использованием .value (x) и setValueAtTime (x, context.currentTime)?

delayNode.delayTime.value = x

, а также - то, что я думал, что было эквивалентно - метод setValueAtTime с текущим временем контекста:

delayNode.delayTime.setValueAtTime(x, context.currentTime)

Взглянув на веб-аудио спецификации here, я прочитал это в разделе аудио параметров:

Эффект установки этого атрибута (.value) эквивалентен вызову setValueAtTime() с текущим временем текущего AudioContext и запрошенным значением .

Тем не менее, я заметил, что использование .value непосредственно вызывает большой аудио глюк, в то время как .setValueAtTime гораздо меньше шума. Вы можете услышать это в этих двух jsFiddles, нажав на кнопку (это шумно кстати):

Мой вопрос: В чем разница между использованием атрибута value и используя .setValueAtTime с текущим временем? Почему они разные? Что заставляет глюк быть в одном, а не в другом?

ответ

2

Разница, которую вы слышите, заключается в том, что команда Chrome не удалила размытие, которое Крис Роджерс первоначально внес в реализацию. Dezippering - это общий процесс сглаживания изменений параметров; например вместо фактического непосредственного изменения значения вы можете вызвать setTargetAtTime с небольшим t; то значение изменяется плавно.

Для delayTime это особенно проблематично, так как любое изменение может вызвать экстремальные сбои. (Например, изменения параметра усиления могут привести к сбоям, но они, вероятно, будут немного менее драматичными.)

Исходная реализация Криса построена для разметки всех параметров, так что изменение параметров по умолчанию будет гладкая - короче говоря, когда вы изменили значение, это не было мгновенно изменением значения. Однако это вызывает проблемы в некоторых параметрах (например, сглаживание частотного параметра на генераторе создает эффект портаменто, что часто нежелательно). В конце концов, после продолжительного обсуждения (https://github.com/WebAudio/web-audio-api/issues/76) Рабочая группа Web Audio решила, что дезапертинг не должен быть автоматическим (вы, в конце концов, всегда можете сгладить параметры с помощью setTargetAtTime); команде Chromium просто нужно удалить ее из своего кода. (По-видимому, Firefox также не удалил их размытие.)

В вашем конкретном примере вы делаете экстремальное изменение delayTime - четырехсекундное изменение - и оно становится «сглаженным» в течение очень короткого периода времени , Это похоже на использование аналоговой линии задержки и очень быстрое изменение delayTime. (Проверьте демоверсии блока Korg Monotron Delay, и вы услышите звуки, которые будут звучать знакомо :) В отличие от этого мгновенное изменение (с помощью setValueAtTime) просто «прыгает» - возможно, это вызывает щелчок, но вы не даже слышу это путем сравнения.

Итак, рассказ: не используйте .value для установки delayTime в этом случае, используйте setTargetAtTime(), если вы хотите, чтобы он был сглажен, или setValueAtTime(), если вы хотите, чтобы он был мгновенным. Однако огромные изменения параметра delayTime всегда будут вызывать какую-то проблему; вы, вероятно, на самом деле хотите перекреститься между двумя линиями задержки или что-то в этом роде.

+0

Идеальный смысл. Благодарим за ясное объяснение и за то, что указали мне на блок задержки Monogron Korg. Эта штука похожа на массу веселья :) Cheers – alemangui