VST3 sidechains


#1

I’ve only tested this in Reaper, since its channel layout is so flexible, but: when I create a VST3 plugin with a sidechain bus and load it on a track with N channels, I only get offered bus layouts where the number of sidechain channels is also N. So I can’t create a 6-channel plugin with a stereo sidechain, for instance. Does anybody know whether this is a VST3 thing or rather a Reaper peculiarity?


#2

Yeah that is strange. It seems to work in most other DAWs I just tested: Cubase, Studio One, Bitwig, … You can force Reaper to accept a sidechain with a different number of channels as the main bus by limiting your main and sidebus to a single layout. For example, in the examples/PluginSamples/NoiseGate, do the following:

class NoiseGate  : public AudioProcessor
{
public:
    //==============================================================================
    //==============================================================================
    NoiseGate()
        : AudioProcessor (BusesProperties().withInput  ("Input",     AudioChannelSet::stereo())
                                             .withOutput ("Output",    AudioChannelSet::stereo())
                                             .withInput  ("Sidechain", AudioChannelSet::mono()))
    {
        addParameter (threshold = new AudioParameterFloat ("threshold", "Threshold", 0.0f, 1.0f, 0.5f));
        addParameter (alpha  = new AudioParameterFloat ("alpha",  "Alpha",   0.0f, 1.0f, 0.8f));
    }

    ~NoiseGate() {}

    //==============================================================================
    bool isBusesLayoutSupported (const BusesLayout& layouts) const override
    {
        if (layouts.getMainInputChannels() != 2)
            return false;
        // the sidechain can take any layout, the main bus needs to be the same on the input and output
        return (layouts.getMainInputChannelSet() == layouts.getMainOutputChannelSet() &&
                (layouts.getNumChannels (true, 1) < 2) &&
                (! layouts.getMainInputChannelSet().isDisabled()));
    }