FABIAN: Waves VST3 plugin controls/presets problem


#1

Fabian,

I’m continuing to test JUCE’s VST3 implementation against a wide variety of VST3 plugins. Today I’ve been testing a variety of Waves plugins, and so far they all exhibit the same behavior:

  1. Click a control to move it.

  2. As you drag the control, the value changes both visually and audibly.

  3. Release the control.

  4. The control’s value drops to zero.

    In addition, loading any preset will cause all controls to drop to zero, probably for the same reason. I’ve discovered that the plug-ins values don’t drop to zero until audio is processed through the effects – you can move any controls you want until audio is processed, and then that control (and any other controls that you’ve moved) will drop to zero.

    You should be able to test this for yourself by downloading a demo of Waves C1, available here: http://www.waves.com/plugins/c1-compressor

    Note that Waves plugins use a single shell .VST3 file to store all of your plugins. JUCE does an excellent job of pulling all the plug-ins out of the shell, and I’m able to load a specific plugin from the shell with ease!

Thanks again,
Dan


#2

This should be fixed on the latest develop branch. Thanks for the heads up.


#3

Fabian,

That’s great news. I gave it a shot. It works great (!!) but there are two issues I wanted to point out to you, with regards to compiling the latest branch in Visual Studio 2015:

  1. In juce_VST3PluginFormat.cpp, this code is ambiguous:

     Vst::IParamValueQueue* PLUGIN_API getParameterData (Steinberg::int32 index) override    { return isPositiveAndBelow (index, numQueuesUsed) ? queues[(int) index] : nullptr; }
    

    The problem is that Steinberg::int32 is defined as a “long”, and there is no version of isPositiveAndBelow() that takes a long. I fixed this by casting the first parameter of isPositiveAndBelow to an (int), as shown:

     Vst::IParamValueQueue* PLUGIN_API getParameterData (Steinberg::int32 index) override    { return isPositiveAndBelow ((int)index, numQueuesUsed) ? queues[(int) index] : nullptr; }
    
  2. This code in juce_MidiMessageSequence.h will not compile in Visual Studio 2015:

    #ifdef JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS
    MidiMessageSequence (MidiMessageSequence&&) noexcept = default;
    MidiMessageSequence& operator= (MidiMessageSequence&&) noexcept = default;
    #endif

All that is required to fix this is to remove the “= default” from the end of the function definitions. These two definitions are the only definitions in all of JUCE that contains “noexcept = default” – all other similar definitions just contain “noexcept”.

I hope that’s helpful! I can report that the Waves plugins I tested are working great now – thank you!

Dan


#4

Thanks this is fixed in the latest commit on develop.

I think this compiler bug is fixed with VS 2015 Update 2. The default keyword is important here - otherwise you will get linker errors if you use move semantics.


#5

I can confirm that the “default” code works perfectly in VS2015 Update 2. Thanks again!

Dan