MIDI PC in a DAW

Hi guys,

In my last plugin for guitarists I’ve added the possibility to switch presets and turn on/off different effects inside the plugin with MIDI and OSC. The idea is to be able to use the plugin in a live situation, for example with a foot controller.
On the MIDI side, I’m using only PC messages.

I build these formats:

  • Windows → AAX, VST3 and Standalone
  • macOS → AAX, AU, VST3 and Standalone

OSC works perfectly in every format.

In the Standalone application with a MIDI controller that sends PC messages everything is fine, but inside the DAWs I just can’t find a way to make it work.

I know that you have to create an audio track with the plugin, a MIDI track for the controller, and then send the output of the second track to the input of the first one. This is basically what I’ve found in every tutorial I’ve read on this topic, of course with small variations for each DAW, but the main concept is always the same. In the end, this method does not work. My plugin does not receive any PC messages.

So my questions are:

  • I’ve read that VST3 do not accept MIDI as input → is that true? I’ve noticed that some companies ask the user to use the VST2 version in order to have MIDI input…
  • Is there something that I need to do in my JUCE code in order to accept MIDI messages inside DAWs? for example in the Cmake there are these flags:
juce_add_plugin(${PLUGIN_NAME}
    VERSION ${VERSION_NUMBER}                                
    ICON_BIG xxxxxx                           
    ICON_SMALL xxxxxxxx 
    COMPANY_NAME xxxxxxx                           
    IS_SYNTH FALSE                              
    # NEEDS_MIDI_INPUT TRUE/FALSE               
    # NEEDS_MIDI_OUTPUT TRUE/FALSE              
    IS_MIDI_EFFECT FALSE    

Do I have to set “TRUE” to “NEEDS_MIDI_INPUT” even if I’m not making a synth?

  • Any other suggestions?

Thank you!

VST3 should be able to take MIDI as input if you’re doing it in JUCE I think. Most likely you need to set NEEDS_MIDI_INPUT to true as well.

Update:

Settings NEEDS_MIDI_INPUT to TRUE solves the problem, but only for the AU version. So, on Reaper in macOS, with the AU version, I am able to receive MIDI PC from another track, but with the VST3 version I still don’t receive anything.

VST3 doesn’t support MIDI. It uses its own event types, but there’s no 1-to-1 conversion between MIDI and VST3 events. The JUCE VST3 wrapper will do its best to convert between MIDI and VST3 events - if you want to receive events in the MidiBuffer argument to processBlock, you’ll need to set NEEDS_MIDI_INPUT TRUE in your CMake.

There’s no VST3 message/event type that corresponds to incoming MIDI program change. Instead, plugins with multiple programs are expected to expose a ‘program change’ parmeter. It’s then up to the DAW/user to map this parameter in a way that makes sense.

Hi Reuk, thank you for your response. Could you please elaborate further on this point? What do I have to do in order to expose a “program change” parameter?

You would use the AudioProcessor program functions, i.e. getNumPrograms, getCurrentProgram, setCurrentProgram, and getProgramName.

1 Like

You might want to try marking it as a synth? I forget what variable you need to set to do that, but I think that did the trick for me at some point.