VST3 ParameterChangeGesture problem in Cubase 7.5

VST3 plug-in sliders appear to be broken in Cubase 7.5 (OSX) and LE AI Elements 7 (OSX or Win) when begin/end gesture support is used.

I've been able to create a minimum repro case with the JuceDemoPlugin.  Add the following lines as public methods to PluginEditor.h (current tip, using VST SDK 3.6.0):

    void sliderDragStarted (Slider* slider) {if (slider == &gainSlider) getProcessor()->beginParameterChangeGesture (JuceDemoPluginAudioProcessor::gainParam);};

    void sliderDragEnded (Slider* slider) {if (slider == &gainSlider) getProcessor()->endParameterChangeGesture (JuceDemoPluginAudioProcessor::gainParam);};

This should, if I understand it correctly, add begin/end ParameterChangeGesture support to the gain slider.

It seems to work properly for AAX, AU, and VST.  Also for VST3 under the Juce PluginHost and VST3PluginTestHost.  Also when running Cubase on OSX in 64-bit mode with a 32-bit VST3.  

But running Cubase or Elements with the VST3 in a matching bit-depth (32 or 64), the Gain slider resets to the full CCW position at the end of every adjustment.

That is, the JuceDemoPlugin gain slider rotates and updates its values as expected but when the slider drag is ended, the processParameterChanges() queue generates a call to SetParameter (0, 0.0) which sets the control full CCW.

I noticed the problem with VST3 SDK 3.5.2; changing to 3.6.0 didn't make any difference.  Also happens on both OSX and Win.

Is something broken, or am I misunderstanding the proper use of begin/end ParameterChangeGesture?  Anyone run into this already and know of a workaround?

Hmm.. Really not sure what to suggest there.

You can see that all the plugin does (juce_VST3_Wrapper.cpp, line 282) is to call the host's beginEdit() method.. AFAICT the ID it passes is correct, and there's really not much else it could do. Must be something odd about the way the host's handling it, but can't think why..

Can confirm this bug for Cubase 7.0.7 (OSX).

Confirmed for Cubase 7.5.3 Mac and Win

Confirmed for Cubase 7.5.3 on OSX Yosemite, compiling from the latest Juce tip. EDIT: I can also confirm that removing the begin/end gesture things "fixes" this behavior.

One more thing which might help is that it seems setParameterNotifyHost() will call setParameter() asynchrously in VST3 instead of syncchrously in VST2.

Must be something odd about the way the host's handling it

So given that Steinberg makes important VST3 hosts, I suggest JUCE's wrapper should include a work-around for this problem - like this: https://github.com/soundradix/JUCE/commit/92699b1dbcbd1dd836ab9d4a868c0e0d90ee25a6

Cheers, Yair

EDIT: made better fix/work-around - see http://www.juce.com/comment/310865#comment-310865

More symptoms which can teach us something about the bug:

  • Open a plugin which doesn't notify Cubase of parameter change gestures
  • Change some parameters
  • Open the preset selection window
  • Press "Esc" on the keyboard
  • The parameters you touched are now reset to the minimal value (BUG)


  • Switch to the generic editor
  • Change some parameters
  • Switch to the editor
  • Change the same parameters
  • Again, open the preset selection window and press "Esc"
  • Now the parameters are reset to their values which were previously set in the generic editor

Cheers, Yair

Looks like adding calls to setParamNormalized in addition to performEdit solves all the known symptoms.

See https://github.com/soundradix/JUCE/commit/2e9e66cbc8c65e889be5232ffae83c0ca78f9c7e

Excellent - thank you !!!! Working like a charm  cool


Were you able to test with other hosts?

Haven't done a lot of testing on other hosts. Things seem to still work on Studio One 2.6.1 and Tracktion 6.0.23 on OS X 10.10.2