Signatur
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
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);
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);
// 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
reductioneinAudioParam, und man musstereduction.valuelesen. Laut aktueller Spezifikation ist es eine einfache Zahl. Alter Code mit.valueliefert heuteundefined. 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). SchnelleresetInterval-Schleifen bringen nichts.