; 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