; pvsBuffer.csd (for Cabbage) ; Writes audio into a circular FFT buffer. ; Read speed can be modified as can the frequencies. ; Take Care! Feedback values above 1 are intended to be used only when transposition if not unison. form caption("pvsBuffer") size(580,90), pluginID("buff") image bounds(0, 0, 580, 90), colour(100, 80, 80,125), shape("rounded"), outline("white"), line(4) rslider bounds(10, 11, 70, 70), text("Speed"), channel("speed"), range(0, 4, 1, 0.5, 0.0001), fontcolour("white"), colour(100, 80, 80, 5) trackercolour(silver) rslider bounds(80, 11, 70, 70), text("Buf. Size"), channel("buflen"), range(0.10, 8.00, 1, 0.5), fontcolour("white"), colour(100, 80, 80, 5) trackercolour(silver) rslider bounds(150, 11, 70, 70), text("Semitones"), channel("semis"), range(-24, 24, 0, 1, 1), fontcolour("white"), colour(100, 80, 80, 5) trackercolour(silver) rslider bounds(220, 11, 70, 70), text("Cents"), channel("cents"), range(-100, 100, 0, 1, 1), fontcolour("white"), colour(100, 80, 80, 5) trackercolour(silver) rslider bounds(290, 11, 70, 70), text("Feedback"), channel("FB"), range(0, 1.50, 0), fontcolour("white"), colour(100, 80, 80, 5) trackercolour(silver) rslider bounds(360, 11, 70, 70), text("FFT Size"), channel("att_table"), range(1, 8, 5, 1,1), fontcolour("white"), colour(100, 80, 80, 5) trackercolour(silver) rslider bounds(430, 11, 70, 70), text("Mix"), channel("mix"), range(0, 1.00, 1), fontcolour("white"), colour(100, 80, 80, 5) trackercolour(silver) rslider bounds(500, 11, 70, 70), text("Level"), channel("lev"), range(0, 1.00, 0.5), fontcolour("white"), colour(100, 80, 80, 5) trackercolour(silver) -d -n sr = 44100 ksmps = 32 nchnls = 2 0dbfs = 1 ;MAXIMUM AMPLITUDE ;Author: Iain McCurdy (2012) ;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 pvsbuffer_module,a,akkkkkkiiii ain,kspeed,kbuflen,kscale,kfeedback,kmix,klev,iFFTsize,ioverlap,iwinsize,iwintype xin kPhOffset = 0 ktrig changed kbuflen ibuflen init 1 kspeed init 1 kscale init 1 if ktrig==1 then reinit UPDATE endif UPDATE: ibuflen = i(kbuflen) iphasor ftgen 0, 0, 65536, 7, 0, 65536, 1 ;WAVE SHAPE FOR A MOVING PHASE POINTER aread osciliktp kspeed/ibuflen, iphasor, kPhOffset ;CREATE MOVING POINTER TO READ FROM BUFFER kread downsamp aread kread = kread * ibuflen ;RESCALE READ POINTER WITH PHASOR RANGE SLIDER aFB init 0 f_anal pvsanal ain+aFB, iFFTsize, ioverlap, iwinsize, iwintype ;ANALYSE THE AUDIO SIGNAL THAT WAS CREATED IN INSTRUMENT 1. OUTPUT AN F-SIGNAL. ibuffer,ktime pvsbuffer f_anal, ibuflen ;BUFFER FSIG rireturn khandle init ibuffer ;INITIALISE HANDLE TO BUFFER f_buf pvsbufread kread , khandle ;READ BUFFER f_scale pvscale f_buf, kscale ;RESCALE FREQUENCIES aresyn pvsynth f_scale ;RESYNTHESIZE THE f-SIGNAL AS AN AUDIO SIGNAL aFB dcblock2 aresyn * kfeedback ;CREATE FEEDBACK SIGNAL FOR NEXT PASS AND BLOCK DC OFFSET ACCUMULATION amix ntrpol ain, aresyn, kmix ;CREATE DRY/WET MIX xout amix*klev endop instr 1 ainL,ainR ins ;ainL,ainR diskin "SynthPad.wav",1,0,1 ;USE FOR TESTING kspeed chnget "speed" kbuflen chnget "buflen" ksemis chnget "semis" kcents chnget "cents" ksemis init 0 kcents init 0 kscale = semitone(ksemis)*cent(kcents) kscale init 1 kbuflen init 1 kspeed init 1 kmix chnget "mix" kfeedback chnget "FB" klev chnget "lev" kmix init 1 kfeedback init 0 klev init 0.5 /* 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 pvsbuffer_module ainL,kspeed,kbuflen,kscale,kfeedback,kmix,klev,iFFTsize,ioverlap,iwinsize,iwintype aoutR pvsbuffer_module ainR,kspeed,kbuflen,kscale,kfeedback,kmix,klev,iFFTsize,ioverlap,iwinsize,iwintype outs aoutL,aoutR endin i 1 0.1 [60*60*24*7]