Sound FX: Compressor #326

Closed
opened 2026-10-05 22:37:52 +02:00 by meleki · 3 comments
Owner

Aus der Einschätzung der Sound-FX-Nodes nach #317 (Gespräch 2026-10-05). Heute gibt es Input, Output, Gain, Pitch, 5-Band-EQ und Mix.

Dynamik eines Sounds zusammendrücken: leise Teile lauter, Spitzen leiser, mehr „Punch“.

Vorschlag:

  • DynamicsCompressorNode, den Web Audio fertig mitbringt.
  • Felder: Threshold (dB), Ratio, Knee (dB), Attack (s), Release (s), dazu Makeup (dB) als Gain danach.
  • Wie bei Gain und 5-Band-EQ: Jeder Wert kann von einem Parameter des Input-Nodes kommen und lässt sich mit Set sound FX parameters samt time und Easing an einer laufenden Stimme ändern.

Haken:

  • Jede Stimme hat ihre eigene Kette. Ein Compressor auf einem einzelnen kurzen Sound ist eher ein Klangformer.
  • Wofür man Kompression meistens will, nämlich alle Sounds zusammen bändigen, braucht den Master-Bus #325.

Rückfragen:

  • Soll der Node schon jetzt pro Stimme kommen, oder erst zusammen mit dem Master-Bus?
  • Alle fünf Werte offen, oder ein vereinfachter Node mit Amount und Presets (Gentle, Punch, Limiter)?
  • Braucht es einen eigenen Limiter (Ratio 20, Attack 0), damit nichts übersteuert? Das wäre vor allem am Master-Bus sinnvoll.
Aus der Einschätzung der Sound-FX-Nodes nach #317 (Gespräch 2026-10-05). Heute gibt es *Input*, *Output*, *Gain*, *Pitch*, *5-Band-EQ* und *Mix*. Dynamik eines Sounds zusammendrücken: leise Teile lauter, Spitzen leiser, mehr „Punch“. Vorschlag: - `DynamicsCompressorNode`, den Web Audio fertig mitbringt. - Felder: **Threshold** (dB), **Ratio**, **Knee** (dB), **Attack** (s), **Release** (s), dazu **Makeup** (dB) als Gain danach. - Wie bei *Gain* und *5-Band-EQ*: Jeder Wert kann von einem Parameter des Input-Nodes kommen und lässt sich mit *Set sound FX parameters* samt `time` und Easing an einer laufenden Stimme ändern. Haken: - Jede Stimme hat ihre eigene Kette. Ein Compressor auf einem einzelnen kurzen Sound ist eher ein Klangformer. - Wofür man Kompression meistens will, nämlich alle Sounds zusammen bändigen, braucht den Master-Bus #325. Rückfragen: - Soll der Node schon jetzt pro Stimme kommen, oder erst zusammen mit dem Master-Bus? - Alle fünf Werte offen, oder ein vereinfachter Node mit **Amount** und Presets (*Gentle*, *Punch*, *Limiter*)? - Braucht es einen eigenen **Limiter** (Ratio 20, Attack 0), damit nichts übersteuert? Das wäre vor allem am Master-Bus sinnvoll.
meleki added the new label 2026-10-05 22:37:52 +02:00
admin added this to the Development project 2026-10-06 15:56:09 +02:00
admin moved this to Next in Development on 2026-10-07 14:01:13 +02:00
  • ganz normaler node falls es latenz verursacht auch kein problem, gibt zwar noch keine master bus, aber die logik perse ist vorhanden (fx beim track, pitch ohne look ahead was latenz verursacht)
  • alle fünf werte offen
  • eigener limiter nicht notwendig, könnte ein eigenes node sein. wenn auto-gain möglich ist, dann könnte dieses toggle bzw. ein weight 0-1 mit rein (sprich, 0 = kein auto-gain, 1 = voller auto-gain, 0.5 = halber auto-gain)

somit: node "Limiter" auch gleich mitbauen bzw. aber noch rückfragen falls es dazu fragen gibt

- ganz normaler node falls es latenz verursacht auch kein problem, gibt zwar noch keine master bus, aber die logik perse ist vorhanden (fx beim track, pitch ohne look ahead was latenz verursacht) - alle fünf werte offen - eigener limiter nicht notwendig, könnte ein eigenes node sein. wenn auto-gain möglich ist, dann könnte dieses toggle bzw. ein weight 0-1 mit rein (sprich, 0 = kein auto-gain, 1 = voller auto-gain, 0.5 = halber auto-gain) somit: node "Limiter" auch gleich mitbauen bzw. aber noch rückfragen falls es dazu fragen gibt
admin removed the new label 2026-10-07 15:10:36 +02:00
Author
Owner

Plan

Deine Antworten: normaler Node, Latenz ist kein Problem, alle fünf Werte offen, Auto-gain als Gewicht von 0 bis 1, dazu ein Node Limiter. Meine Vorschläge zum Limiter gelten als bestätigt („passt alles“).

Compressor

  • DynamicsCompressorNode mit Threshold (dB), Ratio, Knee (dB), Attack (s), Release (s).
  • Makeup (dB) und Auto-gain (0 bis 1). Auto-gain ist die Verstärkung, die ein Signal bei 0 dBFS nach der Kompression wieder auf 0 dBFS bringt. Gerechnet wird sie aus Threshold, Ratio und Knee. Hinter dem Compressor gilt dann (1 - Auto-gain) · Makeup + Auto-gain · berechneter Wert.
  • Der DynamicsCompressorNode hebt von sich aus schon an (laut Spezifikation 60 % davon). Das rechne ich heraus, damit 0 wirklich „kein Auto-gain“ heißt.
  • Alle Werte lassen sich mit Set sound FX parameters samt time und Easing ändern.

Limiter

  • Eigener Node auf dem FX-Worklet, mit 5 ms Look-ahead und harter Grenze. Keine Spitze geht über die Grenze.
  • Zeilen: Threshold (dB), Ceiling (dB), Release (s), Auto-gain (0 bis 1).
    • Abweichung von meinem Vorschlag: Ich brauche zusätzlich Threshold. Ohne ihn hat Auto-gain nichts, woran es sich ausrichten kann. Der Limiter begrenzt bei Threshold, Auto-gain hebt das Ergebnis dann Richtung Ceiling an. Bei 1 liegen die Spitzen genau auf Ceiling, bei 0 bleiben sie bei Threshold. Über Ceiling kommt nie etwas.
  • Die 5 ms Verzögerung gleicht dieselbe Logik aus wie beim Pitch: Stimmen starten um so viel früher, der andere Weg eines Mix wird verzögert, Busse rechnen sie in ihre Laufzeit ein.
  • Falls der DynamicsCompressorNode im Browser selbst verzögert, messe ich das und gleiche es genauso aus.
## Plan Deine Antworten: normaler Node, Latenz ist kein Problem, alle fünf Werte offen, Auto-gain als Gewicht von 0 bis 1, dazu ein Node *Limiter*. Meine Vorschläge zum Limiter gelten als bestätigt („passt alles“). **Compressor** - `DynamicsCompressorNode` mit **Threshold** (dB), **Ratio**, **Knee** (dB), **Attack** (s), **Release** (s). - **Makeup** (dB) und **Auto-gain** (0 bis 1). Auto-gain ist die Verstärkung, die ein Signal bei 0 dBFS nach der Kompression wieder auf 0 dBFS bringt. Gerechnet wird sie aus Threshold, Ratio und Knee. Hinter dem Compressor gilt dann `(1 - Auto-gain) · Makeup + Auto-gain · berechneter Wert`. - Der `DynamicsCompressorNode` hebt von sich aus schon an (laut Spezifikation 60 % davon). Das rechne ich heraus, damit 0 wirklich „kein Auto-gain“ heißt. - Alle Werte lassen sich mit *Set sound FX parameters* samt `time` und Easing ändern. **Limiter** - Eigener Node auf dem FX-Worklet, mit **5 ms Look-ahead** und harter Grenze. Keine Spitze geht über die Grenze. - Zeilen: **Threshold** (dB), **Ceiling** (dB), **Release** (s), **Auto-gain** (0 bis 1). - Abweichung von meinem Vorschlag: Ich brauche zusätzlich *Threshold*. Ohne ihn hat Auto-gain nichts, woran es sich ausrichten kann. Der Limiter begrenzt bei Threshold, Auto-gain hebt das Ergebnis dann Richtung Ceiling an. Bei 1 liegen die Spitzen genau auf Ceiling, bei 0 bleiben sie bei Threshold. Über Ceiling kommt nie etwas. - Die 5 ms Verzögerung gleicht dieselbe Logik aus wie beim Pitch: Stimmen starten um so viel früher, der andere Weg eines Mix wird verzögert, Busse rechnen sie in ihre Laufzeit ein. - Falls der `DynamicsCompressorNode` im Browser selbst verzögert, messe ich das und gleiche es genauso aus.
Author
Owner

Erledigt mit a645026 „Tame the loudness with a Compressor and a Limiter node“.

Gebaut

  • Compressor: DynamicsCompressorNode mit Threshold, Ratio, Knee, Attack und Release, danach Makeup und Auto-gain von 0 bis 1. Heraus kommt (1 - w) · Makeup + w · A dB, A ist das, was die Kurve bei 0 dBFS abzieht.
    • Der Browser-Node hebt selbst schon um 0,6 · A an (so steht es in der Spezifikation). Diese Anhebung wird wieder abgezogen, damit 0 wirklich „kein Makeup“ heißt.
    • Die Form des Knee überlässt die Spezifikation dem Browser. dynamics.ts übernimmt die Kurve von Chromium und trifft die gemessene Anhebung bei vier Einstellungen auf drei Stellen.
  • Limiter: eigener Prozessor im FX-Worklet mit Threshold, Ceiling, Release und Auto-gain. Er schaut 5 ms voraus. Kein Sample kommt über den kleineren Wert aus Threshold und Ceiling. Auto-gain hebt bis zur Ceiling an.
  • Abweichung vom Plan: Der Limiter hat zusätzlich einen Threshold. Ohne ihn hätte Auto-gain nichts, woran es messen kann.
  • Laufzeitausgleich jetzt auch für Stimmen: Eine Stimme startet um die Laufzeit ihrer Stufen früher (Compressor 6 ms, Limiter 5 ms). Der andere Weg eines Mix und die anderen Layer einer Note werden auf den spätesten verzögert, ein Bus zählt sie zu seiner Laufzeit.
  • Eine Stimme mit Limiter gilt als nachklingend. Das Worklet wird erst gestoppt, wenn es nichts mehr hält.

Tests

  • Unit: dynamics (neu) 8, soundfx 49 (3 neu), sound-library 100 (4 neu), grün.
  • Gegenproben: Limiter ohne Look-ahead (3 rot), Anhebung des Nodes nicht abgezogen (1), Stimme nicht früher gestartet (1), Bus ohne Laufzeit der Stufen (1), Mix ohne Verzögerung (1).
  • e2e 34 (melektaus-atx): ALL PASSED, 78 Checks (1 neu). Chrome offline: Compressor 288 Samples spät, Limiter 240. Vollaussteuerung durch -12 dB, 4:1, hartes Knee: +0,19 dB mit vollem Auto-gain, -8,81 dB ohne. Sinus mit Amplitude 2 durch den Limiter bei -6 dB: Spitze -6,00 dB, mit Auto-gain 1 bei -1,00 dB.
  • Gate (melektaus-atx) über den Endstand der Serie: CHECK EXIT 0, 267 Dateien, 4134 Tests.

Nicht geprüft: wie es klingt, die Tests laufen stumm.

Wiki: Sounds (Abschnitt Compressor and Limiter) und Instruments, Wiki-Commit 892ae19.

Erledigt mit `a645026` „Tame the loudness with a Compressor and a Limiter node“. ## Gebaut - **Compressor:** `DynamicsCompressorNode` mit Threshold, Ratio, Knee, Attack und Release, danach *Makeup* und *Auto-gain* von 0 bis 1. Heraus kommt (1 - w) · Makeup + w · A dB, A ist das, was die Kurve bei 0 dBFS abzieht. - Der Browser-Node hebt selbst schon um 0,6 · A an (so steht es in der Spezifikation). Diese Anhebung wird wieder abgezogen, damit 0 wirklich „kein Makeup“ heißt. - Die Form des Knee überlässt die Spezifikation dem Browser. `dynamics.ts` übernimmt die Kurve von Chromium und trifft die gemessene Anhebung bei vier Einstellungen auf drei Stellen. - **Limiter:** eigener Prozessor im FX-Worklet mit Threshold, Ceiling, Release und Auto-gain. Er schaut 5 ms voraus. Kein Sample kommt über den kleineren Wert aus Threshold und Ceiling. Auto-gain hebt bis zur Ceiling an. - **Abweichung vom Plan:** Der Limiter hat zusätzlich einen *Threshold*. Ohne ihn hätte Auto-gain nichts, woran es messen kann. - **Laufzeitausgleich jetzt auch für Stimmen:** Eine Stimme startet um die Laufzeit ihrer Stufen früher (Compressor 6 ms, Limiter 5 ms). Der andere Weg eines Mix und die anderen Layer einer Note werden auf den spätesten verzögert, ein Bus zählt sie zu seiner Laufzeit. - Eine Stimme mit Limiter gilt als nachklingend. Das Worklet wird erst gestoppt, wenn es nichts mehr hält. ## Tests - Unit: dynamics (neu) 8, soundfx 49 (3 neu), sound-library 100 (4 neu), grün. - Gegenproben: Limiter ohne Look-ahead (3 rot), Anhebung des Nodes nicht abgezogen (1), Stimme nicht früher gestartet (1), Bus ohne Laufzeit der Stufen (1), Mix ohne Verzögerung (1). - e2e 34 (melektaus-atx): ALL PASSED, 78 Checks (1 neu). Chrome offline: Compressor 288 Samples spät, Limiter 240. Vollaussteuerung durch -12 dB, 4:1, hartes Knee: +0,19 dB mit vollem Auto-gain, -8,81 dB ohne. Sinus mit Amplitude 2 durch den Limiter bei -6 dB: Spitze -6,00 dB, mit Auto-gain 1 bei -1,00 dB. - Gate (melektaus-atx) über den Endstand der Serie: CHECK EXIT 0, 267 Dateien, 4134 Tests. **Nicht geprüft:** wie es klingt, die Tests laufen stumm. Wiki: *Sounds* (Abschnitt *Compressor and Limiter*) und *Instruments*, Wiki-Commit `892ae19`.
admin moved this to Done in Development on 2026-10-07 21:32:12 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#326