On Sun, Jan 8, 2012 at 9:01 PM, Miller Puckette msp@ucsd.edu wrote:
Hi all --
Peter Brinkmann and Michael Goggins did some related work recently:
http://nettoyeur.noisepages.com/2010/10/doppler-effects-without-equations/
but back in the dark ages Barry Vercoe made a Music 11 ugen called 'pipadv' that added a signal into a delay line assuming the write location was continuous and could be stably differentiated (so that for each point of the delay line you could associate a fractional pposition in the incoming signal. He then interpolated to get fractional-indexed values of the incoming signal to correspond with successive sample locations in the delay line, turning the problem around backward.)
Yes, PIPADV seems to be the process I'm looking for, so let me say [pipadv~] instead of [tabwrite4~]. Barry Vercoe describes a 'community of pipelines', forming a delay network for room acoustics simulation, to which PIPADV can add a signal 'whose distance is time-varying'.
http://web.media.mit.edu/~bv/papers/compsys%20&%20langs.pdf
But the article has no technical details, and Peter Brinkmann and Michael Goggins solve another problem, related to this topic of doppler shifts caused by moving positions of listeners and/or or sources.
If it is true that PIPADV could write to fractional indexes on a PDP-11 (though not quite in realtime yet), then it must be possible to make such a thing for Pd. Here's another brainstorm:
Writing at double speed would be done after upsampling/filtering. Writing at half speed would be done after filtering/downsampling.
Writing at speeds ratio's not some power of two could be done via chirp z-transform: resample the spectrum in forward chirp z-transform, and go back to time domain with regular IFFT. Illustrated here:
http://www.katjaas.nl/chirpZsampling/chirpZsampling.html
However this would still require an integer number of output samples every time, if the output blocks are to be neatly stitched together. The speed ratio would be forced to blocksize/n or n/blocksize, and the larger blocksize, the more options.
If this is not flexible enough for the purpose, it must be done different still. I am now thinking how it could be done as 'fractional-phase convolution'. A non-linear convolution where the filter kernel changes for every input sample. The change in the kernel is a phase rotation, such that the filter kernel's identity point coincides with the fractional index where the output sample should be located. This dynamic filter kernel would regulate the resampling amplitude filtering, plus a fractional delay needed to get the signal energy at the right position. Seen over time, the filter kernel would kind of undulate, like a snake moving forward.
To recalculate a filter kernel for every input sample is a CPU intensive matter, specially for substantial upsampling factors where the filter kernel must be long. So this is not a very practical concept yet. But there may be ways to make this idea more efficient. If it makes sense at all.
Katja