I recently migrated to
AudioProcessorValueTreeState and attachments to bind UI to parameter state and it’s working beautifully. I had a lot of parameters to track and it was much easier than adding listeners to UI components. I’m now in the process of trying to adopt the
SynthesiserVoice abstractions to eliminate some hand-rolled MIDI handling, voice-stealing, etc., reconciling that with
AudioProcessor::processBlock. Looks good so far. I’m still having some awkwardness around updating state:
My synthesizer core is a simulator of some sound chips from another project of mine and they have their own internal state using small POD types, a
uint8_t here, a
uint16_t there, etc. Right now, updating its user-controlled parameters requires calling setters in that core type. It’s been a little awkward to get the data out of the parameter tree and push them into their appropriate setters.
AudioProcessorValueTreeState seems to be designed to be the sole source of parameter state, where you “pull” from state directly as needed, but I’ve already got state in my synth core and it’d be pretty intense to convert all of those ivars to JUCE parameters. I’ve tried bringing up custom parameter listeners that have callbacks but it’s all very messy as you can imagine.
Are there any other methods that I haven’t tried that you’d recommend? I want to use the APIs in the idiomatic way and
AudioProcessorValueTreeState was definitely the right call. Am I going to have to bite the bullet and have the synth core pull directly from the ranged parameters in the implementation?