; FreqShifter
; ----------------
; A frequency shifter effect using the hilbert filter
;
; aout FreqShifter adry,kmix,kfreq,kmult,kfback
;
; Performance
; -----------
; adry -- input audio to be frequency shifted
; kmix -- dry / wet mix of the output signal (range 0 to 1)
; kfreq -- frequency of frequency shifter effect (suggested range -1000 to 1000)
; kmult -- multiplier of frequency value for fine tuning control (suggested range -1 to 1)
; kfback -- control of the amount of output signal fed back into the input of the effect (suggested range 0 to 1)
opcode FreqShifter,a,aKKKK
adry,kmix,kfreq,kmult,kfback 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
isine ftgentmp 0,0,4096,10,1 ;A SINE WAVE SHAPE
kWet table kmix, iWet, 1 ;RESCALE WET LEVEL CONTROL ACCORDING TO FUNCTION TABLE giWet
kDry table kmix, iDry, 1 ;RESCALE DRY LEVEL CONTROL ACCORDING TO FUNCTION TABLE giWet
aFS init 0 ;INITILISE FEEDBACK SIGNAL (FOR FIRST K-PASS)
ain = adry + (aFS * kfback) ;ADD FEEDBACK SIGNAL TO INPUT (AMOUNT OF FEEDBACK CONTROLLED BY 'Feedback Gain' SLIDER)
areal, aimag hilbert ain ;HILBERT OPCODE OUTPUTS TWO PHASE SHIFTED SIGNALS, EACH 90 OUT OF PHASE WITH EACH OTHER
kporttime linseg 0,0.001,0.02
kfshift portk kfreq*kmult, kporttime
;QUADRATURE OSCILLATORS. I.E. 90 OUT OF PHASE WITH RESPECT TO EACH OTHER
;OUTUTS OPCODE AMPLITUDE | FREQ. | FUNCTION_TABLE | INITIAL_PHASE (OPTIONAL;DEFAULTS TO ZERO)
asin oscili 1, kfshift, isine, 0
acos oscili 1, kfshift, isine, 0.25
;RING MODULATE EACH SIGNAL USING THE QUADRATURE OSCILLATORS AS MODULATORS
amod1 = areal * acos
amod2 = aimag * asin
;UPSHIFTING OUTPUT
aFS = (amod1 - amod2)
aout sum aFS*kWet, adry*kDry ;CREATE WET/DRY MIX
xout aout ;SEND AUDIO BACK TO CALLER INSTRUMENT
endop