Start · Sprachen · JavaScript · Referenz · DynamicsCompressorNode.knee

DynamicsCompressorNode.knee

Eigenschaft

Schreibgeschützter k-rate-<code>AudioParam</code> in Dezibel, der den Bereich oberhalb von <code>threshold</code> festlegt, in dem die Kennlinie weich in die Kompression übergeht.

seit JavaScript Baseline: alle modernen Browser (Web Audio API) Kategorie: webapi

Signatur

DynamicsCompressorNode.knee

Beschreibung

Die Eigenschaft knee eines DynamicsCompressorNode bestimmt, wie „weich“ der Kompressor einsetzt. Sie gibt in Dezibel an, über welchen Pegelbereich oberhalb der Schwelle (threshold) die Kennlinie allmählich von linear (keine Kompression) in das volle Verhältnis (ratio) übergeht. Ein Wert von 0 ergibt ein Hard Knee, bei dem die Kompression abrupt einsetzt. Größere Werte ergeben ein Soft Knee mit einem natürlicheren, weniger hörbaren Übergang.

Die Eigenschaft selbst ist schreibgeschützt: Sie liefert ein AudioParam-Objekt, dessen value du setzt oder das du mit Methoden wie setValueAtTime() oder linearRampToValueAtTime() automatisierst. Der Standardwert ist 30, der gültige Bereich reicht von 0 bis 40 dB.

Da es sich um einen k-rate-Parameter handelt, wird der Wert nur einmal pro Render-Block (128 Samples) ausgewertet, nicht für jedes Sample. Für typische Mix-Einstellungen ist das unproblematisch. Sehr schnelle Automationen werden dadurch aber nur blockweise umgesetzt.

In der Praxis nutzt du knee zusammen mit threshold, ratio, attack und release. Ein Soft Knee eignet sich für Sprache und Musik-Mastering. Ein Hard Knee eignet sich für einen Limiter-artigen Schutz vor Übersteuerung.

Parameter

Name Typ Default Beschreibung
$knee.value number 30 Übergangsbereich in Dezibel (dB), gültig von 0 bis 40. Werte außerhalb dieses Bereichs werden auf die Grenzen begrenzt.

Rückgabewert

Typ
AudioParam
Beschreibung
Ein k-rate-AudioParam mit defaultValue 30, minValue 0 und maxValue 40 (Einheit: dB).

Beispiele

Kompressor mit Soft Knee erzeugen

const ctx = new AudioContext();
const compressor = ctx.createDynamicsCompressor();

// Weicher Einsatz der Kompression über 20 dB
compressor.threshold.value = -24;
compressor.knee.value = 20;
compressor.ratio.value = 4;

console.log(compressor.knee.value, compressor.knee.defaultValue);
20 30

Wertebereich und Begrenzung prüfen

const ctx = new AudioContext();
const comp = new DynamicsCompressorNode(ctx, { knee: 10 });

console.log(comp.knee.minValue, comp.knee.maxValue); // 0 40

// Werte außerhalb des Bereichs werden bei der Verarbeitung begrenzt
comp.knee.value = 100;
console.log(comp.knee.value);
0 40 40

Audio-Element komprimieren und Knee automatisieren

const ctx = new AudioContext();
const audio = document.querySelector('audio');
const source = ctx.createMediaElementSource(audio);

const comp = new DynamicsCompressorNode(ctx, {
  threshold: -30,
  knee: 0,   // zunächst Hard Knee
  ratio: 8
});

source.connect(comp).connect(ctx.destination);

document.querySelector('#play').addEventListener('click', async () => {
  await ctx.resume();
  audio.play();
  // Innerhalb von 3 Sekunden auf ein weiches Knee überblenden
  const now = ctx.currentTime;
  comp.knee.setValueAtTime(0, now);
  comp.knee.linearRampToValueAtTime(35, now + 3);
});

// Wichtig · Fallstricke

  • knee selbst lässt sich nicht neu zuweisen (compressor.knee = 10 hat keine Wirkung). Setze stattdessen compressor.knee.value.
  • Als k-rate-Parameter wird knee nur pro Render-Block von 128 Samples ausgewertet. Wenn du einen anderen AudioNode mit knee verbindest (Audio-Rate-Modulation), wird dessen Signal ebenfalls nur blockweise übernommen.
  • Die Wirkung hängt stark von threshold und ratio ab. Bei ratio = 1 hat knee keinen hörbaren Effekt.
  • Die genaue Kennlinie und das Aufholen der Lautstärke (Makeup Gain) unterscheiden sich leicht zwischen Browser-Implementierungen. Kritische Einstellungen solltest du deshalb in mehreren Browsern gegenhören.
  • Browser-Kompatibilität: wird in allen modernen Browsern unterstützt. Ein AudioContext startet wegen der Autoplay-Richtlinien oft im Zustand suspended und muss nach einer Nutzeraktion mit resume() gestartet werden.