Start · Sprachen · JavaScript · Referenz · DynamicsCompressorNode.attack

DynamicsCompressorNode.attack

Eigenschaft

Schreibgeschützter k-rate <code>AudioParam</code>, der die Zeit in Sekunden angibt, die der Kompressor braucht, um den Pegel um 10 dB abzusenken.

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

Signatur

DynamicsCompressorNode.attack

Beschreibung

Die Eigenschaft attack eines DynamicsCompressorNode legt fest, wie schnell der Kompressor reagiert, sobald das Eingangssignal den Schwellwert (threshold) überschreitet. Der Wert gibt die Zeit in Sekunden an, die nötig ist, um die Verstärkung um 10 dB zu reduzieren.

Die Eigenschaft selbst ist schreibgeschützt und liefert ein AudioParam-Objekt. Den eigentlichen Wert änderst du über attack.value oder über Automatisierungsmethoden wie setValueAtTime() oder linearRampToValueAtTime(). Da es sich um einen k-rate-Parameter handelt, wird der Wert nur einmal pro Render-Quantum (128 Samples) übernommen, nicht pro Sample.

Einsatzbereiche:

  • Kurze Attack-Zeiten (z. B. 0,001–0,005 s) fangen Transienten wie Schlagzeug-Anschläge ab, eignen sich also als Limiter oder Schutz vor Übersteuerung.
  • Längere Attack-Zeiten (z. B. 0,02–0,1 s) lassen Transienten durch und sorgen so für mehr „Punch“, während der Rest des Signals trotzdem verdichtet wird.

Der Standardwert ist 0.003, der zulässige Bereich reicht von 0 bis 1.

Rückgabewert

Typ
AudioParam
Beschreibung
Ein AudioParam mit defaultValue 0.003, minValue 0 und maxValue 1. Die Einheit ist Sekunden.

Beispiele

Kompressor mit schneller Attack-Zeit erzeugen

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

// Sehr schnelle Reaktion, um Pegelspitzen abzufangen
compressor.threshold.value = -24;
compressor.ratio.value = 12;
compressor.attack.value = 0.001;
compressor.release.value = 0.1;

console.log(compressor.attack.value);
console.log(compressor.attack.defaultValue, compressor.attack.minValue, compressor.attack.maxValue);
0.0010000000474974513 0.003 0 1

Attack über den Konstruktor setzen und ein Audio-Element komprimieren

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

// Längere Attack-Zeit: Transienten bleiben erhalten
const compressor = new DynamicsCompressorNode(ctx, {
  threshold: -30,
  ratio: 4,
  attack: 0.03,
  release: 0.25
});

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

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

Attack-Zeit per Schieberegler live anpassen

const ctx = new AudioContext();
const compressor = ctx.createDynamicsCompressor();
const slider = document.querySelector('#attack'); // <input type="range" min="0" max="100">
const label = document.querySelector('#attack-label');

slider.addEventListener('input', () => {
  const seconds = Number(slider.value) / 1000; // Millisekunden -> Sekunden
  // Sanfter Übergang ohne Knacksen
  compressor.attack.setTargetAtTime(seconds, ctx.currentTime, 0.01);
  label.textContent = `${slider.value} ms`;
});

// Wichtig · Fallstricke

  • Nicht direkt zuweisen: compressor.attack = 0.01 hat keine Wirkung, denn die Eigenschaft ist schreibgeschützt. Setze stattdessen compressor.attack.value.
  • Einheit Sekunden: Viele Audio-Programme (DAWs) geben Attack-Zeiten in Millisekunden an. Rechne vor dem Setzen um, also 5 ms entsprechen 0.005.
  • Wertebereich: Werte außerhalb von 0–1 werden stillschweigend auf diesen Bereich begrenzt (geclampt). Es gibt keine Fehlermeldung.
  • Gleitkommagenauigkeit: AudioParam speichert Werte als 32-Bit-Float. Beim Auslesen erscheint deshalb z. B. 0.0010000000474974513 statt 0.001.
  • k-rate: Eine Verbindung eines Audio-Signals mit attack oder eine sehr feine Automatisierung wirkt nur einmal pro Block von 128 Samples.
  • Autoplay-Richtlinie: Ein AudioContext startet oft im Zustand suspended und muss nach einer Benutzeraktion mit resume() gestartet werden.
  • Kompatibilität: Wird in allen modernen Browsern unterstützt. Ältere Safari-Versionen brauchen webkitAudioContext und kennen den Konstruktor new DynamicsCompressorNode() nicht; dort funktioniert nur createDynamicsCompressor().