Signatur
Beschreibung
BiquadFilterNode.frequency ist ein a-rate AudioParam. Er legt fest, bei welcher Frequenz (in Hertz) der Filter arbeitet. Wie der Wert wirkt, hängt vom eingestellten type ab:
lowpass/highpass: Grenzfrequenz (Cutoff), ab der gedämpft wirdbandpass/notch/peaking: Mittenfrequenz des Bandeslowshelf/highshelf: Übergangsfrequenz der Kuhschwanz-Anhebung bzw. -Absenkungallpass: Frequenz, bei der die Phasenverschiebung 90° beträgt
Die Eigenschaft selbst ist schreibgeschützt, denn sie verweist immer auf dasselbe AudioParam-Objekt. Ändern kann man aber dessen value oder den Wert mit den Automatisierungsmethoden zeitgenau planen, etwa mit setValueAtTime(), linearRampToValueAtTime(), exponentialRampToValueAtTime() oder setTargetAtTime(). Weil der Parameter a-rate ist, wird er für jedes einzelne Sample neu berechnet. Das ermöglicht saubere Filter-Sweeps ohne Treppeneffekte.
Außerdem lässt sich ein anderer Audioknoten an den Parameter anschließen, zum Beispiel ein OscillatorNode als LFO. So entstehen Effekte wie Auto-Wah oder rhythmisches Filtern. Das Signal des angeschlossenen Knotens wird dabei zum eingestellten Grundwert addiert.
Rückgabewert
AudioParam mit defaultValue 350, minValue 0 und maxValue gleich der Nyquist-Frequenz (context.sampleRate / 2). Die Einheit ist Hertz.Beispiele
Tiefpass-Grenzfrequenz setzen
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 110 });
const filter = new BiquadFilterNode(ctx, { type: 'lowpass' });
// Grenzfrequenz auf 800 Hz setzen
filter.frequency.value = 800;
osc.connect(filter).connect(ctx.destination);
osc.start();
console.log(filter.frequency.defaultValue, filter.frequency.value);
Filter-Sweep mit exponentieller Rampe
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { type: 'sawtooth', frequency: 55 });
const filter = new BiquadFilterNode(ctx, { type: 'lowpass', Q: 8 });
osc.connect(filter).connect(ctx.destination);
const now = ctx.currentTime;
// Startwert fixieren, dann in 2 s von 200 Hz auf 5 kHz öffnen
filter.frequency.setValueAtTime(200, now);
filter.frequency.exponentialRampToValueAtTime(5000, now + 2);
osc.start(now);
osc.stop(now + 2.5);
Auto-Wah per LFO an frequency anschließen
const ctx = new AudioContext();
const source = new OscillatorNode(ctx, { type: 'square', frequency: 110 });
const filter = new BiquadFilterNode(ctx, { type: 'bandpass', Q: 5, frequency: 1000 });
// LFO mit 3 Hz, Modulationstiefe ±700 Hz
const lfo = new OscillatorNode(ctx, { frequency: 3 });
const depth = new GainNode(ctx, { gain: 700 });
lfo.connect(depth).connect(filter.frequency);
source.connect(filter).connect(ctx.destination);
source.start();
lfo.start();
Frequenz per Schieberegler steuern (ohne Knacken)
const ctx = new AudioContext();
const filter = new BiquadFilterNode(ctx, { type: 'highpass' });
const slider = document.querySelector('#cutoff'); // <input type="range" min="20" max="20000">
slider.addEventListener('input', (e) => {
const hz = Number(e.target.value);
// Weich nachführen statt hart zu springen
filter.frequency.setTargetAtTime(hz, ctx.currentTime, 0.02);
});
// Wichtig · Fallstricke
- Nicht die Eigenschaft selbst zuweisen:
filter.frequency = 1000hat keine Wirkung, weil die Eigenschaft schreibgeschützt ist. Richtig istfilter.frequency.value = 1000oder eine Automatisierungsmethode. - Wertebereich: Werte über der Nyquist-Frequenz (
sampleRate / 2) werden auf diesen Bereich begrenzt. - Exponentielle Rampen:
exponentialRampToValueAtTime()erlaubt weder 0 als Ziel- oder Startwert noch einen Vorzeichenwechsel. Sonst wird einRangeErrorausgelöst bzw. die Rampe verhält sich unerwartet. Setze vorher mitsetValueAtTime()einen positiven Startwert. Für das Gehör sind exponentielle Frequenzverläufe meist natürlicher als lineare. - value-Zuweisung während einer Automatisierung: Laufen noch geplante Ereignisse, kann eine direkte Zuweisung an
valueignoriert werden oder zu Sprüngen führen. VorhercancelScheduledValues()aufrufen. - Harte Sprünge bei großen Frequenzänderungen können hörbare Klicks erzeugen. Dagegen hilft
setTargetAtTime(). - Der effektive Wert ergibt sich zusammen mit
detune(in Cent):frequency · 2^(detune/1200). - Kompatibilität: Wird von allen modernen Browsern unterstützt. Der Konstruktor
new BiquadFilterNode()fehlt in sehr alten Browsern. Dort gibt es nurctx.createBiquadFilter(). EinAudioContextstartet in der Regel erst nach einer Nutzerinteraktion (Autoplay-Richtlinie).