Parameter handling and MIDI CC

I’m not completely confident about the way my synth plugin should be handling parameters as it relates to MIDI CC data.

My synth, like many/most synth plugins, allows the user to assign a MIDI CC# to a parameter, usually to control that parameter by a hardware controller. Example: a knob on a hardware controller used to control filter cutoff.

The way I’ve been handling this is:

  • handleController() receives the event in the processBlock()
  • I look up what parameter is mapped to that CC#, if any
  • call parameter->setValueNotifyingHost()

That seems correct to me…it seems the equivalent of a user moving a UI knob.

But then I have a couple of users that ask me why opening and playing back a sequence (without changing anything) is marking their project dirty and needing saving. My assumption is that by me calling setValueNotifyingHost(), the DAW thinks the user has changed something and therefore it needs saving. But, part of me agrees with the user that simply playing back a sequence should not mark it dirty.

Is this my plugin’s fault? Or possibly the DAW’s? Or is it simply a by product of using MIDI CC automation instead of parameter automation? And…does VST3 come into play here? Should I be doing something different for VST3?

How do any of you handle this? Any clarification would be appreciated.

As a user I’ve had some DAWs mark projects as dirty over very trivial things… it could be the DAW is deciding the project is dirty even if your setValueNotifyingHost() call is using the same value. If you’re not already, you may want to check the current value and avoid making that call unless the new value differs

Why not treat MIDI CC as a modulation source? MIDI Learn is the responsibility of the host, imho.