I've been looking into the venerable Freeverb and I see that CCRMA state that it uses 4 Shroeder Allpass filters in series, but when I look at the source code I see:
inline float allpass::process(float input)
{
float output;
float bufout;
bufout = buffer[bufidx];
undenormalise(bufout);
output = -input + bufout;
buffer[bufidx] = input + (bufout*feedback);
if(++bufidx>=bufsize) bufidx = 0;
return output;
}
To me, this doesn't equate to the standard Shroeder Allpass, but instead something like this:
But it should look like this (from CCRMA):
Am I overlooking something here, or is CCRMA incorrect?

