Panning for a 8-head delay patch
I'm trying to implement an 8-head delay system in my Max patch, with the 8 delay channels spread across the stereo field equally. I'm including a simplified version of the patch that only includes the panning logic. My problem is that using this algorithm, the values are slightly off balance. If you look at the printed output, you'll see that whereas the beginning L and R values are 1. and 0. respectively, the spread of values doesn't end at 0. and 1., it ends at .21 and .90. I realize why this is happening, but what I'm unsure about is how to achieve a fully balanced spread that begins at 0. and 1. and ends at 1. and 0. Does anyone have any guidance on this topic?
Simples:

As uzi counts from 1, you have correctly subtracted 1 to get it to count from 0 to 7 but you also needed to rescale the other arm in the same way. Note that I've added a - 1 above the divisor. Or you could combine it into an expr:

I'm not sure why you had the pow functions in there but bear in mind that, for consistency, you should leave spaces between the values and operands in all calculations in Max, including those in expr objects:
expr pow((1 - $f1), 0.75) and not expr pow(1-$f1),0.75)
Wow...you are absolutely correct, Andy. Now I feel silly for not having noticed that I was not applying the same 0-indexed logic to the whole patch. Thank you for your helpful and informative solution!
You're welcome!
[uzi 8] counts from 1 because 1 is the default base (see uzi reference).
[uzi 8 0] counts from 0 .
[uzi 8 666] counts from 666, but beware of the beast!
Yup! But I think his problem was that the other feed for his calculation was not scaled to match what uzi was generating.