I nodi predefiniti coprono molto, ma se vuoi un tuo effetto o sintetizzatore campione-per-campione ti serve l'AudioWorklet: codice che gira nel thread audio, ad alta priorità.

// noise-processor.js (gira nel thread audio)
class Noise extends AudioWorkletProcessor {
  process(inputs, outputs) {
    const out = outputs[0];
    for (const channel of out) {
      for (let i = 0; i < channel.length; i++) {
        channel[i] = Math.random() * 2 - 1; // rumore bianco
      }
    }
    return true; // continua a girare
  }
}
registerProcessor("noise", Noise);
// nel thread principale
await ctx.audioWorklet.addModule("noise-processor.js");
const noise = new AudioWorkletNode(ctx, "noise");
noise.connect(ctx.destination);

Il metodo process riceve i buffer di input e output e li riempie campione per campione. Girando in un thread dedicato, non soffre dei blocchi dell'event loop: niente glitch audio.

È il livello più basso della Web Audio API, quello dove scrivi vero DSP. Sintetizzatori custom, distorsioni particolari, algoritmi tuoi: qui non hai limiti.