{"id":22514041,"url":"https://github.com/atsushieno/uapmd","last_synced_at":"2026-02-15T11:09:13.491Z","repository":{"id":266653820,"uuid":"849908938","full_name":"atsushieno/uapmd","owner":"atsushieno","description":"A liberal plugin hosting library (VST3/AU/LV2/CLAP) with fully-featured MIDI 2.0 (UMP + MIDI-CI) frontend. Create virtual MIDI 2.0 devices using your favorite plugins.","archived":false,"fork":false,"pushed_at":"2026-02-08T12:19:31.000Z","size":6666,"stargazers_count":9,"open_issues_count":11,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-08T13:44:54.420Z","etag":null,"topics":["audio-plugin","audiounit","clap","lv2","midi","midi2","vst3"],"latest_commit_sha":null,"homepage":"https://www.kvraudio.com/product/uapmd-by-the-aap-project-audio-plugins-for-android","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/atsushieno.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2024-08-30T13:50:17.000Z","updated_at":"2026-02-08T12:19:34.000Z","dependencies_parsed_at":"2024-12-05T11:39:54.823Z","dependency_job_id":"e1d8ff6c-2911-449b-87db-ee8c859d83bc","html_url":"https://github.com/atsushieno/uapmd","commit_stats":null,"previous_names":["atsushieno/uapmd"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/atsushieno/uapmd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atsushieno%2Fuapmd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atsushieno%2Fuapmd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atsushieno%2Fuapmd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atsushieno%2Fuapmd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/atsushieno","download_url":"https://codeload.github.com/atsushieno/uapmd/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atsushieno%2Fuapmd/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29476295,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T10:25:47.032Z","status":"ssl_error","status_checked_at":"2026-02-15T10:25:01.815Z","response_time":118,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio-plugin","audiounit","clap","lv2","midi","midi2","vst3"],"created_at":"2024-12-07T03:15:40.901Z","updated_at":"2026-02-15T11:09:13.485Z","avatar_url":"https://github.com/atsushieno.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# UAPMD: next-gen, multi-format, liberally licensed audio plugin host engine with fully equipped MIDI 2.0 frontend\n\n![UAPMD v0.1 example screenshot](docs/images/uapmd-app-v0.1-sshot.png)\n\nUAPMD (Ubiquitous Audio Plugin MIDI Device) is an audio plugin host that serves audio plugin instances and exposes their control points as virtual MIDI 2.0 devices. Your can use arbitrary MIDI 2.0 client apps to:\n\n- play MIDI 2.0 instruments with 32-bit precision; use Assignable Controllers (NRPNs) to change plugin parameters in 32-bit values (velocity in 16-bit).\n- retrieve parameter list as Assignable Controllers and presets as Program List, as long as they are exposed via the plugin APIs. Thus you don't have to remember which controller index maps to the parameter you want, or which program number maps to the tone you need.\n- save and load the plugin's binary state (`.vstpreset` etc.), just like how you use them in a DAW.\n\nWe also develop [midicci](https://github.com/atsushieno/midicci), an fully featured MIDI 2.0 software keyboard that leverages the full potential of this project.\n\nUAPMD targets macOS and Linux desktop. Windows builds are experimental and currently rely on the [Windows MIDI Services developer preview](https://github.com/microsoft/MIDI).\n\nWe support VST3, AudioUnit, LV2, and CLAP plugin formats.\n\nUAPMD is based on its own plugin hosting foundation and released under the MIT license.\n\n## Build or Install\n\nThere is an application `uapmd-app` that performs almost all features UAPMD provides.\n\n### packages\n\n`uapmd` offers Linux packages on the release pages and GitHub Actions build artifacts, in `.deb`, `.rpm` and `.tar.xz` (They are based on CPack packaging tasks). On macOS the `package` target generates a DMG image ready to distribute and the build also emits a standalone `uapmd-app.app` bundle you can drag to Applications. On Windows, running the same target produces a ZIP archive, and if [NSIS](https://nsis.sourceforge.io/Main_Page) is installed you also get a standard installer executable.\n\n`uapmd` offers Homebrew package as well. You can install it as: `brew install atsushieno/oss/uapmd` then run `/opt/homebrew/bin/uapmd-app` or use those libraries the package offers.\n\n### building from source\n\nThis `uapmd` Git repository provides the simple normative `cmake` build:\n\n```\n$ cmake -B build # -G Ninja\n$ cmake --build build\n$ cmake --install build # --prefix=/usr/local\n```\n\n### Windows MIDI Services support\n\nWindows builds expect the Windows MIDI Services runtime to be available and use libremidi's WinMIDI backend. During configuration the build uses the NuGet package `Microsoft.Windows.Devices.Midi2.1.0.14-rc.1.209.nupkg` stored under `external/` and forwards it to libremidi as `LIBREMIDI_WINMIDI_HEADERS_ZIP`.\n\n- `UAPMD_ENABLE_WINMIDI` (defaults to `ON` on Windows, `OFF` elsewhere) toggles this integration.\n- Override `UAPMD_WINMIDI_HEADERS_ARCHIVE` if you want to point at a different package file.\n- Set `LIBREMIDI_WINMIDI_HEADERS_ZIP` manually to a local `.nupkg` if you need offline builds; the automatic download is skipped when this variable is provided.\n\nFor desktop GUI builds on Windows we try to reuse SDL3 from a prebuilt vcpkg package to avoid building GLFW locally. During CMake configure we either reuse `VCPKG_ROOT` or download a vcpkg snapshot, bootstrap it, install `sdl3` for the detected triplet, and extend `CMAKE_PREFIX_PATH` so that `find_package(SDL3)` succeeds. Override `UAPMD_VCPKG_URL`, `UAPMD_VCPKG_URL_HASH`, `UAPMD_VCPKG_TRIPLET`, or `UAPMD_VCPKG_ROOT` when pointing to a mirror or a different architecture. If SDL3 still cannot be provided automatically the build falls back to SDL2 or GLFW as before.\n\n\n## Screenshots\n\nI put them on the [wiki](https://github.com/atsushieno/uapmd/wiki) pages (note that other than the latest ones they are more like historical records).\n\n## What's the point of these tools?\n\nWith UAPMD, You do not have to wait for MIDI 2.0 synthesizers in the market; existing audio plugins should work as virtual MIDI 2.0 devices. 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.\n\nCurrently, both Remidy and UAPMD target only desktop platforms so far, but if you use my [AAP project](https://github.com/atsushieno/aap-core) those synth plugins already work as UMP devices (you need Android 15 or later that supports [`MidiUmpDeviceService`](https://developer.android.com/reference/kotlin/android/media/midi/MidiUmpDeviceService)).\n\n## Usage\n\nThis repository contains one primary executable `uapmd-app`.\n\nThere are supplemental tools for diagnosing problems we encounter.\n\n### uapmd-app\n\nThe virtual MIDI 2.0 device service controller. Currently the command line options are hacky:\n\n\u003e $ uapmd-app (plugin-name) (format-name) (api-name)\n\n`plugin-name` is match by `std::string::contains()` within display name, case-sensitive.\n\n`format-name` is one of `VST3` `AU`, `LV2`, or `CLAP`.\n\n`api-name` so far accepts only `PIPEWIRE` (on Linux) to use PipeWire, and uses default available API otherwise.\n\n### remidy-scan\n\n`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).\n\n## Documentation\n\nALL docs under [`docs`](docs) are supposed to describe design investigation and thoughts.\n\nWe are moving quick and may not reflect the latest state of union, or describe our plans correctly.\n\nThere are some notable docs:\n\n- [Plugin catalog (listing) and instantiation](docs/remidy/PLUGIN_ID_AND_CATALOG.md)\n- [State](docs/remidy/STATE.md)\n- [GUI support and main thread constraints](docs/remidy/GUI_SUPPORT.md)\n- [Parameters](docs/remidy/PARAMETERS.md)\n- [Presets](docs/remidy/PRESETS.md)\n\n## Code modules\n\nThere are two primary libraries in this repository:\n\n### remidy\n\n`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.\n\n### remidy-tooling\n\n`remidy-tooling` offers higher level API to build audio plugin hosting tools like plugin scanning and instancing in the common manner.\nWhat this layer introduces in practice is a set of filters; various existing specific plugin products and vendors are filtered by \"safe for multithreaded access to the plugin API,\" \"plugin scanning requires the UI thread,\" or \"crashes remidy\" kind of information.\n\n### uapmd and uapmd-engine\n\n`uapmd` and `uapmd-engine` provide reusable foundation for constructing virtual MIDI 2.0 devices upon plugin hosting layer (only remidy so far). `uapmd` 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.\n\n`uapmd` itself contains core engine behind MIDI-CI processing for audio plugin hosting and instancing API without implementation and usable backends. `uapmd-engine` goes one step further to establish the premise that there is single audio processing backend, multiple MIDI 2.0 devices, audio graphs, and so on to make everything in usable form.\n\n### uapmd-app\n\n`uapmd-app` is a plugin host that you can list the installed plugins, instantiate plugins, process audio with a UMP keyboard, adjust parameters, select presets, launch the GUI, save, and restore the states. It also exposes those plugins as platform virtual MIDI 2.0 devices, translating UMP inputs into event inputs to those in each plugin API, as well as exposing some plugin features using MIDI-CI property exchange.\n\nIt likely works with MIDI 1.0 inputs (translated, depending on the platform) to control plugins.\n\n\n## License and Dependencies\n\nSources in this repository are released under the MIT license.\n\nThere are third-party (and first party) dependency libraries (git submodules, CMake FetchContent, or directly included):\n\n- [lv2/lv2kit](https://github.com/lv2/lv2kit) (serd, sord, sratom, lilv, zix): the ISC license.\n- [free-audio/clap](https://github.com/free-audio/clap) - MIT\n- [free-audio/clap-helpers](https://github.com/free-audio/clap-helpers) - MIT\n- [steinbergmedia/vst3sdk](https://github.com/steinbergmedia/vst3sdk) - MIT\n- [Tracktion/choc](https://github.com/Tracktion/choc/): the ISC license.\n  - [bellard/quickjs](https://github.com/bellard/quickjs) - MIT\n  - [xiph/vorbis](https://github.com/xiph/vorbis) - BSD (3-clause)\n  - [xiph/flac](https://github.com/xiph/flac) - BSD-like (libraries only)\n- [celtera/libremidi](https://github.com/celtera/libremidi) - BSD (2-clause), MIT (RtMidi)\n- [atsushieno/midicci](https://github.com/atsushieno/midicci) - MIT\n  - [zlib-ng/zlib-ng](https://github.com/zlib-ng/zlib-ng) - Zlib license.\n- [mackron/miniaudio](https://github.com/mackron/miniaudio) - MIT (or public domain)\n- [cginternals/cpplocate](https://github.com/cginternals/cpplocate): MIT\n- [jeremy-rifkin/cpptrace](https://github.com/jeremy-rifkin/cpptrace) - MIT\n- [jarro2783/cxxopts](https://github.com/jarro2783/cxxopts): MIT\n- [cameron314/concurrentqueue](https://github.com/cameron314/concurrentqueue) - BSD (2-clause)\n- [cjappl/rtlog-cpp](https://github.com/cjappl/rtlog-cpp): MIT\n    - for submodules see their [LICENSE.md](https://github.com/cjappl/rtlog-cpp/blob/main/LICENSE.md) (modified BSD, MIT)\n- [cpm-cmake/CPM.cmake](https://github.com/cpm-cmake/CPM.cmake) - MIT\n- [ocornut/imgui](https://github.com/ocornut/imgui) - MIT\n- [unevens/ImTimeline](https://github.com/triplejam/ImTimeline) (a well-maintained and buildable fork of NickVanheer/ImTimeline) - MIT\n- [Roboto font](https://fonts.google.com/specimen/Roboto) - the SIL Open Font License v1.1\n\nNote that while they might look comprehensive, I'm listing those to clarify the licenses that matter. For example, libraries like choc depend on other third-party libraries but we don't use them.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatsushieno%2Fuapmd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatsushieno%2Fuapmd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatsushieno%2Fuapmd/lists"}