VST Plugins for MPC OS
💬 Community: join Open MPC on Discord for support, release announcements, plugin requests and MPC hacking.
Native plugins for Akai MPC OS standalone devices (MPC Live/One/X/Key, Force): a catalog to find and install them, an installer app, and the tools to build, test and release your own.
MPC OS 2.x and 3.x. Plugins here are built and tested on MPC OS 3.x. On MPC OS 2.x a plugin loads and its
Q-Links work, but its touchscreen page only appears if the plugin's skin is written in the older format 2.x reads. The
catalog checks from its files whether each release can work on 2.x, and marks one tested on a 2.x unit MPC OS 2.x tested
(3.x, the standard, gets no badge); the installers warn before putting a 3.x-only plugin on a device that looks like 2.x.
A 3.x-only plugin becomes 2.x-capable when its developer re-releases it with a compatible skin
(how, and what the catalog checks: MPC OS 2.x vs 3.x below).
Plugin catalog
Open MPC - Plugin Catalog: one browsable list of the community's VST2 plugins for MPC OS, with each plugin's current version, license, source link and a checksummed download.
- Find a plugin. Search, filter by kind, style, developer, license or distribution, and sort by recently updated or
feed.xml) of new releases.
- Install with the installer app. The MPC plugin installer is a
- Guides on the site: install a downloaded plugin,
- Get your plugin listed. Publish a GitHub release built with
tools/release.py(or the reusable
vst-release.yml workflow), then open a PR adding one small file, catalog/plugins/.json . After that new
releases appear on their own: the catalog reads your releases every night and checks each zip. Open-source licenses,
or public source with a limited-use license (shown with a "Restricted use" badge).
- Plugins built from your own firmware (so a built zip can never be shared) are listed as Build it yourself:
- Details: docs/CATALOG.md (design and roadmap), docs/CATALOG_SPEC.md (formats),
MPC OS has a plugin host built in: a copy of the JUCE framework that can load Linux VST2 plugins. This repo builds plugins for it. They behave like MPC's own instruments and effects: you add them to a track, play them from pads, keys or the sequencer, turn them with Q-Links, and they're saved with the project. Each one gets its own **native MPC touchscreen page**. There's no bridge, no background app and no LD_PRELOAD: the plugin runs inside MPC.
Where we are
This started as a proof of concept in September 2026. It is now a working ecosystem: plugins are released by their authors, listed in the catalog, and installed by people on their own units.
- Plugins you can install today: synths, samplers, drum machines, sequencers, an amp simulator and a record-digging
- A release you can trust. Every release is built in CI on a pinned toolchain, checked against the catalog's rules
- MPC OS 2.x and 3.x, labelled per release. Plugins are built against glibc 2.31, so they load on older firmware
- Tested on a Force (MPC OS 3.9.1) as the reference device. Other Gen1 MPC OS devices (Live and Live II, One, X,
MPC program. A user's MPC One on MPC OS 2.15 is what led to the glibc 2.31 builds; reports
from other models are welcome. Gen2 devices (aarch64: Live III, One G2, Key(s) G2) are supported with a
separate build per plugin/addin; confirmed on a Live III (2026-10-23) for both. Gen2's root filesystem is
verity-based and more locked down than Gen1's: no SSH without a modded unit, and no writable /etc at all even
with root (docs/GEN2.md).
What the plugins can do:
- Instruments and effects that play from pads, keys and MIDI clips, with Q-Links, automation, and settings saved
- Custom touchscreen pages: knobs, switches, buttons, option selectors, pop-up lists, live text readouts and
What the tools can do:
- A porting kit: describe an engine's parameters in one small file and the tools build the plugin, its page and
- A release workflow (
vst-release.yml): a reusable GitHub Actions workflow that builds, tests, previews and
- Skin Studio, a page editor in your browser: double-click
SkinStudio.command(macOS),SkinStudio.bat
SkinStudio.sh (Linux). It needs Python 3. See docs/SKIN_STUDIO.md. Several interfaces in one plugin: docs/SKIN_VARIANTS.md.
How it works
- The plugin is a small Linux library (
.so) built for the device's ARM processor. It goes in the plugin's own folder in/sdcard/Synths/, next to its skin and data. - MPC finds it through its settings file: one line per plugin in
MPC.settingstells MPC where the file is and
- Its page is the skin in that same folder (
Plugin Skins/), in the same format Akai uses for its own plugins: a JSON
This repo's tools make all three. A port says what its engine is and what its parameters are; the wrapper turns the engine into a VST2 plugin, and the skin tools draw a page for it, either laid out automatically or from a layout you design.
What we've learned
- The plugin host is a full citizen. Plugins get MIDI in, the song tempo and transport, project save/restore
- A plugin is ordinary code inside MPC. It can use the network (HTTP and HTTPS), read and write files, and run
- The page is declarative, not drawn. MPC builds the page from the skin's description; the plugin can't paint
- Akai's own "plugins" are special. Hype, TubeSynth and friends look like plugins but are built into MPC itself.
- Budget matters. Gen1 hardware is a 4-core ARM chip at 1.8 GHz. A plugin gets about 2.9 ms per audio block and
What's possible
- Synths, samplers, drum machines and effects ported from existing C/C++ engines. Engines written for Ableton Move's
- MIDI generators (sequencers, arpeggiators) that play other tracks, synced to MPC's tempo.
- App-like plugins: things that fetch from the web, stream, or write files that MPC's browser can open.
- Pages with pop-up option lists, panels that change with a mode, live readouts, and your own look: any font,
- Presets in MPC's PRESET menu, from the engine's own preset parameter or a
presets.json(the menu listing and loading
- Controls the engine moves by itself (a worker thread, MIDI on a port of its own) followed on the screen.
- Updating a plugin without restarting MPC: replace the file, remove every copy from the project, insert it again.
- Shipping a plugin as one zip with an install script.
Limitations
- MPC OS 2.x needs a compatible skin. A plugin marked MPC OS 3.x only loads on 2.x and plays from the Q-Links, but its
- A plugin shows no skin (just "Load Plugin") when its folder isn't a content location. MPC finds a plugin's skin only through
Synths folder listed under SynthContentLocations in MPC.settings. The plugin still loads from its file= path, so
it works but looks bare. Install into a listed folder (the installers warn when the target isn't one: install.sh -t ),
or add the folder to the list with MPC stopped and MPC.settings backed up, then start MPC. A trailing / is fine. Checked
on a Live III (MPC 3.10.0), 2026-10-27; details in docs/NOTES.md.
- VST2 only. MPC OS has no VST3 or LV2 support. (For a desktop DAW, a port can also be built as a VST3 on this machine:
- Setup needs root SSH to the device, to copy the plugin and add it to
MPC.settings, so it is for modded units.
acvs, or
inmusic-mpc on firmware that has no acvs).
- No native drop-down picker. MPC's own menu opens empty for plugins (and can't practically be patched), so option
- No custom-drawn widgets. No live-drawn graphs or XY pads; only knobs, faders, buttons, text and images. Displays
- Two fonts for live text: Titillium Web and Roboto. Any other typeface has to be baked into the artwork.
- No text entry on the page.
- Plugin MIDI out is ignored by MPC. Generators work around it by opening their own MIDI port, which MPC picks up
- Timing resolution: notes land on 128-sample blocks (about 3 ms), because the wrapper ignores the in-block position MPC
"defines": {"SAMPLE_ACCURATE": 1}, docs/NOTES.md "Sample-accurate note starts").
- A plugin crash takes MPC down with it, so risky work belongs in a separate process.
Technical details
Documentation
- docs/NOTES.md: everything verified on hardware, with dates, plus open issues. The source of truth.
- docs/PORTING.md: the checklist for turning an engine or app into a plugin.
- docs/MIDI_TIMING.md: how a sequencer/arp plugin should time its steps against MPC's transport.
- docs/SKIN_STUDIO.md: laying out and previewing pages.
- docs/BENCH.md: the on-device CPU check. docs/RELEASING.md: release zips.
- docs/ROADMAP.md: repo features still to do.
- docs/OS2_SKINS.md: the MPC OS 2.x skin findings, the shape table, the plan and its open questions.
Device details
- MPC OS reads
from its… MPC.settingsat startup (on the Force:
/media/az01-internal/Settings/MPC/MPC.settings) and adds each
to its plugin list. Edit it with MPC stopped and back it up
first: malformed XML makes MPC reset it to defaults.
- The
.soexportsVSTPluginMain(VST2 ABI, hand-written, no Steinberg SDK). Build for armhf against glibc 2.31
arm32v7/gcc:11-bullseye, which tools/build_port.sh uses) so it loads on MPC OS 2.x (glibc 2.32) and 3.x (2.39). A
newer toolchain binds pthread_create and friends to GLIBC_2.34, which older firmware cannot load; the catalog
check lists anything above 2.32 (up to 2.36) as MPC OS 3.x only and rejects more than that. Audio is 44.1 kHz in 128-frame blocks.
- A skin folder
/sdcard/Synths/(- VST - / version.xml,Plugin Skins/TUI.json,
Q-Links.json) gives it a native screen. Controls bind to "Parameter N", the VST parameter index.
MPC OS 2.x vs 3.x
What differs, and what the catalog does about it (checked on an MPC Live on 2.15.1 and a Force on 3.x; details and dates in docs/NOTES.md, the plan and open questions in docs/OS2_SKINS.md):
- System library. MPC OS 2.x has glibc 2.32 (measured on a 2.15.1 MPC Live); 3.x and the Force have 2.39. A build that needs
GLIBC_2.34 (older Dexed and JV-880 releases, built with a newer toolchain) is listed by MPC on 2.x but shows only
"Load Plugin"; those releases are yanked. The log lines to look for are Attempting to load VST: ... and
Initialising VST: ... in journalctl -u inmusic-mpc.
- Service name. On 2.15.1 MPC runs as
inmusic-mpc, notacvs. The installer app and current release zips detect it. - Skin format. Every JSON object in a skin carries a
version, and each kind of object has its own. The stock skins of
Q-Links.json is the same on both.
- Both can read the older shape. Dexed's skin written in the 2.x shape draws on a 2.15.1 MPC Live and on a Force. On the
- The catalog decides, from the files. For every release it works out
os_compat: 2.x + 3.x when the library needs
- For developers: opting in is optional. To make a plugin 2.x-capable, write its skin in the 2.x shape, check it with
python3 tools/skin_compat.py check "/Plugin Skins/TUI.json" "/Plugin Skins/Q-Links.json" (it lists what still
stops 2.x) and publish a new release; the label changes by itself on the next catalog build. Releases that are not
re-released stay listed as 3.x only. The skin generator writes the 2.x shape when built with SHADOW_SKIN_MPC_OS=2 (docs/PORTING.md); a plugin written by hand needs the table in docs/OS2_SKINS.md.
Help us: tell us your model, your MPC OS version (Settings), whether a plugin's page appeared, and what the
screen shows. If you are comfortable in a terminal and on 2.x, the output of this read-only command is very useful:
cat /usr/share/Akai/Content/Synths//'Plugin Skins'/TUI.json | grep -o '"version": [0-9]*' | sort | uniq -c.
Layout
wrapper/vst2_wrap.c+wrapper/engine.h: a generic VST2 wrapper around a small engine interface
params.h.
adapters/: engines written for other hosts, mapped onto that interface without code changes
adapters/schwung/).
tools/build_port.sh+tools/gen_vst.py: the generic port builder. An engine ports with one small
vst.json (name, uid, parameters, sources, optional layout) and no wrapper code: tools/build_port.sh path/to/vst.json
makes the .so, the skin and the pluginList entry. See docs/PORTING.md.
tools/shadow_skin.py+tools/shadow_art.c: build a skin from a Force Shadow style layout
shadow_page.conf widget syntax: frames, knobs, toggles, triggers, option segments, pop-ups, plus
qlinks lines for nested pages). The artwork (backgrounds, knob filmstrips, button states) is drawn by
force-shadow's own renderer, so the MPC page matches the
shadow page pixel for pixel. That renderer is vendored in tools/vendor/force-shadow/, so no force-shadow
checkout is needed.
tools/html_art.py+tools/html_art/: the optional browser renderer for skin artwork ("art": "html"):
tools/mpc310_on_391/: a USB stick that runs the MPC 3.10 app on an MPC Live III that stays on MPC OS 3.9.1 (which
tools/skin_check.py: checks a built skin for overlapping touch areas, controls off the screen, Q-Links on hidden
gen_vst.py runs it after every build.
tools/studio.py+tools/skin_template.svg: the skin studio. Auto-layout from a port's
studio.py serve, tools/studio_web/, started by the SkinStudio.* launchers), an
Inkscape/Penpot SVG round trip, and page previews. Controls can use built-in looks or your own images and
filmstrips (tools/skin_assets.py). See docs/SKIN_STUDIO.md.
tools/test_port.sh+tools/host_test.c: the offline x86 test of a port under ASan (instances, params, options,
process(), chunks), PASSED/FAILED.
tools/build_vst3.sh+wrapper/vst3_wrap.c: the same port as a VST3 for a desktop DAW (Linux), for local use, with
wrapper/vst3_editor.c drawing its MPC skin (flattened by tools/desktop_skin.py) in the plugin window;
tools/test_vst3.sh + tools/vst3_host_test.c test it offline under ASan. See docs/DESKTOP_VST3.md.
tools/bench.sh+tools/bench.c: a CPU stress test run on the device, with a PASS/WARN/FAIL verdict for Gen1
tools/desktop/: the MPC plugin installer app (Go; a local web page that installs, updates and removes plugins over SSH).tools/plugin_manager_g2/: the OpenMPC Plugin Manager VST, a VST that browses the catalog and installs, updates and removes plugins on the MPC itself (Gen2 first, with rollback; a fork of poloq's MITmpc-vst-manager). See its README andDESIGN.md.tools/mpc-store.sh: the same install, update, remove, prune and sync from a shell on the device, for the catalog's one-line command.tools/release.py: packages a plugin as one shareable zip with an installer, an uninstaller and generated
tools/probe_device.sh: a read-only device report (CPU, 32/64-bit MPC, audio threads, plugin formats: VST2 yes,
poc/gain.c,poc/synth.c: minimal effect / instrument examples.poc/midiport.c: a MIDI-generating plugin (tempo-synced) that drives other tracks through an ALSA port
poc/midiout.c shows that).
poc/menuprobe.c,poc/textprobe.c,poc/netprobe.c: the probes behind the picker, live-text and
Credits
The route was first described on the MPC-Forums thread
"Proof of Concept: Custom Standalone Plugins" (Sep 2026) by NoQuestion and dustyslices.
Schwung by @charlesvestal, the open module platform for Ableton Move,
inspired a good part of how this project is built: the small engine interface that our wrapper and the
adapters/schwung adapter follow, the build, test and release workflow for modules, and the catalog model (a registry
of plugins, releases found on GitHub, a static catalog site, and installer apps that fetch from it). We looked at how
Schwung does these things and made our own versions for MPC OS; thank you for building it in the open.
Credits also to the MockbaMod community for assistance in development, especially @Locrian.
Legal
The code in this repository is under the MIT licence (see LICENSE); vendored third-party files keep their own licences.
VST2 is a deprecated Steinberg format; this project uses a hand-written ABI
header and is for personal, non-commercial experimentation on hardware you own.
No Akai content is redistributed. Editing MPC.settings is at your own risk; back it up first.