csound-expression-typed-0.2.0.2: data/opcodes/MultiFX/PitchShifter.udo
; PitchShifter
; ------------
; A pitch shifter effect based on FFT technology
;
; aout PitchShifter ain,kmix,kpitch,kfine,kfback
;
; Performance
; -----------
; ain -- input audio to be pitch shifted
; kmix -- dry / wet mix of the output signal (range 0 to 1)
; kpitch -- pitch shifting interval in thousands of a semitone (suggested range -0.012 to 0.012)
; kfine -- fine control of pitch shifting interval in octaves (range -1/12 to 1/12)
; kfback -- control of the amount of output signal fed back into the input of the effect (suggested range 0 to 1)
opcode PitchShifter,a,aKKKi
ain,kmix,kscal,kfback,ifftsize xin ;READ IN INPUT ARGUMENTS
iWet ftgentmp 0,0,1024,-7,0,512,1,512,1 ;RESCALING FUNCTION FOR WET LEVEL CONTROL
iDry ftgentmp 0,0,1024,-7,1,512,1,512,0 ;RESCALING FUNCTION FOR DRY LEVEL CONTROL
kWet table kmix, iWet, 1 ;RESCALE WET LEVEL CONTROL ACCORDING TO FUNCTION TABLE iWet
kDry table kmix, iDry, 1 ;RESCALE DRY LEVEL CONTROL ACCORDING TO FUNCTION TABLE iWet
aPS init 0 ;INITIALIZE aOutL FOR FIRST PERFORMANCE TIME PASS
; kscal = octave(((kpitch*1000)/12)+kfine) ;DERIVE PITCH SCALING RATIO. NOTE THAT THE 'COARSE' PITCH DIAL BECOMES STEPPED IN SEMITONE INTERVALS
ioverlap = ifftsize / 4
iwinsize = ifftsize
fsig1 pvsanal ain+(aPS*kfback), ifftsize,ioverlap,iwinsize,0 ;PHASE VOCODE ANALYSE LEFT CHANNEL
fsig2 pvscale fsig1, kscal ;RESCALE PITCH
aPS pvsynth fsig2 ;RESYNTHESIZE FROM FSIG
aout sum ain*kDry, aPS*kWet ;REDEFINE GLOBAL AUDIO SIGNAL FROM MIX OF DRY AND WET SIGNALS
xout aout ;SEND AUDIO BACK TO CALLER INSTRUMENT
endop