PERF-1
Custom live-performance firmware for the M-VAVE FM-1. Sixteen genres of music that plays itself while you steer it: an auto-DJ, a drum sequencer with real depth, an acid line that answers itself, DX7-style FM voices (and your own), effects you can edit page by page, a mixer and a real compressor and limiter, a Jam page to play along on, scenes, and a screen that shows you what the music is doing. By deamonSLINKY. DEMO VIDEO https://youtu.be/NSJR3SOgDXo

The home screen, the master bus and a visualizer.
Try it now: https://deamonslinky.github.io/PERF-1/ (the browser emulator runs the same code with sound; the installer, editor and manual are there too).
Watch the tour (5 minutes, made from the firmware itself): 
What it is
PERF-1 is a custom firmware for the M-VAVE FM-1: a 5 track generative groovebox you perform on. You don't write a song and press play: you pick a piece, and it plays (a pad, a bass, a 303-style acid line, a pluck, drums), and you shape it live: break it down, build it back up, drop it, mute and solo parts, throw effects, change the pattern, take the acid somewhere else. Everything is changeable while it plays, and nothing is a loop of audio: the notes are generated by the engine on the FM-1 itself, from the key, the scale and the chord it is in. MPC Style Flex Beats, 27 effects that are all editable, or mute a track and jam directly. Auto-DJ can run the whole arc (groove, fill, breakdown, build, drop) by itself while you change the Mood, throw in dj snips, or run the effects. Open to any and all ideas and feedback. Still under heavy development, but tested constantly on a real FM-1. Many safety mechanisms in place to prevent audio drops.
Who it's for
- If you want to make music without first learning how to build a good song, PERF-1 is a place to start. Every piece already sounds finished: choose a genre, press play, and you are performing from the first minute, steering a groove that holds together (the chords, the drums, the acid and the effects all follow the same key and tempo). You learn by turning things, not by programming them.
- If you already know what you want, it opens up. The sequencer, the sound pages, the acid line, the scales and the effects can be edited as deeply as you like, a piece you have shaped can be stored, and your own DX7 voices can be loaded. The sequencer keeps growing: per-step ratchets, push and levels, chains of patterns, slices and half or double time are in, and the acid and pluck lines can be frozen and edited step by step.
What makes it different
- Pieces that evolve. Each piece is a set of rules (key, mode, tempo, which sounds, which drum patterns), not a recording. The chords move, the acid line mutates a little each time round, the pad breathes, the hats change. Leave it alone and it develops; touch it and it follows you.
- A performance instrument, not a preset player. One button breaks the music down, a second builds it, a third drops it. An auto-DJ can run the whole arc (groove, fill, breakdown, build, drop) by itself, following the chords or a bar count, and bring in the next piece. Scenes store your mix and effects and recall them on the bar. Effects are played like keys, in four banks (27 effects, 24 beat FX, 15 flex beats and 27 DJ snips, 93 keys in all): tap to latch, hold to play. A Mood dial moves a dozen settings at once from chill to peak.
- Sixteen genres that behave like genres. HYPNO (techno and acid), lofi, house, dubstep, dub, DnB, breaks, garage, electro, trap, disco, funk, reggae, synthwave, amapiano and trip-hop. Each has its own tempos, swing, drum kits and patterns, effects (vinyl and tape for lofi, a pump for house, a shimmer reverb for DnB, a gated one for synthwave), its own bass line (an octave bounce for disco, a kick-locked 808 for trap, an off-beat for house), its own pad comping and ghost notes, and its own habits for where the chords go next (the ii-V-I turnarounds of lofi, DnB and amapiano, the stepwise loops of house, the dark, sparse moves of dubstep and trap). Ten pieces each, a hundred and sixty in all.
- A real sequencer under the generator. Six drum lanes, sixteen steps, six patterns. Euclidean fills and rotation, a chance per lane, lanes with their own lengths (polymeter), a density control that thins a lane by importance (off-beats first) or fills it in without ever editing the pattern, a source per lane (take the hats from pattern 4 while the kick stays on pattern 1), pattern keys that play only while held, and drum drift: patterns that change and mutate on their own, with the backbeat protected. Per step, ratchets (x2 to x6, flams, swells), push and level (ghost, soft, accent); over bars, chains of patterns (the Amen's 1 1 3 4 among them), slice permutations, half and double time, and a condition for each lane (odd bars, the last of four, fills only).
- The acid answers itself. The line asks, then answers: an octave or a fifth up or down, a third within the scale, the contour mirrored round its own middle, backwards, shifted a beat, thinned, or reduced to its accents. It answers every 2nd to 8th bar or loop, or in the bar before the drums change, so it arrives with the pattern change. Like the line? Freeze it: the Acid steps page shows it as sixteen bars you can edit (rest, note, accent, slide, note, octave), holds it against Mutate and stores it with the piece.
- Effects you edit, not only throw. Beyond the 93 keys, every effect with settings has its own page that draws it: the gate's steps, the roll's speed-up, the scratch, the freeze, the phaser, the tape, the vinyl, the pump's targets. Four knobs on every page, the effect held on while you edit it so you hear what you do, four always-there performance knobs (filter, crush, throw, wash), flex-beat loops that always end on the bar line.
- A mixer and a real master bus. A Mixer page with a live meter and fader for every layer and the output, each layer's pan and echo/reverb send; behind it a stereo-linked compressor (ratio, threshold, make-up) and a look-ahead brick-wall limiter with its own ceiling, each genre bringing its own settings and the screen drawing the compressor's curve and the limiter's reduction as they work.
- Jam along. The Jam page makes the 27 keys an instrument: pluck, pad, acid or bass, every key a note of the scale (so no wrong notes), triads, or a harp up the scale, over the music as it plays; stop, and the pluck can answer your phrase back an octave up.
- The bass can be a line, the pluck can remember. The bass plays held, on the genre's rhythm, on the kick, in eighths, off the beat, walking or in a riff, and the pluck can keep its last few notes and bring them round again (deja vu), morphing them a note at a time.
- Real FM voices, and yours. A built-in six-operator FM engine plays 30 DX7-style voices as the pluck, and you can load up to 16 of your own DX7 voices from a
.syxfile over USB and play them from the pluck page. A browser editor shows every parameter and edits DX7 voices with a live preview on the unit. - You keep what you make. Any piece, in any genre, can be stored (one button); the unit remembers your theme, tuning, effect settings and DX7 voices across power-off, and the installer page can back all of it up to a file and restore it (so trying another firmware costs you nothing).
- A screen that tells you what is going on. The middle of the home screen is the sigil: a circle that turns so the chord's root is always at the top, draws the chord as a shape (a triad is a triangle, a seventh a four-sided figure), fills round with the four-bar phrase, shows the sixteen steps of the bar and flares a rune for each plucked note. Its eye is half open in a groove, shut in a breakdown, wide and shaking in a build, and flashes on the drop. The header counts down to the drop or the next break.
- Five tracks at once, with a safety net. Pad, bass, acid, pluck and drums all play together (a generative firmware often runs four), which asks a lot of a chip with a 5.8 ms deadline. So the engine is built around not breaking: a second core takes the reverb, and under load more of the work; each piece is checked for level and load; a master bus with a compressor and a look-ahead limiter keeps the sum from clipping; and if a piece still gets too heavy, the engine sheds the least important work before it would drop a sample.
- Honest about its limits. It runs two cores and watches its own load: a status line shows CPU, dropouts and which core is doing what, USB telemetry logs it, and when a piece gets too heavy the engine sheds the least important work before it would drop audio.

Under the generator: ratchets, push and level per step; the acid line frozen into steps you can edit; density and source per drum lane; chains, slices and half or double time; what the acid answers; the pluck remembering its phrase.

Playing it: the FX menu (latch or hold), the Flex Beat bank, the Perform screen (section, scenes, effects, mood), the mixer, the Jam page (all 27 keys in the scale) and the DJ snips.
A first minute
- Switch on: the boot cards play and a piece starts by itself. Any key skips the cards.
- Turn SELECT to walk the pages; the four knobs under the screen change what each page shows. Turn PRESETS for another piece; hold GLO and turn PRESETS for another genre.
- Tap SAVE for a breakdown on the next bar, tap it again for a build and the drop.
- Press FX: tap a key to latch an effect, hold it to play it. Hold GLO for the mute and solo map and the scenes.
- Hold SEQ for the step sequencer; the white keys are the sixteen steps.
- GLO, then SAVE stores the piece you are in.
The manual (docs/MANUAL.md, or the page on the site with screenshots) covers every control and page.
The look
The screen is drawn in one look (warm black, one colour per voice: the pad bone, the bass crimson, the acid lime, the pluck ice-teal, the drums pink) in six palettes, chosen on the Global page.

What's new in 0.15.2
- Gentler basses: no piece starts on the bright Bite, Tine or Clang bass sounds any more (they are still there to pick by hand).
- Pluck steps page tidied: it now reads Step, Note, Octave, Frozen, like Acid steps, and shows in the page tabs.
- Manuals in plain words: the manual and the quick manual are rewritten for musicians, not developers.
What's new in 0.15.1
- Breakdowns keep the pad's stabs: Fixed and issue where the breakdown wasn't playing the pads correctly for the piece selected.
- The Synth look, settled: Fixed a few problems with the new Synth Theme.
- A beginner's guide at the start of the manual: the first hour in thirteen steps, with pictures, in plain words.
- Printable manuals: the beginner's guide, the whole manual and the eight-page quick manual as PDFs on the manual page.
What's new in 0.15.0
The second update since the public release. The full list, with the development builds it came from, is in docs/CHANGELOG.md.
Harmony you can hear
- A harmonic rhythm in bars for each genre (house, disco, garage, lofi, reggae and synthwave change chord every two bars; dub, DnB, breaks, electro, trap, funk, amapiano and trip-hop every four; dubstep every eight), so lofi's ii-V-I, house's i-VII-VI-VII and synthwave's i-VI-III-VII are progressions you hear. Drift scales the bars; HYPNO keeps its clock in seconds.
- A real dominant in minor keys, diminished chords rare and never the cadence, and chord loops that start from home (four chords in house, disco, garage, trap and synthwave; two in dubstep, DnB, electro, amapiano and trip-hop).
- Stabbing pads where the genre comps: every dub piece skanks; garage, house, funk and amapiano gain stab pieces; dub, breaks and electro get their own comp rhythms. Eleven pentatonic pieces moved to seven-note modes.
Sound
- A fuller pad: the saw sounds (Strings, Dub, Trance, Poly, Rave, Brass, Fat, Pluck) sweep a resonant four-pole filter with every breath and stab, with a sub an octave down; Strings and the supersaws play four saws.
- The bass line has nine figures by name (Octaves, Two-step, One-drop, Log drum, Skippy, Funk, Big beat, Dub, Gallop) and plays its fifth where it played the seventh; DnB, breaks and garage pieces start with a line.
- The DY voices by default: thirty human-made DX7 voices from public-domain banks, each under its bank's own name; DX puts the built-in set back.
New pages and ways to play
- Pluck steps page (ARP x9): deja vu's loop frozen as sixteen steps you write, rung and level, stored with the piece. The pluck on MIDI channel 2, every note with its note-off.
- SET page: rounds a piece gets before the auto-DJ moves on, a tempo ramp over them, and an intro that brings the tracks in one by one over one to eight minutes, for mixing in, scratching or sampling over.
- The Synth Imp look: the Synth theme is a night sky and a banded sun behind the sigil, a scanner in its centre, the floor running to the horizon on the beat, the imp in neon. Scanlines for any theme.
Under the hood
- The dropouts of heavy pieces traced and fixed: a lost timer interrupt, and swung hits splintering a half into many short chunks (a hit may no longer cut a chunk under 128 frames).
- The pad's filter runs on the second core; the first is untouched by it.
Install
Use the web installer, https://deamonslinky.github.io/PERF-1/install/, in Chrome or Edge with the FM-1 plugged in. Installing firmware is at your own risk. The installer checks the package against the unit, can put M-VAVE's own firmware back, and an FM-1 that fails to start twice comes up in a safe mode the installer can reach. Read section 1 of the manual first, and keep a way to restore the stock firmware to hand. PERF-1 keeps its own pieces, settings and DX7 voices and does not read the projects or samples of other firmwares (HYP-1, AMB-1 or the stock one); what is stored may be lost when you switch either way, so keep copies of anything you care about (your .syx voice files, for one). BUILDING.md ends with what the install does and does not protect against.
Under the hood
- Hardware: JieLi AC79 (pi32v2 core, two cores at 240 MHz, a single-precision FPU, 512 KB of RAM, code run in place from flash), 44.1 kHz stereo, the screen drawn in three bands over DMA.
- Audio: the whole instrument renders in 5.8 ms chunks (an 11.6 ms budget for two); the plate reverb, and under load more of the work, runs on the second core and is checked for identical output either way; a master bus with a compressor and a look-ahead limiter; a six-operator FM engine on integer buses.
- Storage: every genre has its own flash object (A/B sectors with a commit record, so a power cut keeps the previous copy), holding packed 376-byte piece records with room to grow.
- Tests: about 70 scripted scenarios run the whole app in a simulator (
tests/), alongside tests of the maths, the instrument, the flash code, the SysEx protocol and the editor. - Source layout and the build:
BUILDING.md. Version history:docs/CHANGELOG.md.
Feedback, ideas and help
PERF-1 is young and I welcome all of it: comments, suggestions, ideas, bug reports, and help improving it. Open an issue (there are templates for a bug report and a feature request, and a free-form one for anything else). A bug report is most useful with the version (shown on the boot card), the genre and piece, and, for anything about load or crackles, a status log (tools/fm1log.py, or the "Live status" on the installer page). Code, documentation and sound-design contributions are welcome too: see CONTRIBUTING.md.
Credits and licence
PERF-1 is a fork of HYP-1 by RedtailWorks, itself a fork of AMB-1 by Charles Vestal, built on the platform layer of Felucca by Leo Kuroshita (Hügelton Instruments) through X0X and FoMni. The six-operator FM engine that plays the DX7 voices, its factory voices and the second-core work are from Melodee by Kerem Kilic (Ellic Studio); its synthesis is after Dexed by Pascal Gauthier, on MSFA by Raph Levien (Google). Several generator ideas (bass line modes, pad comping, ghost notes, the pluck's deja vu loop) follow Tuna by delirioux (github.com/delirioux/tuna, GPL-3.0), written afresh for this engine. The reverb is Jon Dattorro's plate ("Effect Design, Part 1", JAES 1997). The git history keeps every author's commits. The idea of a browser emulator for FM-1 firmware comes from Groove OS by Peter Gombos (no code taken). The community reverse-engineering of the chip, AL-255/FM-1-RE, informed the hardware work, and the rescue route uses FM-1-transporter's protocol and kagaimiq's jl-uboot-tool.
GPL-3.0-only (LICENSE); the code's origins and the third-party material (fonts, the JieLi SDK) are in LICENSING.md. "M-VAVE" and "FM-1" are trademarks of their owners; PERF-1 is independent firmware, not affiliated with or endorsed by them.