A maneira moderna
A API Web Audio usa a interface AudioContext() para gerenciar origens, filtros e destinos. Depois de criar um novo AudioContext(), crie um nó de origem de áudio, como um AudioBufferSourceNode ou OscillatorNode. Como exemplo, considere um oscilador básico com um filtro passa-baixa aplicado.
Como usar o método createBiquadFilter()
Primeiro, crie um novo AudioContext(). Em seguida, crie um nó de origem de áudio, como um AudioBufferSourceNode ou OscillatorNode. Neste exemplo, você vai criar um nó de oscilador sine, que tem uma frequência de 420 hertz a partir do momento em que começa a tocar.
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
const oscillator = audioCtx.createOscillator()
oscillator.type = 'sine';
// Value is in hertz.
oscillator.frequency.setValueAtTime(420, audioCtx.currentTime);
Em seguida, crie um nó de efeito usando createBiquadFilter(). Defina o tipo como lowpass e a frequência para começar um segundo após o início da reprodução. Em seguida, conecte o biquadFilter ao oscillator.
const biquadFilter = audioCtx.createBiquadFilter();
biquadFilter.type = 'lowpass';
biquadFilter.frequency.setValueAtTime(200, audioCtx.currentTime + 1);
oscillator.connect(biquadFilter);
Por fim, conecte o biquadFilter ao destino do audioCtx, antes de iniciar o oscillator e interrompê-lo após dois segundos de reprodução.
biquadFilter.connect(audioCtx.destination);
oscillator.start();
oscillator.stop(2);
O som do oscilador é transmitido pelo filtro não afetado e para o destino, que são os alto-falantes do computador. Após um segundo de reprodução, o filtro lowpass entra em vigor. Após dois segundos, o oscilador é interrompido.
Outros filtros e efeitos disponíveis
Outros nós de filtro podem ser adicionados a um AudioContext para criar efeitos diferentes:
createWaveShaper()é usado para adicionar distorção a uma origem.createGain()é usado para aumentar o sinal geral da origem a que é aplicado.createConvolver()é mais usados com frequência para adicionar reverberação a uma origem.createDelay()é usado para adicionar atraso ao início de uma origem.createDynamicsCompressor()é usado para aumentar o volume da parte mais silenciosa de uma origem e diminuir o volume das partes mais altas.createPanner()ecreateStereoPanner()são usados para mudar a posição espacial da saída de som.
A maneira clássica
Antes da disponibilidade da API Web Audio, não havia como adicionar efeitos ao áudio no navegador. Soluções alternativas usando a renderização do lado do servidor e a alternância entre streams são possíveis, mas isso pode gerar muita sobrecarga de rede.
Como usar o elemento de áudio
Os únicos efeitos de áudio que podem ser controlados diretamente são a reprodução e o volume.
const audio = document.querySelector('audio');
// Sets audio volume to 50%
audio.volume = 0.5;
// Doubles the playback rate.
audio.playbackRate = 2;
Leitura adicional
Demonstração
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🔉</text></svg>"
/>
<title>How to add effects to audio</title>
</head>
<body>
<h1>How to add effects to audio</h1>
<button type="button">Press to hear audio effect</button>
</body>
</html>CSS
:root {
color-scheme: dark light;
}
html {
box-sizing: border-box;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
body {
margin: 1rem;
font-family: system-ui, sans-serif;
}
JS
const button = document.querySelector('button');
button.addEventListener('click', () => {
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
const oscillator = audioCtx.createOscillator();
oscillator.type = 'sine';
// Value is in hertz.
oscillator.frequency.setValueAtTime(420, audioCtx.currentTime);
const biquadFilter = audioCtx.createBiquadFilter();
biquadFilter.type = 'lowpass';
biquadFilter.frequency.setValueAtTime(200, audioCtx.currentTime + 1);
oscillator.connect(biquadFilter);
biquadFilter.connect(audioCtx.destination);
oscillator.start();
oscillator.stop(2);
});