Conversions¶
How stored values become the numbers shown in the Fairlight UI, and how each conversion was established. Item ids: Fairlight model.
Fader, gain, pan, routing¶
| Control | Item | Conversion | Evidence |
|---|---|---|---|
| fader | 0x001 |
÷10 dB, post-dynamics | track: −60 / −200 rendered −6.0 / −20.0 dB. Bus (first part of the bus table): −60 / −200 / +60 rendered exactly −6.0 / −20.0 / +6.0 dB |
| pre-dynamics gain | 0x019 |
÷10 dB, before Dynamics | with the limiter on, −60 lowered the output by only 0.4 dB, so it acts before the dynamics (UI name not confirmed) |
| mute | 0x002 |
1 = muted | bus: 1 rendered silence |
| solo | 0x011 |
1 = solo | |
| pan bypass | 0x00D |
1 = pan off; reported inverted as pan_on |
|
| pan L/R | 0x004 |
÷10 = %, −100 … +100 | |
| Effects In | 0x01D |
1 = on | toggled in the UI: 0 → 1 |
| EQ master switch | 0x0DF |
1 = on | default 1; switching it off in the UI gave 0 |
| processing order | 0x0DE |
0 EQ→DY→FX, 1 EQ→FX→DY, 2 DY→EQ→FX, 3 DY→FX→EQ, 4 FX→EQ→DY, 5 FX→DY→EQ (default) | all six orders selected in the UI one by one |
| track selected | 0x0AA |
1 = the track header is selected (UI state only, no effect on sound) | selecting A1 then A2 changed [1,0,0,0] → [0,1,0,0] |
| output connected / bus | 0x400 / 0x40B |
flag / bus index (0 = Bus 1, −1 = none) |
Built-in EQ¶
Six bands per strip. Band k uses the ids below (k = 1 … 6).
| Control | Item | Conversion |
|---|---|---|
| band on | 0x100+k |
1 = on |
| filter type | 0xF8+k |
1 low shelf, 2 bell, 3 high shelf, 4 notch, 5 low-pass (band 6 default), 6 high-pass (band 1 default) |
| frequency | 0xF0+k |
Hz as-is |
| gain | 0xE0+k |
÷10 dB |
| Q | 0xE8+k |
Q = −0.615 + 0.06567 × raw, clamped to 0.3 … 10.3, one decimal |
| range (bands 2–5) | 0x287+k |
0 L, 1 ML, 2 MH, 3 H. Factory defaults 0, 1, 2, 3 for bands 2–5 |
| slope (bands 1 and 6) | 0x4BE / 0x4C3 |
0 = 6, 1 = 12, 2 = 18, 3 = 24 dB/oct |
| knob (raw) | 0x333+k |
follows the frequency (≈ 94 per natural-log unit of Hz, 0–256); probably the knob position; not used for display |
The Q formula is fitted to 6 UI points between 0.8 and 5.0; all six match to the displayed digit. The UI range is 0.3–10.3; the ends were not checked. An older mapping that read the band 1 type from 0x0DE was wrong (that item is the processing order).
Built-in Dynamics¶
Linear knobs¶
| Control | Item | Conversion |
|---|---|---|
| make-up | 0x109 |
÷10 dB |
| compressor on / threshold / knee / mix | 0x10C / 0x10E / 0x10F / 0x117 |
flag / ÷10 dB / as-is / as-is |
| expander on / threshold / range | 0x114 / 0x116 / 0x115 |
flag / ÷10 dB (single point, assumed) / ×0.6 dB |
| expander mode | 0x11B |
0 = expander; any non-zero value shows the gate |
| limiter on / threshold | 0x11D / 0x11E |
flag / ÷10 dB |
Time and ratio knobs: two encodings¶
Ratio, attack, hold and release of the compressor, expander and limiter are not linear. A stored value r uses one of two encodings, and both can appear in the same project.
| Encoding | Condition | UI value |
|---|---|---|
| legacy (templates, factory defaults) | r ≤ 100 |
r is the knob position in %; log-interpolate the legacy table |
| current (values set in Resolve 21) | r ≥ 5000 |
M = (r + 5) // 100 (knob position 0 … 1000), d = r − 100·M (−5 … 94); UI = law[M] + d × fine |
| out of range | 101 ≤ r ≤ 4999 |
the UI field is blank (画面空欄(raw=…)) |
fineis 1 ms for time knobs and 0 for ratio.- Values typed into the UI have so far always been stored with
d = −4. Example: attack 4.0 ms is stored as 40496 → M = 405 (law 8.0 ms), d = −4 → 8.0 − 4 = 4.0 ms. - Example: ratio stored as 51996 → M = 520, d = −4 (fine 0) → between law[500] = 2.9 and law[550] = 3.2 → 3.0:1.
- Example (legacy): release stored as 20 → legacy table → 93 ms.
| Knob | Item | Law | Notes |
|---|---|---|---|
| compressor ratio | 0x10D |
ratio |
UI x:1, max 20 |
| compressor attack / hold / release | 0x110 / 0x111 / 0x112 |
attack / hold / release |
attack minimum 0.70 ms |
| expander ratio | 0x253 |
exp_ratio |
UI 1:x, max 3.0 |
| expander attack / hold / release | 0x118 / 0x119 / 0x11A |
exp_attack / hold / release |
attack minimum 0.50 ms |
| limiter attack / hold / release | 0x11F / 0x120 / 0x121 |
lim_attack / hold / release |
attack minimum 0.70 ms |
Compressor and expander attack share one curve (only the minimum differs); hold is shared by all three processors; release is shared, and equals hold for M ≥ 200. Hold and release are capped at 4000 ms.
Interpolation and display¶
law[M]is defined every 50 steps plus a few measured points. Between two table points the value is interpolated logarithmically when both ends are positive, otherwise linearly. Outside the table the end value is used (no extrapolation).- The attack minimum (
floor) and the law maximum (max) are applied after the conversion. - Display: below 1 two decimals, below 9.95 one decimal, otherwise an integer — as the Fairlight UI shows it. Ratio is printed
x:1, expander ratio1:x.
Tables (current encoding)¶
Generated from dyn_laws in drpkit/fairlight_map.yaml. Units: ms for time knobs, ratio for ratio / exp_ratio.
| M (knob position) | ratio |
exp_ratio |
attack |
exp_attack |
lim_attack |
hold |
release |
|---|---|---|---|---|---|---|---|
| 0 | 1.2 | 1.1 | 0.7 | 0.5 | 0.7 | 0 | 50 |
| 50 | 1.2 | 4.7 | 4.5 | 4.7 | 4 | 55 | |
| 75 | 1.3 | 4.7 | 4.6 | 6.5 | 59 | ||
| 100 | 1.3 | 4.7 | 4.6 | 4.7 | 11 | 63 | |
| 150 | 1.4 | 4.8 | 4.8 | 4.7 | 50 | 72 | |
| 152 | 1.3 | ||||||
| 165 | 75 | 75 | |||||
| 200 | 1.5 | 5.1 | 5.1 | 4.7 | 84 | 84 | |
| 250 | 1.7 | 5.5 | 5.5 | 4.7 | 100 | 100 | |
| 263 | 1.5 | ||||||
| 300 | 1.8 | 6 | 6 | 4.7 | 125 | 125 | |
| 322 | 4.81 | 138 | 138 | ||||
| 350 | 2 | 6.8 | 6.8 | 5.1 | 158 | 158 | |
| 400 | 2.3 | 1.7 | 7.9 | 7.9 | 5.6 | 201 | 201 |
| 404 | 206 | 206 | |||||
| 405 | 8 | 8 | 5.7 | 207 | 207 | ||
| 410 | 212 | 212 | |||||
| 450 | 2.5 | 9.3 | 9.3 | 6.5 | 260 | 260 | |
| 500 | 2.9 | 11 | 11 | 7.5 | 335 | 335 | |
| 550 | 3.2 | 14 | 14 | 9 | 431 | 431 | |
| 600 | 3.7 | 2.1 | 17 | 17 | 11 | 560 | 560 |
| 650 | 4.2 | 22 | 22 | 13 | 737 | 737 | |
| 675 | 24 | 24 | 836 | 836 | |||
| 700 | 5 | 27 | 27 | 15 | 949 | 949 | |
| 750 | 5.8 | 34 | 34 | 17 | 1205 | 1205 | |
| 800 | 7 | 2.5 | 42 | 42 | 19 | 1523 | 1523 |
| 850 | 8.4 | 52 | 52 | 22 | 1905 | 1905 | |
| 900 | 10 | 63 | 63 | 25 | 2374 | 2374 | |
| 950 | 12 | 76 | 76 | 28 | 2889 | 2889 | |
| 1000 | 16 | 2.9 | 90 | 90 | 31 | 3457 | 3457 |
ratio: fine = 0, max = 20 · exp_ratio: fine = 0, max = 3 · attack: fine = 1 · exp_attack: fine = 1 · lim_attack: fine = 1 · hold: fine = 1, max = 4000 · release: fine = 1, max = 4000
Tables (legacy encoding, r ≤ 100)¶
| legacy r (knob %) | ratio |
exp_ratio |
attack |
exp_attack |
lim_attack |
hold |
release |
|---|---|---|---|---|---|---|---|
| 0 | 1.2 | 1.1 | 0.7 | 0.5 | 0.7 | 0 | 50 |
| 10 | 1.4 | 1.3 | 0.78 | 0.71 | 32 | 66 | |
| 15 | 1 | 1 | 78 | 78 | |||
| 20 | 1.6 | 1.4 | 0.71 | 93 | 93 | ||
| 25 | 1.6 | 1.9 | 1.9 | 116 | 116 | ||
| 28 | 134 | ||||||
| 30 | 2 | ||||||
| 33 | 3.2 | 3.2 | |||||
| 40 | 1.8 | 2.3 | |||||
| 50 | 3.1 | 9.4 | 9.4 | 4.7 | 408 | 408 | |
| 55 | 2.1 | ||||||
| 59 | 4 | ||||||
| 60 | 700 | ||||||
| 75 | 2.5 | ||||||
| 80 | 1827 | ||||||
| 90 | 2.8 | ||||||
| 99 | 3859 | 3859 | |||||
| 100 | 20 | 3 | 100 | 100 | 30 | 4000 | 4000 |
ratio: fine = 0, max = 20 · exp_ratio: fine = 0, max = 3 · attack: fine = 1 · exp_attack: fine = 1 · lim_attack: fine = 1 · hold: fine = 1, max = 4000 · release: fine = 1, max = 4000
How the tables were made, and how accurate they are¶
- Write chosen stored values into a copy of a project with
drpkit write. - Import the copy into Resolve 21.1.1 and read the Dynamics window.
- 23 projects × 10 knobs, plus individual points; the readings are in
tests/data/dyn_law_sweep_readings.txt, the plan intests/data/dyn_law_sweep_plan.json, andtests/test_dyn_law.pychecks every one.
Blind check on 20 points that were not used to build the tables: 11 exact, 5 off by one in the last displayed digit, 3 off by 0.2–0.8 %, 1 outlier (hold at M = 165; that point was then added to the table). In general the conversion is within ±1 % (the last displayed digit); hold and release around knob position 100–250 can be off by more.
The expander ratio (0x253) points — legacy 0 → 1.1, 10 → 1.3, 25 → 1.6, 40 → 1.8, 55 → 2.1, 75 → 2.5, 90 → 2.8, 100 → 3.0; current M = 152 → 1.3, 263 → 1.5, 400 → 1.7, 600 → 2.1, 800 → 2.5, 1000 → 2.9 — were all read on the UI (8 after writing values with the writer). They are all in the table, so the test is not an independent check for this knob.
Plugins and clips¶
Plugin knob formulas (normalized 0–1 → UI): Plugins. Clip volume, fades, fade curves and keyframes: Clips & edits.