Every clip placed in an arrangement’s playlist is one playlist item. An arrangement’s playlist items event (233) holds them all, as fixed-size records with nothing between them. FL Studio 21 lengthened each record from 32 bytes to 60, and later releases lengthened it again. See Record size.
Record
Every number is little-endian. Positions and lengths are in ticks.
| Offset | Size | Type | Name | Description |
|---|---|---|---|---|
| 0 | 4 | u32 | position | Where the item starts in the playlist, in ticks. |
| 4 | 2 | u16 | pattern_base | Always 20480. See What an item plays. |
| 6 | 2 | u16 | item_index | What the item plays: a pattern or a channel. |
| 8 | 4 | u32 | length | The item’s length, in ticks. |
| 12 | 2 | u16 | track | The track the item sits on, counted backwards. See Track numbers. |
| 14 | 2 | u16 | group | The item group. |
| 16 | 2 | bytes | unknown | Unknown. Usually 78 00. |
| 18 | 2 | u16 | item_flags | Item flags. Usually 64. |
| 20 | 4 | bytes | unknown | Unknown. Usually 40 64 80 80. |
| 24 | 4 | f32 | start_offset | Start offset within the item. |
| 28 | 4 | f32 | end_offset | End offset within the item. |
| 32 | 28 | bytes | unknown | Unknown. Added in FL Studio 21, giving 60-byte records. |
| 60 | varies | bytes | unknown | Unknown. Only in the longer records of later releases; see below. |
Record size
The first 32 bytes keep the layout of FL Studio 20. What follows them has grown:
| Saved by | Record size | Source |
|---|---|---|
| FL Studio 21 | 60 bytes | PyFLP |
| FL Studio 2024 and 2025 | 80 bytes | a proposed change to PyFLP, not yet merged |
| FL Studio 2026 | 88 bytes | flpkit, a newer reader |
None of the extra bytes are understood. PyFLP picks the record size from the event’s
length rather than from the version, and flpkit finds it by looking for the constant
pattern_base value 20480 at the same offset in each record. A reader can do
the same: try each known size and keep the one where every record has 20480 at offset
4. Some lengths divide by more than one size, such as 480, so the version string in the
project events
is a useful cross-check.
What an item plays
An item plays either a pattern or a channel’s clip, such as an audio or automation
clip. The item_index tells them apart by comparing it with
pattern_base, which is always 20480:
- Greater than 20480: a pattern. The pattern index is
item_indexminus 20480. - 20480 or less: a channel. The value is the channel index.
Track numbers
The track field counts down from the last track. PyFLP treats every
version from 12.9.1 on as having 500 tracks per arrangement, so subtract the field from
499 to get the track:
track index = 499 − track
So the first track, index 0, is stored as 499. No source records a change to the track count after FL Studio 20; check against a known project before relying on it.