Parsing FSC Files


FL Studio can export a project as 'Project Bones'. Among other things, this includes 'score' files with the '.fsc' extension (fruity score?). Here is what I have found out about the file format.


Channel Rack


Using the graph editor, I left the first note alone, set all values on the second note to their minimums, and all values on the third note to their maximums. (Except for shift)


Binary contents of 'Pattern 1 - Kick.fsc':

46 4c 68 64 06 00 00 00 10 00 04 00 60 00 46 4c
64 74 63 00 00 00 c7 0b 32 30 2e 31 2e 31 2e 37
39 35 00 9f 1b 03 00 00 1c 02 25 01 41 00 00 e0
48
00 00 00 00 00 40 00 00 00 00 00 00 3c 00 00
00 78 00 40 00 40 64 80 80
60 00 00 00 00 40 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00
c0 00 00 00 00 40 00 00 00 00 00 00 83 00 00
00 f0 00 80 00 80 80 ff ff


Key: file header, data header, first note, second note, third note


HexTextMeaning
46 4c 68 64FLhdStart of file header

HexDecimalMeaning
06 00 00 006Number of words to follow in header
10 00
16???
04 004Number of channels in channel rack, even though this file contains just one
60 0096Timebase as set in Project General Settings

HexTextMeaning
46 4c 64 74FLdtStart of data header

HexDecimalMeaning
63 00 00 0099Number of words to follow in data chunk
c7 0b??

HexTextMeaning
32 30 2e 31 2e 31 2e 37 39 35 0020.1.1.795FL version as null terminated string

HexDecimalMeaning
9f 1b 03 00 00 1c 02 25 01 41 00 00 e0??
4872Variable width number of words to follow as "note events". Each note event has 24 words. 3x24 = 72. I don't know why this is variable width while the preceding number of words in the data header seems to be fixed width. Details on variable width numbers can be found here.

Time:
HexDecimal
00 00 00 000
60 00 00 0096
c0 00 00 00192
This project has 4 quarter notes, each divided into 4 sixteenth notes, that can each be shifted forward 23 times (24 possible values including 0). 4x4x24 = 96 ticks per quarter note. I think this is what timebase refers to. I'm not sure how many words this value can use. 4 is my initial guess.

???:
HexDecimal
00 40 00 00?
00 40 00 00?
00 40 00 00?


Note Duration (If using Piano Roll):
HexDecimal
00 00 00 000
00 00 00 000
00 00 00 000
* For example, see below

Pitch:
HexDecimalFL Meaning
3c
60C-5
000C-0
83131B-10
As placed on an 11 octave piano keyboard.

???:
HexDecimal
00 00 000
00 00 000
00 00 000


Fine Pitch Adjustment:
HexDecimalFL Meaning
781200
000-1200 cents
f02401200 cents
Increments of 10.

???:
HexDecimal
000
000
000


Release Velocity:
HexDecimalFL Meaning
406450
0000
80128100


???:
HexDecimal
000
000
000


Pan:
HexDecimalFL Meaning
4064-100 (full left)
0000 (centered)
80128100 (full right)


Velocity:
HexDecimalFL Meaning
6410078
0000
80128100


X:
HexDecimalFL Meaning
801280
00-100
ff255100


Y:
HexDecimalFL Meaning
801280
00-100
ff255100

----------------------------------------

In the Piano Roll, notes can have a duration value.



These two score files are almost identical:

Pattern 1 - Kick 1.fsc
46 4c 68 64 06 00 00 00 10 00 02 00 60 00 46 4c
64 74 34 00 00 00 c7 0c 32 30 2e 39 2e 30 2e 32
37 34 38 00 9f bc 0a 00 00 1c 01 25 01 41 00 00
e0 18 60 00 00 00 00 40 00 00 00 00 00 00 3c 00
00 00 78 00 40 00 40 64 80 80

Pattern 1 - Kick 2.fsc
46 4c 68 64 06 00 00 00 10 00 02 00 60 00 46 4c
64 74 34 00 00 00 c7 0c 32 30 2e 39 2e 30 2e 32
37 34 38 00 9f bc 0a 00 00 1c 01 25 01 41 00 00
e0 18 60 00 00 00 00 40 00 00 a8 00 00 00 3c 00
00 00 78 00 40 00 40 64 80 80

0xa8 == 168 == 1 3/4 beats * 96 ticks per beat