White Noise Generator

A white noise generator with frequency filtering and delay effect controls.

0.300
01
12000
2020000
0.500
0.012
0.400
00.8

This white noise generator uses the Web Audio API to create real-time audio processing. Adjust the volume, cutoff frequency, and delay parameters using the sliders. The filter removes high frequencies to create a softer sound, and the delay effect adds repeats with configurable time and feedback.

Using Web Audio API with delay and filtering.
"use client"

import { useState, useRef, useEffect } from "react"

export function WhiteNoiseGenerator() {
  const [isPlaying, setIsPlaying] = useState(false)
  const [controls, setControls] = useState({
    volume: 0.3,
    frequency: 12000,
    delayTime: 0.5,
    delayFeedback: 0.4,
  })

  const audioContextRef = useRef<AudioContext | null>(null)
  const bufferSourceRef = useRef<AudioBufferSource | null>(null)
  const gainNodeRef = useRef<GainNode | null>(null)
  const filterNodeRef = useRef<BiquadFilterNode | null>(null)
  const delayNodeRef = useRef<DelayNode | null>(null)
  const delayFeedbackRef = useRef<GainNode | null>(null)

  const createWhiteNoise = (context: AudioContext) => {
    const sampleRate = context.sampleRate
    const length = sampleRate * 2
    const noiseBuffer = context.createBuffer(1, length, sampleRate)
    const data = noiseBuffer.getChannelData(0)
    for (let i = 0; i < length; i++) {
      data[i] = Math.random() * 2 - 1
    }
    return noiseBuffer
  }

  const startNoise = async () => {
    const context = new window.AudioContext()
    await context.resume()

    const filter = context.createBiquadFilter()
    filter.type = "lowpass"
    filter.frequency.value = controls.frequency

    const delay = context.createDelay(5)
    delay.delayTime.value = controls.delayTime

    const delayFeedback = context.createGain()
    delayFeedback.gain.value = controls.delayFeedback

    const gainNode = context.createGain()
    gainNode.gain.value = controls.volume

    filter.connect(gainNode)
    delay.connect(delayFeedback)
    delayFeedback.connect(delay)
    delay.connect(gainNode)
    gainNode.connect(context.destination)

    const noiseBuffer = createWhiteNoise(context)
    const source = context.createBufferSource()
    source.buffer = noiseBuffer
    source.loop = true
    source.connect(filter)
    source.start(0)

    audioContextRef.current = context
    bufferSourceRef.current = source
    gainNodeRef.current = gainNode
    filterNodeRef.current = filter
    delayNodeRef.current = delay
    delayFeedbackRef.current = delayFeedback
    setIsPlaying(true)
  }

  const stopNoise = () => {
    if (bufferSourceRef.current) {
      bufferSourceRef.current.stop()
    }
    if (audioContextRef.current) {
      audioContextRef.current.close()
    }
    setIsPlaying(false)
  }

  // ... rest of implementation
}