X0X

X0X turns the M-VAVE FM-1 into a groovebox: a 909, an 808, two 303s and a breakbeat player, all playing at once, in stereo. Each part can play its own pattern, you can arrange patterns into a song, and you can record knob moves.

X0X is in beta. It's solid for everyday playing, but a very busy pattern can push the FM-1 to its limit. When that happens, X0X gives up a little sound quality to keep playing rather than drop out (see Performance in section 15).



1Install

You can try X0X before installing it: https://charlesvestal.github.io/fm1-x0x/emu/ runs the same code in the browser, with sound, played with the mouse, a touch screen or the keyboard. You can load your own breaks into it too, as you would upload them to the FM-1.

The easiest way to install X0X is the web installer at https://charlesvestal.github.io/fm1-x0x/install/. It works in Chrome or Edge on a computer, and you don't need to install anything else. Connect the FM-1 to the computer with a USB data cable, open the page and press Install. Don't unplug the cable while it's writing. When it finishes, the FM-1 restarts into X0X.

You can also install from the command line. Download the firmware file (for example x0x-0.10-beta.fwsc) from the releases page, get the X0X source code from GitHub, install Python 3 with the mido and python-rtmidi packages (pip3 install mido python-rtmidi), and run:

python3 tools/fm1_install.py x0x-0.10-beta.fwsc

(The web installer on hugelton.github.io installs Felucca, not X0X.)

To go back to the original firmware, use "Back to the stock firmware" at the bottom of the web installer: download M-VAVE's FM-1 V15 file from the link there, choose it, and press the button. (M-VAVE's own updater, M-UPGRADE, works too.) If the FM-1 no longer starts, see Recovering an FM-1 that won't start. Installing third-party firmware is at your own risk.


2Getting started

Here's a five-minute tour, from switching on to saving your first beat. When X0X starts, the screen shows the 909, and every part is empty.

  1. Add a kick. Press black key 1 to pick the bass drum (you'll hear it), then press white keys 1, 5, 9 and 13.
  2. Press PLAY. The kick plays on every beat.
  3. Add a clap. Press black key 7, then white keys 5 and 13. While the pattern is playing, picking a drum is silent, so you won't add a stray hit.
  4. Add open hats. Press black key 9, then white keys 3, 7, 11 and 15.
  5. Write a 303 line. Turn ALGORITHM two clicks clockwise to 303A, press ARP, then press OCT+. Each press writes a new line; keep pressing until you like one.
  6. Shape the 303. Press EDIT to show the FILTER page. Turn KNOB 1 to open or close the filter, and KNOB 2 to change the resonance.
  7. Add the break. Turn ALGORITHM two more clicks to BREAK, then press all 16 white keys so the break plays the whole bar.
  8. Mute a part. Press HOME, then black key 5 to mute the break. Press it again to bring it back.
  9. Record a filter sweep. Turn ALGORITHM back to 303A. Press REC, slowly turn KNOB 1 for a bar or two, then press REC again. The sweep now plays every time the pattern comes round.
  10. Save. Press SAVE, and everything is kept when you switch off. (X0X also saves by itself a few seconds after you stop playing; see section 15.)

From here, section 9 shows how to make more patterns and switch between them, and section 12 how to arrange them into a song.


3Controls

The FM-1 (a drawing), running X0X
The FM-1 (a drawing), running X0X
What the keys do
What the keys do

These controls do the same thing on every screen:

ControlWhat it does
ALGORITHMChooses the part you're working on: 909, 808, 303A, 303B or BREAK.
PRESETSChooses the next pattern. On a part's screen it changes only that part; on HOME it changes all five.
SELECTMoves to the next or previous page. In a list, it moves up and down. Hold HOME and turn SELECT to set the tempo.
KNOB 1–4Change the four values shown at the bottom of the screen. Turn slowly for single steps, quickly to sweep: a fast half turn covers the whole range.
SELShows everything on the current screen as a list. In a list, it runs the highlighted action. When X0X asks a question, SEL means yes.
HOMEGoes to the HOME screen. In a list, it goes back. When X0X asks a question, HOME means no.
EDITShows the part's own screen. Press it again for the next page.
ARPOpens TB-3PO, the 303 line generator (on a 303 only).
FXOpens the effects.
LFOOpens the mixer and master.
GLOOpens the settings.
SEQOn a 303, switches the keys between steps and keyboard. On HOME, opens the song.
PLAYStarts and stops. Hold HOME and press PLAY to redo.
RECTurns recording on and off. Hold HOME and press REC to undo.
SAVESaves everything.
ENV, LFOHold one of these while pressing keys to add an accent (ENV) or a slide (LFO).
OCT-, OCT+Show steps 1–16 or 17–32. On the 303 keyboard they change the octave. In TB-3PO they mutate the line or write a new one.
White keysSteps. On HOME, they choose patterns.
Black keysDrum tracks, or the break's slices. On HOME, they mute parts.
MASTERVolume.

(The SEL button is labelled SCL in Felucca.)

In a list, turn ALGORITHM to change the highlighted value. Rows with a return arrow are actions: press SEL to run them. X0X always asks before doing anything that would lose notes.

Help on the FM-1: hold any button for a second on its own, and a card shows what it does on the screen you're on, including its combinations (HOME's card, for example, covers tempo, patterns, undo and redo). Let go and nothing happens. The card disappears as soon as you press anything else, so button combinations work as normal.

Undo: hold HOME and press REC to take back your last change. The screen tells you what it undid, for example UNDO 909 P1. Hold HOME and press PLAY to redo it. You can go back up to 32 steps (fewer after very big changes). A step is whatever you did before pausing for a moment: a few steps tapped in a row, one turn of a knob, or a whole recording pass. Undo covers the sounds, patterns, song and knob motion, even CLEAR PATTERN and FACTORY RESET. It doesn't cover the tempo or the settings, and the history is cleared when you switch off.

A list
A list
A question
A question

4The screen

The top line shows, from left to right:

When you press a button that does something, the top line says what happened for about a second, for example SAVED or COPIED TO P5.

The bottom of the screen shows the four knobs. Settings with only a few choices show a row of small squares instead of a ring. When you turn a knob, its value is also shown in large type for a second.

The 909
The 909
Turning a knob
Turning a knob

5909 and 808

Each drum machine has eleven tracks, one on each black key:

Key909808
1Bass drum (BD)Bass drum (BD)
2Snare (SD)Snare (SD)
3–5Low, mid and high tomLow, mid and high tom, or congas
6Rim shot (RS)Rim shot, or claves
7Clap (CP)Clap, or maracas
8Closed hat (CH)Cowbell (CB)
9Open hat (OH)Cymbal (CY)
10Crash (CR)Open hat (OH)
11Ride (RD)Closed hat (CH)

On the 808, the SOUND setting of a track switches it between tom and conga, rim and claves, or clap and maracas. The 909's hats and cymbals are samples, as on the original machine. Every other sound on both machines is synthesized.

Press a black key to pick its track. When the pattern is stopped you also hear it. While it plays, picking a track is silent, so you don't add a hit to the groove (set GLO > KEY SOUND to ALWAYS if you'd rather hear it every time). Then press white keys to turn the track on or off at those steps. To place accents instead, hold ENV while you press white keys. An accent makes every drum on that step louder.

A pattern can be up to 32 steps long. The white keys show 16 steps at a time: press OCT- for steps 1–16 and OCT+ for steps 17–32.

The closed hat cuts off the open hat. On the 808 you can change this with CHOKE on the KIT page.

Press EDIT to step through the selected track's sound settings. The last one is the track's PAN, which places it left or right. (On the 808, the alternate sounds share their track's pan, so the conga sits where the tom does.) After the track's own pages come these:


6303A and 303B

There are two identical 303s. Each has its own sound and its own line.

303A
303A

Steps. Tap a white key to turn that step on or off. To edit a step, hold its key and turn the knobs: KNOB 1 sets the note, KNOB 2 the gate (REST, NOTE or TIE), KNOB 3 the accent and KNOB 4 the slide. A tie holds the previous note through the step. A slide glides from this step's note into the next one.

Keyboard. Press SEQ to turn all 27 keys into a keyboard; KEYS appears on the top line. OCT- and OCT+ change the octave. If you play a key while still holding another, the 303 slides between them. Press SEQ again to go back to steps.

Press EDIT to step through these pages:


7TB-3PO

TB-3PO writes 303 lines for you. Select a 303 and press ARP.

TB-3PO
TB-3PO

Press OCT+ to write a completely new line. Press OCT- to mutate the current line, which changes about a quarter of its steps.

TB-3PO has three pages:

Turning the GENERATE and SCALE knobs doesn't change the line you're hearing. They set up the next OCT+ (new line) or OCT- (mutate), so your line stays exactly as it is, hand edits included, until you press one of them. When the knobs no longer match the line, the screen shows NEW LINE with a star. The same settings and seed always give the same line, the same one Schwung's TB-3PO module would write.


8Break

The break is a drum loop cut into eight slices, which X0X rearranges as it plays.

The break, slice 5 playing
The break, slice 5 playing

The white keys turn the break on or off for each of the bar's 16 steps. To play slices yourself, hold black keys 1–8; when you let go, the generator takes over again. Hold key 9 to play backwards, key 10 to play at half speed, and key 11 to stutter.

These settings control how the generator rearranges the loop:

These settings are saved with the pattern. The LOOPS page chooses loop A and loop B, and has a PITCH setting. X0X comes with two loops of its own, 909 GR and 909 FL, played by its 909. Loops you upload appear after them. Loops are stretched to fit the tempo.

Your own breaks

X0X doesn't come with any recorded breaks, but you can load your own. The FM-1 has three sample slots of about 7 seconds each. A one-bar loop takes about a third of a slot, so about nine loops fit in total. With the FM-1 connected, run:

python3 tools/upload_breaks.py --bars amen.wav think.wav funky.wav ...

The --bars option takes one bar from each file; without it, each file is uploaded whole. The loops are named BR1.1, BR1.2 and so on, up to BR2.1 and beyond, and they appear after X0X's own loops. Uploading to a slot replaces whatever was in it.

To check what will fit without connecting the FM-1, add --dry-run FOLDER. If you have schwung-breakbeat next to X0X, --bbgen uploads BB Gen's classic breaks.

To build loops into the firmware itself instead, see BUILDING.md.


9Patterns

HOME
HOME

There are 16 patterns. Each part plays its own pattern, so the 303s can play pattern 3 while the drums play pattern 7. A pattern holds each part's steps, length and rate, the break's settings, the swing and any knob motion. Sounds, effects and master settings are not part of a pattern and don't change when the pattern does.

On HOME, each pattern box shows a coloured bar for every part that is playing it.

To choose patterns:

If the music is playing, the new pattern starts when the current bar ends. If it's stopped, the new pattern takes over straight away.

When a part changes pattern, it starts again from step 1. The other parts carry on where they were.

To manage patterns:

Parts can have different lengths, so they drift against each other. The 909's length sets the length of a bar, and the 909's pattern sets the swing. Swing delays every second 16th note: 50% is straight, and 75% is the most swing.

On HOME, the knobs are TEMPO, SWING, PUMP and CUTOFF.


10Recording

Press REC to turn recording on, and press it again to turn it off.


11Knob motion

A recorded cutoff sweep playing
A recorded cutoff sweep playing

You can record knob moves into a pattern. Turn on REC, press PLAY, and turn any sound knob. X0X records the knob on the steps where you moved it. Short pauses are filled in, so a slow sweep has no gaps. On playback, the value glides smoothly from step to step rather than jumping.

A knob with recorded motion has a dot in its corner, and its ring follows the recorded value while it plays.

There is room for 160 recorded knobs across all the patterns. When there's no room left, the top line says MOTION FULL.


12Song

SONG
SONG

A song is a list of up to 192 bars. Each bar says which pattern each part plays and which parts are muted. To open the song, press SEQ on HOME.

Press SEL on the SONG screen for LENGTH, INSERT BAR, DELETE BAR and CLEAR SONG.


13Effects

FX
FX

There is one reverb and one delay, and every part can send to both. Press FX: the first pages set how much each part sends to the reverb and the delay. Each drum track also has its own sends, on that track's own page. The reverb is stereo: whatever you send it comes back wide.


14Mix and master

MIX, with the compressor pumping
MIX, with the compressor pumping

Press LFO to open MIX. It shows a level and a meter for each part, and the compressor's gain reduction in red. The PANS page places the 909, 808 and both 303s left or right (C is the middle); the break's pan is on its own SENDS page. As you turn a pan, the part stays at full level on that side and fades out of the other.

The factory mix is set up for big beat: the break is up front with the 909 kick under it, the 303s run through RAT distortion into a tape delay, and the clap has reverb. The master compressor squeezes hard, at 4:1 from -24 dB with 16 dB of makeup gain into the limiter, and each 909 kick makes the whole mix pump by 4 dB. For a clean mix, set RATIO to 1:1 and PUMP to 0.

CompressorRange
THRESH-48 to 0 dB
RATIO1:1 (off) to 20:1, and INF
ATTACK0.1 to 100 ms
RELEASE10 to 1500 ms
MAKEUP0 to 24 dB
MIXfrom dry to fully compressed, for parallel compression

PUMP lowers the level of the whole mix each time the kick plays, by up to 24 dB, and lets it swell back up over the compressor's release time. PUMP BY chooses which kick does this: the 909's, the 808's, or both. Accented kicks pump harder. PUMP works even with the ratio at 1:1, and even when the kick is muted.

FILTER can be off, low pass, band pass or high pass, with CUTOFF and RESO. LIMIT prevents clipping; leave it on.


15Settings and saving

GLOBAL
GLOBAL

Press GLO for these settings:

SettingWhat it does
CLOCK OUTSends MIDI clock and start/stop messages.
NOTES OUTSends the patterns out as MIDI notes.
KEY LIGHTSShows the steps on the key lights.
KEY SOUNDSTOPPED (the default): picking a drum or editing a 303 step is silent while the pattern plays, unless REC is on. ALWAYS: you always hear it. The 303 keyboard always plays either way.
THEMEThe screen colour: green, amber, cyan, red or mono.
ACCENTHow loud an unaccented drum hit is compared with an accented one.
MODEPATTERN, or SONG to play the song.
SAVE PROJECTSaves everything.
AUTOSAVEON (the default): while the pattern is stopped, changes are saved by themselves once nothing has been touched for four seconds. OFF: only SAVE saves.
CLEAR PATTERNClears all five parts of the current pattern.
FACTORY RESETGoes back to the factory sounds and empty patterns, with no song and no knob motion. Your saved project is kept until you save over it.
PERFORMANCEOpens the performance page (below).
ABOUT X0XShows the version and the audio load.

Press SAVE to save the sounds, all 16 patterns, the song, the knob motion, the tempo and the settings. A small dot at the top right of the screen means you have unsaved changes.

With AUTOSAVE on (the default), you'll rarely need to. Whenever the pattern is stopped and you haven't touched anything for four seconds, X0X saves your changes and says AUTOSAVED. It never saves while the pattern plays, because writing to the FM-1's memory briefly cuts the sound. Anything unsaved is lost when you switch off. With AUTOSAVE off, only SAVE saves.

Performance

GLO > PERFORMANCE shows how hard the FM-1 is working, updated every second: the audio load and its peak, any dropouts, and how much of the processor each part is using.

For a proper measurement, press SEL and choose RUN PERF TEST. X0X plays three patterns of its own for about 15 seconds, from a simple loop up to everything as busy as it gets, then puts your project back exactly as it was and shows the results. HOME or PLAY stops the test early.

When the FM-1 gets close to its limit, X0X lightens the load by itself instead of dropping out: the 303s stop oversampling (bright, resonant notes get a touch grittier) and the 808's sounds end a little sooner as they fade. While this is happening, GUARD lights up in amber next to the audio load; it switches off again after three quiet seconds. The performance page counts how often it has kicked in (GUARD 3x).

If X0X drops out on one of your patterns, a photo of the test results and of the pattern is the most useful thing you can send.

KNOB 1 turns on some extra counters (STALLS). They're experimental: if the FM-1 acts up with them on, switch it off and on again.


16MIDI and USB audio

When connected over USB, the FM-1 shows up as a MIDI device called "X0X FM-1".

X0X takes MIDI from USB and from the FM-1's TRS MIDI IN jack, both the same way:

InputWhat it plays
Channel 10The 909, with General MIDI drum notes: 36 kick, 38 snare, 41, 45 and 50 toms, 37 rim, 39 clap, 42 closed hat, 46 open hat, 49 crash, 51 ride.
Channel 11The 808, with the same notes, plus 56 for the cowbell and 49 for the cymbal.
Channel 2303A. Overlapping notes slide, and a velocity of 100 or more plays an accent.
Channel 3303B, in the same way.
Channel 4Notes 36–43 play break slices 1–8.
ClockX0X follows an incoming MIDI clock automatically, and returns to its own tempo half a second after the clock stops. Start, Stop and Continue start and stop the patterns.

X0X can also send MIDI: clock and start/stop when CLOCK OUT is on, and the patterns as notes on the channels above when NOTES OUT is on.

USB audio

Over the same USB cable, the FM-1 also shows up on a computer as an audio input called "X0X FM-1": two channels at 44.1 kHz, with no driver to install. It carries what the headphones hear, after VOLUME, in stereo.

Record it in any audio app, or monitor it live through one. The FM-1 keeps its USB audio in step with the computer's clock, so live monitoring doesn't drift or drop out. The first moment after an app opens the input can click while the FM-1 settles.


17Troubleshooting

Update mode: hold OCT- and OCT+ together for five seconds. A countdown appears; let go before it ends to cancel.

Calibration: if a button or knob does the wrong thing, hold OCT- and OCT+ while you switch the FM-1 on. The screen then asks you to press each button and turn each knob in turn.

After a crash: X0X shows a red CRASH screen and restarts by itself a few seconds later. The next start shows RESTARTED AFTER A CRASH and an address (PC ...) for a moment. If you report the problem, include that address and what you were doing.

Safe mode: if X0X crashes twice in a row while starting, it starts in SAFE MODE instead. There's no sound, but USB works, so the web installer can reach it: reinstall X0X, or put the stock firmware back from the same page. Press PLAY to try starting X0X normally again. If even safe mode fails twice, the FM-1 drops into the chip's own update mode, and only the rescue below can reach it.

Stuck on the start screen after changing BRIGHTNESS: versions up to 0.9-beta had a brightness setting that could freeze the FM-1, and because the setting was saved, it stayed frozen at every start, even after reinstalling. Install 0.10-beta or later from the web installer: the setting is gone, the saved value is ignored, and the FM-1 starts normally.

Recovering an FM-1 that won't start

Since 0.5-beta, an FM-1 that keeps crashing starts in safe mode (above), where the web installer can fix it. Older versions instead dropped into the chip's own update mode after two crashes (0.2- beta did this: the X0X screen, a red X0X CRASH screen, then a blank screen). Neither the web installer nor M-VAVE's updater can see an FM-1 in that state, but a script can put M-VAVE's firmware back, on a Mac, with the USB cable you already have:

Open Terminal, paste this line and press Return:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/charlesvestal/fm1-x0x/main/tools/fm1_rescue.sh)"
  1. If a window asks to install the command line developer tools, click Install. When it has finished, paste the line again.
  2. If it asks for a password, type your Mac password (nothing shows as you type) and press Return.
  3. When it says it's waiting, plug the FM-1 in and switch it on. It crashes and goes blank, and the script catches it. It checks the chip, saves a backup of the FM-1's memory in the fm1-rescue folder in your home folder, and asks before it writes anything.
  4. Type yes and press Return. Don't unplug anything until it says it's restarting the FM-1. The FM-1 then starts into its original firmware, and you can install X0X again from there.

The script downloads M-VAVE's FM-1 V15 firmware and JieLi's flash loader, and checks both against known fingerprints. It writes only the firmware area of the memory, never the bootloader or the FM-1's own settings, and checks everything it writes. Running it again is always safe. If it fails, copy everything in the Terminal window and open an issue. If the FM-1 never shows up at all, Felucca's FM-1-transporter (a small RP2040 board wired to the USB lines) can still reach it.


18Parameters

Drum settings range from 0 to 127. DIST, the distortion type, can be DIODE, CLIP, SAT, BFZ, PDIST, FOLD or CRUSH. PAN goes from L64 through C (the middle) to R63.

909 trackSettings
BDTune, Attack, Decay, Level, Pitch depth, Pitch, Drive, Dist, Pan
SDTune, Tone, Snappy, Level, Drive, Dist, Rev, Dly, Pan
LT, MT, HTTune, Decay, Level, Attack, Drive, Dist, Rev, Dly, Pan
RSLevel, Tune, Drive, Dist, Rev, Dly, Pan
CPLevel, Tune, Tail, Drive, Dist, Rev, Dly, Pan
CH, OHDecay, Level, Tune, Drive, Dist, Rev, Dly, Pan
CR, RDTune, Level, Decay, Drive, Dist, Rev, Dly, Pan
KITAccent, Velocity
808 trackSettings
BDLevel, Tone, Decay, Tune, Attack, Drive, Dist, Pan
SDLevel, Tone, Snappy, Tune, Decay, Drive, Dist, Rev, Dly, Pan
LT, MT, HTLevel, Tune, Decay, Sound, Drive, Dist, Rev, Dly, Pan
RSLevel, Tune, Decay, Sound, Drive, Dist, Rev, Dly, Pan
CPLevel, Tune, Decay, Attack, Sound, Drive, Dist, Rev, Dly, Pan
CB, CHLevel, Tune, Decay, Drive, Dist, Rev, Dly, Pan
CY, OHLevel, Decay, Tune, Drive, Dist, Rev, Dly, Pan
KITLevel, Accent, Choke (off, closed cuts open, or both)
303 settingRange
Cutoff, Reso, EnvMod0–127
Decay200–2000 ms
Accent0–127
WaveSaw or square
TuneA from 400 to 480 Hz; the middle is 440 Hz
Volume0–127
Drive, Drive typeOff, soft or RAT
Slide2–360 ms
Accent decay30–3000 ms
Break settingRange
Complexity, Anchor, Roll, Fill0–100
Retrig 2x, 3x, 4x, 8x0–100
PhraseOff, 2, 4, 8 or 16 bars
B chance0–100
A length, B length1/4, 1/2, 1, 2, 4 or 8 bars
Level0–127
Pitch-12 to +12 semitones
Effect pageSettings
REVERBDecay, Tone, HPF, Level
DELAYTime (1/32, 1/16T, 1/16, 1/8T, 1/16., 1/8, 1/4T, 1/8., 1/4, 1/2T, 1/4., 1/2, 1/2.), Feedback, Tone, Level
TAPEType (DIGI or TAPE), Wear, HPF, Ping (off or on)
KIT DRIVEVolume, Dist, Drive, Comp

The delay follows the tempo, including an external MIDI clock. A delay longer than two seconds (1/2. below 90 BPM, 1/2 below 60) plays at half that length, which still lands on the beat. With PING on, the echoes bounce from left to right, one delay time apart; delays longer than one second play in the middle instead.


19Credits

X0X is free software under the GNU General Public License, version 3. If you share the firmware, you must also share its source code.

M-VAVE and FM-1 are trademarks of their owners, and TR-808, TR-909 and TB-303 are Roland trademarks. X0X is not connected with M-VAVE, Roland or Hügelton Instruments.