There are two primary components on this repository:
remidyaims to provide audio plugin hosting features in a cross-platform and multi-format manner in liberal licenses (MIT/BSD). It supports VST3, AudioUnit (on macOS), LV2, and CLAP formats.uapmd(Ubiquitous Audio Plugin MIDI Device) is an audio plugin host that can instantiate an arbitrary set of plugins and acts as a virtual MIDI 2.0 UMP device on various platforms (multiple tracks do not mean they work in parallel yet).
At user developers perspective, there are two primary GUI tools:
remidy-plugin-hostis a simple plugin host that you can list the installed plugins, instantiate, and process audio with simple MIDI 2.0 keyboard.uapmd-serviceinstantiates one single audio plugin for each virtual MIDI 2.0 device, and translates UMP inputs into event inputs to those in each plugin API, as well as exposing some plugin features using MIDI-CI property exchange.
I put them on the wiki pages.
With UAPMD, You do not have to wait for MIDI 2.0 synthesizers in the market; existing audio plugins should work as a virtual MIDI 2.0 device. We have timidity++ or fluidsynth, Microsoft GS wavetable synth, YAMAHA S-YXG etc. for MIDI 1.0. UAPMD will take a similar place for MIDI 2.0.
Currently, both Remidy and UAPMD target only desktop platforms so far, but if you use my AAP project those synth plugins already work as UMP devices (you need Android 15 or later that supports MidiUmpDeviceService).
This repository consists of two primary executables:
remidy-plugin-hostis an audio plugin hostuapmd-serviceis a plugin host that maps plugin instances to platform virtual MIDI 2.0 devices
There are supplemental tools for diagnosing problems we encounter.
The virtual MIDI 2.0 device service controller. Currently the command line options are hacky:
$ uapmd-service (plugin-name) (format-name) (api-name)
plugin-name is match by std::string::contains() within display name, case-sensitive.
format-name is one of VST3 AU, LV2, or CLAP.
api-name so far accepts only PIPEWIRE (on Linux) to use PipeWire, and uses default available API otherwise.
The plugin host. No particular command line options exist.
remidy-scan is a tool to query and enumerate locally installed plugins, and stores the results to (local app data)/remidy-tooling/plugin-list-cache.json (local app data depends on the platform).
ALL docs under docs are supposed to describe design investigation and thoughts.
We are moving quick and may not reflect current state of union, or describe our plans correctly.
There are some notable docs:
- Plugin catalog (listing) and instantiation
- State
- GUI support and main thread constraints
- Parameters
- Presets
remidy offers plugin API abstraction layer at lower level that primarily involves application agnostic audio and event processing. Apart from parameter API, it adopts UMP for event inputs, including parameter support via NRPN (AC, Assignable Controller) and Per-Note AC. It is an opinionated layer towards MIDI 2.0 i.e. events are parsed into timed parameter changes and other events on the plugins.
remidy-tooling offers higher level API to build audio plugin hosting tools like plugin scanning and instancing in common manner.
What this layer introduces in practice is a set of filters e.g. various existing specific plugin products and vendors are filtered at "safe for multithreaded access to the plugin API", "plugin scanning requires UI thread", or "crashes remidy" kind of information.
uapmd provides reusable foundation for constructing virtual MIDI 2.0 devices upon plugin hosting layer (only remidy so far). It serves AllCtrlList MIDI-CI standard property for plugin parameters as Assignable Controllers (NRPNs), ProgramList MIDI-CI standard property for the indexed presets as Program Change, and saves and loads states in MIDI-CI property manner. It is supposed to manage multiple tracks with multiple plugins [not implemented yet].
uapmd-service works as a virtual MIDI device service that can receive platform UMP inputs (and most likely MIDI 1.0 inputs, translated, depending on the platform) to control plugins.
Sources in this repository are released under the MIT license.
There are third-party (and first party) dependency libraries (git submodules, CMake FetchContent, or directly included):
- lv2/lv2kit (serd, sord, sratom, lilv, zix): the ISC license.
- free-audio/clap - MIT
- free-audio/clap-helpers - MIT
- steinbergmedia/vst3sdk - MIT
- Tracktion/choc: the ISC license.
- celtera/libremidi - BSD (2-clause), MIT (RtMidi)
- atsushieno/cmidi2 - MIT
- atsushieno/midicci - MIT
- mackron/miniaudio - MIT (or public domain)
- cginternals/cpplocate: the MIT license.
- jarro2783/cxxopts: the MIT license.
- cameron314/concurrentqueue - BSD (2-clause)
- cjappl/rtlog-cpp: the MIT license.
- for submodules see their LICENSE.md (modified BSD, MIT)
- cpm-cmake/CPM.cmake - MIT
- ocornut/imgui - MIT