FLParser
A parser for FL Studio project files in .NET.
FLParser is a utility for parsing and structuring project files in FL Studio (FLP files). It is used by the MONAD Demogroup for converting FLP files to a format useable by the demo replayer.
FLParser is based on andrewrk's node-flp, but contains many improvements to clean up code and add compatability for newer versions of FL Studio.
Please note: FLParser is currently in beta. Only the minimal things that we need are currently implemented, and some of them might break - if they do, or you find something new, please submit an issue or pull request.
install
In commandline:
$ cd my/project/directory
$ git clone https://github.com/monadgroup/flparser.gitIn Visual Studio:
Solution > Add > Existing Project
Find Monad.FLParser.csproj
Project References > Add Reference > Projects > Monad.FLParser
Nuget package coming soon!
use
Load a project with Project.Load:
Project project1 = Project.Load("path/to/project.flp"); // load from file
Stream someStream = ...;
Project project2 = Project.Load(someStream); // load from stream
BinaryReader someReader = ...;
Project project3 = Project.Load(someReader); // load from binaryreaderreference
classes
class Project
Represents an FLP file. Has the following properties: (all get; set;)
const int MaxInsertCount; // max number of inserts (as of FL 12, equal to 105)
const int MaxTrackCount; // max number of tracks (as of FL 12, equal to 199)
int MainVolume; // volume of project
int MainPitch; // pitch of project
int Ppq; // pulses per quarter-beat
double Tempo; // tempo of project
string ProjectTitle; // title of project
string VersionString; // xx.xx.xx-formatted string of FL version
int Version; // int format of version
List<Channel> Channels; // list of channels in project
Track[] Tracks; // set of tracks in project (length is equal to Project.MaxTrackCount)
List<Pattern> Patterns; // list of patterns in project
Insert[] Inserts; // set of inserts in project (length is equal to Project.MaxInsertCount)class Channel
Represents an individual channel (instrument) in a project. Has the following properties: (all get; set;)
int Id; // channel ID
string Name; // channel name
uint Color; // 0x00RRGGBB-formatted channel color
IChannelData Data; // channel data, will either be GeneratorData or AutomationDataclass GeneratorData : IChannelData
Represents channel data for a generator channel (sampler or plugin). Has the following properties: (all get; set;)
byte[] PluginSettings; // settings saved by the plugin
string GeneratorName; // plugin generator name
double Volume; // generator volume
double Panning; // generator panning
uint BaseNote; // generator base note
int Insert; // insert to send audio to
int LayerParent; // ???
Enums.ArpDirection ArpDir; // direction of arp
int ArpRange; // range of arp
int ArpChord; // chord of arp (mapping unknown)
int ArpRepeat; // number of times to repeat arp
double ArpTime; // speed of arp
double ArpGate; // arp note duration
bool ArpSlide; // slide arp?
// for samplers:
string SampleFileName; // path to sample
int SampleAmp; // sample volume
bool SampleReversed; // play sample reversed?
bool SampleReverseStereo; // swap stereo channels?
bool SampleUseLoopPoints; // ???class AutomationData : IChannelData
Represents channel data for an automation channel. Has the following properties: (all get; set;)
Channel Channel; // channel that this automation is controlling
int Parameter; // parameter to control
AutomationKeyframe[] Keyframes; // automation keyframesclass AutomationKeyframe
Represents an individual keyframe in an automation track. Has the following properties: (all get; set;)
int Position; // keyframe position in pulses
double Value; // keyframe value
float Tension; // keyframe tensionclass Track
Represents a track in a project playlist. Has the following properties: (all get; set;)
string Name; // track name
uint Color; // 0x00RRGGBB-formatted track color
List<IPlaylistItem> Items; // list of playlist items in track, will either be ChannelPlaylistItem or PatternPlaylistItemclass IPlaylistItem
Represents an item in a track. Has the following properties: (all get; set;)
int Position; // position of the item in pulses
int Length; // length of the item in pulses
int StartOffset; // position to start in data
int EndOffset; // position to end in dataclass ChannelPlaylistItem : IPlaylistItem
Represents a sample or automation item in a track. Has the following additional properties: (all get; set;)
Channel Channel; // channel to take sample or automation data fromclass PatternPlaylistItem : IPlaylistItem
Represents a pattern in a track. Has the following additional properties: (all get; set;)
Pattern Pattern; // pattern to take note data fromclass Pattern
Represents a pattern in a project. Has the following properties: (all get; set;)
int Id; // pattern ID
string Name; // pattern name
Dictionary<Channel, List<Note>> Notes; // the notes that each channel plays in this patternclass Note
Represents a note in a pattern. Has the following properties: (all get; set;)
int Position; // note position in pulses
int Length; // note length in pulses
byte Key; // note key in MIDI format
ushort FinePitch; // note pitch adjustment
ushort Release; // note release time
byte Pan; // note pan, 0 is left and 127 is right
byte Velocity; // note velocityclass Insert
Represents an insert in a project. Has the following properties: (all get; set;)
const int MaxSlotCount; // max number of effect slots (as of FL 12, equal to 10)
int Id; // insert ID
string Name; // insert name
uint Color; // 0x00RRGGBB-formatted track color
ushort Icon; // icon ID
Enums.InsertFlags Flags; // insert flags
int Volume; // insert volume
int Pan; // insert pan
int StereoSep; // stereo separation
int LowLevel; // EQ lowpass level
int BandLevel; // EQ bandpass level
int HighLevel; // EQ highpass level
int LowFreq; // EQ lowpass frequency
int BandFreq; // EQ bandpass frequency
int HighFreq; // EQ highpass frequency
int LowWidth; // EQ lowpass width
int BandWidth; // EQ bandpass width
int HighWidth; // EQ highpass width
bool[] Routes; // map of which inserts this insert routes to (length is equal to Project.MaxInsertCount)
InsertSlot[] Slots; // set of slots in insert (length is equal to Insert.MaxSlotCount)class InsertSlot
Represents an effect slot in an insert. Has the following propertie: (all get; set;)
int Volume; // volume of slot
int State; // slot state (0 = muted, 1 = enabled, 2 = solo)enums
All enums are in the Enums static class.
enum Event
List of FLP event types, used for parsing. Consult the source code for a list of values.
enum InsertParam
List of insert parameters, used for parsing. Consult the source code for a list of values.
enum ArpDirection
Potential directions for generator channel's arpeggiator. Values are:
Off = 0- no active arpUp = 1- arp notes go upDown = 2- arp notes go downUpDownBounce = 3- arp notes bounce up and downUpDownSticky = 4- arp notes stick up and downRandom- random arp notes
[Flags] enum InsertFlags
Flags for inserts to specify their states. Values are:
ReversePolarity = 1- reverse polarity of the insertSwapChannels = 1 << 1- swap left and right channelsUnmute = 1 << 3- insert is audibleDisableThreaded = 1 << 4- threading is disabled on insertDockedMiddle = 1 << 6- insert is docked to middleDockedRight = 1 << 7- insert is docked to rightSeparator = 1 << 10- insert has separator on leftLock = 1 << 11- insert is lockedSolo = 1 << 12- insert is solo'd (all other inserts will be muted)
license
Licensed under the GPL3 license. See the LICENSE file for more information.

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.
