Every clip placed in the playlist is one playlist item. The playlist items event (233) holds them all, as fixed-size records with nothing between them. There is one such event for the whole project, because these versions have a single playlist.
Record
PyFLP reads these files with the same 32-byte record it uses for FL Studio 20. Every number is little-endian, and 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 | 20480 in the files PyFLP was tested on. 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. |
| 18 | 2 | u16 | item_flags | Item flags. PyFLP notes a muted flag from version 9.0. |
| 20 | 4 | bytes | unknown | Unknown. |
| 24 | 4 | f32 | start_offset | Start offset within the item. |
| 28 | 4 | f32 | end_offset | End offset within the item. |
This layout has not been confirmed for these versions. LMMS’s old importer, removed after LMMS 1.0, read 28-byte records from the same event with a different way of naming the pattern, and no source says when the 28-byte form gave way to 32 bytes. Check that the event size divides by 32 before relying on the table.
What an item plays
An item plays either a pattern or a channel’s clip, such as an audio or automation
clip. PyFLP tells them apart by comparing item_index with
pattern_base:
- Greater than
pattern_base: a pattern. The pattern index isitem_indexminuspattern_base. - Otherwise: a channel. The value is the channel index.
PyFLP notes that pattern items in this event date from version 7.0 and channel items from 2.0.1.
Track numbers
The track field counts down from the last track. The playlist in these
versions has 199 tracks, so subtract the field from 198 to get the track:
track index = 198 − track
So the first track, index 0, is stored as 198. This is how both PyFLP and FLParser read files from before version 12.9.1.