Introduction
An FST file is a preset saved by FL Studio, Image-Line’s music production software, once called FruityLoops: the settings of one channel, one plugin or one mixer insert, kept so that they can be loaded again into another project. The instrument and effect presets that ship with FL Studio, such as the Sytrus and 3x Osc patches, are FST files.
A preset is not a format of its own. It is an FLP project
in miniature: the same two chunks, FLhd and FLdt, and the same
events. Only two things differ. The file type in the header is not 0 (a project) but 32, 48
or 64, and the event stream holds only what one channel, one plugin or one insert needs: no
patterns, no playlist, no tempo. So everything about how events are laid out is on the
FLP pages, and these pages describe what is particular to presets.
Image-Line has never published the preset layout. What is written here was checked
against FL Studio’s own presets on this site’s author’s disks (1,868 files with different
contents, saved by versions 2.2.0 to 5.0.1) and against the 61 presets in PyFLP’s test
assets, saved by FL Studio 11.5.13, 12.5.0.45, 20.8.4 and 20.9.1, which gave the UTF-16
text of 11.5 and later and the FL Studio 20 layout. The file types and their names come
from PyFLP’s FileFormat. Nothing from versions 6 to 11.4 or from 21 on was
available, and those are assumed to follow the FLP layouts for their versions.
Variations
| Format | Variation | About | Open |
|---|---|---|---|
.FST | FL Studio channel preset | File type 32: one channel of the channel rack, with its sample or plugin. | Open |
.FST | FL Studio plugin preset | File type 48: one plugin’s name and saved state, with no channel around it. | Open |
.FST | FL Studio mixer preset | File type 64: one mixer insert, with its effect plugin and its settings. | Open |
The header’s file type, in the two bytes at offset 8, tells them apart. The viewer on this site reads the type first and then reads the rest with the FLP layout that fits the version event, so each preset is shown by the variant its file type names, and a file whose type is 0 is left to the FLP reader.
FL Studio channel preset
The file type is 32. The events are those of a single channel, opened by a New channel event, and the file ends with the channel’s sample path, if it plays a sample.
FL Studio plugin preset
The file type is 48. After the version there are three events: the plugin’s name, the wrapper settings and the plugin’s state. Nothing else.
FL Studio mixer preset
The file type is 64. The events are an effect plugin’s (when the insert has one), then the insert’s colour and name and its mixer parameters.
Structure
Every preset starts with the 14-byte FLhd header chunk and ends with the
FLdt data chunk, which runs to the end of the file. The header is the same
as in a project: a file type, a channel count and the timing resolution (PPQ).
0FLhd header chunk: ID, length 68 bytes8File type: 32, 48 or 64 as a 16-bit number2 bytes10Channels: a count that varies from file to file2 bytes12PPQ: ticks to a beat, 96 in nearly every file2 bytes14FLdt data chunk: ID and length of the events8 bytes22Events: the version, then what the preset holdsvaries
PyFLP describes the channel count as the number of channels in the channel rack (for a Patcher preset, the number of plugins inside it), and writes the number of channels it holds when it saves. For presets that fits what was seen: it does not count what is in the preset, because a channel preset holds one channel and carries values from 1 to 27 in the FL Studio 3 and 5 folders, so FL Studio fills it in from the project the preset was saved from (which this site’s sources do not say outright). PyFLP’s FL Studio 20 presets have 1 (channel and plugin presets, mostly) or 18 (mixer presets). A reader should ignore it. The PPQ is 96 in nearly all files; of the 723 presets in the FL 3 and FL 5 folders, three have 24, one has 120 and two have 192.
A preset has no notes, so the note and playlist record sizes that separate the FLP layouts never matter; what does matter is the layout of the text events, which changes with the version in the same way as in a project.
Worked example
The start of the plugin preset FX - sea and wind.fst from the Sytrus
pack of FL Studio 5, 37,936 bytes long:
00000000 46 4c 68 64 06 00 00 00 30 00 05 00 60 00 FLhd, length 6, type 48, 5, PPQ 96
0000000e 46 4c 64 74 1a 94 00 00 FLdt, length 0x941A = 37,914
00000016 c7 06 34 2e 35 2e 30 00 event 199, version "4.5.0"
0000001e c9 07 53 79 74 72 75 73 00 event 201, plugin "Sytrus"
00000027 d4 34 00 00 00 00 ... event 212, 52 bytes of wrapper settings
0000005d d5 cf a7 02 ... event 213, length 0x4F, 0x27, 0x02 =
37,839 bytes of plugin state
The length 37,914 is the file size minus the 22 bytes before the events, so the data chunk ends exactly at the end of the file, as it does in every file examined.
File types
The header’s file type, as PyFLP names the values. Only 32, 48 and 64 were seen in files.
| Type | Name | Seen |
|---|---|---|
| 0 | Project (.flp) | Not a preset; left to the FLP reader. |
| 16 (0x10) | Score (.fsc): pattern notes and controller events | No file. The explorer reads it as an FLP stream and names it a score or automation preset. |
| 24 (0x18) | Automation: controller events and automation channels | No file; read as above. |
| 32 (0x20) | Channel state, plugin events included | Yes: channel preset |
| 48 (0x30) | Native plugin state, on a channel or an insert slot | Yes: plugin preset |
| 49 (0x31) | Plugin events of a VST instrument | No file; read as a plugin preset. |
| 50 (0x32) | Plugin events of a VST effect | No file; read as a plugin preset. |
| 64 (0x40) | Insert state: an insert and all its slots | Yes: mixer preset |
| 80 (0x50) | Probably Patcher, but PyFLP says Patcher presets are saved as type 48 | No file; not read as a preset. |
PyFLP says the preset container began with FL Studio 2.5.0. The earliest preset seen here was saved by 2.2.0, which writes the same header.
Other uses of .fst
The extension is shared, and the contents settle which one a file is. A viewer should read the first bytes, not trust the name.
| Starts with | What it is |
|---|---|
46 4C 68 64 (“FLhd”), then a file type of 32, 48 or 64 | An FL Studio preset, described on these pages. A file type of 0 is an FLP project with the wrong extension. |
D6 FD B2 7E (0x7EB2FDD6, little-endian) | A binary finite-state transducer written by the OpenFst library. macOS keeps its speech recognition pronunciation maps in this form: eight pmap.*.fst files in SpeechRecognitionSharedSupport.framework were examined. Each has the strings “vector” and “standard”, a version of 2, flags of 3, two symbol tables of phoneme names and one state holding 1,519 to 2,914 arcs. The layout is on its own page, OpenFst transducer, and the explorer reads the header, both tables and the arcs. |
| Plain text | An implementation file in the F* programming language (its interface files are .fsti). Not examined here; the explorer shows such a file as bytes. |
Not described
This page and its three variant pages are partial. What they leave out, and what the explorer does not do:
| Item | Reference | Viewer |
|---|---|---|
| Versions 6 to 11.4 and FL Studio 21 on | No preset from these versions was seen; the layout is assumed to follow the FLP pages. | Reads them with the FLP layouts for the version; unchecked on a real preset. |
| File types 16, 24, 49, 50 and 80 | Named from PyFLP only; no file was seen, and no page describes them. | 16 and 24 are read as a score or automation preset, 49 and 50 as plugin presets; 80 is not read as a preset. |
| Plugin states | Only the native layouts and the Fruity Wrapper chunks listed on the plugin preset page. | Shows the state of every other plugin as bytes. |
| Event 37 and other unknown events | Meaning unknown. | Shows them as numbers or bytes. |
| Header channel count | Explained only as PyFLP defines it (the rack size of the source project); how FL Studio fills it for a preset is not documented. | Shows the number; does not use it. |
| F* source files | Mentioned, not described. | No parser; shown as bytes. |
| OpenFst files | On their own page, which is partial. | Reads the vector type with standard arcs only. |
| Editing | Not applicable. | Read-only. |
Also used for
- OpenFst transducer – OpenFst’s binary finite-state transducer: a header and symbol tables, then the states.
Links
Software
Developers
- PyFLP – library that reads FLP files, whose header notes mention the other file types (Python)
Reference
- The FLP file format – this site’s reference for the header and events that presets share