How can I avoid this 'clicking' sound when I stop playing a sound?

前端 未结 3 2014
别跟我提以往
别跟我提以往 2020-12-30 12:55

I really hope this question stays a programming question and do not end up an Sound Mechanics question... Here goes...

I am doing some experiments in order to figure

3条回答
  •  伪装坚强ぢ
    2020-12-30 13:39

    Looks like the Web Audio API gives the developer an easy way of stopping a sound source from playing without abruptly stopping the waveform and avoid any noise and sound artifacts.

    1. Create your sound source (in my example an oscillator)
    2. Create a gain node and connect it with the sound source.
    3. Start the sound source and set the gain value to 0. That way, you won't listen to the sound even if it's technically playing
    4. Set the gain value to 1 when you want the source to play and to 0 when it should not play. The gain node will handle the rest, and no clicking will be heard

    var audioContext = new(AudioContext || webkitAudioContext)();
    
    var frequencyOffset = 0
      // Our sound source is a simple triangle oscillator
    var oscillator = audioContext.createOscillator(); // Create sound source  
    oscillator.type = 'triangle';
    
    // Adding a gain node just to lower the volume a bit and to make the
    // sound less ear-piercing. It will also allow us to mute and replay
    // our sound on demand
    var gainNode = audioContext.createGain();
    oscillator.connect(gainNode);
    gainNode.connect(audioContext.destination);
    
    gainNode.gain.value = 0;
    oscillator.frequency.value = 200;
    oscillator.start(0);
    
    function boop() {
      gainNode.gain.value = 0.1;
      // The sound should last for 250ms
      setTimeout(function() {
        gainNode.gain.value = 0;
      }, 250);
      oscillator.frequency.value++;
    }
    
    setInterval(boop, 500);

提交回复
热议问题