Obviously, I'd prefer a unified solution that works for a wide variety of samples. Any advice?
Hello SEP (and list),
Another route is the granular route.
I've got a bunch of abstractions that attempt to replicate SuperCollider's Warp1 UGen. Basically the idea is to have grains occur one after another in a more-or-less fixed rate (with some randomness thrown in so you don't get a pitch from the grains themselves) and choosing the duration of each grain so that they overlap each other (I can't remember what I chose, I think something like 32x overlap? I think the default rate in Warp1 is 8x but I never managed to get it sounding good with that low of an overlap). I think as well as time-stretching, you have the option of pitch shifting (at least in fgrainstr).
fgrainstr needs fgrain (which is a "grain voice") and tukeymaker (which defines the window shape of each grain) and uses tabread4 if I remember correctly.
fgrainstr2 needs fgrain2 and tukeymaker and uses tabplay to get around the issue of very large index numbers.
With these abstractions, you can go down to a playback rate of 0. I didn't really code these abstractions with other eyes in mind, but I think they're commented enough to be useful.
I've also started making these into externals but I'm not sure if they sound as good as the abstraction versions quite yet (still working out the kinks). Instead of a Tukey window, I opted in this case to use a standard cosine window.
Here's the link to the abstractions on my github: https://github.com/derekxkwan/pure-data-abstractions/tree/master/fgrain
Derek Kwan
===================== Derek Kwan www.derekxkwan.com