I’m interested in figuring out how to do a live spectral sustain for a potential future project. I know that I can sustain a sound indefinitely with Warp1 (non-spectral) and with PV_BinDelay. But PV_BinDelay seems to allocate a buffer for the sustain, and all I’m interested in doing is freezing a particular moment in time. For that, I would only need one frame of FFT data.
My idea is to use PV_RecordBuf to record spectral data into a buffer, then PV_PlayBuf to play it back on a loop. Is this the best approach, or is there a better alternative?
I do this quite a bit - I will (for a piece where I want to capture then stretch a sound) allocated a buffer for audio (for Warp1) and spectral info of the same size - then I use the same pointer for Warp1 and PV_BufRd to playback the sustained portion.
However - freezing a pointer at one space sounds very fake very quickly! So, what I often do is add some random jitter for the playback point. I usually take my pointer value and then add an LFNoise2 to it with a small random amount of variance. This means Warp1 and PV_BufRd are playing back a little before or after the actual playback point. It gives just enough variance to keep it sounding like a performer actually sustaining forever, and not a computer.
I’m a bit confused. So you have an audio buffer and a FFT buffer. You’re recording audio from the performer into the audio buffer, while also running it through the FFT and PV_RecordBuf, so that at the end you have both a buffer of the audio and a corresponding FFT buffer? Why do you then need both Warp1 and PV_BufRd?
I have found when a granular and FFT based stretch are mixed, they tend to cancel out the artifacts of both. When the signal is noisier, the Warp1 time stretch hides the sinusoidal funkiness, and when the sound is more stable, the FFT helps mask some of the granular windowing.
(and as a side note - this is also why the pointer arguments for these ugens all work between 0 and 1 - a little selfish, possibly, but it meant it was easier for me to combine them to work together!)