Every clip placed in an arrangement’s playlist is one playlist item. An arrangement’s playlist items event (233) holds them all, as 80-byte records with nothing between them. The first 60 bytes of each record keep the layout of FL Studio 21, and 20 bytes follow that are not understood. 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 | u32 or f32 | start_offset | Start offset within the item. See Start and end offsets. |
| 28 | 4 | u32 or f32 | end_offset | End offset within the item. |
| 32 | 4 | u32 | clip_id | A clip ID. Read by DawVert. |
| 36 | 4 | f32 | fade_in | The clip’s fade-in. Read by DawVert. |
| 40 | 4 | f32 | fade_in_tension | The shape of the fade-in. Read by DawVert. |
| 44 | 4 | f32 | fade_out | The clip’s fade-out. Read by DawVert. |
| 48 | 4 | f32 | fade_out_tension | The shape of the fade-out. Read by DawVert. |
| 52 | 4 | f32 | volume | The clip’s gain. Read by DawVert. |
| 56 | 4 | bytes | fade_flags | Flags for the fades. Read by DawVert. |
| 60 | 20 | bytes | unknown | Unknown. New in FL Studio 2024 and 2025, giving 80-byte records. |
Bytes 32 to 59 came in with FL Studio 21, whose changelog adds “fade in, fade out and gain to audio clips” (20.99 beta 3). PyFLP reads them as unknown bytes. The names and types above are DawVert’s reading, not confirmed by Image-Line.
Record size
The 80-byte size comes from a proposed change to PyFLP (pull request 205), checked against projects saved by FL Studio 2025. It reads the 20 new bytes but does not say what they hold. The pull request labels the size “FL Studio 2024/2025 (21.2+ / 25.x)”, but no file from FL Studio 2024 (24.x) has been found to show it. The flpkit reader also reports 80-byte records, in 17 of the demo projects that come with FL Studio.
Whether every record is 80 bytes is open. The pull request says that edited clips can leave the event with a length that fits no fixed record size; flpkit found a single record size in each of the 49 files it was checked against. The explorer takes the event as whole 80-byte records and turns down a file whose playlist events do not divide by 80.
Start and end offsets
Bytes 24 to 31 say which part of the item’s source is played. DawVert and FLParser
read them as whole ticks for pattern clips and as 32-bit floats for audio clips. A
value of −1.0, or FF FF FF FF, means none.
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. Each arrangement has
500 tracks, as in FL Studio 20 and 21, so subtract the field from 499 to get the
track:
track index = 499 − track
So the first track, index 0, is stored as 499.