Signatur
Beschreibung
Jeder AudioNode (z. B. GainNode, OscillatorNode, AnalyserNode) wird immer von genau einem Audio-Kontext erzeugt und bleibt fest an ihn gebunden. Die Eigenschaft context liefert diesen Kontext – entweder einen AudioContext (Echtzeit-Wiedergabe) oder einen OfflineAudioContext (Rendering in einen Puffer). Beide erben von BaseAudioContext.
Nützlich ist die Eigenschaft vor allem in wiederverwendbaren Funktionen und Bibliotheken, die nur einen Knoten übergeben bekommen: Über node.context kommt man an currentTime für präzises Timing, an sampleRate oder an Fabrikmethoden wie createGain(), um weitere Knoten im selben Graph zu erzeugen. So muss der Kontext nicht separat mitgereicht werden.
Die Eigenschaft ist schreibgeschützt; ein Knoten kann nicht in einen anderen Kontext verschoben werden. Verbindungen per connect() sind nur zwischen Knoten desselben Kontexts erlaubt – ein Vergleich a.context === b.context ist daher eine sinnvolle Vorabprüfung.
Rückgabewert
AudioContext oder OfflineAudioContext, der den Knoten erzeugt hat. Der Wert ist für die gesamte Lebensdauer des Knotens konstant.Beispiele
Kontext eines Knotens auslesen
const audioCtx = new AudioContext();
const gain = audioCtx.createGain();
console.log(gain.context === audioCtx);
console.log(gain.context.constructor.name);
console.log(gain.context.sampleRate);
Fade-out-Hilfsfunktion ohne separaten Kontext-Parameter
// Blendet einen GainNode über 'dauer' Sekunden aus
const fadeOut = (gainNode, dauer = 1) => {
const now = gainNode.context.currentTime;
gainNode.gain.cancelScheduledValues(now);
gainNode.gain.setValueAtTime(gainNode.gain.value, now);
gainNode.gain.linearRampToValueAtTime(0, now + dauer);
};
const ctx = new AudioContext();
const osc = ctx.createOscillator();
const gain = ctx.createGain();
osc.connect(gain).connect(ctx.destination);
osc.start();
document.querySelector('#stop').addEventListener('click', async () => {
await ctx.resume();
fadeOut(gain, 2);
osc.stop(ctx.currentTime + 2);
});
Effektkette im selben Kontext erzeugen und Kontexte prüfen
// Hängt einen Tiefpass-Filter hinter einen beliebigen Quellknoten
const addLowpass = (source, frequency = 800) => {
const ctx = source.context;
const filter = ctx.createBiquadFilter();
filter.type = 'lowpass';
filter.frequency.value = frequency;
source.connect(filter);
return filter;
};
const safeConnect = (a, b) => {
if (a.context !== b.context) {
throw new Error('Knoten gehören zu unterschiedlichen Kontexten');
}
return a.connect(b);
};
const ctx = new AudioContext();
const offline = new OfflineAudioContext(2, 44100, 44100);
const osc = ctx.createOscillator();
const filter = addLowpass(osc, 500);
safeConnect(filter, ctx.destination);
try {
safeConnect(osc, offline.destination);
} catch (err) {
console.log(err.message);
}
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
node.contextwird ignoriert (im Strict ModeTypeError). Knoten lassen sich nicht zwischen Kontexten verschieben – man muss sie im Zielkontext neu erzeugen. - Kontextübergreifendes
connect()wirft einenInvalidAccessError. Das betrifft z. B. das Mischen von Knoten aus einemAudioContextund einemOfflineAudioContext. - Der Rückgabetyp ist
BaseAudioContext; Methoden, die nurAudioContextbesitzt (z. B.createMediaElementSource(),close(),outputLatency), existieren bei einemOfflineAudioContextnicht. Bei Bedarf mitinstanceof AudioContextprüfen. - Auch nach
close()verweistcontextweiterhin auf den (nun geschlossenen) Kontext;node.context.stateist dann"closed". - Kompatibilität: In allen modernen Browsern verfügbar; sehr alte WebKit-Versionen nutzten das Präfix
webkitAudioContext.