Я работаю над проектом простой, чтобы создать инструмент, с помощью Web Audio API, и написал следующий фрагмент кода (вы можете нажать кнопку «Q», чтобы играть ноты):Регулятор громкости с Web Audio API
var audio = new AudioContext();
var volume = 0;
var attack = 1;
var release = 1;
var carrier = audio.createOscillator();
carrier.frequency.value = 440.00;
carrier.type = "sine";
carrier.start();
var carrier_volume = audio.createGain();
carrier_volume.gain.linearRampToValueAtTime(volume, 0);
carrier.connect(carrier_volume);
carrier_volume.connect(audio.destination);
document.addEventListener("keydown", function(e) {
if(e.keyCode == 81) {
carrier_volume.gain.linearRampToValueAtTime(1, audio.currentTime + attack);
}
});
document.addEventListener("keyup", function(e) {
if(e.keyCode == 81) {
carrier_volume.gain.linearRampToValueAtTime(0, audio.currentTime + release);
}
});
(Если вы не знакомы с терминологией: «атаки» является время, затрачиваемое на записку, чтобы достичь своего пика, 1 второй в моем примере, и «освобождение» это время, берет, чтобы исчезнуть после того, как кто-то выпустит ключ, также 1 сек в этом примере).
Проблема заключается в том, что этот «щелчок» звука вы слышите до и после воспроизведения ноты. Я сделал некоторые исследования:
How can I avoid this 'clicking' sound when I stop playing a sound?
http://modernweb.com/2014/03/31/creating-sound-with-the-web-audio-api-and-oscillators/
и обнаружил, что это будет вызвано резкой звуковой волны, так что я должен держать ноту играть на 0 дБ и повысить/понизить громкость по мере необходимости , Тем не менее, он работает только на Chrome и только, если я задаю объем напрямую, например: carrier_volume.gain.value = 1
. Он не работает даже в Chrome, если я использую функцию linearRampToValueAtTime()
.
Другие странные вещи случаются, если я пытаюсь напрямую установить начальный том на 0. Используя инициализацию carrier_volume.gain.value = 0
, первая нота будет вырезана, но следующие ноты будут воспроизводиться нормально.
Кто-нибудь нашел решение этого раздражающего щелчка, и какая проблема с задержкой при использовании как gain.value
, так и linearRampToValueAtTime()
?
большое спасибо! Теперь это звучит гладко. Я также дам вам совет по поводу расчета атаки/выпуска. – adrield