FMS is a groovebox built for the Nintendo® Game Boy Advance handheld video game system. Its focus lies on quick and intuitive control of programming sounds and music, for live performance and studio recording - or just having a blast.

While it's built for the GBA hardware, it can be run on all kinds of old and new devices since emulators are both widespread and accurate. Computers, phones, Linux handhelds, FPGA systems, game consoles - FMS runs almost anywhere.


FMS at a glance

4 × 2-OP FM synth with:

  • attack / hold / release envelope
  • fractional modulator ratio
  • modulator feedback
  • modulator attack / release envelope
  • pitch sweep envelope
  • stereo hard panning
  • portamento

1 × Game Boy PSG noise with:

  • attack / hold / release envelope
  • adjustable rate from wide to narrow
  • stereo hard panning
  • portamento

16-step sequencer with:

  • unique sound per step
  • individual track length
  • individual track rate
  • individual track shuffle
  • note echo per track
  • per-step chord allocator
  • transpose sequencer
  • snapshot recall
  • trigless steps
  • randomization
  • 128 patterns per track

Getting started

Since FMS is a software for the Game Boy Advance it requires either original (or compatible) hardware or an emulator to use. The program is contained in a GBA ROM (.rom file) which is either put on a flash cart or loaded in an emulator.

Compatible Nintendo® hardware:

  • Nintendo® Game Boy Advance
  • Nintendo® Game Boy Advance SP
  • Nintendo® Game Boy Player
  • Nintendo® Game Boy Micro
  • Nintendo® DS
  • Nintendo® DS Lite

Compatible 3rd party handhelds:


To use FMS on official/compatible hardware you will need a flash cart. Most modern flash carts should be compatible if they support 1Mbit (128Kbyte) flash saves. NOTE Most flash carts use SRAM for saving - this works as intended as long as they support 1M saves.

  • Everdrive GBA Mini link
  • Everdrive GBA Pro link
  • Everdrive GBA X5 N/A
  • EZ-Flash Air link
  • EZ-Flash Omega link
  • EZ-Flash IV N/A

Alernatively, FMS can be emulated on any device (e.g a computer, Linux handheld gaming device) that has a GBA emulator. Compatibility is high, although the PSG noise emulation quality varies.

NOTE While the suggested emulators will work out of the box, some emulators do not accurately detect the save type, so if there are issues saving or loading data, make sure that the save type is set to Flash 128k / 1M.


Basic controls

select trig parameterselect synth parametercut/paste stepmove cursor / change valuestart/stop sequencerpress to confirm / add step hold + d-pad to change valuetoggle top menu

Button mapping

By default, B is used as the primary button and A for secondary actions, but this can be swapped if you are more used to an LSDj or M8-style button layout.

The Coarse and Fine mapping for adjusting parameters can also be changed from the default (Up/Down for Fine) to a more LSDj/M8 style layout.

Grid view

track ratetrack lengthstep parameterssynth parametersgrid/data viewcursorecho viewtransposescale viewtemposhuffle

This is the main view of FMS and displays all four FM tracks and the Noise track alongside the parameter selection at the bottom. This is where you program patterns and sounds.

A fundamental concept in FMS is that each step holds a unique sound, kind of like having a specific synth patch per step. This is a very powerful sound design tool, but also means that there are no instrument presets - each step is a clean slate.

Working with the cut/paste button, like double-tapping to copy then tap on empty steps to paste, or using the multi-editing functionality is therefore crucial to raching a flow state.


At the top of the screen you'll find the top menu, which lets you change between the different views as well as set the shuffle per track and global tempo.

top barmain view

Switch between top menu and current view

Move cursor

Confirm selection

Shuffle and tempo

Shuffle is set per-step and will delay every other step (on a global counter) by up to half a step. Shuffle stored per track and you can change the shuffle value of all tracks by holding

Tempo is global across all patterns and goes from 30 to 300 BPM. The tempo can be nudged by holding which temporarily nudges the BPM +/- 10 units and then snaps back when you release the buttons. This is useful for beat matching to another source without sync.

Tapping four times in succession will tap-tempo in a new BPM value, and you can keep tapping to hone in the value.

It is also possible to cue a tempo change by double tapping which will let you change the BPM value without updating the actual clock. The change will then occur when a new pattern slot is loaded, which is useful for drastic tempo changes across patterns.

Grid controls

Step editing

Move cursor

Place step

Cut/paste step

Change step value (fine)

Change step value (coarse)

Trigless steps

(double-tap)

Toggle trigless step

Trigless steps will change the parameter values without reseting the oscillator and envelopes. This useful for pitch slides and other form of stepped automation.

Parameter selection

Choose step parameter

Choose synth parameter

You can also double-tap either shoulder button to lock the parameter selection which can make multi-parameter editing more convenient.

Multi-step editing

Change all steps on a track

Change all steps on all tracks

Track parameters

Change track rate

Change track length

Track mute/solo

Mute/un-mute track

Solo/un-solo track

Rotate track

Shift steps forwards/backwards

Chords

Each step in FMS has the possibility to allocate voices from the other tracks to play back chords. This is done by stealing voices from tracks that are inactive or lower priority than the track that is sending the chord trig. Chords are fully polyphonic in that they steal a voice including unique parameter settings.

The Chord parameter is a sub-parameter of Note and can be toggled by pressing on Note when selecting the Step parameter. When Chord is the active parameter the steps will display the chord intervals instead of the Note.

The Chord step parameter displays the chord in semitone offsets relative to the Note. An interval of 0 means that no voice will be allocated to the chord, but 1 and above will use a voice (if possible) to form a chord.

A line underneath each chord slots shows which is selected, and will select which slot is being edited.

The hierarchy for voice stealing is top-down, with the lower track being able to interrupt the steal from the top track. This means that you can control when and how voice stealing occurs. For example, if you have something that should never be stolen it should be put on Track 4.

Random edit

Any step can be incrementally randomized by pressing the randomize button combo. This will lightly nudge the selected parameter value towards increasingly random values.

Random edit can also be triggered when in the parameter selection mode for randomizing all steps on a track or all steps on all tracks.

Randomize value

Range edit

Range edit allows you to edit, copy and paste multiple steps at once by selecting a range of steps and performing various operations.

Activate

Enter Range edit

The cursor will start to blink when Range edit is active, while in this mode you can use the DPAD to extend or subtract the range.

While active

Copy steps

Cancel Range edit

Change values

Randomize values

While inactive (normal editing)

Paste steps

Snapshot

Snapshot lets you store the current sequencer state, change it, and then cycle between the snapshot and altered state instantly. This is very powerful for live manipulation and can be used to quickly juggle between two states without loading different patterns.

Take snapshot

Reload snapshot

The screen will quickly flash as a sort of shutter effect when a snapshot is taken. This will store the state in memory, later to be recalled. Whatever is then changed after taking the snapshot will be the "live state" which can be swapped back and forth between by triggering the reload combo.

FM synth

The four digital audio tracks in FMS use FM synthesis to generate audio. This is a synthesis method that typically utilizes phase modulation of simple sinewave oscillators to create more complex shapes. Discovered by John Chowning and popularized by Yamaha in the 1980s, FM synthesis is still widely used in many commercial synthesizers as a versatile way to create new sounds.

The FM tracks in FMS use a very simple 2OP structure, meaning "two operator" - an FM synthesis term used to describe an oscillator paired with an envelope.

In a nutshell, FM synthesis creates harmonics by changing the traversal (phase) of one oscillator with the other.

A "modulator" oscillator is fed into a "carrier" oscillator which outputs (carries) the result of the final sound. In FMS this is a simple two-part structure, where the modulator is also fed back into itself (feedback) which can be used to create a sharper sound.

FMS implements a sample accurate low-level realtime FM synth, never before done on the GBA platform.

GB noise

The GBA hardware is backwards compatible with the original Game Boy from 1989, which means the original sound registers are fully integrated. The fifth channel in FMS uses one of these - the Game Boy noise generator. Depending on its rate, it ranges from a pseudo-random white noise to a narrow, almost pitched tone, useful for both percussive and melodic sounds.

Parameters

FMS has two parameter types: Step and Synth. The Step parameters adjust values that concern the step itself, what note is it, how loud and so on. Synth parameters change values in the synth engines themselves.

When in the Grid, holding will choose a Step parameter and holding will choose a Synth parameter. This makes it very quick to switch between editing a synth parameter and, for example, the note of the step.

Step parameters

note
pitch in semitones

level
sound level

pan
stereo pan (L/C/R)

slide
pitch slide time

logic
trigger or not every nth count

Synth parameters

amp attack
level fade-in time

amp hold
level sustain time

amp release
level fade-out time

mod mult
modulator ratio
(¼ steps)

mod depth
modulation depth

mod feedback
modulator feedback

mod attack
modulation fade-in time

mod release
modulation fade-out time

sweep depth
pitch sweep depth

sweep release
pitch sweep fade-out time

Most values in FMS are shown as two-digit hexadecimal numbers. Hex works like regular counting, but instead of stopping at 9 it keeps going: A = 10, B = 11, C = 12, D = 13, E = 14, F = 15. After F, the next number is 10 (which equals 16 in decimal)

FMS uses this to represent values from 00 to 7F which is 0 to 127. The first digit counts groups of 16, and the second counts the remainder. For example, 2A means 2 groups of 16 plus 10, which is 42. It can be confusing in theory, but practically you just need to think of A to F as larger numbers.

NOTE using hexadecimal is a necessity for displaying the step values on such a small screen resolution

Echo view

The note echo in FMS is a sequencer effect (stored per pattern) that generates an algorithmic echo by re-trigger the voices at different intervals and levels. This is a technique commonly used in chiptune and sometimes other monophonic sound sources to simulate an echo effect.

With sub-step resolution and note transposition it can also be used as an arpeggiator of sorts.

echo repeatsecho speedtransposevolume atten.mod atten.echo panning

REP controls the number of echoes (note repeats) that will occur from a trigger.

SPD controls the interval of the repeats in units of steps, for example an SPD value of 3 means that the echo will trigger every 3rd step. The SPD has a sub-step resolution, meaning that it can trigger repeats in between steps or even faster than one step. The first digit represents the sub-step value and the second digit the whole step.

VOL attenuates the level of each echo trigger by the factor set by the parameter. The default of -4 (on FM tracks) will cause a natural fade out of each echo. It can also increase the volume with positive values.

MOD attenuates the FM depth of each echo trigger in the same way that VOL works.

PAN changes the panning of the echo. C will use the same panning as the step value, L and R will hard-pan the echo to either Left or Right output and LR will cause a ping-pong effect.

TSP transposes the echo in semitones. The modulo value underneath will repeat the transpose shift and loop back, which means that it can be used for a frequency shift effect or as an arpeggio of sorts.

It's also possible to set whether a step should trigger an echo by accessing the Echo sub-parameter hich can be toggled by pressing on Level when selecting the Step parameter. When Echo is the active parameter the steps will display the echo icon for send and an X for off.

Transpose view

The transpose sequencer can transpose the note of each FM track for making longer progressions or sequences that vary over time or in unexpected ways.

transpose valuerateadvancementlength

Rate controls the number of times a transpose step will repeat.

Length sets the number of steps of the transpose pattern, up to a maximum of 8.

Adv. changes how a step advances - either per pattern length or per step count.

Transpose values are set in semitone offsets, and will be quantized to the set scale.

Scale View

On the Scale view you can change which notes can be entered into steps and what notes are played back. By default it's set to "Chromatic" which enables all the notes in the 12TET tuning system.

scale keyscale maskcursorpreset scales

Changing the scale will both filter the note parameter changes to adhere to the keys in the scale and quantize the note output itself. This means that you can use it to work on multiple patterns in a certain scale, then switch to another without actually changing the data in previous patterns (while keeping them in current scale). This means that you can set the scale to Chromatic to play patterns with multiple scales.

Data view

On the Data view you can store and load patterns as well as change the type of sync that's in use. There are 8 pattern banks that contain 16 patterns per track, making a total of 128 patterns per track. Here you can also clear the current track data, or generate a new random pattern.

pattern bankspattern slotsexternal syncbutton mappingclearrandomize

Saving pattern slots

Save single slot

Save whole column

Note that if your track data is empty when you save to a slot it will clear it. This means that to delete a pattern you can simply empty the track data and then write to whatever slot you want to delete.

Loading pattern slots

Load slot in place

Load slot & reset

Load column in place

Load column & reset

There are two different types of pattern loads; load-and-reset and load-in-place.

Load-and-reset will load the new data and reset the track's playhead so that it will start the pattern from the first step on the next beat.

Load-in-place will load the data and instead keep the current playhead position.

For example, if you have patterns loaded with different lengths and rates, and want to move to a new set of patterns it can be beneficial to load and reset the playhead. Or, if you are working with patterns that are all of the same length and want to jump between patterns on a single track it could be beneficial to load it in place instead of resetting the playhead.

Pattern cue

Cue slot

Cue column

Patterns can be queued so that they change to the queued slot once the current pattern finishes. This lets you cue changes ahead of time and make sure that the change happens naturally. When pattern slots are queued they will start to blinking to indicate that the transition is about to occur.

Clear & randomize

The two items to the left of the pattern slots are special operation slots that can be used to clear or randomly generate a new pattern. By navigating the cursor over to the X or ? slots you can clear or randomly generate a new pattern by pressing the same key combo as for loading patterns.

Button mapping

The two items to the left of the pattern slots are special operation slots that can be used to clear or randomly generate a new pattern. By navigating the cursor over to the X or ? slots you can clear or randomly generate a new pattern by pressing the same key combo as for loading patterns.

Bank lock & naming

Banks can be locked to prevent any save operations, this is done simply by toggling the padlock icon next to the Bank label. Banks can also be renamed to any four letter name by changing the field next to the padlock icon.

External sync

Running FMS on hardware (and some emulators) lets you synchronize it with another GBA running FMS or other music hardware via the Link Cable. FMS can either send or receive sync and support multiple protocols for different kinds of hardware connections.

Sync set to In means that FMS will receive sync by an external device, acting as the follower, while setting it to Out means that it will send sync, acting as a the leader.

Supported protocols are:

  • GBA to GBA
  • Analog clock e.g modular synths, Pocket Operators, Korg Volca
  • Arduinoboy NOTE receive only
  • Analogue Pocket MIDI In Cable NOTE receive only

To use the sync protocols Analog Clock you will need to build your own cable by cutting off a GBA link cable and soldering on the appropriate connector. A multi-meter is also recommended to check the connector pinout.

Analog clock cable wiring

This cable lets you sync FMS to devices that can send or receive sync via analog clock pulses. For example the Teenage Engineering Pocket Operators, Korg Volca series and many eurorack modules.


Design & development by sm0hm (Ess Mattisson)
© 2026 Lo-bit Club, distributed by Fors FM AB

Eternal gratitude to the beta testers that put FMS through its paces, encouraged going the extra mile and came up with many features and improvements throughout the beta development phase.

Much love to:

avrilcadabra
eris fairbanks
ilzxc
impbox
keff
laamaa
mikey303
nullsleep
pselodux

"Game Boy Advance" and "Game Boy" is a registered trademark of Nintendo. This software is not affiliated with, licensed or otherwise approved by Nintendo.