M-VAVE FM-1 (emulated)
click Start to bootRuns an FM-1 emulator in a WASM virtual machine.
Turn the phone sideways for a bigger synth.
A…' play C4–F5 Z X octave Space PLAY drag or scroll a knob Play chords with several fingers · drag a knob up / down How to use it, MIDI in, the firmwares ↓
What this is
The M-VAVE FM-1 is a pocket FM synthesizer. This page emulates its chip, a JieLi AC791N with two cores of JieLi's own 32-bit pi32v2 CPU, together with the screen, keys, knobs and audio, and runs the FM-1's firmwares on it unchanged, in WebAssembly in your browser: the same update packages you would install on a real one.
- Pick a firmwareFelucca, the original open firmware, is the default. Every firmware is downloaded from its author's own site when you start it. The list below says what each one does.
- Press StartA browser only plays sound after a click. Changing the firmware or the clock later reboots the synth.
- PlayUse the computer keyboard, the mouse or a touch screen, or a MIDI keyboard (MIDI in). The status line shows the clock, how many million instructions per second the emulated CPU runs, and the count of short audio quanta.
Playing
Computer keyboard
- Z OCT−
- X OCT+
- Space PLAY
- R REC
- 1 FX
- 2 SCL
- 3 ENV
- 4 LFO
- 5 EDIT
- 6 GLO
- 7 HOME
- 8 SAVE
- 9 ARP
- 0 SEQ
- ←→ SELECT
- ↓↑ PRESETS
- ,. ALGORITHM
The keyboard covers 18 of the FM-1's 27 keys; OCT− and OCT+ reach the rest. KNOB1–4 and MASTER have no keys: use the mouse.
Mouse and touch
- Click a key or button, or drag across the keys for a glissando.
- Drag a knob up or down, or scroll over it. MASTER is the volume.
- On a touch screen every finger counts: play chords, or hold a key while you turn a knob.
- On a phone, turn it sideways: the synth fills the screen.
MIDI in
A MIDI keyboard connected to this computer plays the synth through its MIDI IN jack, just as a cable into the real FM-1 would: the firmware reads the bytes itself, at MIDI's own 31250 baud.
Browsers: Chrome, Edge and Firefox, which have Web MIDI. Safari has none, so the MIDI controls are greyed out there.
- Connect the keyboard (USB, or through a MIDI interface).
- Choose it under MIDI in, or choose “all inputs”.
- Allow MIDI access when the browser asks. It only asks once you pick an input.
The dot next to the list lights up amber while messages arrive. The page remembers the input and connects it again on Start next time; devices plugged in later appear in the list.
Channel “as sent” passes every message on unchanged. A number from 1 to 16 moves every note and controller to that channel, so a keyboard fixed on one channel can play a firmware that listens on another.
Which channel each firmware wants
- M-VAVE's firmware listens on channel 2 in the emulator (its boot code sets it up that way). That is not yet confirmed on a real FM-1.
- Felucca and its relatives play their parts on channels 1–4.
- ChoralRoot, Hortator, SLOOP ALG and X0X make no sound from a plain note-on. X0X's own MIDI code says it is untested on hardware.
The firmwares
Every downloadable community firmware from fm1-editor.com/firmware, plus this repository's FM-1 SID and M-VAVE's own. Each is its author's build, unchanged, downloaded from the author's site when you start it. “Install” links to the author's installer, for putting it on a real FM-1.
M-VAVE's own firmware
The firmware the FM-1 ships with: a DX7-style FM synth (a port of msfa, the Dexed engine), with both cores running. Versions V13 and V15 have been tested here.
This page hosts no firmware, and it cannot download M-VAVE's: their server does not let other pages fetch it. Bring your own copy.
- Download
FM-1.fwscfrom M-VAVE. - Choose “M-VAVE stock firmware”, then click Open .fwsc…, or drop the file on the synth.
- Press Start. This browser keeps the copy for your next visit; open another one to replace it.
Patches
On a real FM-1 the patches live in a part of the flash that updates never write, so the update package has
none. Here it starts with a small bank of the emulator's own (EMU E.PNO, EMU BASS, …).
DX7 bank… loads a DX7 32-voice .syx into slots 1–32; you can also drop the
.syx on the synth.
Play it over MIDI on channel 2 (see MIDI in). How the emulator runs it.
Known limits
- Speed. The real FM-1 runs at 240 MHz. The page starts at 100 MHz, which keeps slower machines in real time. If the status line's count of short audio quanta keeps climbing, the emulator is falling behind: pick a lower clock.
- Safari has no Web MIDI, so no MIDI in there.
- MIDI goes in only. The page sends no MIDI out.
- M-VAVE's MIDI channel 2 is what the emulator shows; it has not been checked on a real FM-1.
- ChoralRoot, Hortator, SLOOP ALG and X0X give no note from a plain MIDI note-on.
- M-VAVE's patches: the factory bank of a real unit is not in the update package, so the emulator starts with its own small bank.
How it works
The emulator is written in Rust and runs as WebAssembly in the browser's audio thread. It executes the pi32v2 instruction set and models the parts of the chip the firmwares use: timers, interrupts, the flash, the 240×240 screen, the key matrix and encoders, the MASTER knob, the audio output and the MIDI IN port. Hot code is compiled to WebAssembly while it runs (a JIT); hover over the status line to see how many regions it has compiled.
Each firmware boots from its whole update package (.fwsc), fetched from the author's site
when you press Start. If the author has moved on to a newer version, the page takes the package the author's
installer names now. Packages are unpacked by the page's own unpacker, fwsc.js; Felucca's GPL
package code (fm1pkg.js) stays out of the page.
More for the curious
- The FM-1 behind it: a JieLi AC791N (WL82) with 1 MB of flash, a 240×240 screen, 27 keys, 14 buttons with LEDs, 7 encoders, the MASTER knob and a TRS MIDI in.
- M-VAVE's firmware, X0X, Melodee and ChoralRoot use the second core; both cores are emulated.
- In WebAssembly at 240 MHz, every firmware ran faster than real time on the development machine: from 1.6× (X0X) to 3.7× (Hortator).
- The front panel is drawn by the same Rust code as the native version,
fm1-live, which plays the firmwares in a window with audio and MIDI in. - Links keep a setup:
?fw=x0x&mhz=120picks the firmware and the clock;?jit=0turns the JIT off. The page also remembers your last choices.
Source and credits
The emulator's source: github.com/joakimeriksson/fm1-emu.
The firmwares are their authors' work, under the licences shown on each card; the list follows fm1-editor.com/firmware.
Built on public reverse engineering of the FM-1: AL-255/FM-1-RE, ip2k/lunar-modulator, kagaimiq's jielie, and the hardware layer of hugelton/Felucca. More FM-1 resources: awesome-fm-1.
Also here: FM-1 SID, a firmware that makes the FM-1 a Commodore 64 SID synth, with a step sequencer and stereo chorus, delay and reverb, and plays C64 tunes: its page has all of HVSC.