Introduction
Version 2 of the patch file of SimSynth, the subtractive synthesizer of FruityLoops and FL Studio. SimSynth 2, which came with FruityLoops 3, and the SimSynth Live generator of FL Studio 5 save their patches in it. A patch holds three oscillators, an LFO, three envelopes with up to 300 points each, the filter and amplifier settings, a short riff of notes and a comment. The file has no sections and no lengths: it is one fixed structure written out in order, 6,763 bytes long, or 6,251 for a revision that has no comment.
Image-Line has not published the format. The layout below comes from the loader in
ss2wav.dll, the program that renders SimSynth patches to sound and ships
with FruityLoops 3 and FL Studio 5, which reads the whole file into memory in a
handful of reads (the sizes and the order are certain), and from 580 real patch files
(279 different ones) on this site’s machine, all of which fit the layout exactly. What a field is for is
worked out from its default value in that loader and the values real patches hold.
Those names are marked inferred and may be wrong. Several blocks of settings
are listed by position only.
Structure
0x0000HeaderSYNTH, the version 2 and a revision9 bytes0x0009Records oscillator 1, oscillator 2, oscillator 3 and the LFO4 × 286 bytes0x0481Envelopes three, each with times, levels and a flag3 × 1,266 bytes0x1357Settings A and B 45 words, then 47 words90 + 94 bytes0x140FRiff 520 words of note numbers1,040 bytes0x181FSettings C to F seven words, four words, three lists of eight bytes, a word and 28 bytes76 bytes0x186BComment text, zero-padded (not there when the revision is 0)512 bytes
All numbers are little-endian 16-bit words, signed where a field can be negative. The offsets are the same in every file of revision 1 or more, and there is nothing variable in the file, so a reader can go straight to any field.
Header
| Offset | Size | Field | Meaning |
|---|---|---|---|
0x00 | 5 | Signature | The characters SYNTH |
0x05 | 2 | Version | 2 for this format; version 1 files have 1 |
0x07 | 2 | Revision | A revision of the format within the version. 4 to 17 are seen (14 in 233 files, 15 in 218, 16 in 86, 17 in 25, 13 in 8, and 4, 7, 10 and 12 in a few). The loader brings older revisions up to date, and reads the comment only when the revision is above 0 |
Oscillator and LFO records
Four records of 286 bytes follow the header, from 0x0009: oscillator 1,
oscillator 2, oscillator 3 and the LFO. They have the same layout; the LFO uses the
same fields for its own settings. The first 20 bytes are ten words, then comes a
266-byte buffer.
| Offset | Size | Field | Meaning |
|---|---|---|---|
0x00 | 2 | Detune (inferred), signed | Zero in most patches; small values such as 3, 8, −1 and 100 are seen. For the LFO it may be the delay |
0x02 | 2 | Level (inferred) | 0 to 99; a new patch has 50 |
0x04 | 2 | Pitch offset (inferred), signed | In cents: −2400, −1200, 700 (a fifth), 1200 and 2400 are common. In the LFO record a new patch has 12, which looks like its rate |
0x06 | 2 | Pulse width (inferred) | 0 to 255; a new patch has 255 |
0x08 | 2 | Amount (inferred), signed | A modulation amount: 0 in most patches, ±100 to ±500 in others |
0x0A | 2 | Off switch (inferred) | 0 or 1. A new patch has 1 in oscillators 2 and 3 and 0 in oscillator 1 and the LFO. Oscillator 1 is never 1 in the files seen |
0x0C, 0x0E, 0x10 | 2 each | Switches 1, 2 and 3 (inferred) | Three buttons of each oscillator, each 0 or 1 |
0x12 | 2 | Shape (inferred) | The wave shape, counted from 0: 0 to 4 are seen. A new oscillator has 1, a new LFO 2 |
0x14 | 266 | Wave file path | A zero-terminated text buffer holding the path of an oscillator wave file (.OSC), or NA, the text of a new patch, when there is none |
The parts of this table that the loader fixes: the order and sizes of the fields, and
the defaults, which it sets by writing each word of a new record in turn. That a record
stands for an oscillator is inferred from the three oscillators and an LFO of the
program’s window, and the names of its wheels, buttons and shape selectors in
SimSynth.dll.
Revisions below 7 stored oscillator 2 and 3’s pitch 4 less and 4 more than the program now uses: the loader adds 4 to oscillator 2’s pitch offset and subtracts 4 from oscillator 3’s when it reads such a file. No file of those revisions was available to check this on.
Envelopes
Three envelopes follow the records, from 0x0481, each 1,266 bytes: an
array of 300 times, an array of 300 levels and a flag.
| Offset | Size | Field | Meaning |
|---|---|---|---|
0x000 | 600 | Times (inferred) | 300 words, one for each point of the envelope, in the order they are played. A time can be smaller than the one before it, so they are not totals |
0x258 | 600 | Levels (inferred) | 300 words, the level of each point, 0 to 255. A new envelope has 255 and 0 for the first two points: time 0, level 255, then time 400, level 0. The loader turns a level of 1 in these arrays into 0 (old patches wrote a 1 where 0 was meant) |
0x4B0 | 2 | Flag (inferred) | 0 in a new envelope 1, 1 in new envelopes 2 and 3. What it switches is not worked out |
0x4B2 | 64 | Not used (unproven) | Read by the loader and not used by it; zero in most patches |
Only the first few points are used: the real patches looked at have a handful of points before the zeros start. Where the list ends is not stated in the file, and the explorer shows the points up to the last pair that is not zero. Which envelope drives the amplifier and which the filter is not worked out.
Settings
The rest of the file, up to the comment, is settings and a riff. The loader reads them in this order, and the field names it uses are not known, so each block is listed by what it holds and where it is.
| Offset | Size | Block | Holds |
|---|---|---|---|
0x1357 | 90 | Settings A | 45 words. Its first two words are 64 in a new patch and its fifth is 255. Word 13 is set to 100 for revision 1 and below. Word 14 is set to 0 for revisions below 15 |
0x13B1 | 94 | Settings B | 47 words. The first is 50 in a new patch, the third 40. For revisions below 3 the loader converts the first word with a formula from the first two; this has not been checked |
0x140F | 1,040 | Riff | 520 words. Note numbers (36 is 0x24) with 0xFFFF for no note, in what look like pairs; how they are grouped into steps is not worked out. The patches in the Riffs folder of FruityLoops 3’s SimSynth presets use it; this has not been checked on all of them |
0x181F | 14 | Settings C | Seven words. The seventh is 120 in a new patch (the loader replaces 0 by 120), which may be a tempo; the sixth is 1638 (0x666) in a new patch |
0x182D | 8 | Settings D | Four words |
0x1835 | 8 | Flags 1 | Eight bytes; for revisions below 15 the loader sets the first to 1 |
0x183D | 8 | Flags 2 | Eight bytes; for revisions below 15 the loader sets the first to 0 |
0x1845 | 2 | Settings E | One word; for revisions below 15 the loader sets it to 2 |
0x1847 | 8 | Levels (unproven) | Eight bytes; for revisions below 15 the loader sets all to 100 |
0x184F | 28 | Settings F | Twenty-eight bytes |
The statements about older revisions are read from the loader’s code and could not be checked: the oldest revision in the real patches seen is 4, and nearly all are 13 or more.
Comment
A 512-byte text buffer at 0x186B, present when the revision is above 0,
filled with zeros after the text. Lines end in CR LF. It holds the patch’s notes: in
the patches seen, 127 have none, and the longest is 406 characters, such as “very very
creepy :0” and a credit to the author.
Worked example
The start of horror.syn, from the SimSynth 2 extras of FruityLoops 3:
0000: 53 59 4E 54 48 02 00 0E 00 SYNTH, version 2, revision 14
0009: CE FF detune −50
000B: 32 00 level 50
000D: 00 00 pitch offset 0
000F: 46 00 pulse width 70
0011: 00 00 00 00 amount 0, off switch 0
0015: 00 00 01 00 00 00 switches 0, 1, 0
001B: 04 00 shape 4
001D: 4E 41 00 … wave file path "NA"
0127: oscillator 2 begins (0x9 + 286)
Telling it apart
The file starts with SYNTH and the word 2 at offset 5, and is 6,763
bytes long (or 6,251 for revision 0). The explorer takes a .syn file as
this format only when all of that is true; version
1 has a 1 there and is 989 bytes long. Other programs’ files with the same
extension, such as the info.syn text of the DOS game Stunts, do not start
with SYNTH.
Not described
This page is partial: the file has no published specification, and these things are guessed or unknown, in the reference and in the viewer.
| Item | Reference | Viewer |
|---|---|---|
| Record fields (detune, level, pitch offset, pulse width, amount, off switch, three switches, shape) | Names and meanings are inferred from defaults and value ranges; the shape values are not named | Shows the numbers with “inferred” in the name |
| Envelopes | Which envelope drives the amplifier or the filter, what the flag does, where the point list ends, what the 64 spare bytes hold | Lists the points up to the last non-zero pair; draws no picture |
| Settings A to F, the flag bytes | Positions and sizes only, no field names or meanings | Shows them as unnamed words or bytes |
| Riff | How the 520 words group into steps is not known | Shows 520 words, not notes |
| Revisions | The rules for revisions below 15 are read from code and unchecked; revision 0 and revisions below 4 were never seen | Shows the revision number, applies no conversion |
| Wave files | The format of the .OSC files the paths name is not described | Shows the path as text, does not open the file |
Variants
- SimSynth patch, version 1 – 989-byte patches of the first SimSynth, with five-point envelopes
- SimSynth patch, version 2 – 6,763-byte patches of SimSynth 2 and SimSynth Live, with 300-point envelopes, a riff and a comment
Links
Software
- FL Studio – Image-Line’s music software, whose SimSynth Live generator opens and saves these patches (Windows, macOS)
- FruityLoops 3 – the release whose SimSynth folders hold the patches this page was checked on (Windows)