Skip to content

audiodynamics: a gain-smoothing option, so a fast release does not ride a 50 Hz waveform #61

Description

@bdbarnett

Stakes. Compressor's dossier fixed three "clean" traits — F5 at 0.5 %
THD, V6 at 0.2 %, M5 at 1 % — and asked one question at Station A: "Is gain
smoothing composable, or a fifth ask? If the shipped patches cannot reach the
three bars, the ask is a one-pole on the gain after the gain computer."

Measured 2026-09-07 on the shipped patches: they cannot, on
low-frequency material.

Read back off the instance, at 10 dB of gain reduction on a 50 Hz tone
(audiocomponents/tools/compressor_evidence.py patches, 48 kHz, CPython at
AUDIOIF_PIN 2f6cbc3):

  patch  name                    character   THD @50 Hz  THD @1 kHz
      0  Level Ride              optical      0.8323 %   0.0446 %
      1  Fast Peak Catch         fet          1.1289 %   0.0611 %
      2  Everything At Once      fet          4.0207 %   0.2668 %
      3  Bus Glue                vca          0.2415 %   0.0117 %
      5  Let The Stick Through   fet          0.9393 %   0.0462 %
      6  Parallel Squash         fet          1.0945 %   0.0735 %

Five of the fourteen shipped patches are over F5's 0.5 % bar at 50 Hz —
patch 0, the constructor's own defaults, among them — and patch 3 is over
V6's 0.2 %. Patch 2 is the 1176's all-buttons-in mode and is meant to be
dirty. At 1 kHz only patch 2 is over the bar, so this is specifically
low-frequency material: with a short release the per-sample gain follows the
waveform. Swept over the Release macro's whole travel at 10 dB of GR, patch 1
reads 0.0209 % at the slow end and 3.8909 % at the fast end (50 Hz);
1.1359 % at 200 Hz; 0.2397 % at 1 kHz.

The class cannot fix this with the nodes on the pin: the ripple is in the
gain the node computes per sample, and nothing downstream of Dynamics can
remove it without also removing the compression.

Ask. audiodynamics.Dynamics gets a one-pole smoothing on the computed
gain, after the gain computer and before it multiplies the audio —
gain_smooth_ms, default 0, so every figure already measured against the
pin stays exactly where it is. A class that wants the 1176's dirt keeps 0; a
class that wants the dbx's cleanliness at 50 Hz asks for a few milliseconds.

Related: the class's own evidence records the disconfirmation and the bound
(audiocomponents/docs/effects/Compressor-evidence.md §1, traits F5/V6, and
docs/effects/Compressor.md §8 question 7, which is the question this ask
answers).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions