Skip to content

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:

u32 1 | u32 item_id | u32 n_columns | n_columns × int32
  • One column per channel. A stereo track occupies two columns with the same name; a mono track one.
  • Item 0xBC is the exception: it holds n_columns length-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.