AudioParameterFloat range + getNormalisableRange(): Why?

    /** Returns the range of values that the parameter can take. */
    const NormalisableRange<float>& getNormalisableRange() const override   { return range; }

    /** Provides access to the parameter's range. */
    NormalisableRange<float> range;

Why is there a getter that returns the public range variable, other than to add const qualifiers?

When we updated the APVTS to support arbitrary parameter types, we needed to introduce a new parameter base class (RangedAudioParameter) that supported all the operations that are used by the APVTS. We also wanted to allow the existing parameter types (AudioParameter(Int|Float|Bool|Choice)) to be used with the APVTS, which meant updating them to derive from RangedAudioParameter. We couldn’t make the ‘range’ member of AudioParameterFloat private at that point, because that would break code that was previously accessing that data member directly.

tl;dr The plain data member was there first, removing it would break code, and the new member function implements RangedAudioParameter for APVTS compatibility.