Recommended practice to set plugin variables

I have a synthengine object in my plugin, it lives in the audio thread.
Plugin variable are maintained in the AudioProcessorValueTreeState (audio thread).
The gui contains all the widgets that can change pluging variables, each widget has a parameter attachment to one of the variables in the AudioProcessorValueTreeState. So all pretty normal stuff.

When running the plugin without GUI, I’d like the synthengine to still get all the parameter changes that are received from the host.
My question is: what is the recommended practice to set plugin variables?
Just pulling parameters from the AudioProcessorValueTreeState does not work, there are many scenario’s where I want to push parameters changes to the synthengine.

Can I add a second ParameterAttachment, connecting to the RangedAudioParameter that already has an attachment to the (custom) widget, and pointing to a synthengine method?

OK, I think it’s done with a listener, right?


which means I could get rid of most of the editor-side callbacks… (e.g. comboBoxChanged etc)
So how can I iterate over an AudioProcessorValueTreeState to add parameter listeners?