Need help? Write us via hi@lo-bit.club
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
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
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.
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
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.
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.
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.
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.
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.