Start · Sprachen · JavaScript · Referenz · DynamicsCompressorNode.reduction

DynamicsCompressorNode.reduction

Eigenschaft

Schreibgeschützter Float in Dezibel, der angibt, wie stark der Kompressor die Verstärkung des Signals gerade absenkt.

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

Signatur

DynamicsCompressorNode.reduction

Beschreibung

Die schreibgeschützte Eigenschaft reduction eines DynamicsCompressorNode gibt an, wie stark der Kompressor die Verstärkung des Signals im Moment absenkt. Der Wert ist eine Zahl in Dezibel (dB). Er ist 0, solange nicht komprimiert wird, und wird negativ, sobald der Pegel über dem Schwellwert (threshold) liegt. Ein Wert von -6 heißt zum Beispiel, dass das Signal gerade um 6 dB leiser gemacht wird.

Typischerweise nutzt man reduction für eine Gain-Reduction-Anzeige (GR-Meter), wie man sie von Studio-Kompressoren kennt. Man kann den Wert aber auch zur Fehlersuche verwenden, etwa um zu prüfen, ob die Einstellungen für threshold, ratio, knee, attack und release wie gewünscht wirken. Weil sich der Wert ständig mit dem Audiosignal ändert, fragt man ihn meist regelmäßig ab, z. B. in einer requestAnimationFrame-Schleife.

Anders als die übrigen Kompressor-Einstellungen ist reduction kein AudioParam, sondern ein einfacher Zahlenwert. Man kann ihn also weder automatisieren noch mit anderen Knoten verbinden. Zuweisungen werden ignoriert.

Rückgabewert

Typ
number
Beschreibung
Aktuelle Verstärkungsreduktion in dB als Gleitkommazahl. 0 bedeutet: keine Kompression. Negative Werte (z. B. -4.2) zeigen, um wie viel dB der Pegel gerade abgesenkt wird.

Beispiele

Kompressor erzeugen und reduction auslesen

const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { frequency: 220 });
const compressor = new DynamicsCompressorNode(ctx, {
  threshold: -30,
  knee: 10,
  ratio: 8,
  attack: 0.003,
  release: 0.25
});

osc.connect(compressor).connect(ctx.destination);
osc.start();

// Direkt nach dem Start wurde noch nichts verarbeitet
console.log(compressor.reduction);

// Nach kurzer Zeit ist die Kompression aktiv
setTimeout(() => {
  console.log(`Reduktion: ${compressor.reduction.toFixed(2)} dB`);
  osc.stop();
}, 500);
0 Reduktion: -18.43 dB (Wert abhängig von Signal und Einstellungen)

Gain-Reduction-Anzeige mit requestAnimationFrame

const ctx = new AudioContext();
const audioEl = document.querySelector('audio');
const source = ctx.createMediaElementSource(audioEl);
const compressor = ctx.createDynamicsCompressor();
compressor.threshold.value = -24;
compressor.ratio.value = 6;

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

const meter = document.querySelector('#gr-meter'); // <meter min="0" max="30">
const label = document.querySelector('#gr-label');

const update = () => {
  const gr = Math.abs(compressor.reduction); // positiv für die Anzeige
  meter.value = gr;
  label.textContent = `-${gr.toFixed(1)} dB`;
  requestAnimationFrame(update);
};

audioEl.addEventListener('play', async () => {
  await ctx.resume();
  update();
});

Kompressor-Einstellungen prüfen (Debugging)

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

const logReduction = (label) =>
  console.log(`${label}: ${compressor.reduction.toFixed(1)} dB`);

// Zuweisung wird ignoriert – die Eigenschaft ist schreibgeschützt
compressor.reduction = -10;
logReduction('Nach Zuweisungsversuch');

// Typprüfung: einfache Zahl, kein AudioParam
console.log(typeof compressor.reduction);
Nach Zuweisungsversuch: 0.0 dB number

// Wichtig · Fallstricke

  • Vorzeichen: Der Wert ist 0 oder negativ. Für Anzeigen nimmt man meist Math.abs().
  • Kein AudioParam: In frühen Chrome-Versionen war reduction ein AudioParam, und man musste reduction.value lesen. Laut aktueller Spezifikation ist es eine einfache Zahl. Alter Code mit .value liefert heute undefined. Wer sehr alte Browser unterstützen muss, prüft vorher: typeof c.reduction === 'number' ? c.reduction : c.reduction.value.
  • Schreibgeschützt: Zuweisungen werden im nicht-strikten Modus stillschweigend ignoriert. Im Strict Mode (also auch in ES-Modulen) werfen sie einen TypeError.
  • Aktualisierung: Der Wert wird im Audio-Thread berechnet und pro Verarbeitungsblock (128 Samples) aktualisiert. Er ist deshalb nur eine Momentaufnahme. Bei einem angehaltenen AudioContext (state === 'suspended', z. B. wegen Autoplay-Sperren) bleibt er unverändert.
  • Performance: Frag den Wert höchstens einmal pro Frame ab (requestAnimationFrame). Schnellere setInterval-Schleifen bringen nichts.