Here are the bigger features/changes for the plugin API and SDK that are planned in the short/medium term future, and roughly where we’re putting them on a timeline. However if anyone wants to help on any particular new features (either by testing the API on their own plugins, or helping with code), we can re-arrange priorities.
Edits in Italics
v1.3:
- X Done! Text Display API. The API is already done (thanks @hemmer) and merged into the main firmware and SDK branches. I’m adding support for plugins to be able to use their own font files.
v2.x:
See the v2.0-dev
branch.
This will be first ABI compatibility break, that is, all plugins will need to be recompiled with the v2.x SDK in order to run on firmware v2.x.
- In progress on v2.0-dev: Add MIDI raw streams. This is still experimental. The idea is to pass raw MIDI packets to modules. The idea I’m working with now would not require an API break, so it could be part of v1 SDK.
- X Done in v2.0-dev: Context menus. These show up in the elements list on the Module view page. In most cases there are no changes needed to the VCV plugin code. So far the only changes needed were purely for UX (updating the text of the menu live as you select items, which does not usually happen in VCV Context menus).
SDK helpers for adding AltParams. These are regular params but they can’t be mapped and don’t show up on the panel (just at the end of the list of elements in ModuleView). I’d love to have a way to automatically convert rack::Menu items to AltParams, but I haven’t found a way to do this automatically (yet?).Update: This is not necessary now that we have automatic adding of Context Menus.- X Done v2.0-dev: Support for loading Factory Presets: The presets/ dir containing json files are included in the
assets/
dir. Backported into v1.x branch. - Support for loading User Presets: This means scanning for and loading
.vcvm
files from SD Card or USB drive.
Changes to CoreProcessor
(base class for all modules):
- X Done Adding a
CoreProcessor
function to get a param value from the module. This allows the GUI to update the visual state of module if the module changes its own parameters. - In progress Support bypass for modules. Adds
bool bypass
to theCoreProcessor
base class. The engine ends up callingprocessBypass()
instead ofprocess()
on VCV-ported modules when bypass is true. Native modules may have BypassRoutes in theirinfo
structs.
Changes to core-interface:
- X Done Add min/max value, display base/mult/offset, units, to all ParamElements. This allows the human-readable values such as “440Hz” instead of just 0-100%.
- X Done Add min/max angle to Pots so they are drawn more correctly.
Changes to rack-interface:
- X Done Remove dependency on
MetaModule::Elements
byrack::Widget
. Doing this means that future changes to Element types (such as the two items above) would not be an ABI break.
Next up (v2.x?)
- In progress: Filesystem access: This is more-or-less worked out. It adds two features: modules may run background tasks which are allowed to block (and do not block the audio task); and an API for accessing filesystems. The FS API is based on FatFs API, but a posix adaptor is easy. In progress and may be back-ported to v1.x:
fopen
,fread
,fclose
,lseek/fseek
which allows for plugins to read from their own assets/ dirs - In progress Direct Draw Elements: I wrote a back-end renderer for nanovg which ties into LVGL. It supports TTF fonts, and most NVG vector commands. This lets VCV modules display graphics and text, without any code modification.
Future directions:
In general I want to see less changes required to VCV-based plugins. Some easy ones are:
- Support exceptions, and support streams (iostream, stringstream). This is quite far along, but I have it at a low priority. Fixing this will save quite a few #ifdef blocks…
- Integrate building MM plugins with building VCV plugins. Ideally a MM-compatible VCV plugin could have minimal modifications made to the Makefile or CmakeLists file, so that something like this:
export RACK_DIR=/path/to/Rack-SDK
export MM_SDK_DIR=/path/to/mm-sdk
make dep
make dist
make install-mm-sdk
make mm-plugin
… builds both the .vcvplugin
and the .mmplugin
files. There is an example of this working in our CVFunk fork
- Use SVGs instead of PNGs. This isn’t a huge deal, but it would mean we could “zoom” in on part of module at better resolution. A quick check I did showed that compressed SVGs (.svgz) were close in size to 240-px high PNGs.