2015-03-18 5 views
4

Я думаю, что понимаю основную концепцию API веб-аудио, а также то, как звуки работают в целом. И хотя мне удалось сделать звук «затухание звука», я не могу понять, почему это не «выцветание» в следующем фрагменте кода я написал, чтобы представить эту проблему:Звук исчезает, но не исчезает - почему?

(function() 
 
{ 
 
    'use strict'; 
 
    var context = new AudioContext(), 
 
     wave = context.createOscillator(), 
 
     gain = context.createGain(), 
 
     ZERO = 0.000001; 
 

 
    wave.connect(gain); 
 
    gain.connect(context.destination); 
 

 
    wave.type = 'sine'; 
 
    wave.frequency.value = 200; 
 
    gain.gain.value = ZERO; 
 

 
    wave.start(context.currentTime); 
 

 
    gain.gain.exponentialRampToValueAtTime(1.00, 1.0); 
 
    gain.gain.exponentialRampToValueAtTime(ZERO, 3.0); 
 
})();

Примечание: Та же проблема появилась на Firefox (Linux) и Chrome (Windows) тоже

+2

Я также наблюдал ту же проблему (я думаю) с 'linearRampToValueAtTime', так что это, по крайней мере, не проблема с экспоненциальной спецификой. Кроме того, поскольку у вас, кажется, есть полный runnable пример здесь (спасибо!), Не могли бы вы отремонтировать его в Stack Snippet, чтобы мы могли запускать и редактировать его прямо на странице? – apsillers

+0

@ capsillers yepp, я также тестировал это с помощью «линейной» версии, и, как вы сказали => тот же результат. Надеюсь, я правильно применил приведенный выше код к Stack Snippet (я никогда не использовал это до сих пор, спасибо за головы;)) –

ответ

4

Замена ваша gain.gain.value = ZERO линия с:

gain.gain.setValueAtTime(ZERO, 0); 

будет решить эту проблему.

Обоснование не в actual specification из exponentialRampToValueAtTime() функции:

расписаний экспоненциального непрерывное изменения значения параметра из предыдущего планового значения параметра к заданному значению

Итак, если есть нет предыдущее заданное значение параметра (только фиксированное значение), то функция не может интерполировать. То же самое относится к функции linearRampToValueAtTime.

Это также может быть полезным с MDN documentation:

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

+0

Umm .. yepp .. похоже, что это исправление проблемы .. очень любопытно , в самом деле! –

3

Вам нужно

gain.gain.setValueAtTime(ZERO, 0); 

, потому что просто установка

gain.gain.value = ZERO; 

не устанавливает точку расписания в AudioParam планировщика - так это планирование с точки графика в прошлом знать (это значение по умолчанию 1 в момент времени = 0). Настройка смешивания. Значение и планирование не имеют хорошей работы; У меня была статья на 75%, написанная об этом в течение длительного времени, и просто не получила ее.

+0

Привет Крис - у вас есть upvote для вашей работы по редактированию спецификации :) Я действительно должен закончить этот эмулятор TB-303, который я начал ... – Alnitak

+0

:) Вы видели http://errozero.co.uk/acid-machine /? – cwilso

+1

У меня не было, черт побери! : p Моя проблема была в том, что я начал работать, когда спецификация была незрелой, и никогда не преуспевала в моих разочарованиях в том, как правильно эмулировать аналоговый EG. ;) – Alnitak

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