VSTPlugin v0.3.0 released!

I’m happy to announce the release of VSTPlugin v0.3.0!

Binaries and source code: https://git.iem.at/pd/vstplugin/releases.

Please report any bugs at https://git.iem.at/pd/vstplugin/issues or leave a comment.

NOTE: in SC 3.11 it will be finally possible to show the native VST GUI on macOS and VSTPlugin will also work in Supernova. The necessary changes have already been merged to the develop branch on GitHub, so in the meantime you can use the “Bleeding Edge” build from https://supercollider.github.io/download

New features:

  • better error messages when plugins fail to load (e.g. wrong CPU architecture)

  • automatically scan VST3 presets

  • new simplified preset management system, using named presets which are saved to standard locations (the old methods remain for power users).

  • params argument for VSTPluginGui.gui; if set to false, only the menu section is shown.

  • VSTPluginController.browse method to open a plugin from the plugin browser.

  • the plugin browser now allows to filter plugins by keyword, type, vendor and category.

  • /vst_search_stop OSC command resp. VSTPlugin.stopSearch method to cancel a plugin search.

  • custom event type \vst_set which allows to easily set plugin parameters with Patterns. The OSC messages are scheduled as bundles with Server latency to enable precise and correct timing.

  • custom event type \vst_midi which allows to easily play VST instruments with Patterns. Unlike the regular \midi event type, the MIDI events are scheduled as bundles with Server latency to enable precise and correct timing.

Bug fixes

  • fixed several bugs in the VST3 implementation


  • VSTPluginDesc class for plugin infos, which means they are no longer IdentityDictionaries.

  • VSTPluginGui: the menu section is fixed and only the parameter grid is scrollable. “read program” etc. buttons are gone in favor of the new preset management system (“save”, “save as”, “rename”, “delete”, “reload”)

  • don’t automatically resolve relative paths to currently executing file because it only works in specific cases.

  • removed unused (and misleading) members from VSTPluginMIDIProxy




To all Mac users who want to use the VST GUI now: you can download the latest develop build from https://supercollider.github.io/download (“Bleeding Edge”)


Wow!! well done! thank you for this work

Thanks a lot!!! This expands SC a lot!

Awesome job!
I have the gui up + running.

How would you get a parameter name that contains white space characters sequenceable?

This does not work for me:

~fx.set(\grain size,rrand(0.1,1.0));

A symbol can be notated with single quotes, so how about
~fx.set('grain size', rrand(0.1,1.0));

That did the trick!
I am made elated!
Thank you so much!

Is there a way to control how often the VST GUI gets updated/redrawn?

I am on a Mac running the bleeding edge sc version referenced by Spacechild1 above.

Is there a way to control how often the VST GUI gets updated/redrawn?

@t36s do you experience any problems? I just realized that I have a wrong (i.e. too slow) refresh rate in the macOS VSTPlugin implementation :man_facepalming:, but this should only affect plugins which don’t have their own timer (mostly older ones). Will be fixed in the next bug fix release.

@Spacechild1 Yes, I am all about old plugins. :blush:
Cool that you know how to fix it. That’s going to help me for sure.

Having so much fun right now with this.

How would y’all look at and change the gain between plugins so that they don’t clip?

@t36s did you actually see problems with the update rate and if yes, can you name some plugins, preferrably freeware? I’m asking because I didn’t notice it myself and I want to test it.

Yes I saw it happening. Very slow update frequency in the gui.
I was using Soundhack Bubbler.
An old version that suits me better than the new version.
It was and is freeware.
Here is the link to my old version:

Here is the link to Soundhack’s site where you can find the newer version:

Bubbler is part of the delay bundle.

@t36s Hey, can you try this new version and report back: https://git.iem.at/pd/vstplugin/-/jobs/9105/artifacts/download

You are awesome!
It totally works now.
The GUI can update at breakNeck speed:

Thank you!

I am trying to pan the output from a plugin.
What am I doing wrong?

SynthDef(\insert, { arg bus,pan,out;
    var in, sig ;
    in = In.ar(bus, 1);
    sig = VSTPlugin.ar(in, 1);
    sig = Pan2.ar(sig,pan);

// create the synths:
~synth1 = Synth(\insert, [\bus, 0, \out, 50], 1, 'addToHead');
~synth2 = Synth(\insert, [\bus, 50, \out, 0], 1, 'addToTail');
// get a handle to the VSTPlugins:
~bubbler = VSTPluginController(~synth1);
~dtblkfx = VSTPluginController(~synth2);
// open a plugin by name/key)
~bubbler.readProgram("/001.fxp").post; // bubbler clean slate

~dtblkfx.readProgram("/002.fxp"); // dtblkfx clean slate

        \type, \vst_set,
            \vst, ~bubbler,
            \params, ['time','grain size','filter freq','octave','feedback','density'],
            'time', Pexprand(0.1, 1.0),
            'grain size', Pwhite(0.1, 1.0),
            'filter freq', Pwrand([0,1],[1,64].normalizeSum,inf),
            'octave', Pwhite(0.0,1.0), //maybe reDo w/ 9 values and Pxshuf?
            'feedback', Pexprand(0.65, 1.0),
            'density', Pexprand(0.65, 1.0),
	        \dur, Pwrand([0.2,0.4,0.8,1.6,8,],[10,10,10,10,1].normalizeSum, inf),
            \pan, 1.0,

I think I’m panning the signal before the plugin get’s added?
That’s where I’m at.
Any help greatly appreciated.

I think your problem is that Out.ar sums into the bus but you actually want to replace the signal, e.g. with ReplaceOut.ar. I think what you want is a chain of two insert FX in series, right? Usually, an insert FX reads from a bus and replaces the original signal with the processed one, so the simplest insert FX SynthDef would be:

SynthDef(\insert_mono, { arg bus;
    ReplaceOut.ar(bus, VSTPlugin.ar(In.ar(bus, 1), 1));

Another problem is that in your SynthDef you take a mono input and create a stereo signal with Pan2.ar, but it doesn’t make much sense to do this several times in series. I think you should first do all the FX processing and only do the panning at the end (e.g. with a dedicated panner SynthDef) - or vice verca!

Note that if the number of VST plugins in your FX chain is fixed, you can do everything in a single SynthDef, e.g.:

SynthDef(\foo, { arg bus, pan;
    var sig = In.ar(bus, 1);
    sig = VSTPlugin.ar(sig, 1, id: \fx1); // first FX
    sig = VSTPlugin.ar(sig, 1, id: \fx2); // second FX
    ReplaceOut.ar(bus, Pan2.ar(sig, pan)); // pan

~synth = Synth(\foo, [\bus, 0]);
~fx1 = VSTPluginController(~synth, \fx1); // get handle to the first FX
~fx2 = VSTPluginController(~synth, \fx2); // get handle to the second FX

This is approach is, of course, less flexible than having a dedicated Synth for each FX.