VST3 Development Experience

2025-10-26

Due to the recent MIT-fication of the VST3 SDK and the fact that Steinberg and PreSonus seem to be working towards Wayland support in VSTGUI, I decided it was time to take the infamous API for a test ride.

This post will mostly follow the official Steinberg VST3 guide and is not meant as a replacement, but as more of a learning/documentation for myself and others.

Setup

Clone the SDK:

$ git clone --recursive https://github.com/steinbergmedia/vst3sdk.git

Install the deps on Arch:

# pacman -S cmake ninja qtcreator

(On CachyOS gcc, gcc-libs, libxcb, fontconfig, cairo, gtkmm3, sqlite and keysyms seem to already be installed. Since, Arch does not have separate library packages, the naming is different from Debian packages.)

cd inside the SDK, make the build directory and build the examples:

$ cd vst3sdk
$ mkdir build
$ cd build
$ cmake ../
$ make

Missing cstdint header

So first off, the cstdint header is missing from one of the files. This is a common problem with old C++-projects where the header got implicitly included in the past.

Somebody already fixed it in the upstream vstgui, so all that has to be done is to update the submodule:

In the vstsdk root run:

$ git submodule update --remote vstgui4

Building using QtCreator

From the root directory launch QtCreator:

$ qtcreator ../

Then, follow https://steinbergmedia.github.io/vst3_dev_portal/pages/Tutorials/Using+cmake+for+building+plug-ins.html#on-linux-with-qtcreator.

Did not work; had to instead go to Projects-tab and click configure project.

After building (running/configuring cmake?) the example plugins are linked to ~/.vst3:

$ ls -lgG ~/.vst3 | tail -n +2 | sed "s@$HOME@\~@g" | awk '{print $6, $7, $8}'
adelay.vst3 -> ~/src/vst3sdk/build/VST3/Debug/adelay.vst3
again-sample-accurate.vst3 -> ~/src/vst3sdk/build/VST3/Debug/again-sample-accurate.vst3
again-simple.vst3 -> ~/src/vst3sdk/build/VST3/Debug/again-simple.vst3
again.vst3 -> ~/src/vst3sdk/build/VST3/Debug/again.vst3
channel-context.vst3 -> ~/src/vst3sdk/build/VST3/Debug/channel-context.vst3
host-checker.vst3 -> ~/src/vst3sdk/build/VST3/Debug/host-checker.vst3
legacy-midicc-out.vst3 -> ~/src/vst3sdk/build/VST3/Debug/legacy-midicc-out.vst3
mda-vst3.vst3 -> ~/src/vst3sdk/build/VST3/Debug/mda-vst3.vst3
multiple-program-changes.vst3 -> ~/src/vst3sdk/build/VST3/Debug/multiple-program-changes.vst3
note-expression-synth.vst3 -> ~/src/vst3sdk/build/VST3/Debug/note-expression-synth.vst3
note-expression-text.vst3 -> ~/src/vst3sdk/build/VST3/Debug/note-expression-text.vst3
panner.vst3 -> ~/src/vst3sdk/build/VST3/Debug/panner.vst3
pitch-names.vst3 -> ~/src/vst3sdk/build/VST3/Debug/pitch-names.vst3
prefetchable.vst3 -> ~/src/vst3sdk/build/VST3/Debug/prefetchable.vst3
program-change.vst3 -> ~/src/vst3sdk/build/VST3/Debug/program-change.vst3
remap-paramid.vst3 -> ~/src/vst3sdk/build/VST3/Debug/remap-paramid.vst3
sync-delay.vst3 -> ~/src/vst3sdk/build/VST3/Debug/sync-delay.vst3
utf16-name.vst3 -> ~/src/vst3sdk/build/VST3/Debug/utf16-name.vst3

The plugins can be loaded in a VST3-capable host:

AGain VST3

Crashes if you detach the window and then close it (double click, close the plugin window).

Creating a plug-in using the Project Generator App

Clone the project generator to where-ever you store repos:

$ git clone https://github.com/steinbergmedia/vst3projectgenerator.git

cd in to the vst3projectgenerator/script-directory:

$ cd vst3projectgenerator/script

Generate a new project:

cmake -P GenerateVST3Plugin.cmake

Then, the project can be opened and configured in QtCreator:

$ qtcreator output/My\ Plugin/

Do note that the generated CMakeLists.txt will have the vst3sdk_SOURCE_DIR hardcoded.

Although, this can be configured using a flag when the cmake script is invoked.

Maybe something more appropriate for me:

$ cmake \
    -DSMTG_VENDOR_NAME_CLI="rllk" \
    -DSMTG_VENDOR_HOMEPAGE_CLI="https://kallinen.xyz" \
    -DSMTG_VENDOR_EMAIL_CLI="valtteri@kallinen.xyz" \
    -DSMTG_PLUGIN_NAME_CLI="SVF" \
    -DSMTG_PREFIX_FOR_FILENAMES_CLI="Svf_" \
    -DSMTG_PLUGIN_IDENTIFIER_CLI="xyz.kallinen.vst3.svf" \
    -DSMTG_CMAKE_PROJECT_NAME_CLI="Svf" \
    -DSMTG_VENDOR_NAMESPACE_CLI="Rllk" \
    -DSMTG_PLUGIN_CLASS_NAME_CLI="CSvf" \
    -DSMTG_PLUGIN_CATEGORY_CLI="Filter" \
    -DSMTG_PLUGIN_BUNDLE_NAME_CLI="rllksvf" \
    -DSMTG_VST3_SDK_SOURCE_DIR_CLI='$ENV{HOME}/src/vst3sdk' \
    -DSMTG_GENERATOR_OUTPUT_DIRECTORY_CLI="~/src/rllksvf" \
    -DSMTG_ENABLE_VSTGUI_SUPPORT_CLI=ON \
    -P GenerateVST3Plugin.cmake

Test that it configures and builds:

$ qtcreator ~/src/rllksvf/SVF

Code the plugin

Basically, just follow https://steinbergmedia.github.io/vst3_dev_portal/pages/Tutorials/Code+your+first+plug-in.html.

There is no plugids.h, so the parameters probably go in <yourplug>_cids.h instead.

WYSIWYG interface editor

Seems to work OOTB, seems to also crash a lot. For example, crashes if I insert a knob and try to move/scale it.

I can get a knob connected to the parameter:

what a knob

The knob works if I exit the editor.

That is it

Did not have time to look at this any further. I might check later if the SDK will mature a bit. Right now the tutorial and documentation is a bit scattered around and does not feel polished. Although, it is relatively easy to get a project building and going from scratch.

Would I recommend VST3 as it is? On Linux, probably not yet. Otherwise, maybe.