+1 for rpole~.
Resetting the playback position using rpole~ isn't obvious, though: you need a single sample where the left inlet = new position, and right inlet = 0, then flip immediately back to left inlet = rate, right inlet = 1.
I had asked awhile back what is the best way to generate a single-sample (Dirac) impulse in response to a bang -- it seems that tabplay~ is the best way. tabplay~ goes to zero at the end of the array, so we have to generate "1, 0 0 0 0 0." The rpole~ right inlet needs "0, 1 1 1 1 1" so, 1 - pulse.
Then we need rate when this inverted pulse is 1, and the new position when it's 0:
(rate * invertedpulse) + (pos * (1 - invertedpulse)) but a bit of algebra changes 2
*-es and 1
+ into 2
+ or --es and 1
(rate * invertedpulse) + (newpos * (1 - invertedpulse))
= rate * invertedpulse + newpos - (newpos * invertedpulse)
= (rate - newpos) * invertedpulse + newpos
You would, of course, replace the snapshot~ with tabread4~.