I add this fyi, in case you find problems later on. What you see is likely caused by this in the VST3 wrapper:
inParameterChangedCallback
is thread-local, so if you set a parameter in the change callback of another one, the host won’t know. Additionally, Cubase and Nuendo ignore parameter changes sent from non-message threads. A warning in the VST docs underlies all this:Audio units have a concept for this (metaparameters), VST doesn’t. Your solution works because it defers the change. It has another issue though: callAsync
allocates, which is generally a bad idea on the audio thread. Here eyalamir gives a timer-based solution to a similar problem. In my experience, the deferred solutions mostly work, until you do something silly like reading both parameters at the same time, or recording one while reading the other. Still, given the format explicitly forbids this, you could always find a host (or a future version of it) that complains in uglier manners.