Fairlight model (FLStudioModelBA)¶
The whole Fairlight mixer of a timeline — tracks, buses, built-in EQ and Dynamics, plugins, routing — is one binary blob: the FLStudioModelBA value in the Sm2Sequence FieldsBlob (see .drp and Project.db). After qCompress decompression it holds two kinds of data that drpkit reads: channel settings tables and plugin records.
The machine-readable source of truth for every item id and conversion is drpkit/fairlight_map.yaml. The item table below is generated from it.
Channel settings tables¶
A run of little-endian records:
- One column per channel. A stereo track occupies two columns with the same name; a mono track one.
- Item
0xBCis the exception: it holdsn_columnslength-prefixed UTF-8 strings — the channel names. It is how tables are found and told apart. - If an item id appears twice in a table, the first occurrence is used.
There are several tables, recognized by their names:
| Table | Names look like |
|---|---|
| track table | the track names |
| bus table | Bus 1, Bus 2, … (starts at item 0x1D) |
| others | VCA…, Mapping…, Folder… (not read) |
How the reader finds them: it locates every 0xBC record, walks backwards record by record to the start of its table, then parses forward until the record pattern breaks.
The bus table's first part¶
The bus table is split. Its first part — fader 0x001, mute 0x002, pre-gain 0x019, pan … — is stored separately, earlier in the blob, right after a header u32 0, u32 7 (7 is the bus kind, the same number used in plugin ownership). The reader takes the last such run before the bus table whose column count equals the number of buses, and merges it into the bus strips.
Strip ids and routing¶
| Item | Tracks | Buses |
|---|---|---|
strip id 0x458 |
0 … n−1 (the second column of a stereo track is −1) | number of tracks + 1 |
bus channel count 0x1B4 |
— | as-is (2 = stereo) |
output connected / output bus 0x400 / 0x40B |
flag / bus index (0 = Bus 1, −1 = none) |
Plugin records¶
Each plugin instance — insert plugins on tracks and buses, and the track built-in FX — appears as an ASCII tag bmd:<Name>:<ID>.
offset from the tag content
−12 u8 kind | u8 column | u8 0 | u8 slot
−4 u32 owner (2 = mixer-owned instance)
0 256-byte NUL-padded name field "bmd:<Name>:<ID>"
256 4 × int32: plugin window rectangle (all −1 until the window was opened)
272 u32 state flags
... parameters until the next tag
| Field | Values |
|---|---|
| kind | 0 = track, 7 = bus |
| column | the column of the owning strip in its table |
| slot | 0–5 = insert slots 1–6; 6–10 = track built-in FX: 6 Voice Isolation, 7 Dialogue Leveler, 8 Dialogue Separator, 9 Music Remixer, 10 Ducker |
| owner | 2 for mixer-owned instances; 0 / 1 for built-in FX. Other values are templates (for example AutoMix presets) and are ignored |
| parameter | 64-byte NUL-padded name (Plugin::PARAM, or a bare name such as UI_BAS_PRESET) followed by a little-endian float32 normalized value 0–1 |
| state flags | track built-in Voice Isolation: bit 0x10 set = disabled, clear = enabled (the amount is kept while disabled). Unused built-in slots also carry 0x10. Not decoded for insert plugins or the other built-in FX (--all prints them raw) |
The knob conversions are listed in Plugins.
Confidence marks¶
Every converted value carries a mark that tells you how it was established.
| Mark | conf |
Meaning |
|---|---|---|
| (none) | direct |
stored value as-is or times a constant; cross-checked against known UI values |
| ² | two_point |
linear / log formula fixed by two or more known points |
| ※ | calib / law |
lookup table built from UI readings (interpolated for Dynamics). Unknown stored values print 未較正(raw=…) |
| ? | assumed |
single point, range assumed — reference only |
| ✗ | raw / uncal |
meaning unknown or not calibrated; raw value only |
All channel items¶
Generated from drpkit/fairlight_map.yaml (python tools/gen_map_docs.py). Item ids are the same in the track and bus tables. Kinds: scale = raw × constant, flag = 0/1, flag_inv = inverted flag, enum = lookup, affine = a + b × raw (clamped), law = built-in Dynamics conversion, raw = not decoded.
| Id | Item | Kind | Stored value → UI | Mark |
|---|---|---|---|---|
0x001 |
fader |
scale | ÷ 10 dB | ² two_point |
0x002 |
mute |
flag | 1 = on | direct |
0x004 |
pan_x |
scale | ÷ 10 % | direct |
0x00D |
pan_bypass |
flag_inv | 1 = off (reported inverted as pan_on) |
direct |
0x011 |
solo |
flag | 1 = on | direct |
0x019 |
pre_gain |
scale | ÷ 10 dB | ² two_point |
0x01D |
effects_in |
flag | 1 = on | direct |
0x0AA |
track_selected |
flag | 1 = on | direct |
0x0B9 |
unknown_0b9 |
raw | raw only (meaning unknown) | ✗ raw |
0x0DE |
proc_order |
enum | 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) | direct |
0x0DF |
eq_on |
flag | 1 = on | direct |
0x0E1 |
eq_band1_gain |
scale | ÷ 10 dB | direct |
0x0E2 |
eq_band2_gain |
scale | ÷ 10 dB | direct |
0x0E3 |
eq_band3_gain |
scale | ÷ 10 dB | direct |
0x0E4 |
eq_band4_gain |
scale | ÷ 10 dB | direct |
0x0E5 |
eq_band5_gain |
scale | ÷ 10 dB | direct |
0x0E6 |
eq_band6_gain |
scale | ÷ 10 dB | direct |
0x0E9 |
eq_band1_q |
affine | -0.615 + 0.06567 × raw, 0.3 … 10.3 | ※ calib |
0x0EA |
eq_band2_q |
affine | -0.615 + 0.06567 × raw, 0.3 … 10.3 | ※ calib |
0x0EB |
eq_band3_q |
affine | -0.615 + 0.06567 × raw, 0.3 … 10.3 | ※ calib |
0x0EC |
eq_band4_q |
affine | -0.615 + 0.06567 × raw, 0.3 … 10.3 | ※ calib |
0x0ED |
eq_band5_q |
affine | -0.615 + 0.06567 × raw, 0.3 … 10.3 | ※ calib |
0x0EE |
eq_band6_q |
affine | -0.615 + 0.06567 × raw, 0.3 … 10.3 | ※ calib |
0x0F1 |
eq_band1_freq |
scale | as-is Hz | direct |
0x0F2 |
eq_band2_freq |
scale | as-is Hz | direct |
0x0F3 |
eq_band3_freq |
scale | as-is Hz | direct |
0x0F4 |
eq_band4_freq |
scale | as-is Hz | direct |
0x0F5 |
eq_band5_freq |
scale | as-is Hz | direct |
0x0F6 |
eq_band6_freq |
scale | as-is Hz | direct |
0x0F9 |
eq_band1_type |
enum | 1 = low shelf, 2 = bell, 3 = high shelf, 4 = notch, 5 = low-pass, 6 = high-pass | direct |
0x0FA |
eq_band2_type |
enum | 1 = low shelf, 2 = bell, 3 = high shelf, 4 = notch, 5 = low-pass, 6 = high-pass | direct |
0x0FB |
eq_band3_type |
enum | 1 = low shelf, 2 = bell, 3 = high shelf, 4 = notch, 5 = low-pass, 6 = high-pass | direct |
0x0FC |
eq_band4_type |
enum | 1 = low shelf, 2 = bell, 3 = high shelf, 4 = notch, 5 = low-pass, 6 = high-pass | direct |
0x0FD |
eq_band5_type |
enum | 1 = low shelf, 2 = bell, 3 = high shelf, 4 = notch, 5 = low-pass, 6 = high-pass | direct |
0x0FE |
eq_band6_type |
enum | 1 = low shelf, 2 = bell, 3 = high shelf, 4 = notch, 5 = low-pass, 6 = high-pass | direct |
0x101 |
eq_band1_on |
flag | 1 = on | direct |
0x102 |
eq_band2_on |
flag | 1 = on | direct |
0x103 |
eq_band3_on |
flag | 1 = on | direct |
0x104 |
eq_band4_on |
flag | 1 = on | direct |
0x105 |
eq_band5_on |
flag | 1 = on | direct |
0x106 |
eq_band6_on |
flag | 1 = on | direct |
0x109 |
dyn_makeup |
scale | ÷ 10 dB | direct |
0x10C |
comp_on |
flag | 1 = on | direct |
0x10D |
comp_ratio |
law | Dynamics law ratio (see Conversions) :1 |
※ law |
0x10E |
comp_threshold |
scale | ÷ 10 dB | direct |
0x10F |
comp_knee |
scale | as-is | direct |
0x110 |
comp_attack |
law | Dynamics law attack (see Conversions) ms, minimum 0.7 ms |
※ law |
0x111 |
comp_hold |
law | Dynamics law hold (see Conversions) ms |
※ law |
0x112 |
comp_release |
law | Dynamics law release (see Conversions) ms |
※ law |
0x114 |
exp_on |
flag | 1 = on | direct |
0x115 |
exp_range |
scale | × 0.6 dB | ² two_point |
0x116 |
exp_threshold |
scale | ÷ 10 dB | ? assumed |
0x117 |
comp_mix |
scale | as-is | direct |
0x118 |
exp_attack |
law | Dynamics law exp_attack (see Conversions) ms, minimum 0.5 ms |
※ law |
0x119 |
exp_hold |
law | Dynamics law hold (see Conversions) ms |
※ law |
0x11A |
exp_release |
law | Dynamics law release (see Conversions) ms |
※ law |
0x11B |
exp_mode |
enum | 0 = Expander | ※ calib |
0x11D |
limiter_on |
flag | 1 = on | ² two_point |
0x11E |
limiter_threshold |
scale | ÷ 10 dB | direct |
0x11F |
limiter_attack |
law | Dynamics law lim_attack (see Conversions) ms, minimum 0.7 ms |
※ law |
0x120 |
limiter_hold |
law | Dynamics law hold (see Conversions) ms |
※ law |
0x121 |
limiter_release |
law | Dynamics law release (see Conversions) ms |
※ law |
0x13B |
unknown_13b |
raw | raw only (meaning unknown) | ✗ raw |
0x1B4 |
bus_channels |
scale | as-is | direct |
0x253 |
exp_ratio |
law | Dynamics law exp_ratio (see Conversions) 1: |
※ law |
0x289 |
eq_band2_range |
enum | 0 = L, 1 = ML, 2 = MH, 3 = H | ※ calib |
0x28A |
eq_band3_range |
enum | 0 = L, 1 = ML, 2 = MH, 3 = H | ※ calib |
0x28B |
eq_band4_range |
enum | 0 = L, 1 = ML, 2 = MH, 3 = H | ※ calib |
0x28C |
eq_band5_range |
enum | 0 = L, 1 = ML, 2 = MH, 3 = H | ※ calib |
0x334 |
eq_band1_knob |
raw | raw only (meaning unknown) | ✗ raw |
0x335 |
eq_band2_knob |
raw | raw only (meaning unknown) | ✗ raw |
0x336 |
eq_band3_knob |
raw | raw only (meaning unknown) | ✗ raw |
0x337 |
eq_band4_knob |
raw | raw only (meaning unknown) | ✗ raw |
0x338 |
eq_band5_knob |
raw | raw only (meaning unknown) | ✗ raw |
0x339 |
eq_band6_knob |
raw | raw only (meaning unknown) | ✗ raw |
0x400 |
route_connected |
flag | 1 = on | direct |
0x40B |
route_bus |
scale | as-is | direct |
0x458 |
strip_id |
scale | as-is | direct |
0x4BE |
eq_band1_slope |
enum | 0 = 6 dB/oct, 1 = 12 dB/oct, 2 = 18 dB/oct, 3 = 24 dB/oct | direct |
0x4C3 |
eq_band6_slope |
enum | 0 = 6 dB/oct, 1 = 12 dB/oct, 2 = 18 dB/oct, 3 = 24 dB/oct | direct |
Item families¶
| Family | Ids | Notes |
|---|---|---|
| EQ band k on (k = 1…6) | 0x100+k |
1 = on |
| EQ band k 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) |
| EQ band k frequency | 0xF0+k |
Hz as-is |
| EQ band k gain | 0xE0+k |
÷10 dB |
| EQ band k Q | 0xE8+k |
Q ≈ −0.615 + 0.06567 × raw |
| EQ band k range (k = 2…5) | 0x287+k |
0 L, 1 ML, 2 MH, 3 H |
| EQ band 1 / band 6 slope | 0x4BE / 0x4C3 |
0 = 6, 1 = 12, 2 = 18, 3 = 24 dB/oct |
| EQ band k knob (raw) | 0x333+k |
follows the frequency, ≈ 94 per natural-log unit of Hz, 0–256; probably the knob position, not used for display |
How each conversion was established: Conversions.