Proper use of APVTS and how to hide paramaters from host?

Hi, I’m developing an FM synth plugin with 4 oscillators and an FM matrix and some other values e.g. master gain.
I started by using a raw Value Tree but I decided to try to switch to switch to an apvts because it seems to have better integration with the UI. My question is: how can I get the parameters I add to not be visible to the host? because right now in ableton it looks like this:

image

Which is not very useful.
Secondly I was wondering about good practise for the apvts. Right now I have one group containing 4 groups(one for each oscillator).

Is it a good to append the paramter IDs with their respective index?

*note, osc_0 - osc_3 are groups, and attack_0, decay_0, attack_1 etc. are ParameterFloats

Regarding appending an index, I certainly find that very helpful when I have multiple banks/channels/whatever.

As for hiding from the host, that’s a question I have posed here myself. With the old (and now deprecated) createAndAddParameter method, it was easy to pass in false for the isAutomatable flag for parameters you don’t want the host to show. But the new parameter types like AudioParameterChoice, etc., don’t have that ability. Apparently, because some hosts ignored that flag and showed the non-automatable parameters anyway, they decided to not make it a settable value in JUCE 6. So, the only way I know to handle that (if using the new parameter system) is to either 1) modify the JUCE parameter types to allow setting that flag, and making sure the flag’s value gets passed to the host when asked, or 2) making all non-automatable parameters not be parameters. Doing that, however, makes it a lot more difficult to use attachments to handle the Editor<->Processor interactions safely and efficiently.

We’re still using the old deprecated createAndAddParameter calls currently, and just have an FAQ for certain hosts that ignore the isAutomatable flag.

What would be really helpful is if there were a parameter attachment that was easily used for “private” parameters, and a “privateParameters” data structure as part of the base AudioProcessor class. but I haven’t seen a good solution in JUCE for that yet.

Thanks for your reply
I aslo forgot to ask about correct use of the the apvts in the inner loop of the synth. When I had a ValueTree implemented, each Voice would be a ValueTree listener, then when a value changed, the properties of the oscillators and envelopes would change accordingly. When using apvts I’m not sure the best way about updating all of my parameters. Here’s what I have so far:

void Voice::renderNextBlock(juce::AudioBuffer<float>& outputBuffer, int startSample, int numSamples)
{
    iterate([&](unsigned i)
        {
            float gain = *state->getRawParameterValue(oscillatorProperties[kGain].id + juce::String(i));
            osc[i].setGain(gain);
        });

    for (int targetSample = startSample; targetSample < startSample + numSamples; targetSample++)
    {

the function iterate() simply runs a loop that iterates n times where n is the number of oscillators.

For the sake of simplicity I am just showing the gain parameter. I assign it a to a new float. Then call setGain on the respective oscillator. Is this a good idea?
Feel free to ask any questions about the code