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.