Signatur
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
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);
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`);
});
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);
// Wichtig · Fallstricke
ratioselbst ist schreibgeschützt:compressor.ratio = 4hat keine Wirkung (im Strict ModeTypeError). Immercompressor.ratio.value = 4verwenden.- Werte außerhalb von 1–20 werden stillschweigend auf den gültigen Bereich begrenzt; dabei kann eine Konsolenwarnung erscheinen.
- Als k-rate-Parameter nimmt
ratiokeine 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 durchkneeweich 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 – dortcreateDynamicsCompressor()verwenden. EinAudioContextstartet wegen der Autoplay-Richtlinien oft im Zustandsuspendedund braucht eine Nutzerinteraktion.