Start · Sprachen · JavaScript · Referenz · DynamicsCompressorNode.ratio

DynamicsCompressorNode.ratio

Eigenschaft

Schreibgeschützter k-rate-<code>AudioParam</code>, der das Kompressionsverhältnis angibt: wie viele dB Eingangsänderung über dem Schwellwert 1 dB Ausgangsänderung ergeben.

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

Signatur

DynamicsCompressorNode.ratio

Beschreibung

Die Eigenschaft ratio eines DynamicsCompressorNode legt fest, wie stark ein Signal komprimiert wird, sobald sein Pegel den Schwellwert (threshold) überschreitet. Ein Wert von 12 (Standard) bedeutet: Steigt der Eingangspegel oberhalb des Schwellwerts um 12 dB, steigt der Ausgangspegel nur um 1 dB. Ein Wert von 1 bedeutet keine Kompression, ein Wert von 20 (Maximum) wirkt nahezu wie ein Limiter.

Die Eigenschaft selbst ist schreibgeschützt – sie liefert ein AudioParam-Objekt. Den eigentlichen Wert setzt man über ratio.value oder zeitgesteuert über Automatisierungsmethoden wie setValueAtTime() oder linearRampToValueAtTime(). Der gültige Wertebereich liegt zwischen 1 und 20.

Da es sich um einen k-rate-Parameter handelt, wird der Wert nur einmal pro Render-Quantum (128 Samples) ausgewertet, nicht pro Sample. Typische Einsatzgebiete sind das Angleichen von Lautstärkeschwankungen bei Sprache (Ratio 2–4), das Verdichten von Musik (4–8) oder das Verhindern von Übersteuerung (Ratio 20 mit niedrigem knee).

Rückgabewert

Typ
AudioParam
Beschreibung
Ein AudioParam mit defaultValue 12, minValue 1 und maxValue 20. Der aktuelle Wert steht in ratio.value.

Beispiele

Kompressor erzeugen und Ratio setzen

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

console.log(compressor.ratio.defaultValue, compressor.ratio.minValue, compressor.ratio.maxValue);

// Moderate Kompression für Sprache
compressor.threshold.value = -24;
compressor.ratio.value = 4;
console.log(compressor.ratio.value);
12 1 20 4

Audio-Element über Kompressor abspielen (Konstruktor mit Optionen)

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

const compressor = new DynamicsCompressorNode(ctx, {
  threshold: -30,
  knee: 10,
  ratio: 6,
  attack: 0.005,
  release: 0.25
});

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

document.querySelector('#play').addEventListener('click', async () => {
  await ctx.resume();
  audioEl.play();
});

Ratio per Schieberegler live steuern

const ctx = new AudioContext();
const compressor = ctx.createDynamicsCompressor();
const slider = document.querySelector('#ratio'); // <input type="range" min="1" max="20">

slider.addEventListener('input', () => {
  const value = Number(slider.value);
  // Sanft in 50 ms auf neuen Wert gleiten, um Knackser zu vermeiden
  compressor.ratio.setTargetAtTime(value, ctx.currentTime, 0.05);
  console.log(`Ratio: ${value}:1`);
});
Ratio: 8:1

Wirkung über reduction auslesen

const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { frequency: 220 });
const compressor = new DynamicsCompressorNode(ctx, { threshold: -40, ratio: 20 });
osc.connect(compressor).connect(ctx.destination);
osc.start();

setTimeout(() => {
  // Aktuelle Pegelreduktion in dB (negativ)
  console.log(compressor.reduction.toFixed(1));
  osc.stop();
}, 500);
-37.x (ungefähr, abhängig vom Signal)

// Wichtig · Fallstricke

  • ratio selbst ist schreibgeschützt: compressor.ratio = 4 hat keine Wirkung (im Strict Mode TypeError). Immer compressor.ratio.value = 4 verwenden.
  • Werte außerhalb von 1–20 werden stillschweigend auf den gültigen Bereich begrenzt; dabei kann eine Konsolenwarnung erscheinen.
  • Als k-rate-Parameter nimmt ratio keine sample-genauen Modulationen an; ein angeschlossener Audio-Eingang (node.connect(compressor.ratio)) wird nur einmal pro Block von 128 Samples ausgewertet.
  • Die Ratio wirkt nur auf den Signalanteil oberhalb von threshold; der Übergang wird durch knee weich gestaltet. Ohne passenden Schwellwert ist die Wirkung kaum hörbar.
  • Kompression senkt den Pegel – ggf. mit einem nachgeschalteten GainNode (Make-up-Gain) ausgleichen.
  • Kompatibilität: in allen aktuellen Browsern unterstützt; der Konstruktor new DynamicsCompressorNode() fehlt in sehr alten Safari-Versionen – dort createDynamicsCompressor() verwenden. Ein AudioContext startet wegen der Autoplay-Richtlinien oft im Zustand suspended und braucht eine Nutzerinteraktion.