Thanks, it's been a while since I made that...
As far as I understand my intentions after over three years, it's something like that: Every time a grain is triggered, it copies the data starting at the current index from the circular "buffertable" to it's local graintable, windowed by the ad envelope. Thus the grain is detached from the circularity of the circular buffer and can repeat on it's own without discontinuities until the envelope is finished.
This implementation doesn't allow for easy and smooth pitch shifting because the per-grain-tables and the main buffer are running synchroniously. I also wouldn't recommend a per grain pitch-shifter object (there are several in the lib), because of CPU limitations. But maybe a single pitch shifter in the feedback path could provide some grainy "shimmer"