Signatur
Beschreibung
Die Methode createDelay() eines AudioContext oder OfflineAudioContext erzeugt einen DelayNode. Dieser Knoten gibt sein Eingangssignal zeitversetzt wieder aus. Wie lange verzögert wird, legt der AudioParam delayTime fest (in Sekunden). Er lässt sich zur Laufzeit ändern und auch automatisieren.
Verzögerungen sind ein Grundbaustein vieler Audioeffekte: Echo (Verzögerung mit Rückkopplung über einen GainNode), Slapback, Chorus und Flanger (per LFO modulierte, kurze Verzögerungszeiten) sowie der Ausgleich von Laufzeitunterschieden zwischen Signalwegen.
Mit dem optionalen Parameter maxDelayTime legst du beim Erzeugen fest, wie weit delayTime höchstens eingestellt werden kann. Der Browser reserviert dafür einen internen Puffer. Wähle den Wert deshalb nur so groß wie nötig. Seit new DelayNode(context, options) verfügbar ist, gibt es auch einen Konstruktor. Beide Wege sind gleichwertig.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $maxDelayTime | number | 1 | Größtmögliche Verzögerung in Sekunden. Muss größer als 0 und kleiner als 180 (3 Minuten) sein, sonst wird ein NotSupportedError ausgelöst. |
Rückgabewert
DelayNode. Sein delayTime-AudioParam hat den Startwert 0 und ist nach oben durch maxDelayTime begrenzt.Beispiele
Einfache Verzögerung eines Oszillators
const ctx = new AudioContext();
const osc = ctx.createOscillator();
const delay = ctx.createDelay(2); // bis zu 2 Sekunden
delay.delayTime.value = 0.5; // 500 ms Verzögerung
osc.connect(delay).connect(ctx.destination);
osc.start();
osc.stop(ctx.currentTime + 0.2);
console.log(delay.delayTime.value, delay.delayTime.maxValue);
Echo-Effekt mit Rückkopplung
const ctx = new AudioContext();
const audio = document.querySelector('audio');
const source = ctx.createMediaElementSource(audio);
const delay = ctx.createDelay(1);
const feedback = ctx.createGain();
const wet = ctx.createGain();
delay.delayTime.value = 0.35;
feedback.gain.value = 0.4; // < 1, sonst schaukelt sich das Signal auf
wet.gain.value = 0.5;
// Trockenes Signal direkt ausgeben
source.connect(ctx.destination);
// Nasses Signal: Quelle -> Delay -> Wet -> Ausgang
source.connect(delay);
delay.connect(wet).connect(ctx.destination);
// Rückkopplungsschleife: Delay -> Feedback -> Delay
delay.connect(feedback).connect(delay);
audio.addEventListener('play', () => ctx.resume());
Flanger: Verzögerungszeit per LFO modulieren
const ctx = new AudioContext();
const osc = ctx.createOscillator();
osc.type = 'sawtooth';
const delay = ctx.createDelay(0.02);
delay.delayTime.value = 0.005; // 5 ms Grundverzögerung
const lfo = ctx.createOscillator();
const lfoDepth = ctx.createGain();
lfo.frequency.value = 0.25; // langsame Modulation
lfoDepth.gain.value = 0.003; // ±3 ms
lfo.connect(lfoDepth).connect(delay.delayTime);
osc.connect(ctx.destination);
osc.connect(delay).connect(ctx.destination);
osc.start();
lfo.start();
osc.stop(ctx.currentTime + 4);
lfo.stop(ctx.currentTime + 4);
Verzögerungszeit sanft ändern
const ctx = new AudioContext();
const delay = ctx.createDelay(5);
// Harte Sprünge erzeugen Knackser, deshalb rampen
const setDelay = (seconds) => {
delay.delayTime.setTargetAtTime(seconds, ctx.currentTime, 0.05);
};
setDelay(1.2);
try {
ctx.createDelay(200); // zu groß
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Obergrenze festlegen:
maxDelayTimelässt sich nach dem Erzeugen nicht mehr ändern. Werte fürdelayTimeoberhalb dieser Grenze werden stillschweigend auf das Maximum gekappt. Werte ≤ 0 oder ≥ 180 lösen einenNotSupportedErroraus. - Rückkopplungsschleifen: In der Web Audio API sind Zyklen im Audiographen nur erlaubt, wenn ein
DelayNodein der Schleife liegt. Hält der Feedback-Gain nicht unter1, schaukelt sich das Signal auf und übersteuert. - Mindestverzögerung im Zyklus: Liegt der
DelayNodein einer Rückkopplungsschleife, beträgt die Verzögerung mindestens einen Render-Block (128 Samples), auch wenndelayTimekleiner ist. - Knackser vermeiden: Sprünge in
delayTimewährend der Wiedergabe erzeugen Artefakte. Nutze stattdessensetTargetAtTime()oderlinearRampToValueAtTime(). - Autoplay-Richtlinien: Browser starten einen
AudioContextoft im Zustandsuspended. Rufectx.resume()nach einer Nutzeraktion auf. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Sehr alte WebKit-Versionen kannten nur das Präfix
webkitAudioContext.