Juce 4 looks great so far, funnily i implemented lots of functionality already in my own extensions classes ;-)

The way you convert a choice parameter to a float value, seems not save with rounding

For example if you have three choices, and use the second (1), the float value is 0.33333333333, if there is only a minor adjustment it turns to the first choice (0)

float AudioParameterChoice::convertTo0to1 (int v) const noexcept { return limitRange (v) / (float) choices.size(); }

instead it should be

float AudioParameterChoice::convertTo0to1 (int v) const noexcept { return limitRange (v+0.5f) / (float) choices.size(); }

or better (check if its the first or last step)

float AudioParameterChoice::convertTo0to1 (int v) const noexcept

{

if (v<=0) return 0.f;

if (v>=choices.size()-1) return 1.f;

return limitRange (v+0.5f) / (float) choices.size();

};