Firmware for the M-VAVE FM‑1 · open source · early

Make a sound. Resample it. Make it new.

Veffbox is a resampling sound-design instrument for a 27-key pocket synth. Build one sound from a source, a strummed chord sequence, modulation and up to eight effects. Then RESAMPLE: the recording becomes the new source, and the recipe that made it is kept, so every sound can be rebuilt bit for bit.

  • 6sources: FM, analog, drums, and three ways to play a resample
  • 9×46 LFOs and 3 envelopes, 4 destinations each
  • 8FX slots in any order, 13 effect types
  • 64bank sounds, each with its own generation tree

Interactive · with sound

Play it right here.

The emulator runs the Veffbox firmware itself in your browser: the same screen, the same engines, the same sound, and your bank is kept in this browser. Start tutorial lights up what to press next and says why, from the first sound to a resample, the tree and a chord sequence.

Computer keyboard: Z S X D C… play the keys, Space PLAY, Enter resample, \ SEL (click the panel first). Open full screen ↗
00 · Your first sound

From nothing to a bank
of your own sounds.

Eight steps on the FM‑1. You never lose anything: each roll can be undone, each resample is kept with the recipe that made it, and a sound can always be rebuilt from scratch.

  1. Pick an engine

    EDIT · turn SELECT

    EDIT opens the source page. Turn SELECT to choose the engine: OP4 (FM), ANLG (analog) or DRUM. The engine's name is the big title. Play the keys to hear it.

    The four knobs under the screen edit the row shown by the dots. Press EDIT again for the next row. In DRUM, the key you press picks the voice the knobs shape. In OP4, the OP knob on the third row picks the operator, A to D.

  2. Roll the engine

    SEL · SEL · SEL…

    On the source page, SEL is RANDOMIZE: new engine settings, and the sound plays once so you hear it. Tap again for another roll. CHAOS on GLO sets how far a roll goes, from a nudge to a whole new sound.

    Hold SEL for 0.6 s to go back to the sound from before the first roll of the series.

  3. Give it a part

    ARP · SEQ · PLAY

    ARP picks the mode: NOTE (the keys), SEQ (a 16-step line) or CHORD (up to 8 chords with exact notes, each with its own length, and a strum). SEQ edits the selected step: turn SELECT to move, press keys to enter notes. PLAY starts and stops.

  4. Make it move

    LFO · ENV · SEL = LEARN

    Pick an LFO or envelope with SELECT, tap SEL, then turn any knob on any page: that parameter becomes one of its four destinations. A ~ next to a knob's name means something modulates it.

  5. Scramble the effects

    FX · SEL · SEL · SEL…

    On the FX page, SEL is SCRAMBLE: a new chain of effects, with LFOs already routed into them. Tap a few times until something clicks, and hold SEL to go back. Or build the chain by hand: SELECT picks the slot, the knobs set TYPE, the amounts, MIX and the slot's position.

  6. Resample it

    REC · from any page

    REC records the whole chain as a new generation: G1, G2… With AFTER on FLAT (HOME), the effects and modulation are cleared and the resample becomes the source, so you start fresh on the result.

    HOME sets the resample: LEN (one note or 1, 2 or 4 bars), START on the grid, NORM, and how long the tail rings.

  7. Bend the resample, and resample again

    EDIT · SELECT: SAMP · GRAN · CHOP

    Now the resample is the sound. Play it as a sample (SAMP), scatter it into grains (GRAN) or cut it at its transients into slices on the keys (CHOP). Roll it with SEL, scramble new effects, then REC again. Every round adds a generation, a child of the one before.

  8. Your tree, your bank

    SAVE · SELECT · SEL

    SAVE shows the sound's generation tree. Pick a generation with SELECT, choose an action with the DO knob, and run it with SEL.

    LOAD plays its resample again. EDIT brings back the recipe that made it, so the next resample grows a new branch and the old one stays. RBLD re-renders it from the first generation, bit for bit.

    PRESETS picks which of the 64 bank sounds you are on, ALGORITHM which of the 4 tracks. Everything saves itself to the FM‑1's flash 2.5 s after you stop playing. To fill the bank, turn PRESETS to an empty sound and start again from step 1.

Why the tree can always be rebuilt: Veffbox uses integer math only, and every random roll comes from a seed stored in the recipe. A recipe is a few hundred bytes, so a sound keeps up to 12 generations in flash, while audio is kept only for the last resample. REBUILD renders the rest from their recipes and gets the same bits back.

01 · The loop

Five pages.
One direction.

Everything you do is a step on one road: a source, played, modulated, run through effects, resampled. The resample goes into the bank as a new generation and comes back as the source. Round you go.

SOURCE to PLAY to MOD to FX to RESAMPLE. RESAMPLE saves a generation in the BANK, and the resample becomes the next SOURCE. SOURCEEDIT · SEL = RANDOMIZE PLAYARP · SEQ MODLFO · ENV · SEL = LEARN FXFX · SEL = SCRAMBLE RESAMPLEREC · from any page BANKSAVE · new generation THE RESAMPLE BECOMES THE NEXT SOURCE SOURCE to PLAY to MOD to FX to RESAMPLE. RESAMPLE saves a generation in the BANK, and the resample becomes the next SOURCE. SOURCEEDIT · SEL = RANDOMIZE PLAYARP · SEQ MODLFO · ENV · SEL = LEARN FXFX · SEL = SCRAMBLE RESAMPLEREC · from any page BANKSAVE · new generation THE RESAMPLE BECOMES THE NEXT SOURCE
  1. SourceEDIT

    Where the sound comes from: an FM, analog or drum engine, or the last resample played as a sample, as grains or as slices.

  2. PlayARP · SEQ

    From the keys, as a 16-step line, or as an 8-step chord sequence with exact notes and a strum.

  3. ModLFO · ENV

    6 LFOs and 3 envelopes, each reaching 4 destinations anywhere on any page.

  4. FXFX

    Up to 8 effects in a chain, in any order, the same type more than once if you like.

  5. ResampleHOME · REC

    Records the whole chain. The resample is the next source; its recipe goes into the bank.

02 · Sources

Three engines.
Three ways back in.

Start from a synth engine. After the first resample, the source can be the resample itself: played as a sample, scattered into grains, or cut into slices. The knobs come in rows of four; press the page button again for the next row. SELECT picks the engine.

Engines: make a sound from nothing

OP4
4-operator FM

Four operators, A to D, in 11 algorithms that decide who modulates whom and which ones you hear. Integer ratios sound harmonic, odd ones metallic; a fixed-frequency operator makes drums and bells.

  • 11 ALG
  • 7 waves
  • CRS · FINE · LVL
  • ADSR per op
  • FIX
  • D feedback
ANLG
Two-oscillator analog

Two oscillators with detune, a sub one octave down, noise and sync, into a 24 dB ladder filter with drive and its own envelope.

  • SAW SQR TRI PWM SIN NOIS
  • DET · SUB · SYNC
  • CUT · RES · ENV
  • DRV
DRUM
Eight 808-style voices

Kick, snare, clap, hat, tom, rim, cowbell and cymbal, each with 8 shaping knobs: pitch sweep and its time, click, snap, metal, burst, choke. The keys play the voices.

  • KICK
  • SNARE
  • CLAP
  • HAT
  • TOM
  • RIM
  • COWB
  • CYMB

Resample sources: play the last generation

SAMP
The resample as a sample

Start and length, one-shot, forward or ping-pong loop, reverse, pitch, fade and gain.

  • START · LEN
  • LOOP FWD / P-P
  • REV
  • PITCH ±24
GRAN
The resample as grains

Position, size, density and spray, random pitch and reverse grains, four window shapes, a freeze. Grain scatter comes from a seed, so a render repeats exactly.

  • POS · SIZE · DENS · SPRAY
  • HANN TRI RECT EXP
  • FRZ
  • SEED
CHOP
The resample as slices

Transient detection cuts the resample; SENS decides how many slices. Map them to the keys or to the steps, and play them in order, shuffled, stuttered or reversed.

  • SENS
  • SEQ SHUF STUT REV
  • MAP KEYS / STEPS
03 · Play

Chords with exact notes.
Steps with their own length.

Three play modes: NOTE from the keys, SEQ as a 16-step line with slides and probability, and CHORD: 8 steps, each holding up to 6 exact notes and its own length, from a sixteenth to four bars. Press a key to add or remove a note; the chord name is recognized for you.

The sequence every new sound starts with · 120 BPM · GATE 90%27 bars of sixteenths = 6¾ bars
StepChordExact notesLENTemplate

Per step: ROOT moves the whole voicing, TYPE fills it from 11 templates (MAJ, MIN, 7, MAJ7, MIN7, SUS2, SUS4, ADD9, MIN9, DIM, 5), N1–N4 set single pitches, LEN runs 1/16, 1/8, 3/16, 1/4, 3/8, 1/2, 3/4, 1, 1½, 2, 3 or 4 bars, and GATE sets how long the notes ring inside the step.

Seven ways to strum.

TIME sets the gap between strummed notes (0–250 ms) and HUMAN adds timing and velocity drift. Each picture below is step 1, Cm7, as the screen draws it.

04 · Modulation

One source.
Four destinations.

Nine modulation sources: 6 LFOs and 3 envelopes. Each one reaches up to four destinations, each with its own bipolar amount. A destination can be any knob on any page: an operator level, a drum's pitch sweep, a grain position, a delay time, even another LFO's rate.

LFO 2 modulates four destinations: GR SIZE +40, GR POS +18, FX1 SPRY +25 and FX2 PTCH −8. LFO 2 SIN · 1/4 · TRIG D1 GR SIZE+40 D2 GR POS+18 D3 FX1 SPRY+25 D4 FX2 PTCH−8

LEARN: point, don't scroll.

Destinations are generated from every engine's and effect's parameters, so the list is long. LEARN skips it.

  1. Open LFO or ENV and pick the source with SELECT (L1–L6, E1–E3).
  2. Press SEL. The next free destination waits: TURN A KNOB…
  3. Go to any page and turn the knob you want to move. It becomes the destination; set its amount with A1–A4.

Modulated knobs show a ~ next to their name. Modulation adds a delta on top of the knob, so the recipe always keeps the value you set.

LFOSINTRISQRSAWRAMPS&HEXP SYNC 8/1 … 1/32FREE TRIG HOLD ONE HALFPHASE ENVADSRLOOP OFF / LOOP / BEATVEL
05 · FX chain

Eight slots.
Or let it scramble.

Signal runs from slot 1 to slot 8. Every slot has a type, four knobs, a wet mix, a bypass and MOVE, because order changes the sound. On the FX page, SEL = SCRAMBLE: a random, wild chain with LFOs patched into its knobs. Try it here.

SCRAMBLE

TypeKnobsWhat for
DRIVEDRV TONE BIAS OUTSaturation, asymmetric with BIAS.
FOLDAMT SYM PRE OUTWavefolding: bright, hollow, wild.
CRUNCHAMT RATE HISS OUTADPCM-style grit and hiss.
BITSBITS SR JIT OUTBit depth and sample-rate reduction with clock jitter.
FILTERCUT RES TYPE DRVA resonant filter in the chain, not only in the voice.
TAPE DLYTIME FB HP LPDelay with a tape's pitch bend when TIME moves.
REVERBSIZE DEC DAMP GATERooms to washes, gated if you like.
CHORUSRATE DEP FB WIDEWidth and movement.
PHASERRATE DEP CNTR FBSweeping notches.
RINGTUNE WAVE EXT KEYRing modulation, tuned or following the key.
RESONTUNE DEC TONE CHRDResonators that turn noise into pitch, or a chord.
FREEZESIZE SPRY PTCH HOLDHolds a moment and smears it.
SHIFTPTCH FB WIN TONEPitch shifting, spiralling with feedback.
06 · Randomize, chaos, undo

Roll the dice.
Hold to take it back.

One button acts on whatever page you are on. A tap rolls, another tap re-rolls, and holding it brings back the sound from before the first roll. You can explore without fear.

SELRANDOM

RANDOMIZE

On the source page (EDIT): new engine settings. OP4 gets a new algorithm, ratios and envelopes with its carriers kept audible; DRUM reshapes the selected voice; GRAN rolls a new seed. At high CHAOS, OP4 and ANLG may even swap.

GLOCHAOS

CHAOS

How far RANDOMIZE and SCRAMBLE go. Every value moves toward a random target by the CHAOS amount, so low settings nudge your sound and high ones replace it.

0% nudges100% total chaos
SELHOLD

Hold SEL = undo

Holding SEL for 0.6 s undoes the whole run of rolls, not just the last one. It works for RANDOMIZE and SCRAMBLE alike. And since every roll comes from a seed, whatever you resample is in the recipe.

07 · Resample and the generation tree

REC resamples from any page. The output of the whole chain is recorded as a new generation, a child of the one you started from. With AFTER = FLAT, effects and modulation are cleared and the resample is loaded as the source, ready to be bent again.

Resample settings, on HOME.

LENNOTE · 1 · 2 · 4 BAR how much to record
STARTGRID · FREE on the beat or right away
NORMON · OFF normalize the level
AFTERFLAT · KEEP clear FX and MOD, or leave them
TAILAUTO · 0.5 · 1 · 2 s let effects ring out
FMTPCM · ADPCM ADPCM: 4× the time, forward only

Why bit-exact matters: the FM‑1 has room for the recipes of every generation (stored as small deltas against the parent) but for the audio of only a few. Everything is integer math, all randomness comes from seeds in the recipe, and a shipped engine never changes how it sounds; a fix is a new engine version. So REBUILD gives back the same bits, and you never notice the audio was not kept.

08 · Bank and tracks

64 sounds.
Four tracks. One in focus.

The bank holds 64 sounds, each with its own generation tree. Four tracks each play one bank sound. You edit one at a time, full screen, while the others keep playing as context.

Turn to choose.

ALGORITHM picks the track you edit. PRESETS picks which of the 64 sounds sits on it. Recipes live in flash as deltas against their parent, so 64 sounds with many generations each fit in the FM‑1's own memory.

T1 · 01INIT
T2 · 02GRIT PAD · editing
T3 · 05SUB BASS
T4 · 06BOOM KIT

GLO holds what the tracks share: BPM and CHAOS.

09 · Panel map

Every control, one job.

The FM‑1's labels stay; Veffbox gives them these meanings. The four knobs under the screen always edit the lit row of the current page.

FM‑1 controlVeffboxDetails
EDITSRC: the sourceSELECT picks the engine or resample source; the keys pick the DRUM voice. SEL = RANDOMIZE.
ARPSEQPLAYARP: mode and strum row. SEQ: the step row (chord or note of the selected step).
LFOENVMOD6 LFOs, 3 envelopes, 4 destinations each. SEL = LEARN.
FXFX chain8 slots, 13 types. SEL = SCRAMBLE.
HOMEResample settingsLEN, START, NORM, AFTER, TAIL.
RECResampleFrom any page.
SAVEBankThe generation tree: LOAD, EDIT, REBUILD.
GLOGlobal + CHAOSBPM, and how far the random rolls go.
PLAYTransportStart and stop. Flash is only written while stopped.
SELAct on the pageRANDOMIZE on SRC, SCRAMBLE on FX, LEARN on MOD, resample on HOME, run the action on SAVE.
hold SELUndoTakes back the whole run of random rolls.
SELECTEngine, or the item on the pageThe engine on SRC; the step, LFO, FX slot or generation elsewhere.
ALGORITHMTrackWhich of the 4 tracks you edit.
PRESETSSoundWhich of the 64 bank sounds sits on the track.
KNOB 1–4The lit rowPress the page button again for the next row.
OCT−OCT+OctaveShift the keys by an octave.
OCT−+OCT+ 5 sUBOOT recoveryThe way back if anything goes wrong.
10 · Status

Running on the FM‑1 today.

The emulator above is the firmware itself, compiled for the browser. It is portable integer C, tested on a computer before it reaches the hardware, and installed on an FM‑1 from the page below.

Firmware 0.3.2

Running on hardware today

Measured on a real FM‑1: a strummed OP4 chord sequence through a scrambled FX chain peaks at 45% CPU, with no late audio buffers.

  • SourcesOP4, ANLG, DRUM, and SAMP, GRAN and CHOP playing the resample
  • Playkeys, a 16-step line, or a chord sequence with exact notes and seven strums
  • MOD6 LFOs and 3 envelopes, 4 destinations each, LEARN
  • FX8 slots, 13 types, SCRAMBLE; hold SEL to undo
  • RESAMPLEthe resample becomes the source; generations are saved to flash
  • REBUILDre-renders a generation from its recipe, bit-exact
  1. M0Mockup doneEvery page, every button, the bank tree, designed before the firmware.
  2. M1Portable core doneSix engines, 13 effects, modulation, the player, flash formats. Host tests for repeatability and overflow.
  3. M2Platform doneMNM-1's hardware layer, loader and tools; its own identity, FM-1_62000100.
  4. M3UI on the device donePages, rows, SELECT and SEL, RANDOMIZE and SCRAMBLE with undo, LEARN.
  5. M4RESAMPLE doneThe chain renders into RAM (1.67 s); SAMP, GRAN and CHOP play it.
  6. M5Bank done64 sounds and their generations in flash, LOAD, EDIT, REBUILD.
  7. M6In the browser doneThe firmware as WebAssembly: the emulator and the step-by-step guide at the top of this page.
  8. M7NextFour tracks sounding at once, PITCH as a modulation target, longer resamples, sidechain and spectral effects.
11 · Install

Put it on your FM‑1.

Over the FM‑1's own USB cable. The update path is the same as MNM-1's, so a Veffbox image can always be replaced with the normal installer.

Firmware 0.3.2

Web installer

One button, in Chrome or Edge on a computer. Connect the FM‑1 with a USB data cable and keep the page open until it says Done.

Back to the stock firmware

M-VAVE's own updater puts the official FM‑1 firmware back.

If something goes wrong

Hold OCT− and OCT+ together for 5 seconds: the FM‑1 goes into UBOOT, its recovery mode, and takes a new image from there. A build that keeps crashing in its first 30 seconds drops into UBOOT by itself.

Or

Command line

With the install tool from an MNM-1 checkout:

$ python3 tools/fm1_install.py veffbox-X.Y.Z.fwsc --port FM‑1 --yes
  1. Plug the FM‑1 into the computer with a USB data cable.
  2. Run the command with the package's real file name.
  3. Keep the cable in until it says it is done; the FM‑1 restarts with Veffbox.

Test firmware, installed at your own risk: no warranty, and the author accepts no responsibility if your FM‑1 is damaged or misbehaves.