; by Davide Morelli www.davidemorelli.it ; se si vuole lavorare su un altro campione: ; 1) modificare le righe 242, 243, 257, 258 ; 2) impostare gilunghezza con la durata in secondi del campione (riga 22) -+P13 -b100 sr = 44100 kr = 100 ksmps = 441 nchnls = 2 gilunghezza = 1.50 ; MODIFY HERE set to sound lenght ; also modify rows 242, 243, 257, 258 ; quanti step hanno gli slider di posizione campioni gidefinizione = 30 gkpos init 0 gkpos2 init 0 ; ---------------- per la tabella formanti campione 1 giElem init 120 ; numero di formanti usate giOutTab1 ftgen 2,0,128, 2, 0 giOutTab2 ftgen 3,0,128, 2, 0 ; -------------- INTERFACCIA GRAFICA FLpanel "lettore campioni",730,600,100,100 ;***** start of container FLtabs 730, 600, 0, 0 FLgroup "controllo strumento", 730,550,30,30 ; campione 1 gk1,ih1 FLslider " ", -gidefinizione, gidefinizione, 0 ,17, -1, 600,15, 20,40 ; posizione ; oscillatore posizione campione 1 ihtmp1 FLbox " ", 6, 1, 30, 150, 70, 20, 80 ihtmp2 FLbox "OSC", 1, 1, 15, 20, 20, 20, 100 gkOsc1Amp_, ihosc1amp1 FLknob "Amp", .0001, gilunghezza, -1, 1, -1, 50, 50,80 gkOsc1Freq_, ihosc1freq FLknob "Freq", 0, 10, 0, 1, -1, 50, 100,80 ; risonanza campione 1 ihtmp3 FLbox " ", 6, 1, 30, 220, 70, 200, 80 ihtmp4 FLbox "Resonant Filter", 1, 1, 15, 20, 40, 200, 100 gkAnCutoff1_, ihAnCut1 FLknob "Cutoff", 50, 12000, -1, 1, -1, 50, 300,80 gkAnReso1_, ihAnRs1 FLknob "Reson", 1, 100, 0, 1, -1, 50, 350,80 gkAnMix1_, ihAnMix1 FLknob "Mix", 0, 1, 0, 1, -1, 50, 250,80 ; Mix ; posizione campione 1 gkposizione1,gihposizione1 FLslider " ", 0, gilunghezza, 0 ,11, -1, 600,15, 20,55 ; posizione gkTrasponi1_, ihTrasponi1 FLknob "trasponi", .09, 1, 0, 1, -1, 35, 640,40 ; pan gkPan1_, ihPan1 FLknob "PAN", 0, 1, 0, 1, -1, 40, 440,80 gkOscPan1Velo_, ihOscPan1Velo FLknob "velo", .1, 20, -1, 1, -1, 35, 480,80 gkOscPan1Amp_, ihOscPan1Amp FLknob "amp", 0, 1, 0, 1, -1, 35, 520,80 ; volume dello strumento gkFormantiMix1_, ihFormantiMix1 FLknob "Mix Formanti", 0, 1, 0, 1, -1, 40, 580,80 gkVol1_, ihVol1 FLknob "Volume", 0, 2, 0, 1, -1, 40, 670,90 ; campione 2 gk2,ih2 FLslider " ", -gidefinizione, gidefinizione, 0 ,15, -1,600,15, 20,170 ; posizione ; oscillatore posizione campione 1 ihtmp1a FLbox " ", 6, 1, 30, 150, 70, 20, 200 ihtmp2a FLbox "OSC", 1, 1, 15, 20, 20, 20, 230 gkOsc2Amp_, ihosc2amp FLknob "Amp", .0001, gilunghezza, -1, 1, -1, 50, 50,200 gkOsc2Freq_, ihosc2freq FLknob "Freq", 0, 10, 0, 1, -1, 50, 100,200 ; posizione campione 2 gkposizione2,gihposizione2 FLslider " ", 0, gilunghezza, 0 ,11, -1, 600,15, 20,185 ; posizione ;gkReset2, gihReset2 FLbutton " ", 1, 0, 1, 20, 20, 20, 90, -1 ; risonanza campione 2 ihtmp3a FLbox " ", 6, 1, 30, 220, 70, 200, 200 ihtmp5a FLbox "Resonant Filter", 1, 1, 15, 20, 40, 200, 220 gkAnCutoff2_, ihAnCut2 FLknob "Cutoff", 50, 12000, -1, 1, -1, 50, 300,200 gkAnReso2_, ihAnRs2 FLknob "Reson", 1, 100, 0, 1, -1, 50, 350,200 gkAnMix2_, ihAnMix2 FLknob "Mix", 0, 1, 0, 1, -1, 50, 250,200 ; Mix gkTrasponi2_, ihTrasponi2 FLknob "trasponi", .09, 1, 0, 1, -1, 35, 640,170 ; pan gkPan2_, ihPan2 FLknob "PAN", 0, 1, 0, 1, -1, 40, 450,200 gkOscPan2Velo_, ihOscPan2Velo FLknob "velo", .1, 20, -1, 1, -1, 35, 490,200 gkOscPan2Amp_, ihOscPan2Amp FLknob "amp", 0, 1, 0, 1, -1, 35, 530,200 ; volume campione 2 gkFormantiMix2_, ihFormantiMix2 FLknob "Mix Formanti", 0, 1, 0, 1, -1, 40, 580,200 gkVol2_, ihVol2 FLknob "Volume", 0, 2, 0, 1, -1, 40, 670,215 ; sposto a mano o con selettore velo? ihtmp2a FLbox " ", 6, 1, 15, 250, 100, 330, 310 gkSposta1, gihSposta1 FLbutton "spostamento 0=auto 1=manuale", 1, 0, 4, 100, 100, 350, 330,-1 gkSpostaVeloPos, ihSpostaVeloPos FLknob "Velocità spostamento manuale", 0, 2, 0, 1, -1, 40, 500,320 ; master volume gkAnVolume_, ihAnVolume FLknob "Master Volume", 0, 2, 0, 1, -1, 50, 350,430 ; riverbero gkRevVol_, ihRevVol FLknob "Reverb Volume", 0, 2, 0, 1, -1, 40, 450,430 gkRevTime_, ihRevTime FLknob "Reverb Time", 0, 2, 0, 1, -1, 40, 500,430 ; delay gkDelayVol_, ihDelayVol FLknob "Delay Volume", 0, 1, 0, 1, -1, 40, 450,510 ; uso anche il joystick gk1, gk2, ih3, ih4 FLjoy "controllo simultaneo campioni", -gidefinizione, gidefinizione, -gidefinizione, gidefinizione, 0, 0, -1, -1, 300,300,20,280 FLgroup_end FLgroup "formanti campione", 670,550,30,30 FLscroll 650,550, 20, 50 ;FLslidBnk " ", giElem, giOutTab , 300 , giElem*20, 50, 10, -12 , giExpTab, 0, giMinMaxTab FLslidBnk " ", giElem, giOutTab1 , 400 , giElem*20, 50, 10 FLscroll_end FLgroup_end ;FLgroup "formanti campione 2", 670,550,30,30 ;FLscroll 650,550, 20, 50 ;FLslidBnk " ", giElem, giOutTab2 , 400 , giElem*20, 50, 10 ;FLscroll_end ;FLgroup_end FLgroup "salvataggio impostazioni", 670,550,30,30 gkSpostaVelo, ihSpostaVelo FLknob "Velocità assestamento variabili", 0, 2, 0, 1, -1, 40, 400,50 gkCheck,ih4 FLbutton "0=load 1=save",1,0,14, 108,50,30,60, -1 gk9,ih FLbutton "Store snapshot to current index", 3,0, 11,150,40,200,60, 0,7,0,0 gk9,ih FLbutton "Save snapshot bank to disk", 1,0, 11,130,40,200,110, 0,5,0,0 gk9,ih FLbutton "Load snapshot bank from disk", 1,0, 11,150,40,20,110, 0,6,0,0 gkGet,ih FLbutBank 12, 10,10, 600,300, 20,160, 0,7,0,0 FLgroup_end FLtabs_end ; inizializzo i vari controlli FLsetVal_i 12000, ihAnCut1 FLsetVal_i 1, ihAnRs1 FLsetVal_i 0, ihAnMix1 FLsetVal_i 1, ihTrasponi1 FLsetVal_i .25, ihPan1 FLsetVal_i 1, ihVol1 FLsetVal_i 0, ihFormantiMix1 FLsetVal_i 12000, ihAnCut2 FLsetVal_i 1, ihAnRs2 FLsetVal_i 0, ihAnMix2 FLsetVal_i 1, ihTrasponi2 FLsetVal_i .75, ihPan2 FLsetVal_i 1, ihVol2 FLsetVal_i 1, ihAnVolume FLsetVal_i 0, ihRevVol FLsetVal_i 1, ihRevTime FLsetVal_i 0, ihDelayVol FLsetVal_i .5, ihSpostaVelo FLsetVal_i .5, ihSpostaVeloPos ;iwidth, iheight, ibpp bmopen "J:/musiche/i have a dream/csound/i have a dream.jpg", 1 ;FLsetImage 1, gihposizione1 ,0 FLpanel_end ;***** end of container FLrun ;***** runs the widget thread, it is always required! ; ------------------------ FINE INTERFACCIA ; ------------------------ INIZIO STRUMENTO instr 1 ; calcolo le posizioni ; tutti questi lineto servono per quando carico gli shot ; per evitare che le variabili passino in un istante ; da un valore ad un altro generando rumore gkOsc1Amp lineto gkOsc1Amp_, gkSpostaVelo gkOsc1Freq lineto gkOsc1Freq_, gkSpostaVelo gkAnCutoff1 lineto gkAnCutoff1_, gkSpostaVelo gkAnReso1 lineto gkAnReso1_, gkSpostaVelo gkAnMix1 lineto gkAnMix1_, gkSpostaVelo gkTrasponi1 lineto gkTrasponi1_, gkSpostaVelo gkPan1 lineto gkPan1_, gkSpostaVelo gkOscPan1Velo lineto gkOscPan1Velo_, gkSpostaVelo gkOscPan1Amp lineto gkOscPan1Amp_, gkSpostaVelo gkFormantiMix1 lineto gkFormantiMix1_, gkSpostaVelo gkVol1 lineto gkVol1_, gkSpostaVelo gkOsc2Amp lineto gkOsc2Amp_, gkSpostaVelo gkOsc2Freq lineto gkOsc2Freq_, gkSpostaVelo gkAnCutoff2 lineto gkAnCutoff2_, gkSpostaVelo gkAnReso2 lineto gkAnReso2_, gkSpostaVelo gkAnMix2 lineto gkAnMix2_, gkSpostaVelo gkTrasponi2 lineto gkTrasponi2_, gkSpostaVelo gkPan2 lineto gkPan2_, gkSpostaVelo gkOscPan2Velo lineto gkOscPan2Velo_, gkSpostaVelo gkOscPan2Amp lineto gkOscPan2Amp_, gkSpostaVelo gkFormantiMix2 lineto gkFormantiMix2_, gkSpostaVelo gkVol2 lineto gkVol2_, gkSpostaVelo gkAnVolume lineto gkAnVolume_, gkSpostaVelo gkRevVol lineto gkRevVol_, gkSpostaVelo gkRevTime lineto gkRevTime_, gkSpostaVelo gkDelayVol lineto gkDelayVol_, gkSpostaVelo if (gkSposta1 < .5) goto convelo gkpos lineto gkposizione1, gkSpostaVeloPos gkpos2 lineto gkposizione2, gkSpostaVeloPos goto next convelo: ; primo campione koffset = gk1 ;gkpos = gkpos + koffset/(gidefinizione*kr) ; perchè questa riga non funziona ? gkpos = gkpos + (koffset/gidefinizione)/kr ; secondo campione koffset2 = gk2 ;gkpos2 = gkpos2 + koffset2/(gidefinizione*kr) ; perchè questa riga non funziona ? gkpos2 = gkpos2 + (koffset2/gidefinizione)/kr goto next next: ; primo campione ; aggiungo un oscillatore che modifica la posizione del campione ko1 oscil gkOsc1Amp, gkOsc1Freq, 1 gkpos = gkpos + ko1 gkpos = (gkpos<0?gilunghezza:gkpos) gkpos = (gkpos>gilunghezza?0:gkpos) tablexseg giOutTab1, 1, giOutTab1 a1b vpvoc gkpos, gkTrasponi1, "J:/musiche/i have a dream/csound/i have a dream.wav.pv" a1a pvoc gkpos, gkTrasponi1, "J:/musiche/i have a dream/csound/i have a dream.wav.pv" a1 = a1a * (1 - gkFormantiMix1) + a1b * gkFormantiMix1 ; secondo campione ; aggiungo un oscillatore che modifica la posizione del campione ko2 oscil gkOsc2Amp, gkOsc2Freq, 1 gkpos2 = gkpos2 + ko2 gkpos2 = (gkpos2<0?gilunghezza:gkpos2) gkpos2 = (gkpos2>gilunghezza?0:gkpos2) ; e assegno a2a e a2b ; vpvoc deve venire subito dopo tablexseg sennò non funziona ;tablexseg giOutTab2, 1, giOutTab2 a2b vpvoc gkpos2, gkTrasponi2, "J:/musiche/i have a dream/csound/i have a dream.wav.pv" a2a pvoc gkpos2, gkTrasponi2, "J:/musiche/i have a dream/csound/i have a dream.wav.pv" a2 = a2a * (1 - gkFormantiMix2) + a2b * gkFormantiMix2 ; applico il volume a1 = a1*gkVol1 a2 = a2*gkVol2 ; filtro risonante a1res rezzy a1, gkAnCutoff1, gkAnReso1 a1tot = a1*(1-gkAnMix1) + a1res*gkAnMix1 a2res rezzy a2, gkAnCutoff2, gkAnReso2 a2tot = a2*(1-gkAnMix2) + a2res*gkAnMix2 ; riverbero a1totB reverb a1tot, gkRevTime a1totB = a1tot + a1totB*gkRevVol a2totB reverb a2tot, gkRevTime a2totB = a2tot + a2totB*gkRevVol ; delay a1delay delay a1totB, gilunghezza a1totB = a1totB + a1delay*gkDelayVol a2delay delay a2totB, gilunghezza a2totB = a2totB + a2delay*gkDelayVol ; applico il volume generale a1totB = a1totB*gkAnVolume a2totB = a2totB*gkAnVolume ; pan ko1pan oscil gkOscPan1Amp, gkOscPan1Velo, 1 kPan1 = gkPan1 kPan1 = kPan1 + ko1pan kPan1 limit kPan1, 0, 1 kpan1r = sqrt(kPan1) ; Take the square root for the left side kpan1l = sqrt(1-kPan1) ; Use square root of 1-kpan for the right side ko2pan oscil gkOscPan2Amp, gkOscPan2Velo, 1 kPan2 = gkPan2 kPan2 = kPan2 + ko2pan kPan2 limit kPan2, 0, 1 kpan2r = sqrt(gkPan2) ; Take the square root for the left side kpan2l = sqrt(1-gkPan2) ; Use square root of 1-kpan for the right side asinistra= a1totB*kpan1l + a2totB*kpan2l adestra = a1totB*kpan1r + a2totB*kpan2r ; TODO: limitatore per evitare distorsione ;asinistra limit asinistra, 0, 10000 ;adestra limit adestra, 0, 10000 ; TODO: compressore? ; aggiorno gli slider di posizione if (gkSposta1 > .5) goto fine FLsetVal 1, gkpos, gihposizione1 FLsetVal 1, gkpos2, gihposizione2 goto fine fine: outs asinistra,adestra endin ; ------------------------ FINE STRUMENTO ; --------- strumenti usati dal gestore snapshots --- INIZIO instr 5 FLsavesnap "BROWSE_FILE" endin instr 6 FLloadsnap "BROWSE_FILE" endin instr 7 if i(gkCheck) == 0 goto then inumsnap, inumval FLsetsnap i(gkGet) goto endif then: inumel FLgetsnap i(gkGet) endif: endin ; --------- strumenti usati dal gestore snapshots --- FINE f1 0 1024 10 1 ; stai attivo per 1 ora i1 0 3600