The 1999 document has no note records: its patterns are step data, stored as note-on and step events. Later files keep each pattern’s notes in a pattern notes event (224) as a run of fixed-size records, and controller changes in event 223. Two readers describe these records, and they disagree on the note size. Which one files from this era use, and in which version event 224 first appears, is not recorded.
Note record, 20 bytes
LMMS’s old importer, removed after LMMS 1.0, reads 20-byte records and uses these fields. All numbers are little-endian, and positions and lengths are in ticks.
| Offset | Size | Type | Name | Description |
|---|---|---|---|---|
| 0 | 4 | i32 | position | Where the note starts in the pattern. |
| 6 | 1 | u8 | channel | The channel that plays the note. |
| 8 | 4 | i32 | length | How long the note lasts. |
| 12 | 1 | u8 | key | The note number. |
| 16 | 1 | u8 | pan | Panning of the note. |
| 17 | 1 | u8 | volume | The note’s volume. |
The other bytes are not read by LMMS and their meaning is unknown.
Note record, 24 bytes
PyFLP reads 24-byte records from every version: position (4 bytes), flags (2), channel (2), length (4), key (2), group (2), then single bytes for fine pitch, an unknown byte, release, MIDI channel, pan, velocity and two modulation values. It marks the fine pitch byte as new in version 3.3. Its layout has been checked against FL Studio 20 files, not against files from this era.
Divide the event size by 20 and by 24: if only one divides evenly, that settles the record size.
Controller record
Event 223 holds 12-byte records, one controller change each. LMMS reads three little-endian 32-bit values: the position, then the channel in the high 16 bits and the controller number in the low 16 bits, then the value as an integer. PyFLP reads the same 12 bytes from later files with the value as a 32-bit float. Which reading suits this era is not known.