User Manual


Let's launch fmcomposer.exe. The window below appears, showing the song editor. Hover the screenshot with mouse to see help.

Click on the first column of a channel then press an alphabetical key to add a note. You can edit the Key/Note mapping in the config page if they don't suit to your keyboard.

Adding a note will also add the instrument number (it depends on the instrument you select in the instrument list), and a default volume. You can select/move all those data with the mouse, edit them with right click or double click and more, please see keyboard shortcuts.

Notes can be slurred by removing their instrument number.

To stop a note, press '='

The last column is reserved for effects. They can change the panning, delay a note, change the tempo and many other things, see effect list.

Try composing a simple tune. To play several notes at the same time, put them on different channels :

A C major chord.

Bored with the default piano sound ? Click on the Instrument tab . The Add button above the instrument list is now available :

Click on Add to add a second instrument into the list, then Load to open one of the instruments shipped with the program. You'll found them in the instruments folder.

See the next chapter to learn how to create your own sounds.

Creating an FM instrument

How it works

FM (Frequency Modulation) synthesis works by modifying a wave's frequency depending on the amplitude of another wave :

The Carrier get its frequency changed as the Modulator evolves.
To get interesting sounds, more than a single modulation is needed. FM Composer provides 6 of them, which can be configured in any imaginable way. They are called operators, each one can generate a basic shape : sine wave, square, triangle...

When they are at the bottommost position, you listen to their direct output : changing their volume impacts as you expect, the output volume. When they are above, their sound isn't directly heared : their output modulates the frequency of the operator below . The volume of those operators will impact the tone of the below ones. When several operators are next to each other, there is no frequency modulation thing, their output is simply summed like if they were separate sounds. The way the operators are arranged is called an algorithm.

Editing the algorithm


Editing the parameters

Click on the Instruments tab. Don't be impressed by the amount of parameters. They are organised per operator. When your mouse hovers a parameter block, the corresponding operator is highlighted so you can see what you are actually editing :

Volume envelopeVolume-over-time parameters. It's a classic ADSR envelope but with added delay, initial volume and hold (held time before decay) additional parameters.
FrequencyFrequency parameters. Can be a ratio calculated from the playing note, or a fixed frequency. Integer ratios are best for harmonious sounds. 1/4 tone and Fine parameters allow to break those integer values and create inharmonic sounds./td>
WaveformChanges the waveform type and its offset.
Pitch envelopeChanges the way the frequency evolves over time. Initial freq/decay time defines a starting frequency and a time to reach the normal frequency. Release freq/release time is the same but triggered on note release.
Keyboard scalingsAllow to modify operator parameters depending on the note position on the keyboard. The higher the values, the higher effect strength will be applied.
LFOChoose how the LFO affects the operator's frequency and amplitude

Making your first sound

Start by experimenting how FM works. Put the operators 1 and 6 on a bottom position, Drag&drop the 2, 3, 4 and 5 on the 6 then mute the 6th. This will mute all the operators above it so you can listen to Op1 :

Play a note on your keyboard, you should hear a simple sine wave sound which is operator 1's output. Play with the envelope parameters and the waveform choice. Now put an operator above it. Listen how the sound is modified as you change its volume and frequency multiplier. This is very basic 2-operators FM and you can already make a lot of sounds with it. But they won't be much refined, the 4 others operators are here so you can build more precise harmonics to get the sound you want.

Splitting a sound make it easier to program

Let's say you want to create a pan flute sound. Try to split it in several parts. You have the 'T' noisy attack sound, and the main sustained sound of the pipe. You can use two blocks of 3 operators to make this sound : the first 3 will do the attack sound, the 3 others the pipe sound. It's a simple way of creating sounds when you don't know where to start : split the complex final sound into separate simple ones.


Improving the pan flute sound

By listening to a real pan flute, you'll probably notice that it's not just a noisy attack + a resonating sound. There is still an airy sound in the sustained part, and the attack has some harmonics that are not pure noise. Try to recreate those subtleties by tweaking your current sound.

A great way of understanding how to make sounds is to look at some of the built-in FM Composer sounds (/instruments/ folder). You can see how they are made and use them as a starting point if creating your sound from scratch seems too annoying.

Making the sound you're thinking about

Creating a particular sound can be achieved easily after some practice. Try creating a rough approximation with few operators, then refine the sound by adding others operators and fiddling with multipliers and waveforms.

General sound making tips

Create a song

As seen in the tutorial tutoriel, adding notes is done by selecting an instrument in the list, clicking in the pattern then pressing a key. 24 channels are available, each one having a volume, panning and reverb. Shift+Mouse wheel allows to scroll horizontally so you can see all the channels. To move/swap channels, click on their number in red then drag&drop :

Right clicking on the pattern list shows several options for organizing, creating and removing them :

Moving a pattern is done, like the channels, by drag&drop.

Pattern editing functions are also available with the right click. You can transpose the selected notes, create fade in/outs, insert/delete rows, add effects...



Song editor

Instrument editor


The effect column is divided in two parts, a letter representing the effect type, and a value. If you are familiar with trackers, you'll notice some similarities.

LetterEffect nameDescriptionRange
AArpeggioCreate a fast, chiptune-like 3 notes arpeggio. The first note is the note on the pattern, the two others are defined by the value of this effect : the units represent the second note, in semitones from the first (0-9), the tens represent the third node (0-25 although the common usage range )0-255
B*Pattern jumpJump to another pattern. Use in combination with C (row jump) to create a loop point0-255
C*Row jumpJump to another row (on the same pattern if no pattern jump is specified)0-255
DNote delayAllows notes to be played with precise timing (1/8th row steps)0-7
EPortamento upIncrease the pitch of the current note. Value affects the slide speed0-255
FPortamento downDecrease the pitch of the current note. Value affects the slide speed0-255
GGlissandoCreate a smooth pitch transition between notes. Value controls the glissando speed0-255
HVibratoAdd vibrato. It is persistent, so you can use other effects while keeping vibrato active. Put a H0 to stop it.0-255
IPitch bendA MIDI-like pitch bend. Unlike portamento up/down which continuously change pitch without any limit, pitch bend sets the pitch relative to the current note. 0=-2 semitones, 64 = -1 semitone, 127=nothing, 192=+1 semitone, 255=+2semitones.0-255
JTremoloCreate a tremolo effect. Like vibrato it's a persistent effect, use J0 to stop it.0-255
KInstrument controlModify a parameter of the current instrument. Use the instrument editor to select which parameter this effect controls : 0-255
MChannel volumeChange the channel volume. 0=muted, 99=full volume0-99
NChannel volume slideSmooth channel volume slide. 0=fast decrease, 127=no change, 255=fast increase.0-255
PPanning slideCreate a smooth panning transition. 127 does nothing, lower values pans to the left faster as it comes close to 0, higher values pans to the right faster as it comes close to 2550-255
QNote retriggerFastly repeats the note on the same row, up to 8 times0-7
RReverb sendSet the reverb amount. 0=no reverb, 99=maximum0-99
T*Set tempoChange the tempo (BPM).0-255
V*Global volumeSet the global volume. 0=muted, 99=full volume0-99
W*Global volume slideSmooth global volume slide. 0=fast decrease, 127=no change, 255=fast increase.0-255
XChannel panningSet panning to the desired value. 0=left, 127=middle, 255=right.0-255
Y*Sync markerSpecial markers for synchronizing events to the song. See the FM Lib API0-255
* Global effects, they can be put on any channel

Import / Export

Getting FM music for my project

If you don't create your soundtrack yourself, you may ask a composer for this task. You have several choices :

I'm a developer, I want to use it in my game

The library is written in C, without any dependencies, and allows the playback of songs made with FM Composer. It provides real time control of the channel properties (volume, panning), global tempo, muting/replacing instruments, fire events when the song reach a specific point... A lot of useful features for sound interactivity in your game.

The API provides a simple function that writes its output to a buffer, so you can output that to the speakers using a lib that provides sound card access, or write the data to a file, or doing whatever you want with it.


FM Composer

Completely free to use, you can create and publish music without any restrictions. Credits to the application or author's name are appreciated, though.

FM Lib

Free for non-commercial projects. For commercial projects, fees depends on the team size :
Indie (1-2 people)$20 / app
Studio (3-10 people)$100 / app
"AAA" (10+)$500 / app