; Reverse
; ----------------
; An effect that reverses an audio stream in chunks
;
; aout Reverse ain,ktime
;
; Performance
; -----------
; ain -- input audio to be reversed
; ktime -- time duration of each chunk (suggested range: 0.3 to 2)
opcode Reverse, a, aK ;nb. CAPITAL K CREATE A K-RATE VARIABLE THAT HAS A USEFUL VALUE ALSO AT I-TIME
ain,ktime xin ;READ IN INPUT ARGUMENTS
ktrig changed ktime ;IF ktime CONTROL IS MOVED GENERATE A MOMENTARY '1' IMPULSE
if ktrig=1 then ;IF A TRIGGER HAS BEEN GENERATED IN THE LINE ABOVE...
reinit UPDATE ;...BEGIN A REINITILISATION PASS FROM LABEL 'UPDATE'
endif ;END OF CONDITIONAL BRANCH
UPDATE: ;LABEL CALLED 'UPDATE'
itime = i(ktime) ;CREATE AN I-TIME VERSION OF ktime
aptr phasor 2/itime ;CREATE A MOVING PHASOR THAT WITH BE USED TO TAP THE DELAY BUFFER
aptr = aptr*itime ;SCALE PHASOR ACCORDING TO THE LENGTH OF THE DELAY TIME CHOSEN BY THE USER
ienv ftgentmp 0,0,1024,7,0,(1024*0.01),1,(1024*0.98),1,(0.01*1024),0 ;ANTI-CLICK ENVELOPE SHAPE
aenv poscil 1, 2/itime, ienv ;CREATE A CYCLING AMPLITUDE ENVELOPE THAT WILL SYNC TO THE TAP DELAY TIME PHASOR
abuffer delayr itime ;CREATE A DELAY BUFFER
atap deltap3 aptr ;READ AUDIO FROM A TAP WITHIN THE DELAY BUFFER
delayw ain ;WRITE AUDIO INTO DELAY BUFFER
rireturn ;RETURN FROM REINITIALISATION PASS
xout atap*aenv ;SEND AUDIO BACK TO CALLER INSTRUMENT. APPLY AMPLITUDE ENVELOPE TO PREVENT CLICKS.
endop