<body> <label for="duration">Duration</label> <input name="duration" id="duration" type="range" min="0" max="2" value="1" step="0.1" /> <label for="band">Band</label> <input name="band" id="band" type="range" min="400" max="1200" value="1000" step="5" /> </body> <script> const audioCtx = new AudioContext(); function playNoise(noiseDuration, bandHz=1000) { const bufferSize = audioCtx.sampleRate * noiseDuration const noiseBuffer = new AudioBuffer({ length: bufferSize, sampleRate: audioCtx.sampleRate, }) const data = noiseBuffer.getChannelData(0) for (let i = 0; i < bufferSize; i++) { data[i] = Math.random() * 2 - 1; } const noise = new AudioBufferSourceNode(audioCtx, { buffer: noiseBuffer, }) const bandpass = new BiquadFilterNode(audioCtx, { type: "bandpass", frequency: bandHz, }) const gain = new GainNode(audioCtx) gain.gain.setValueCurveAtTime([0.5, 1/10, 0], audioCtx.currentTime, noiseDuration) noise.connect(bandpass).connect(gain).connect(audioCtx.destination) noise.start() } </script>