Skip to content
joakimerikssonPublic

About

Emulator for the M-VAVE FM-1 pocket synth: runs its firmwares unchanged in the browser and natively

Topics

Resources

Stars

68 stars

Watchers

3 watching

Forks

Latest commit

 

History

101 Commits

Folders and files

Repository files navigation

FM-1 emulator

The M-VAVE FM-1 is a pocket FM synthesizer, and a small community writes its own firmwares for it: drum machines, grooveboxes, ambient generators, a chord harp. This project emulates the FM-1 itself, its CPU, screen, keys, knobs and audio, so every one of those firmwares runs unchanged in a browser, on a computer or as an instrument plugin in a DAW (AU, VST3). You can try a firmware before you install it, write one without a synth on the desk, or just play.

Play it: joakimeriksson.github.io/fm1-emu: pick a firmware, press Start, play with the computer keyboard, the mouse, a touch screen or a MIDI keyboard.

The emulated FM-1's front panel running fifteen of the firmwares in turn

With sound: nine of the firmwares in 50 seconds.

fm1-emu-demo.mp4

The browser keeps the firmware you run and automatically saves flash changes, including settings and patches saved through the firmware's own controls. Each exact firmware version has its own save. Save & backup offers a manual save, portable .fm1save backup export/import, reset, and a check for firmware updates. This also works with locally opened packages and on the SMK-37 page. Edits held only in firmware RAM need its normal save command first; browser saves survive reloads but clearing browser data removes them. Export a backup to keep a separate copy.

The page hosts no firmware: it downloads each one from its author's own site when you start it, the same update package you would install on a real FM-1. M-VAVE's own firmware can't be fetched that way, so download FM-1.fwsc from M-VAVE and open it on the page.

And the M-VAVE SMK-37: a 37-key keyboard with the FM-1's chip inside, whose community ports run here too (below).

Also here: FM-1 SID, a firmware that turns the FM-1 into a Commodore 64 SID synth, with a step sequencer and stereo chorus, delay and reverb, that also plays C64 tunes (its page plays all of HVSC).

What runs

71 community firmwares: every one on the FM-1 Firmware Hub that runs here (its packages, fetched from the Hub; tools/hub_catalog.mjs follows its catalog), and a few more from fm1-editor.com/firmware. Also FM-1 SID, and M-VAVE's stock firmware (V13 and V15) with both CPU cores running. The ones the Hub doesn't list are our own list, web/firmwares-own.json: add a firmware there, and the tool appends it. Each name below opens the page with that firmware picked; press Start. (?fw= takes the Hub's ids too; &embed=1 shows only the device and its controls, for a window on another site.)

Firmware (opens it on the page) By What it is
M-VAVE stock firmware M-VAVE The firmware the FM-1 ships with: a DX7-style FM synth, both cores running. Bring your own FM-1.fwsc.
Felucca 1.6.1 hugelton The original open firmware: a four-operator FM synth with sequencer, arpeggiator and effects.
Felucca [Salt] 0.9-salt14 ChanceTheMaker A Felucca fork with its own sound and editor changes.
AMB-1 1.3 charlesvestal A generative ambient machine inspired by Music for Airports.
April OS BETA 1.1 beashoko A sampler inspired by the Casio SK-1: no synth engines, only samples, recorded through the installer page's microphone bridge.
BEETLE 1.0.5RC Joppe Sikken (SikkenWorks) A tracker for the FM-1: patterns written top to bottom, step by step, with note, instrument, chord and effect columns, the way trackers have always worked.
Bunker Evolved 1.0.0 Kid Bunka Generative ambient: four editable layers from 64 sound recipes, 24 worlds, 24 motifs and 32 scales.
ChoralRoot 0.25.1 Quixotic7 A port of the Choral Root synth.
fm1-chord 0.3 math0ne A chord machine after the HiChord, with extras: chords in a key under the white keys, slash chords and inversions, sounds, envelopes, effects and a looper.
CoralFlower 0.3.1 FicusFicusov Chords after the Orchid, with a UX made for the FM-1: one key turns every note into a chord with a bass, 27 scales, an arpeggiator, a looper, a plate reverb, and a pixel flower that grows as you play.
CS-1 2026.10.17 twochannels A Yamaha CS-80 in spirit: eight voices of two channels, high- and low-pass filters in series, ring modulator, the touch response and 22 tones from the owner's manual.
CTL-1 0.9.2 charlesvestal A MIDI controller: the keys play in a scale with its chords on the black keys, four banks of knobs, an arpeggiator and Euclidean drums, with General MIDI sounds of its own.
Cut-A-Dor 1.2.1 Kid Bunka A beat dojo for scratch DJs and beatmakers: boom bap, lo-fi and breaks from 16 rhythm families with swing and fills, an eight-lane 32-step sequencer, punch-in effects you record bar by bar, a bass voice.
Dinghy 0.3 zvenson Your base for your own FM-1 firmware: everything under it done and documented (updates, USB rescue, USB-MIDI, USB audio, keys, screen, settings), a 4-voice sine on top.
DUB-1 1.2.0 sbegueria A generative dub techno machine that plays itself from the moment it is on: chord stabs into a tape echo, FM pings, a sub bass on five grooves, a ducking kick, crackle, and an eight-bar arrangement with breaks and fills.
DUELL 0.2.20-beta OSCILL/R A multimorphing bitimbral synthesizer: two complete parts, three ways to play them together, and a morph that glides between two versions of every sound.
Evander's Music Box 1.5.2 Michail Tsakiroglou A bard's instrument for LARP, medieval and high fantasy: recorder, hurdy-gurdy, harp and a tavern kit on four tracks, encounters and songs for the table.
ETCH 1.50 SikkenWorks Draw the sound: a waveform drawn and changed with the knobs, morphed into another one, and a third modulating the result.
Fart Machine One 1.0.0 adamcharleswilsonmusic-code A questionable musical instrument: eleven artisanal farts, reverb, delay and a sixteen-step sequencer.
Felucca 8 Patterns 1.6.1_and_sequences echoe Felucca 1.5.1 with eight sequences a track to switch between and chain one after another; the user samples are left out to make room.
FiMba-1 0.6.1 jadamsowers A physically modelled kalimba (thumb piano), with mbira patterns, tape and grains.
FM-106 Beta4 PatttF The Juno-106 emulation of KR-106 ported to the FM-1: six voices on both cores, the BBD stereo chorus, 128 factory presets and a 1980s Roland look.
FM-1 Doom 0.5 zvenson Doom on the FM-1: one arena from FreeDM, played on the keys and a knob, on the FM-1's screen, with synthesised sound effects and no music.
FM1-GM 2026.10.19 jartificer A General MIDI sequencer with 16 tracks, 128 General MIDI instruments to choose from and a drum kit (on track 10).
FMEL-1 0.1 Antonio Altea Mellotron-style tape sounds, coloured with effects and lo-fi tape: flutes, strings and choirs as on the old tape frames, played from the keys.
FMini-1 1.5.3 Ruppert A three-oscillator monosynth in the spirit of the classic Moogs: a 24 dB/octave ladder filter, two contours, 100 factory patches, an arpeggiator, a sequencer and MIDI.
FOMAJAM 0.1.3 konsumer A drum machine in the classic step-grid style: voices after the 909, 808, 707, 606, DMX and more, a machine per voice, accents and patterns.
FoMni 0.4 charlesvestal A chord harp inspired by the Omnichord: hold a chord, strum the keys.
Frodhes 0.9.3 Leonardo Mirabal A Rhodes electric piano, physically modelled, no samples: four piano types, compressor, drive, tremolo or wah, phaser, chorus, delay and reverb, tap tempo, MIDI clock, scales and presets.
FuMi-1 1.0.7 cartesive Inspired by the Suiko ST-50 shigin conductor: koto and shakuhachi-style tones.
Pocket GammaWave 1.0-GW ShadowTune (GammaWave Audio) The companion to the GammaWave desktop synth: four industrial distortions, vowel and scream filters, an FFT spectrogram, a four-track tape deck screen and a song generator with 49 genres, trap and drill too.
GHOULBOX 2.3.2 jasonpersinger Dungeon synth (a Felucca fork): cathedral reverb and dark drones.
Golana 1.1 Gadlele One analog-style synth laid out like the classic microKORG, with a screen that draws the sound.
GR!MM 1.0 GRiMMBIENT Dark ambient, dungeon synth and deathdream: four tracks, seven sound sources from VA and 6-op FM to formant voices and physical models, tape, granular freeze and reverbs up to infinite, a 64-step sequencer and song mode.
Hortator 0.16.0 DeadActive A drum-focused firmware based on Felucca.
HYP-1 1.5.44 RedtailWorks Hypnotic techno and acid: a breathing pad, a deep drone, a generative 303 line and grain over drums you sequence.
Jangada 1.0.1 zednaked Superwave analog voices and a modulation matrix.
JIANT FM 0.9.17-98a04cf juanjiant-bit A bio-synthetic groovebox: six tracks drawn as living beings, eight engines (FM6 with Dexed, analog, phase, voice), mutating macros and SLOOP's song mode.
Ketch 0.1-beta risseraka A tracker in the LSDJ / picoTracker / M8 line: song, chain and phrase screens, instruments, effects and a mixer, on the FM-1's own keys and screen.
MAKU 1.0 okumurari An ambience machine for DJ interludes: switch it on and a random world in key plays, four parts, buttons that are verbs, and the worlds you like breed new ones.
MIN-1 0.2.1 Reytian A tiny minimalist ensemble after Philip Glass: it starts playing when you switch on, you join whenever you like.
Mini-Tone 1.0.0 Stéphane Schmitz Felucca with six tracks and new engines: SID, Braids' 48 models, a TB-303 and engines after Elektron's Analog Four, SY Chip and Digitone 2, a ping-pong delay and a new reverb.
MORPHEUS 1.0.0 Ben Badio A pattern sequencer after Reason's Matrix: up to four channels of MIDI sequence data out, and a few voices built in to build the patterns with.
MYCELIUM 1.0-test Mandalars Forest, Psytrance, Goa and Hitech grooves, built on Felucca and SLOOP: original drums and icons and four factory songs.
Niagara Drift 0.1-beta evanyerburgh A drone synth: two drifting virtual-analog drones, each with its own part, swells, LFOs, effects and a sequencer.
No Man Sky FM 0.4 Hericdk A space adventure while you make music, built on SLOOP 2.7.1: fly between planets with two knobs, land, mine, fight sentinels and warp between stars, every SLOOP screen floating over the game.
NOIZ DEMONS 666 SPIKE the Percussionist Felucca with randomization as a ritual: every new sound summons one of 30 demons of the Ars Goetia, its sigil takes the screen and its rank decides how wild the sound gets.
OPN-1 2.0.0 putchdev The Sega Genesis / Mega Drive's Yamaha YM2612: six channels of 4-operator FM.
ORBIT 0.7.1 dspaudio A four-track groovebox based on SLOOP: three synth parts and a drum machine, an event tape to rearrange them, OP-1-inspired screens.
PIGEON 0.4.1 The Shrimp Blimp An old-school hip-hop and house sampler after the SP-404 and the PO-33: two song samples and a 16-pad kit, up to 32 chops a song, a 64-step sequencer, patterns and a song arrangement.
Polly 0.5 charlesvestal A pocket arranger after the Yamaha QY70: pick a style, play a chord and a band of eight follows, with General MIDI sounds.
PurpleMonkey 0.11 Quixotic7 A firmware for kids.
FM1 Quest 38 hericdk A live RPG adventure inside the synth.
Rainbow Mode 1.1.5-rb joshbartlettband-web A music toy for little hands (a Felucca fork).
FM-1 SID 0.1 joakimeriksson A SID chip on the FM-1, as a synth: the keys play 12 instruments, KNOB1-4 are cutoff, resonance, attack, release; FX opens chorus, delay and reverb.
SID-1 1.0.0 putchdev The Commodore 64's SID chip, twice for six voices.
Skiff 1.3.3 illuminus5 A six-track groovebox built on Felucca 1.1.5: fourteen synth and drum engines, a 64-step sequencer with chords, ratchets and locks, songs and a performance layer.
SLOOP 2.7.1 isod89 A live groovebox: four looping tracks.
SLOOP ALG ALG05-TEST shaw-core A SLOOP test build with extra FM algorithms.
SLOOP DX7 Banks 2.5-b28-test majnikool SLOOP with up to twelve DX7 voice banks and presets grouped by kind.
SLOOP Floyd FM 2.4 renebohne SLOOP with a four-operator FM engine after Floyd Steinberg's 4-OP idea: an envelope per operator and a live oscilloscope that draws the envelopes as you play.
sloopDX 4.0 zvenson SLOOP's live workflow with a six-operator DX7 engine from Dexed: 32 algorithms, your own .syx banks, every voice edited on the FM-1, and FM drums.
Tonitor 2026.10.19 Nuno Zimas Six tracks for live ambient and experimental music: three synth engines, patches generated by algorithm, free-length loops with up to ten overdubs each, a granulator, filters and a lush reverb.
TRIBE 0.1-beta apiel A ten-track groovebox built on X0X where any engine plays on any track: kicks, 909 and 808 voices, a 303, sixteen clips a track and scatter effects.
Tuna 1.0-fbc56d3 delirioux Generative music built on Felucca: composer profiles write the music as it plays, you steer them.
Unholy Union 0.2.3 actuallysparky Generative ambient and drone: Immaculate Permutation rolls an arrangement in one key, a pad, a sequence and a chord arpeggio under a fourth voice for your hands.
Vector37 0.3.1 genkigenki An orbiting overtone synth: four corners of two overtone generators each, a sun on a path and a moon around it decide how much of each you hear; the knobs shape the selected planet.
WaveLoop FM-1 1.0.5.2-midi23 ELI7VH A Felucca mod: standalone Arturia MiniLab 3 control, fine track mixing, a DJ filter, momentary effects and MIDI feedback.
winampFM Synth 0.12 hericdk Winamp 2.x on the FM-1, built on SLOOP: your sounds as a playlist, four tracks recorded as loops, effects on sliders and a visualizer of lines.
X0X 1.1.0 charlesvestal A groovebox: 909, 808, two 303s and a break player.
X0X-RMX 1.1.0 Mr-Roboto (Oliver) X0X remixed after The Orb: banks and patterns reordered live per voice, Grids MAP and EUCLID drum generation, an extended TB-3PO with 22 scales and a morphing 303 waveform.
ZEN-1 1.1 aceyprime Ambient as a living window: cherry petals on a river, koi in a pond, fireflies under a real moon, and every movement a note.
zp12 2.4.4 zvenson A 12-bit sampling drum machine after the E-mu SP-1200: 32 pads at 26 kHz with no interpolation, filtered channels on the knobs, loops and songs.

MIDI in works through the emulated MIDI IN jack, so each firmware reads MIDI with its own driver: Web MIDI on the page (Chrome, Edge, Firefox), any MIDI input natively. M-VAVE's firmware listens on channel 2 in the emulator (not yet checked on a real FM-1); Felucca plays its parts on channels 1–4.

The SMK-37

M-VAVE's SMK-37 (Pro / Elite, the MKE-P37 and the Donner Starrykey 37 Play share its hardware) is a 37-key keyboard with 16 RGB pads, 8 knobs, 4 faders, pitch and mod wheels and a screen, around the FM-1's chip: same flash layout, audio and update path, only the panel is wired differently. genkigenki's fm1-to-smk37 kit maps that wiring and ports FM-1 firmwares to it. The emulator models the SMK-37's panel from that map, and a package's identity says which board it runs on.

Play it: joakimeriksson.github.io/fm1-emu/smk37. The firmwares come from genkigenki's install page (node tools/smk37_catalog.mjs refreshes the list). M-VAVE's own SMK-37 firmware runs as the MIDI controller it is (screen, buttons, pads, keys; it names the chord you hold), without sound (its notes go to USB / Bluetooth MIDI) and slower than real time in the browser so far.

Firmware (opens it on the page) By What it is
M-VAVE stock firmware 016 M-VAVE The firmware the SMK-37 Pro ships with: a MIDI controller. Bring your own SMK-37 Pro_016.fwsc.
Makkuro37 0.1 genkigenki A microtonal drone synth: eight voices as eight soot creatures, 96 presets.
Vector37 0.2.2 genkigenki An orbiting overtone synth: a moon circles a sun along a path, and where it is decides how much of each of four sounds you hear.
Snoop37 2.6.5 isod89 (port: genkigenki) SLOOP, the four-track looper groovebox, adapted for the SMK-37.
X0X 0.2 Charles Vestal (port: genkigenki) A 909, an 808, two 303s with a line generator and a breakbeat player, all at once.
FoMni 0.2 Charles Vestal (port: genkigenki) An Omnichord-style chord harp: the 16 pads become the strum plate, the keybed holds the chords.
MAKU 0.1 okumurari2 (port: genkigenki) An always-on ambience machine: power it on and a new, random, in-key world is already playing.
Rainbow mode 0.2 joshbartlettband-web (port: genkigenki) A music toy for kids: colour-coded notes, 40 friends who sing along, no menus.
GHOULBOX 2.1 Jason Persinger (port: genkigenki) Dungeon-synth firmware: dark ambient, medieval and fantasy sounds, with drones, a hurdy-gurdy crank and two sounds at once.
ChoralRoot 0.21 Quixotic7 (port: genkigenki) A chord instrument in the manner of the Orchid: one hand plays roots, the other picks the chord.
ORBIT 0.7.0 dspaudio (port: genkigenki) A four-track groovebox with OP-1-inspired screens: three synth parts, a drum machine, an event tape and a mixer.
AMB-1 1.1 Charles Vestal (port: genkigenki) A generative ambient machine inspired by Music for Airports: loops of different lengths drift past each other and never repeat.
Polly 0.4.1 Charles Vestal (port: genkigenki) A pocket arranger inspired by the Yamaha QY70: a band of eight General MIDI instruments follows the chords you play.
winampFM 0.1 Hericdk (port: genkigenki) A synth groovebox in the look of Winamp 2.x, built on SLOOP: player, playlist, effect sliders and a visualizer.
OberVave 1.2.1 zvenson One 8-voice analog-style polysynth in the spirit of the American poly synths of 1979–84, with chorus, delay and a plate reverb.

On your computer

Download fm1-live for macOS (Apple silicon) or Linux (ARM64, x86-64) from the releases, and play a firmware package: ./fm1-live --fwsc felucca.fwsc. Or build it from a checkout:

cargo run --release -p fm1-live -- --fw list           # the firmwares
node tools/fetch_firmwares.mjs                          # download them into reference/firmwares
cargo run --release -p fm1-live -- --fw felucca         # a window with the synth, audio out
cargo run --release -p fm1-live -- --fwsc FM-1.fwsc     # M-VAVE's own, from its package

fm1-live runs the real 240 MHz clock on Apple silicon Macs and 64-bit ARM Linux, with an AArch64 JIT; elsewhere it interprets (--mhz lowers the clock if that can't keep up). It plays every MIDI input of the computer (--midi NAME, --midi none, --midi-ch N) and loads a DX7 bank into M-VAVE's firmware with --syx bank.syx. fm1-emu is the batch runner for tests and debugging (WAV and screen output, breakpoints, memory dumps). Both take --flaky-core1 RATE [--seed N]: the second core misreads RAM now and then, as on some units, to test a firmware's fallback to one core (docs/stock-firmware.md).

The page builds with web/build.sh (Rust to WebAssembly; needs the wasm32-unknown-unknown target), the whole site with tools/build_site.sh.

In your DAW: AU and VST3

The emulator also comes as an instrument plugin, so a firmware plays in a DAW like any other synth:

Format Loads in
AU Logic Pro, GarageBand, MainStage, and most other Mac DAWs
VST3 Ableton Live, Cubase, FL Studio, Reaper, Bitwig, Studio One, Cakewalk…
CLAP Bitwig, Reaper, FL Studio, Studio One…

What it does:

  • The firmware: Load firmware / save… in the plugin’s window picks a .fwsc package: any community firmware (the table above links each author's) or M-VAVE's own. An SMK-37 package gets the SMK-37's panel.
  • Playing it: MIDI from the DAW plays it, as through the FM-1's MIDI IN. A MIDI channel setting moves all notes to one channel; M-VAVE's firmware listens on 2. The panel is the page's, played with the mouse: keys, buttons, knobs, and on the SMK-37 the pads, faders and wheels.
  • Automation: Master (the MASTER pot) is a parameter the DAW can automate.
  • CPU clock: the emulated clock, 240 MHz as on the chip by default; 320 or 400 give a firmware that runs out of time more, at the cost of more of the computer's CPU.
  • Share setups with the browser or another DAW. “Load firmware / save…” opens a .fwsc package or .fm1save setup. “Export save…” writes the firmware and its latest saved patches and settings to one portable file. Edits in RAM need the firmware’s own Save command first.
  • The project keeps the firmware and its patches. The package and every flash sector the firmware has written are saved with the song, so it reopens with the same sounds.
  • Timing: the emulator runs a little ahead of the DAW and reports that delay as the plugin's latency, so the DAW compensates and notes land where they were placed. The status bar shows how much faster than real time the firmware could run on this computer; most run at 3–6x, the heaviest at about 1.5x.

Download it from the releases, for Macs with Apple silicon (M1 or later). The zip has the three plugins and an INSTALL.txt that says where each goes. Until a release is signed with an Apple Developer ID, macOS blocks it until you allow it, with one Terminal command that INSTALL.txt gives.

Build and install it yourself (macOS, Apple silicon). You need Rust, CMake and Ninja (brew install cmake ninja), then:

tools/build_plugin.sh

This builds the plugin and installs FM-1.component, FM-1.vst3 and FM-1.clap in ~/Library/Audio/Plug-Ins. It then runs Apple's AU validator on them.

In GarageBand:

  1. Settings → Audio/MIDI: tick Enable Audio Units, then quit and reopen GarageBand.
  2. Make a Software Instrument track and open its Smart Controls (B).
  3. Click the Instrument slot and choose AU Instruments → fm1-emu → FM-1.
  4. Click the slot to open its window, then Load firmware / save….
  5. Play it with ⌘K (Musical Typing) or a MIDI keyboard.

In Logic: a Software Instrument track's instrument slot, AU Instruments → fm1-emu → FM-1.

In VST3 or CLAP hosts: add FM-1 (by fm1-emu) as an instrument on a track.

How it's built: it's one plugin written in Rust as a CLAP with nih-plug. clap-wrapper makes the AU and VST3 of it, and the plugin stays MIT. All its parts are MIT, ISC or Apache-2.0, including Apple's AudioUnitSDK and Steinberg's VST3 SDK, which is MIT since 3.8.

So far it has passed:

  • Apple's AU validator (auval);
  • Steinberg's VST3 validator (47 of 47 tests);
  • GarageBand, as an AU;
  • Steinberg's VST3 test host.

Logic, Ableton and the Windows / Linux builds haven't been tried yet. More in crates/fm1-plugin.

How it works

The FM-1 is built on a JieLi AC791N: two cores of JieLi's own 32-bit pi32v2 CPU, with no public instruction set manual. The instruction set here was recovered from the firmwares themselves (isa/, docs/isa-notes.md) and checked against test programs built with JieLi's toolchain. On top of the CPU sit models of the chip's timers, interrupts, flash, the 240×240 screen, the key matrix and encoders, the knobs, the audio output and the MIDI UART. Hot code is compiled, to AArch64 natively and to WebAssembly in the browser. How it was built and checked, step by step, is told in a technical report: Emulating a Synthesizer Before It Arrives (PDF, 8 pages).

  • crates/: fm1-isa (decoder tables), fm1-core (CPU and JITs), fm1-soc (the chip and the board), fm1-live (the native synth), fm1-emu (batch runner), fm1-web (the wasm build), fm1-gdbstub
  • web/: the page; web/fwsc.js unpacks the update packages
  • docs/: the hardware notes (recon.md), the instruction set (isa-notes.md), M-VAVE's firmware (stock-firmware.md); PLAN.md is the work log
  • tools/, probes/: ISA extraction, benchmarks, differential test programs
  • fm1-sid/: the SID study and player firmware (its own README)

Licences

The emulator is MIT (LICENSE). The firmwares are their authors' and are not part of this repository; the page fetches them from the authors' sites. fm1-sid/ has files under other licences, among them its player firmware, GPL-3.0 since it is built on Felucca's code: its README lists them. The plugin (crates/fm1-plugin) is MIT too; the libraries and SDKs it builds with are MIT, ISC or Apache-2.0.

Credits

Built on the community's reverse engineering of the FM-1: AL-255/FM-1-RE, ip2k/lunar-modulator, kagaimiq's jielie, the hardware layer of hugelton/Felucca and awesome-fm-1. Thanks to every firmware author for publishing their work.

About

Emulator for the M-VAVE FM-1 pocket synth: runs its firmwares unchanged in the browser and natively

Topics

Resources

Stars

68 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages