Every FLP file starts with a 14-byte header chunk whose ID is FLhd.
Image-Line’s own description of the format, written for FruityLoops 1.7 in 1999, covers
it in full, and adds that “most of this chunk is not used”.
00000000 46 4C 68 64 06 00 00 00 00 00 10 00 60 00 46 4C FLhd........`.FL
Fields
All numbers are little-endian. The names are the ones the 1999 document uses.
| Offset | Size | Type | Name | Description |
|---|---|---|---|---|
| 0 | 4 | ASCII | ChunkID | Always FLhd (46 4C 68 64). |
| 4 | 4 | u32 | Length | The size of the rest of the header: 6, “because of the 3 words below”. |
| 8 | 2 | u16 | Format | Set to 0 for full songs. See File type. |
| 10 | 2 | u16 | nChannels | The total number of channels, which the document notes is “not really used”. |
| 12 | 2 | u16 | BeatDiv | Pulses per quarter note: the number of ticks in one beat. |
The data chunk follows straight after, at offset 14.
File type
The 1999 document defines only one value: 0, a full song. PyFLP notes that from FruityLoops 2.5 the same container was also used for other files, such as channel and plugin presets, with other values in this field. Which values these versions write is not recorded, so a reader looking for projects should expect 0.
Pulses per quarter note
Positions and lengths in the event stream are counted in ticks, and
BeatDiv says how many ticks make one beat. The values these versions
allow are not documented.