Recording Automation doesn't work with VST3

Issue (Juce 5.3.2):
I am currently working on an adapter that wraps my existing VST2.4 plugins to VST3.

It is already running fine.
However I noticed two issues:

  1. Recording automation doesn’t work. The host’s automation parameters don’t get notified when a knob is turned.
    It seems like beginEdit/endEdit isnt’t forwarded properly to the host. The issue does not happen with my VST 2.4 plugin.

  2. The VST3 plugin exposes hundrets of Midi CCs as automation paramateres. I am aware that this is a wrokaround for the VST3 limitation for Midi. Is there a way to expose only a part of the automation parameters, since my plugins don’t need all?

There have been a lot of changes to the VST3 wrapper to do with parameter handling and automation since JUCE 5, so I wouldn’t be surprised if the beginEdit/endEdit issue has been fixed.

We are no longer releasing bugfix patches for JUCE 5.3.2. Please try building your project with the very latest version of JUCE from the develop branch and see whether the problem is still present. If it is, please let us know and we’ll investigate further.

For the second issue, you can disable the MIDI CC compatibility parameters by setting JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS=0 in your project’s preprocessor definitions.

  1. I depend on v5.3.2, since I must support VST2.4. The wrapper code doesn’t compile with more recent versions. I explicity stated that I need JUCE 5 when I paid over €800 for the perpetual license last month.
    I am very disappointed. :frowning:

  2. I didn’t ask for stripping it completely. My plugins need the CCs. But not all of them. I asked if exposing only a selected number of CCs is possible

It’s possible to build VST2 plugins with JUCE 6. If you’re using the Projucer, you just need to set the “VST (Legacy) SDK Folder” in the exporter settings for each exporter. If you’re using CMake, you can call the juce_set_vst2_sdk_path function to set the path to the VST2 SDK.

No, this is not possible.

With big effort I migrated my project to Juce 6 now (a VST3 wrapper that loads a VST2.4 plugin). The problem still persists:

Recording automation doesn’t work. The host’s automation parameters values don’t get updated when a knob is turned.
It seems like the wrapped plugin’s beginEdit/endEdit/setParameterAutomated aren’t forwarded to the host.

I am using a class class WrapperProcessor: public juce::AudioProcessor similar to here:

One thing I have noticed that this is missing in the above example (they’re defined as virtual functions in juce_AudioProcessor.h):

void beginParameterChangeGesture(int parameterIndex) override { plugin->beginParameterChangeGesture(parameterIndex); }

void endParameterChangeGesture(int parameterIndex)override {plugin->endParameterChangeGesture(parameterIndex); }

void setParameterNotifyingHost(int parameterIndex, float newValue) override {plugin->setParameterNotifyingHost(parameterIndex, newValue); }

The JUCE VST3 wrapper registers itself as an AudioProcessorListener of your (outer) AudioProcessor and sends parameter change notifications to the host whenever it receives an audioProcessorParameterChanged, audioProcessorParameterChangeGestureBegin, or audioProcessorParameterChangeGestureEnd callback.

It sounds like at the moment, your outer AudioProcessor never calls these listener callbacks. To get this working, I think you’ll need to:

  • Make your outer processor inherit from AudioProcessorListener.
  • Call innerProcessor.addListener (this) in the constructor of your outer processor to register it as a listener of the inner processor.
  • Override AudioProcessorListener::audioProcessorParameterChanged, and call AudioProcessor::sendParamChangeMessageToListeners with the same parameter index and value.
  • Override AudioProcessorListener::audioProcessorParameterChangeGestureBegin and End, and call AudioProcessor::beginParameterChangeGesture or endParameterChangeGesture as appropriate, passing the same parameter index.

Thanks. I implemented your suggestions (audioProcessorChanged has been missing in your proposal).
Some virtual functions like
setParameter etc are deprecated. Not sure if it is correct to have them still inside the code. Should I remove them?