Hi, Max.
You could have a looper feeding into a variable delay line whose delay is modulated appropriately.
A looper would be an N-sample feedback loop with some input feeding into it, where the input gain and the feedback gain are mutually exclusive. That would prevent new elements from being added and you'd have the same recirculating material when you freeze it:
y[n] = Rx[n] + (1-R)y[n-N]
with R being 1 to write into it, or 0 to freeze it.
The output of the looper could then feed an N-sample delay line whose delay is offset consistently to always point to the same buffer position:
delay[n] = (lineN[n] + element[n]) % N
where
lineN[n] = (1[n-1] + lineN[n-1]) % N
and element[n] is an int between 0 and N - 1 determining the array element that is being output.
I don't have this in PD but here's the Faust implementation:
Ciao,
Dario