# Comp Desk > The ratio does not set the gain reduction — the overshoot does. `GR = (input - > threshold) * (1 - 1/R)`, and the ratio's whole contribution is that second term, a > number CAPPED AT 1. At 2 dB over the threshold even an infinite ratio removes > 2 dB; at 18 dB over, a mild 3:1 removes 12 dB. **The overshoot varies by > twenty decibels across a programme and the ratio's term varies by less than one.** At 10 dB > over, going from 4:1 to 10:1 buys 1.5 dB and the whole rest of the dial is worth 2.5 dB; > dropping the threshold 3 dB buys 2.25 dB and keeps buying it. **RATIOS MULTIPLY IN SERIES** — three > 2:1s are 8:1. **A SOFT KNEE STARTS HALF ITS WIDTH EARLY.** And **A STAGE CAN DO > NOTHING AT ALL**: a bus compressor at −18 dBFS behind one that lands the peak at exactly > −18 dBFS never engages, and its own panel cannot say so. ## The one thing to know **THE RATIO DOES NOT SET THE GAIN REDUCTION. THE OVERSHOOT DOES.** ```text overshoot x = input - threshold slope = 1 - 1/R <- capped at 1, whatever R is reduction GR = x * slope <- the OVERSHOOT is the term that varies output = threshold + x / R soft knee = slope * (x + W/2)^2 / 2W for -W/2 < x < W/2 attack = 1 - e^(-transient/tau) <- how much of GR arrives series = R1 * R2 * R3 ... <- above every threshold ``` The reduction is a product of two terms and only one of them has any range. The threshold sets the overshoot; the ratio scales it. **THE THRESHOLD IS THE CONTROL THAT MATTERS.** At 10 dB over, 4:1 already gives 7.5 dB. Going to 10:1 buys 1.5 dB and the entire remaining dial, all the way to infinity, is worth 2.5 dB. Lowering the threshold 3 dB buys 2.25 dB and buys the same again for every 3 dB after it, so after 3.33 dB of threshold a mild ratio has passed what an infinite one could do from where it started. One control saturates and the other is linear, and the one that saturates is the one everybody turns. **RATIOS MULTIPLY IN SERIES.** Above every threshold each stage divides what is left of the overshoot, so 8:1 comes out of three panels that all read 2:1. No panel anywhere in the chain displays the product, and a chain of gentle stages is not gentle. **A STAGE CAN DO NOTHING.** Every stage sees the output of the one in front of it. A stage whose threshold sits at or above what reaches it has no overshoot to work on, and no ratio multiplies zero into anything. This is the commonest reason a chain that looks busy sounds untouched, and reading the panels one at a time will never show it. **AND THE METER AND THE EAR DISAGREE FOR A REASON.** A single-pole attack reaches `1 - e^(-t/tau)` of its target, so a 10 ms attack on a 5 ms transient delivers 39.3% of what the static curve promises. Every figure here is the static curve unless it says so. ## Where the reduction comes from | Overshoot | at 2:1 | at 4:1 | at 10:1 | at ∞:1 | 4:1 → ∞:1 is worth | | --- | --- | --- | --- | --- | --- | | +1 dB | 0.5 dB | **0.75 dB** | 0.9 dB | 1 dB | 0.25 dB | | +2 dB | 1 dB | **1.5 dB** | 1.8 dB | 2 dB | 0.5 dB | | +5 dB | 2.5 dB | **3.75 dB** | 4.5 dB | 5 dB | 1.25 dB | | +10 dB | 5 dB | **7.5 dB** | 9 dB | 10 dB | 2.5 dB | | +20 dB | 10 dB | **15 dB** | 18 dB | 20 dB | 5 dB | **Read the bolded column down, then any row across.** Down the 4:1 column the reduction goes from 0.75 dB to 15 dB — a range of 14.25 dB. Across the +10 dB row, from 2:1 all the way to infinity, it goes from 5 dB to 10 dB — a range of 5 dB. **THE OVERSHOOT IS THE TERM THAT MATTERS.** `GR = overshoot × (1 − 1/R)`, and `(1 − 1/R)` is capped at 1 — the entire ratio dial, from 2:1 to infinity, is worth a factor of two on the reduction. The overshoot is worth whatever the programme and the threshold make it. The last column is the one to quote at somebody reaching for a higher ratio: at +2 dB over the threshold, going from 4:1 to INFINITY buys 0.5 dB. ## What a ratio is actually worth | Ratio | Slope, 1 − 1/R | Of the way to infinity | Doubling it again buys | | --- | --- | --- | --- | | 1.5:1 | 0.333 | 33.3% | +0.333 | | 2:1 | 0.5 | 50% | +0.25 | | 3:1 | 0.667 | 66.7% | +0.167 | | 4:1 | 0.75 | 75% | +0.125 | | 6:1 | 0.833 | 83.3% | +0.083 | | 8:1 | 0.875 | 87.5% | +0.063 | | 10:1 | 0.9 | 90% | +0.05 | | 20:1 | 0.95 | 95% | +0.025 | | ∞:1 | 1 | 100% | — | **A ratio is a slope and nothing else.** 2:1 is already halfway to infinity, 4:1 is 75% of the way, and 10:1 is 90%. Everything above about 8:1 is buying the last tenth. The last column is why the dial feels unresponsive at the top, and it falls strictly: doubling 2:1 to 4:1 adds 0.25 of slope, doubling 4:1 to 8:1 adds 0.125, and doubling 10:1 to 20:1 adds 0.05. **Each doubling is worth half the last**, because the gain from R to 2R is 1/(2R). **At and above 20:1 the stage is a limiter**, and the distinction between that and infinity is not audible while the distinction between either and 4:1 is. ## The two knobs, priced against each other | Change, from 4:1 at +10 dB over | New reduction | It buys | | --- | --- | --- | | nothing | 7.5 dB | — | | ratio to 6:1 | 8.33 dB | 0.83 dB | | ratio to 8:1 | 8.75 dB | 1.25 dB | | ratio to 10:1 | 9 dB | 1.5 dB | | ratio to 20:1 | 9.5 dB | 2 dB | | ratio to ∞:1 | 10 dB | 2.5 dB | | **threshold down 1 dB** | 8.25 dB | **0.75 dB** | | **threshold down 2 dB** | 9 dB | **1.5 dB** | | **threshold down 3 dB** | 9.75 dB | **2.25 dB** | | **threshold down 6 dB** | 12 dB | **4.5 dB** | **3 dB OF THRESHOLD BEATS 4:1 → 10:1.** Going from 4:1 to 10:1 buys 1.5 dB; dropping the threshold 3 dB buys 2.25 dB. The threshold wins by 0.75 dB, and it goes on winning: the whole ratio dial cannot reach 10 dB and the threshold has no limit at all. Note the shape of the two halves. **The ratio column has a ceiling**: the whole dial from 4:1 to infinity is worth 2.5 dB and cannot exceed it, because the most any ratio can take is the whole overshoot. **The threshold column is linear and unbounded** — every decibel buys exactly 0.75 dB, for ever. So the threshold passes an INFINITE ratio at 3.33 dB of movement: dropping it 4 dB at 4:1 gives 10.5 dB, which is more than ∞:1 gives at the original threshold. **One control saturates and the other does not**, and the one that saturates is the one everybody turns. ## The stages multiply | The chain | Overall ratio | Peak in | Peak out | Off the peak | Range left | | --- | --- | --- | --- | --- | --- | | 2:1 | **2:1** | −3 dBFS | −16.5 dBFS | 13.5 dB | 7.5 dB of 15 dB | | 2:1 then 2:1 | **4:1** | −3 dBFS | −22.25 dBFS | 19.25 dB | 3.75 dB of 15 dB | | 2:1 then 2:1 then 2:1 | **8:1** | −3 dBFS | −24.13 dBFS | 21.13 dB | 1.88 dB of 15 dB | | 3:1 then 2:1 | **6:1** | −3 dBFS | −24.5 dBFS | 21.5 dB | 2.5 dB of 15 dB | | 4:1 then 4:1 | **16:1** | −3 dBFS | −26.81 dBFS | 23.81 dB | 0.94 dB of 15 dB | **Nothing in the first column is above 4:1 and the second column reaches 16:1.** For a signal above every threshold each stage divides what is left of the overshoot, so the ratios multiply: three 2:1s are 8:1 and two 4:1s are 16:1. Nobody reading the panels one at a time would guess those numbers, and that is the point — **a chain of gentle stages is not gentle.** The last column is what it costs: the gap between peak and average, which is the thing a compressor is bought to narrow and the thing a chain can narrow past the point anybody wanted. ## How much of it arrives | Attack | Reaches, in a 1 ms transient | in 5 ms | in 20 ms | in 100 ms | | --- | --- | --- | --- | --- | | 100 µs | 100% | 100% | 100% | 100% | | 500 µs | 86.5% | 100% | 100% | 100% | | 1 ms | 63.2% | 99.3% | 100% | 100% | | 3 ms | 28.3% | 81.1% | 99.9% | 100% | | 10 ms | 9.52% | 39.3% | 86.5% | 100% | | 30 ms | 3.28% | 15.4% | 48.7% | 96.4% | | 100 ms | 1% | 4.88% | 18.1% | 63.2% | A single-pole envelope reaches `1 − e^(−t/tau)` of the way to its target, so an attack several times longer than the loud moment delivers a fraction of what the static curve promises. **A 10 ms attack on a 5 ms transient reaches 39.3%** — so 12 dB on the curve arrives as about 4.72 dB. That is why a chain can read as heavily compressed on paper and sound untouched, and why the gain-reduction meter and the ear disagree. It is also why a slow attack is a legitimate choice rather than a mistake: it lets the transient through on purpose. **The number to check is not the attack on its own but the attack against the length of the thing it is meant to catch.** ## Thresholds | Threshold | Value | What it separates | | --- | --- | --- | | a limiter, at | 20:1 | above it the slope is over 0.95 and the output barely moves. | | a stage worth having | ≥ 0.5 dB on the peak | below it the stage costs release behaviour and attention and delivers nothing. | | notable reduction | ≥ 6 dB | past it, makeup gain lifts the noise floor by an amount worth naming. | | heavy reduction | ≥ 12 dB | past it the chain is deciding the level rather than the performer. | | an attack that arrives | reaches ≥ 50% of target | below that the static curve is describing something the audio never does. | | the comparison is made at | +10 dB over, 4:1 → 10:1 against 3 dB of threshold | which control is worth more. | Defaults when the sheet is silent: a peak of −6 dBFS, an average of −20 dBFS, a hard knee, and a 5 ms transient. **The peak and the average are reported as WARNINGS when assumed** — they set the overshoot, which is the term that decides everything. The knee and the transient are notes: the knee assumption is the pessimistic one and the transient changes nothing about the static curve. ## Sheet grammar Two blocks. `CHAIN` is `key | value`, one per line. `STAGES` is a table. ``` CHAIN name | what this chain is peak | -6 the loudest the programme reaches, in dBFS average | -20 where it sits most of the time, in dBFS knee | 0 knee width in dB; 0 or `hard`, or `soft` for 6 transient | 5 how long the loud moments last, in ms STAGES s1 | the tracking comp | -24 | 3:1 | 10 ms | 100 ms | s2 | the bus comp | -18 | 2:1 | 30 ms | 300 ms | why this one is here ``` A STAGES row is `id | what it is | threshold | ratio | attack | release | why`. The attack and release are optional; without an attack the stage is read as its static curve and no arrival figure is given. **Levels are dBFS and therefore normally negative.** A bare number is dBFS whatever its sign, and a POSITIVE threshold is reported as an error rather than clamped — full scale is zero, so a threshold above it can never be reached and it is almost always a dropped minus sign. **A ratio takes `4:1`, a bare `4`, or `inf`** (also `limit`, `limiter`, `brickwall`). A ratio **below 1:1** is expansion rather than compression, and it is reported as an error because none of the arithmetic here describes an expander. **A bare time is MILLISECONDS**, because that is what every attack and release control is marked in. `s` and `us` are accepted. **THE STAGES ARE COMPUTED IN ORDER.** Each one sees the output of the one before it, so the same panel settings mean different things at different positions in a chain. That is the only reading that corresponds to what the audio does, and it is why a stage's threshold has to be chosen against what reaches it rather than against the programme. ## Lanes - **`plan`** — Choose the threshold before the ratio. A chain gets built by picking ratios and then hunting for a threshold, which is the weaker control chosen first. This works the other way: start from the programme's peak and average, decide how much reduction the job actually wants, and solve the threshold that delivers it — then pick a ratio, which is worth less than the last three decibels of threshold. Sections: Summary, The Sheet, The Setting, Reasoning, Next Step. - **`check`** (primary) — Whether this chain does what the panels say. The paid read of what the free panel computes. Every stage run in order, what each actually removes from the peak and the average, which of them never engage, what the chain adds up to, and how much of the performance's dynamic range is left when it is done. Sections: Summary, Verdict, Findings, Corrected Sheet, Next Step. - **`overshoot`** — The overshoot question: where the reduction comes from. Gain reduction is the overshoot times (1 − 1/R), and only one of those two terms varies by much. This reads them apart: what the overshoot contributes, what the whole ratio dial is worth against it, and what three decibels of threshold buys instead. Sections: Summary, Where The Reduction Comes From, What The Ratio Adds, What The Threshold Adds, Next Step. - **`chain`** — The chain question: what the stages do to each other. Each stage sees the output of the one before it, so the same panel settings mean different things at different positions. This reads the chain in order: what each stage really gets, what the ratios multiply to, and which stages have been starved of their overshoot by the one in front. Sections: Summary, Stage By Stage, What Multiplies, What Starves, Next Step. - **`deliver`** — Decide what changes: a threshold, a ratio, or a stage. Sorts every finding into what moving a threshold fixes, what only removing or reordering a stage fixes, and what nothing fixes. Raising a ratio appears in almost none of those buckets, which is the point — it is the control that gets reached for and the one worth the least. Sections: Summary, A Threshold Fixes, Only Removing A Stage Fixes, Nothing Fixes, Next Step. ## Findings All 28 are computed in the browser and cost nothing. | Code | Severity | Scope | What it means | | --- | --- | --- | --- | | `PEAK-ASSUMED` | warn | chain | The programme peak was assumed | | `AVERAGE-ASSUMED` | warn | chain | The programme average was assumed | | `KNEE-ASSUMED` | note | chain | The knee was assumed hard | | `TRANSIENT-ASSUMED` | note | chain | The transient length was assumed | | `NO-STAGES` | error | chain | No stages, so nothing is compressing | | `RATIO-BELOW-UNITY` | error | stage | A ratio below 1:1 is expansion, not compression | | `THRESHOLD-ABOVE-ZERO` | error | stage | A threshold above 0 dBFS can never be reached | | `THE-OVERSHOOT-DOES-THE-WORK` | note | stage | The overshoot sets the reduction, not the ratio | | `STAGE-REDUCTION` | note | stage | What this stage removes, at the peak and at the average | | `STAGE-DOES-NOTHING` | warn | stage | This stage never engages | | `STAGE-BARELY-ENGAGES` | note | stage | This stage does almost nothing | | `RATIO-IS-A-LIMITER` | note | stage | At this ratio the stage is a limiter | | `STARVED-BY-THE-STAGE-BEFORE` | warn | stage | The stage in front has already taken the overshoot away | | `THRESHOLD-BEATS-RATIO` | note | chain | Three decibels of threshold beats going from 4:1 to 10:1 | | `RATIOS-MULTIPLY-IN-SERIES` | warn | chain | The stages multiply, so the chain is steeper than any of them | | `TOTAL-REDUCTION` | note | chain | What the chain removes in total | | `HEAVY-REDUCTION` | warn | chain | The chain is doing the performing | | `DYNAMIC-RANGE-LEFT` | note | chain | How much of the original range survives | | `KNEE-STARTS-EARLY` | note | stage | The soft knee starts below the threshold | | `ATTACK-NEVER-ARRIVES` | warn | stage | The attack is too slow to reach its own target | | `ATTACK-CATCHES-IT` | note | stage | The attack is fast enough for this transient | | `MAKEUP-RAISES-THE-FLOOR` | warn | chain | Makeup gain raises everything below the threshold too | | `THRESHOLD-FOR-A-TARGET` | note | stage | The threshold that would deliver a chosen reduction | | `RATIO-CANNOT-REACH-IT` | note | stage | No ratio delivers that much at this overshoot | | `SLOPE-IS-WHAT-A-RATIO-IS` | note | stage | What the ratio contributes, as a number | | `ONE-STAGE-ONLY` | note | chain | One stage, so nothing multiplies | | `PEAK-AT-OR-ABOVE-FULL-SCALE` | warn | chain | The programme is already at or over full scale | | `STAGES-IN-ORDER` | note | chain | The stages were computed in order, not independently | ## What this page cannot do This page computes from the levels and settings on the sheet. It has not heard anything. - **It is a static curve.** Real compression is a moving envelope with an attack and a release acting on a detector, and the reduction at any instant depends on what came before it. The attack column is the only dynamic thing here and it is a single-pole approximation of one transient in isolation. - **Peak and average are two numbers standing in for a distribution.** A programme is not two levels; the same peak and average can come from a performance that sits still and one that jumps, and a compressor treats those completely differently. - **The detector is not modelled.** Peak, RMS and true-peak detection see the same audio as different levels, and a stage's threshold means something different in each. So does whether the detector is fed before or after the makeup gain. - **Nothing here knows about programme loudness.** LUFS is an integrated measurement over time with a frequency weighting, and none of that is in a peak-and-average model. - **Makeup gain is treated as exactly restoring the reduction.** In practice it is another control, often with its own auto-makeup behaviour, and where the detector sits relative to it changes the loop. - **No stage's own colour is modelled** — the distortion, the frequency-dependent detector, the transformer, the optical cell. Those are often the reason a particular compressor was chosen, and they are entirely absent here. - **The knee formula is the standard quadratic**, which is one of several shapes real devices use; two compressors with the same threshold, ratio and knee width can still differ by a decibel near the threshold. - **Series behaviour assumes the signal is above every threshold.** Below one of them the multiplication does not apply, which is exactly why the stages are run in order rather than multiplied. - Nothing here reaches the network, reads a file, or listens to anything. ## API `POST https://api.skillsafe.ai/v1/app-api/run` with a bearer token from https://comp-desk.skillsafe.ai/tokens.html. The body IS the input object — there is no `input` wrapper and no `X-App-Slug` header. `task` is required and must be one of plan, check, overshoot, chain, deliver. `POST /estimate` is free and validates the same body. Full documentation at https://comp-desk.skillsafe.ai/api.html. ## Provenance Lanes derived from the `sherpa-onnx-tts` skill in https://github.com/steipete/clawdis. The arithmetic, thresholds, sheet grammar and findings are this app's own. Not affiliated with or endorsed by the authors of that repository.