Skip to content
Conduit

mcp server

fb200-tools

Open-source tools for the FLAMMA FB200 (Mooer-based) bass multi-effects pedal: IR manager, firmware inspector/patcher and safe flash client

w1ne/fb200-toolscommunitylistedunreviewed

Set up

Runs on your computer. Pick your agent and operating system.

Before you start

  • uv (`curl -LsSf https://astral.sh/uv/install.sh | sh`)
~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "fb200-tools": {
      "command": "uvx",
      "args": [
        "fb200-tools"
      ]
    }
  }
}

same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12

Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs

README

synced Oct 21, 2026

fb200-tools: open firmware for the FLAMMA FB200

Open-source replacement firmware and tools for the FLAMMA FB200 bass multi-effects pedal. It sounds like the stock firmware, keeps your presets and the official app working, and adds what the stock firmware lacks: USB updates without a button combo, a debug console, crash reports, better display feedback, drums in your recordings and a bass delay. Add what you want: the software is yours to modify.

Buy me a coffee

Why

The FB200 is a good little bass pedal built around a 600 MHz Cortex-M7 (i.MX RT1052). Its firmware is closed and frozen. This project aims to:

  • match the stock firmware. Every stock effect was ported and checked against an emulation of the stock DSP code.
  • then improve on it. Done: a bass delay. The plan: 48 kHz / 24-bit audio, longer cab IRs with WAV import, a clean-blend drive for bass, a web editor, and NAM amp captures. See docs/PARITY.md and docs/ROADMAP_RESEARCH.md.

Status (v0.12)

Verified on a real pedal:

AreaWhat works
SoundStock chain: noise gate → compressor → 10 amp models + 4-band tone stack → 10 cab IRs + 9 user-IR slots → 12 modulations → 5 reverbs. Parity against the stock DSP: amp and tone bit-exact, the rest within -105 dB. The heaviest preset uses 27% of the CPU on average, 31% at peak.
Front panel3-digit display, 16 knobs with LEDs, 4 footswitches with the stock actions (slot select, bank chords, stomp mode, tuner, save).
PresetsYour stock presets load and save in the stock format and survive switching firmware
Drums & tunerStock drum machine (40 rhythms, played from the samples already in your pedal's flash) and stock YIN tuner
USBClass-compliant audio interface (record and play back, 44.1 kHz). The stock USB identity and control protocol, so fb200 info and IR import work.
BluetoothModule link. The Bluetooth audio input runs; playback from a phone is not yet checked by ear. The app protocol is implemented and tested on the host, but not yet with the Flamma Manager phone app.
Our additionsBass delay up to 1 s, bass EQ (HPF, 5 bands, LPF; saved in the preset), cab IRs up to 4096 taps in 64 long-IR slots (cab types 20-83, fb200 ir put), reamping over USB (usb in). Measured on the pedal: echo times, EQ response, CPU (engine 14% average with a 4096-tap IR).
LooperUp to 108 s in the pedal's flash, with undo and loop save/load of two loops across power-off. On a pedal: a 103 s record, a dub past 54 s, save/load across reset, delay and a stored long IR while the loop played. Rings C and D show recording and the play position; checked on a pedal. The sound has not been listened to.
PowerBattery level, charger sense, status LED
Updates & recoveryUSB updates with no button combo. A resident recovery keeps the USB console after a crash or hang. Crash dumps survive a reset.

New in 0.7 and 0.8, tested on the host but not yet checked on a pedal: the bass delay, save to any slot and to another bank, the stock rhythm-mode buttons, drum/tuner/rhythm-mode commands from the app, input gain, tuner calibration and mute, factory reset, and the footswitch light rings (live-mode modules, colours from the app, save blink, rhythm tempo flash). On the pedal so far: the light ring of the selected slot.

Better than stock so far:

  • A bass delay (the stock has none: its delay settings do nothing): 20-1000 ms, feedback, mix, low cut on the repeats, tone. Stock presets keep their sound (docs/PARITY.md).
  • A bass EQ (the stock has none): HPF, 5 bands, LPF, after the cab; set from the console or MCP and stored in the preset (stock presets keep it off) (docs/PARITY.md).
  • Updates over USB without holding A+D.
  • The display names the knob you turn (GAn, CAb, …) and marks knobs that have not picked up yet.
  • Hold A and turn LEVEL / RATE / MOD to change drum level, tempo or rhythm live.
  • A looper (the stock has none): up to 108 s mono in the pedal's flash, overdub with undo, single-switch control (Looper). The delay and long IRs stay available. Checked on a pedal, including loop save/load across a reset. The sound has not been listened to.
  • Drums are included in the USB recording.
  • Choosing an empty IR slot never silences the pedal.
  • Drum hits start on time (the stock plays each one up to 31 ms early).
  • The Bluetooth audio switch from the app survives a reboot (the stock turns it back on).

Still open: the pedal checks above, a test session with the phone app, a 48 kHz option, and the "better" roadmap. The code runs on the stock hardware only.

Flashing

Flashing custom firmware is at your own risk; read DISCLAIMER.md. The vendor bootloader and your presets are never overwritten, and holding A+D at power-on always gets you back to the vendor updater.

Easiest: flash from the browser. Open shylenko.com/fb200-tools/flash.html in Chrome or Edge (Windows, macOS, Linux, ChromeOS). Nothing to install. It takes the latest release and guides you step by step.

The first install needs your copy of the official FB200 firmware file (.mr). It supplies the vendor loader and the stock sound data, so this repository and its releases contain no vendor code or data. Updates after that need no .mr and no button combo.

From the command line (macOS, Linux):

python3 -m pip install "fb200-tools[hid] @ git+https://github.com/w1ne/fb200-tools"

# first install, once
fb200 fw twostage ~/Downloads/FB200_V1.0.1.mr -o fb200-twostage.mr
#   hold A+D while plugging in USB, then:
fb200 fw flash fb200-twostage.mr --yes --no-jump
fb200 update app latest
fb200 update stock ~/Downloads/FB200_V1.0.1.mr

# every later update
fb200 update app latest

The factory reset needs the factory presets in the stock sound data (sound data version 2). If you wrote the sound data with fb200-tools 0.6.0 or earlier, run fb200 update stock ~/Downloads/FB200_V1.0.1.mr once more (your sound works without it).

Back to stock at any time: hold A+D while plugging in, then run fb200 fw flash FB200_V1.0.1.mr --yes --no-jump. Full guide, building from source and Linux permissions: docs/INSTALL.md.

Using the pedal

The controls work as on the stock firmware:

ActionWhat it does
A / B / C / Dselect slot A–D of the shown bank (display P<bank><slot>)
C + D / A + Bbank up / bank down. Your edits stay: the display flashes the new bank; press A–D to load a preset from it, or hold one to save there. After about 2 s the display goes back to the current bank.
B + Clive mode (L…): A = reverb, B = mod, C = amp+cab, D = comp on/off. C turns amp and cab off if either is on.
hold A, B, C or D (1 s)save the current sound to that slot of the shown bank (preset and live mode)
hold B, then A longtuner (display: flat arrow, note, sharp arrow; knob LEDs off); any switch exits
hold C, then B longrhythm mode (d<rhythm>): A / B previous / next rhythm, C tap tempo (two taps or more), D play/stop
hold A + turn LEVEL / RATE / MODdrum level / tempo / rhythm, live. Start turning within 1 s: holding A alone saves.
hold D, then C longlooper mode (ours, display LP-), see Looper; same again to leave

Knobs, left to right: MASTER, LEVEL (reverb), REVERB, MIX, RATE, MOD, CAB, VOL, BASS, MID, TREBLE, GAIN, AMP, LEVEL (comp), THRESH, GATE.

After a preset loads, a knob takes over once it passes the preset's value. Until then its LED blinks and the display shows the value with a dot. The LED is off when that effect is off in the preset.

USB audio: choose "FB200 Audio I/O" in your DAW. It records the processed sound plus drums, and plays computer audio through the pedal. For reamping, fb200 console "usb in" sends the computer audio through the effects instead of the instrument: play a DI track, record the processed result (usb mix adds it to the instrument, usb out is the default).

Looper

Ours (the stock has none). Enter looper mode: hold D, then hold C for 1 s; the same again leaves it (rhythm mode and looper mode exclude each other; the tuner chord works in both). In looper mode:

SwitchWhat it does
A (acts when pressed)empty: record (rEC, ring A red). Recording: close the loop and play it (PLY, green). Dubbing: back to play. Stopped: play from the start.
A (tap while playing)overdub (odb, orange); starts when you release A
hold A (1 s)undo the last overdub (Und); again = redo (rdo). no = nothing to undo
B (tap)stop (StP) / play from the start
hold B (1 s)clear the loop (CLr)

Entering looper mode starts erasing the looper's flash in the background (about 7 s for all of it; a record can start after the first 0.3 s). An A press before that shows PrP: press again.

Ring A flashes white at each loop start; ring B is blue while a loop exists. Ring C fills red while recording and orange while dubbing. Ring D shows one LED at the play position: green while playing, orange while dubbing, blue while stopped. The loop length is set by the first record (A press to A press). Leaving looper mode keeps the loop playing: presets and knobs work as usual, come back to stop or clear it.

  • What it records: the processed sound (after the reverb, before the master volume), mono. The drums are not recorded. Overdubs mix the new take with the loop; each dubbed pass keeps the older layers at x0.95 (-0.45 dB).
  • Length: up to 108 s (22.05 kHz, 10-bit block floating point, 60 dB SNR) in the flash (F:0x510000..0x800000 on the 8 MB chip). A dub over the whole loop works for loops up to 54 s; a longer loop dubs until the free flash runs out (the dub fades out). Undo takes back the whole last dub; again = redo. The record closes by itself when the flash is full.
  • Flash: loop save 1|2 keeps that loop across power-off (two slots). loop load 1|2 brings it back, stopped at the start. A loop that was not saved is lost. While a loop exists, the automatic settings saves wait; a preset save during a record or a dub is refused (try again after it).
  • Console: loop (state; prep_ms = erased flash ready for a record), loop rec|play|dub|stop|undo|clear|tap, loop save|load <1-2>, loop level <0-100> (loop playback level), loop stats (flash counters). MCP: the looper tool.

Host tools

The fb200 command also works with the stock firmware:

fb200 info                          # product, firmware, Bluetooth and hardware versions
fb200 ir list                       # IR slots
fb200 ir import 3 my-cab.wav        # convert and upload a WAV IR to slot 3
fb200 ir process my-cab.wav -o out.wav --trim --taps 512   # process to a file, no pedal
fb200 ir put 20 my-room.wav         # open firmware: a long IR (up to 4096 taps) in slot 20..83
fb200 ir ls --long                  # the long IR slots; `fb200 ir delete 20` deletes one
fb200 console "cab 20"              # play long slot 20 (cab type 20; `save` stores the preset)
fb200 console [cmd ...]             # open-firmware USB console (interactive without args)
fb200 console "factory yes"         # factory reset: presets, settings, IR list
fb200 console "delay on 350"        # bass delay: [on|off] [time] [fb] [mix] [lowcut] [tone]
fb200 console "eq 1 40 3"           # bass EQ: eq [on|off] | hpf <hz> | lpf <hz> | <band 1-5> <hz> <dB> [q]
fb200 console prof                  # CPU cycles per chain stage
fb200 console "loop rec"            # looper: loop [rec|play|dub|stop|undo|clear|tap] | level <n> | stats
fb200 console "usb in"              # reamping: computer playback into the effects (out: default)
fb200 update app latest             # open-firmware USB update (or a file)
fb200 update stock FB200.mr         # write the stock sound data (once)
fb200 crash --elf fb200-app.elf     # read and symbolize the last crash dump
fb200 fw inspect|flash ...          # .mr container tools and the vendor updater client

IR import

fb200 ir import and fb200 ir process convert any WAV (8/16/24/32-bit PCM or 32-bit float, any rate) to 44.1 kHz with a Kaiser windowed-sinc resampler. With no options the result is the same as the official editor: channel 0, 1024 samples, cut or zero-padded. The pedal plays the first 512 taps and sets the loudness itself. Options, applied in this order:

OptionEffect
--channel left|right|sumchannel 0 (default), channel 1, or the mean of all channels
--blend other.wav:0.3mix 30 % of a second IR in, aligned by onset and cross-correlation
--lowcut HZ, --highcut HZ2nd-order Butterworth high / low pass, baked into the IR
--trimcut the silence before the onset (-60 dB rel. peak), keep 8 samples
--minphasecepstral minimum phase; needs numpy: pip install 'fb200-tools[ir]'
--taps Nlength 1..4096 (the pedal slot holds 1024, and plays 512); a cut tail gets a half-Hann fade over the last N/8 taps
--normalizepeak to 1.0

fb200 ir put SLOT WAV (open firmware) stores a long IR: slot 20..83, up to 4096 taps (default 4096; trailing zeros are dropped), the same options. Select it as cab type SLOT (app, set_cab, or the preset). The pedal sets the loudness with the stock rule for user IRs, so a long IR plays at the level of the same IR in a stock slot. An empty or damaged slot bypasses the cab. The store needs a flash chip of 8 MB (fb200 console jedec shows it). Stock slots 1..9 and the stock app are unchanged.

ir process -o out.wav writes the result as mono 32-bit float at 44.1 kHz, for any IR loader. From Python: fb200.wav.process_ir(path_or_bytes, taps=512, trim=True, ...) returns the float taps.

Install for development: .venv/bin/pip install -e ".[dev,hid]", then run the host tests with .venv/bin/pytest (under a minute). The slow stock-DSP parity tests (-m stock: unicorn emulation of the stock firmware, need .[stock] and your fb200-stock.mr in FB200_STOCK_MR) run nightly: tools/nightly_stock.sh.

MCP server

fb200 mcp lets an AI agent (Claude Code, Claude Desktop) drive the pedal with the open firmware over USB. It is an MCP server on stdio.

pip install 'fb200-tools[mcp]'          # add numpy sounddevice for audio_test
claude mcp add fb200 -- fb200 mcp
ToolWhat it does
pedal_status, pedal_infofirmware, engine stats, current preset, USB audio state; versions
consolerun one console command (the tool description lists the command set)
preset, save_presetshow or select preset 0..39; store the edit buffer
preset_list, rename_presetthe 40 preset names; rename and store a preset
parameter_docsevery field's range, unit and sound meaning, and tone recipes (also the resource fb200://parameter-docs)
settingsglobal settings: input gain, global cab switch, BT audio, light ring
get_effectsall effect blocks of the edit buffer
set_amp, set_cab, set_comp, set_gate, set_mod, set_reverbchange fields of one block (app protocol, HID); returns the block read back
set_delay, set_eqbass delay; bass EQ (on/off, HPF, LPF, band 1-5 freq/gain/q), returns the EQ state; both go into the edit buffer (save_preset stores them)
set_output, drums, tuneroutput gain and mute, drum machine, tuner
looperlooper state and actions (rec, play, dub, stop, undo, clear, tap), playback level
usb_routeUSB playback to the output (out), into the chain input (in, reamping) or summed (mix)
cpu_profile, crash_dump, cab_longCPU cycles per chain stage (prof); the last crash dump; a synthetic N-tap cab IR for measurements (0 = the preset's cab)
ir_list, ir_import, ir_deleteuser IR slots; import a WAV into a slot (with the process_ir options); delete a slot
long_ir_list, long_ir_import, long_ir_deletelong IR slots 20..83 (up to 4096 taps, open firmware console); import overwrites the slot in flash
audio_testplay a test signal, capture the USB audio, return RMS, peak, THD (sine) or an octave-band response; can save a WAV

audio_test uses the firmware test generator (tin, into the chain input) by default, so the capture holds all effects. With source="usb" the host plays the signal (a sweep, noise or a DI track as a WAV) through the effects: the tool sets usb in for the test and restores the routing after, and returns the round-trip delay_ms.

The tools do not flash firmware (use fb200 update). One lock serializes all access to the pedal. Edits change the live preset until save_preset.

A desktop app (PoC) with editors and an assistant chat on top of these tools: app/README.md (pip install '.[app]', fb200-app).

Documentation

DocumentContents
docs/INSTALL.mdbuilding, flashing, updating, recovery, back to stock
docs/PARITY.mdstock feature inventory, status, roadmap, parity tests
docs/ROADMAP_RESEARCH.mdwhat "better than stock" means: research with sources
docs/BOOTLOADER.mdboot chain, two-stage boot, flash layout, dead ends
docs/AUDIO_PATH.mdcodec, SAI, clocks, input path
docs/UI_AND_STORAGE.mddisplay, knobs, LEDs, Bluetooth, preset and settings storage
docs/PROTOCOL.mdUSB/BLE app protocol, full command set
docs/FIRMWARE_FORMAT.md, docs/FIRMWARE_BRINGUP.mdthe .mr container and vendor boot contract
docs/HARDWARE.md, docs/pcb/hardware notes and PCB photos
docs/LABWIRED.mdLabWired twin of the board: chip/board YAML, smoke and stock-boot gates

Credits

Support

The project is free and stays free. If it is useful to you, you can buy me a coffee.

License

MIT (see LICENSE). Images are original works, licensed with the project.

This is an independent, community reverse-engineering effort. It is not affiliated with, endorsed by, or supported by FLAMMA Innovation or MOOER Audio. All product names and trademarks belong to their owners and are used only to describe interoperability. The repository contains no vendor firmware images, code, or asset data (samples, models, IRs). A few codec register values and filter constants recorded during the reverse engineering are included for interoperability.

↑↓ navigate openesc close