csound-expression-typed-0.2.0.0: data/opcodes/MultiFX/EnvelopeFollower.udo
; EnvelopeFollower
; ----------------
; A dynamic envelope following resonant lowpass filter
;
; aout EnvelopeFollower ain,ksens,kfreq,kres
;
; Performance
; -----------
; ain -- input audio to be filtered
; ksens -- sensitivity of the envelope follower (suggested range: 0 to 1)
; kfreq -- base frequency of the filter before modulation by the input dynamics (range: 0 to 1)
; kres -- resonance of the lowpass filter (suggested range: 0 to 0.99)
opcode EnvelopeFollower,a,aKKK
ain,ksens,kfreq,kres xin ;READ IN INPUT ARGUMENTS
kfreq expcurve kfreq,4 ;CREATE AN EXPONENTIAL REMAPPING OF kfreq
kfreq scale kfreq,10000,10 ;RESCALE 0 - 1 VALUE
ksens logcurve ksens,100 ;CREATE LOGARITHMIC REMAPPING OF ksens
aFollow follow2 ain, 0.01, 0.05 ;AMPLITUDE FOLLOWING AUDIO SIGNAL
kFollow downsamp aFollow ;DOWNSAMPLE TO K-RATE
kFollow expcurve kFollow/0dbfs,3 ;ADJUSTMENT OF THE RESPONSE OF DYNAMICS TO FILTER FREQUENCY MODULATION
kFrq = kfreq + (cpsoct(kFollow*ksens*150)) ;CREATE A LEFT CHANNEL MODULATING FREQUENCY BASE ON THE STATIC VALUE CREATED BY kfreq AND THE AMOUNT OF DYNAMIC ENVELOPE FOLLOWING GOVERNED BY ksens
kFrq port kFrq, 0.05 ;SMOOTH CONTROL SIGNAL USING PORTAMENTO
kFrq limit kFrq, 20,sr/2 ;LIMIT FREQUENCY RANGE TO PREVENT OUT OF RANGE FREQUENCIES
;IF REALTIME PERFORMNCE IS AN ISSUE, USE moogvcf2 INSTEAD OF moogladder
aout moogladder ain, kFrq, kres ;REDEFINE GLOBAL AUDIO SIGNAL AS FILTERED VERSION OF ITSELF
xout aout ;SEND AUDIO BACK TO CALLER INSTRUMENT
endop