Another method, related to the vocoder but more "real-time" oriented
(i.e. sample-by-sample, not fft block processed) uses a bank of Hilbert
transforms (for the pitch shift) and a bank of bandpass filters (each
harmonic shifted individually to maintain harmonic relations) --
see ssb-bank et al in dsp.scm in the Snd tarball (ssb refers to the
single sideband suppressed carrier amplitude modulation generator).
sndscm.html has examples.