50 lines
1.1 KiB
HTML
50 lines
1.1 KiB
HTML
<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> |