v0.2.0
Download
- Windows (x64), bundled Node + native MIDI:
mcp-midi-control-v0.2.0-win-x64.zip - Stable latest URL (same file, version-stable name):
mcp-midi-control-win-x64.zip - SHA256 (versioned ZIP):
9e656e8b8c64b64e2eee5861e7fed58c8add1e9e84b9ca72f027cb0e0fc14df9
Install
- Download the ZIP and extract it (right-click -> Extract All).
- Double-click
setup.cmd. - Fully quit and relaunch Claude Desktop.
See instructions.txt inside the ZIP for full details.
Adds the rest of the modern Fractal floor-unit family (FM3 and FM9) and a
one-command macOS install. The Axe-Fx III, FM3, and FM9 now run on one shared
gen-3 codec with per-device parameter catalogs mined from each unit's own editor,
so a parameter write addresses the right control on each device instead of
borrowing the III's numbering.
Added
- Fractal Audio FM9 (model byte 0x12) and Fractal Audio FM3 (model byte
0x11), community beta. They share the Axe-Fx III's gen-3 SysEx protocol, scenes,
and A to D channels, on the FM9's 6x14 grid and the FM3's 4x12 grid, and are
controlled through the same unified tools as every other device. Like the III,
they ship behind a beta notice pending a hardware round-trip from an owner; see
the per-device beta-testing guides. - Fractal Axe-Fx Standard / Ultra (gen-1, model byte 0x01), community beta.
A descriptor decoded byte-for-byte from the published gen-1 SysEx spec: 922
parameters across 35 blocks. Both writing (set_param/set_params) and
reading (get_param/get_params) are wired: a parameter query (function 0x02
with the set/query flag cleared) returns the live value and the device's own
label. Whole-preset dump, save, and preset/scene/channel switching are out of
scope, so those tools decline cleanly. Gen-1 also participates in
translate_presetas a source into Axe-Fx II and AM4. All decoded from the spec
and unconfirmed on hardware; confirm changes on the front panel. - Preset backup and restore (
export_preset/import_preset).export_preset
writes a byte-exact.syxbackup of the active working buffer to disk, and
import_presetre-applies a backup to the device, on Fractal AM4 and Axe-Fx II.
import_presettargets the working buffer by default, or a stored
target_locationwhen save is explicitly authorized.export_presetalso takes
an optionallocationto dump a stored preset slot straight from device flash;
that path is gen-3 (Axe-Fx III / FM3 / FM9), wire-confirmed on FM9 (thefn=0x03
request andfn=0x77/0x78/0x79dump). - macOS install.
npm run setup-macbuilds and registers the server with
Claude Desktop in one command, with no config-file editing. See
docs/INSTALL-MAC.md. Windows keeps its one-click installer. - More AM4 parameters, from hardware probes. Amp expert controls
(plate_suppr_diodes,cab_zoom,dynacab_sync), 23 global-block enum tables,
and the amp channel LED color enum are now wired and labeled from hardware-probe
captures, so more of the AM4's front panel is reachable by name.
Changed
- The modern Fractal family is one codec, not three. The Axe-Fx III, FM3, and
FM9 are per-device configs of a single model-byte-parameterized gen-3 codec
factory; adding a gen-3 device is a config, not a package. The III's behavior is
unchanged and is now frozen by a byte-identity gate. - Device-true parameter catalogs for FM3 and FM9. Each device's parameter IDs
are mined from its own editor (validated to 100 percent against the III's
known-good table) rather than reused from the III. Parameter IDs are
device-specific, so reusing the III's would have addressed the wrong control on
about 13 percent (FM3) and 24 percent (FM9) of shared parameters; each device
now uses its own. - One tool surface. The Fractal device-namespaced tools (
am4_*,axefx2_*,
axefx3_*) are removed; every Fractal device is driven through the unified,
port-routed tools (apply_preset,set_param,get_param, and the rest). If
you had a saved prompt naming a*_-prefixed tool, point it at the unified tool
with aportargument instead. The Hydrasynth keeps itshydra_*tools. - Signal-chain routing on the gen-3 grid.
apply_presetlays out the cables
between blocks on the III/FM9 6x14 and FM3 4x12 grids (thefn=0x01 sub=0x35
routing op), decoded from FM9-Edit and FM3-Edit captures, so a built preset
passes signal end to end instead of placing unconnected blocks.
Fixed
- The modern family's
set_bypassandswitch_scenenow report a device
rejection instead of always claiming the write succeeded. - The gen-3 patch-name read used the Axe-Fx III's model byte on every device; FM3
and FM9 reads now use their own. apply_preseton gen-3 now sends calibrated values. It was passing spec
knob values (e.g.treble: 5.5) straight to the encoder, which rejected
non-integers and silently sent integer knob values as raw wire (sogain: 5
went out near zero instead of mid-travel). It now coerces display to wire
through each parameter's calibration, the same pathset_paramalready used.set_blockis bounded to each device's grid (the FM3's 4x12 no longer accepts an
III-sized cell), and auto-save is gated where the store envelope is unpublished.- Port routing: a port that enumerates as a Fractal FM9 or FM3 resolves to that
device rather than falling through to the AM4 catch-all. - Axe-Fx II read values round to the panel.
get_presetand post-apply
read-back returned raw float noise from the wire-to-display inverse (a panel
7.0reading came back as7.000030518), which fouled read-modify-write
nudges. Values now round to each parameter's display resolution at the read
boundary. - Axe-Fx II
channel_blocksis now the real X/Y set.describe_device
advertised a malformed channel-block list (filtered on bypassable rather than
channel-bearing blocks, emitted display names instead of canonical keys, and
duplicated multi-instance blocks). An agent that trusted it sent channel params
to a block with no channels and failed the first apply. It now lists only
genuinely X/Y-capable block types, deduped, as canonical keys. compressor.thresholdspelling. The Axe-Fx II compressor threshold was
registered astreshold; it is nowthreshold, withtresholdkept as a
back-compat alias so existing prompts and recipes keep resolving.- AM4 save returns a verifiable receipt and guards overwrites.
save_preset
reads the stored slot back after writing and reports what actually landed, and it
pre-flight scans a non-empty target location and refuses to overwrite it unless
overwrite is confirmed. This closes a reported case where a save appeared to go
to one location while the slot held a different preset. - AM4 tone builds no longer hang. A large
apply_presetis bounded by a total
time budget with diagnostic logging, so an unresponsive device degrades to a
partial result with a clear message instead of stalling for minutes. - AM4 unsaved-edit gate no longer over-refuses. The dirty-buffer check is
rebased onto deterministic edit tracking and the device-true edited bit, so
navigating away no longer refuses with a false "unsaved edits" warning when the
buffer is clean. - AM4 scene levels read back correctly. The per-scene Level controls (Scene
1-4 on the Main Levels page) were decoded against the wrong dB range, so
get_param/get_preset/list_paramsreported wrong values (a +10 dB scene
read back as -5). The writes were always correct; only the read-back display was
wrong. They now decode against the device's actual plus/minus 20 dB range. - Leveling guidance follows Fractal's unity-match philosophy. The built-in
volume guidance on the AM4 and Axe-Fx II steered scene balancing backwards (it
pushed clean scenes quieter). It now matches Fractal's own approach: balance
every scene to the white-line 0 dB average, treat the red line as headroom not
clipping, and raise the clean scene rather than lower it. The Axe-Fx II guidance
now points at its real per-scene control (output.scene_N_main). - Channel LED colors can be set inside
apply_preset. The AM4 amp slot's
per-channel map now accepts acolorkey, so a whole preset including footswitch
colors builds in one call instead of a follow-up write. - Axe-Fx II output is muted safely during
apply_preset. The mute and restore
around a multi-step build are now verified and retried (a dropped mute on a flaky
USB link could let a half-built amp screech), and the output is restored to its
exact pre-apply level instead of a fixed value. - FM9 preset switching lands the right preset. The FM9 reads MIDI Bank Select
from CC0 (MSB), and the bank-plus-program-change is now sent as separate MIDI
messages, fixing both a wrong bank above preset 127 and a Windows MIDI limitation
that silently dropped the combined message. Axe-Fx III and FM3 keep the
spec-standard bank encoding. - Built-in recipes are validated against each device. Several block-stack
recipes carried amp / block / enum names that no longer matched the catalog, so
applying them failed; every recipe is now materialized and checked at build time. - The server reports its real version in serverInfo instead of a hardcoded value.
Under the hood
- A byte-identity gate freezes the Axe-Fx III's catalog and
describe_device
surface, so the shared factory cannot silently change the III anchor. - The VP4 (model byte 0x14) is registered and reachable through
describe_device
and the read tools; device-state writes are gated pending confirmation of its
serial-chain block-placement wire shape. - FM9 amp-voicing, drive/fuzz, and filter type names read back from the device
where hardware captures confirmed them; the drive/fuzz type vocabulary is shared
across the gen-3 family. Amp model names still read back as numbers on gen-3
pending an owner capture of the model list (the amp-model ordinals are
device-specific and exist only on the hardware). - The first hardware-captured gen-3 single-parameter GET response (the device's
internal value plus its own display label, from a community FM9) is decoded and
available as a read-only calibration primitive for the paramId rebind work.