; pvsFreeze.csd
; Freeze either amplitude stream or frequency stream (or both) of a streaming FFT analysis
; Changing FFT size can modify the sound quality of the frozen sound
; 'Auto' can be used to automatically trigger a new freeze frame (both amplitude and frequency) if the amplitude of the sound crosses a threshold
; 'Delay' specifies the time delay at which the sound will actually be frozen after the threshold triggering. This can be employed to capture the sustain portion of a sound (and not the attack).
; 'Threshold' specifies the threshold level at which triggering will occur. In a noisy environment, raise 'Threshold'
form caption("pvsfreeze"), size(670, 80) colour( 0,140,40,170), pluginID("frez")
image bounds( 0, 0,270, 80), colour( 0,200,100,100), shape("rounded"), outline("white"), line(4)
checkbox bounds( 15, 10, 180, 25), channel("freezb"), text("Freeze Both"), fontcolour("white"), shape("rounded"), colour("red")
checkbox bounds(120, 10, 180, 25), channel("freeza"), text("Freeze Amplitudes"), fontcolour("white"), shape("rounded"), colour("yellow")
checkbox bounds(120, 45, 180, 25), channel("freezf"), text("Freeze Frequencies"), fontcolour("white"), shape("rounded"), colour("orange")
image bounds(270, 0,200, 80), colour( 0,200,100,100), shape("rounded"), outline("white"), line(4)
rslider bounds(280, 10, 60, 60), text("FFT Size"), channel("att_table"), range(1, 8, 5, 1,1), fontcolour("white"), colour( 0,100, 50,255), trackercolour("white")
rslider bounds(340, 10, 60, 60), text("Mix"), channel("mix"), range(0, 1.00, 1), fontcolour("white"), colour( 0,100, 50,255), trackercolour("white")
rslider bounds(400, 10, 60, 60), text("Level"), channel("lev"), range(0, 1.00, 0.5, 0.5), fontcolour("white"), colour( 0,100, 50,255), trackercolour("white")
image bounds(470, 0,200, 80), colour( 0,200,100,100), shape("rounded"), outline("white"), line(4)
checkbox bounds(480, 10, 180, 25), channel("auto"), text("Auto"), fontcolour("white"), shape("rounded"), colour("red")
rslider bounds(540, 10, 60, 60), text("Delay"), channel("delay"), fontcolour("white"), range(0.0001, 0.5, 0.1, 1,0.001), colour( 0,100, 50,255), trackercolour("white")
rslider bounds(600, 10, 60, 60), text("Threshold"), channel("thresh"), fontcolour("white"), range(0.001, 0.5, 0.1,1,0.001), colour( 0,100, 50,255), trackercolour("white")
-d -n
sr = 44100
ksmps = 64
nchnls = 2
0dbfs = 1 ;MAXIMUM AMPLITUDE
;Author: Iain McCurdy (2013)
;http://iainmccurdy.org/csound.html
/* FFT attribute tables */
giFFTattributes1 ftgen 0, 0, 4, -2, 64, 32, 64, 1
giFFTattributes2 ftgen 0, 0, 4, -2, 128, 64, 128, 1
giFFTattributes3 ftgen 0, 0, 4, -2, 256, 128, 256, 1
giFFTattributes4 ftgen 0, 0, 4, -2, 512, 128, 512, 1
giFFTattributes5 ftgen 0, 0, 4, -2, 1024, 256, 1024, 1
giFFTattributes6 ftgen 0, 0, 4, -2, 2048, 512, 2048, 1
giFFTattributes7 ftgen 0, 0, 4, -2, 4096,1024, 4096, 1
giFFTattributes8 ftgen 0, 0, 4, -2, 8192,2048, 8192, 1
opcode pvsfreeze_module,a,akkkkiiii
ain,kfreeza,kfreezf,kmix,klev,iFFTsize,ioverlap,iwinsize,iwintype xin
f_anal pvsanal ain, iFFTsize, ioverlap, iwinsize, iwintype ;ANALYSE AUDIO INPUT SIGNAL AND OUTPUT AN FSIG
f_freeze pvsfreeze f_anal, kfreeza, kfreezf
aout pvsynth f_freeze ;RESYNTHESIZE THE f-SIGNAL AS AN AUDIO SIGNAL
amix ntrpol ain, aout, kmix ;CREATE DRY/WET MIX
xout amix*klev
endop
instr 1
kmix chnget "mix" ; read in widgets
klev chnget "lev"
kfreeza chnget "freeza"
kfreezf chnget "freeza"
kfreezb chnget "freezb"
; triggering of 'Freeze All' mode
kon = 1
koff = 0
ktrigon trigger kfreezb,0.5,0
ktrigoff trigger kfreezb,0.5,1
if(ktrigon==1) then
chnset kon,"freeza"
chnset kon,"freezf"
elseif(ktrigoff==1) then
chnset koff,"freeza"
chnset koff,"freezf"
endif
; audio input
ainL,ainR ins
;ainL,ainR diskin "808loop.wav",1,0,1 ;USE FOR TESTING
; auto freeze triggering
kauto chnget "auto" ; read in widgets
kthresh chnget "thresh"
kdelay chnget "delay"
if kauto==1 then ; if 'Auto' is on
krms rms ainL+ainR ; scan RMS of audio signal
ktrig trigger krms,kthresh,0 ; if signal crosses threshold upwards
ktrigdel vdel_k ktrig,kdelay,0.5 ; delayed version of the trigger
if ktrig==1 then ; if initial threshold crossing occurs...
chnset koff,"freeza" ; turn freezing off
chnset koff,"freezf"
endif
if ktrigdel==1 then ; if delayed trigger is received...
chnset kon,"freeza" ; turn freezing on
chnset kon,"freezf"
endif
endif
kofftrig trigger kauto,0.5,1 ; when 'Auto' is turned off generate a trigger
if kofftrig==1 then ; if 'Auto' is turned off...
chnset koff,"freeza" ; turn freezing off
chnset koff,"freezf"
endif
/* SET FFT ATTRIBUTES */
katt_table chnget "att_table" ; FFT atribute table
katt_table init 5
ktrig changed katt_table
if ktrig==1 then
reinit update
endif
update:
iFFTsize table 0, giFFTattributes1 + i(katt_table) - 1
ioverlap table 1, giFFTattributes1 + i(katt_table) - 1
iwinsize table 2, giFFTattributes1 + i(katt_table) - 1
iwintype table 3, giFFTattributes1 + i(katt_table) - 1
/*-------------------*/
aoutL pvsfreeze_module ainL,kfreeza,kfreezf,kmix,klev,iFFTsize,ioverlap,iwinsize,iwintype
aoutR pvsfreeze_module ainR,kfreeza,kfreezf,kmix,klev,iFFTsize,ioverlap,iwinsize,iwintype
outs aoutR,aoutR
endin
i 1 0 [60*60*24*7]