| Home | Contact | Il Suono Virtuale | Virtual Sound |


Indice articolo
DirectCSound
Pagina 2
Pagina 3
Pagina 4
Pagina 5
Pagina 6


3.7 Sintesi Granulare

In questa sezione viene presentato un esempio di sintesi granulare
in cui è possibile controllare molti parametri di sintesi in tempo reale

; granulare.orc

sr = 32000
kr = 320
ksmps = 100
nchnls = 2
garev1 init 0
gaout1 init 0
gaout2 init 0
;- - - - - - -
;///////////////////////////////////////
instr 100
;///////////////////////////////////////
gk_1, gk_2, gk_3, gk_4, gk_5, gk_6, gk_7, gk_8,\ gk_9, gk_10, gk_11, gk_12, gk_13, gk_14, gk_15, gk_16 slider161,\
\; ctl min max init func
1, 1, 20.5, 1, 0, \;1 numero di tabella audio
2, 0, 13.5, 1, 0, \;2 velocità di lettura del campione
3, .5, 5, 3, 0, \;3 velocità di ripetizione dei grani
4, 0, 2, 1, 0, \;4 veloc. di spostamento di fase nella granulazione
5, 0, 1, 0, 0, \;5 frequenza finale dei glissandi
6, .005, 4, 5, 100, \;6 durata totale del grano
7, 1/15, 1, 3, 0, \;7 durata dell’attacco del grano
8, 1/15, 1, .3, 0, \;8 tempo di decay del grano
9, 0, 12, 0, 0, \;9 livello della mandata a riverbero
10, 300, 8000, 3200, 0, \;10 filtro passabasso del riverbero
11, 0, 2, 0, 0, \;11 quantità random della frequenza del grano
12, 0, 3, 0, 0, \;12 quantità random della durata del grano
13, 0, .2, .05, 0, \;13 differenza di fase tra canale destro e sinistro
14, 0, .5, 0, 0, \;14 quant. random fase dell’inizio di un grano
15, 0, 3, 0, 0, \;15 fattore di ottavizzazione
16, .05, 2, 1, 0 ;16 volume globale
gk_17, gk_18, gk_19, gk_20, gk_21, gk_22, gk_23, gk_24 slider8 1,\
\ ctl min max init func
17, 102, 105.5, 102, 0, \;17 numero tabella di intonazione armonica
18, 0, 8.5, 0, 0, \;18 quantità di variaz. random nella micro-intonazione
19, 1, 1.5, 1, 0, \;19 diff. velocità di ripetiz. tra can. destro e sinistro
20, 0, 1, 0, 0, \;20 offset della fase iniziale dei grani
21, 0, 15, 0, 0, \;21 quantità random del tempo di inizio dei grani
22, 0, 1, 0, 0, \
23, 0, 1, 0, 0, \
24, 0, 1, 0, 0,
;************ REVERB and OUTPUT *************
arevb tonex garev1, gk_10,3
arev reverb2 arevb, 9, .05
outs gaout1 + arev, gaout2 + arev
clear gaout1, gaout2, garev1
endin
;//////////////////////////////////////////
instr 1
;//////////////////////////////////////////
ifmidi cpsmidi
iamp ampmidi 1
ifna = int(i(gk_1)) ;** tabella contenente il campione del canale sinistro
ifna2 = ifna ;** tabella contentente il campione del canale destro
imemlen = ftlen(ifna) ;** lunghezza della tabella allocata
ilen = nsamp(ifna ;** numero di campioni contenuti nelle tabelle
ilnDmem = ilen/imemlen ;** rapp. tra lunghezza del campione e dimensione della tabella
ifsr = ftsr(ifna)/sr ;** rapporto tra la freq.di campionamento del campione e sr
isrDmem = sr/imemlen ;** operazione necessaria per calcolare la frequenza effettiva
isrDdur = ftsr(ifna)/ilen ;** frequenza di campionamento sul numero di campioni
krdharm linrand gk_18 ;** quantità random della variazione armonica
krdharm2 linrand gk_18
krdharm table krdharm, i(gk_17)
krdharm2 table krdharm2, i(gk_17)
kform able gk_2, 151
kform = (ifmidi/127*.98) *kform*isrDmem*ifsr
krndpch trirand gk_11 ;** quantità random della variazione di altezza dei grani
krndpch2 trirand gk_11
kform1 = kform*powoftwo(krndpch)*krdharm ;** freq. canale sinistro
kform2 = kform*powoftwo(krndpch2)*krdharm2 ;** freq. canale destro
krnd trirand gk_21
kfund = 2^(gk_3+krnd) ;** velocità di ripetizione dei grani
kphsrate = gk_4*isrDdur
ckrndphs linrand gk_14 ;** quantità di variazione random della fase
kphs init 0
kphs phasor kphsrate
kphs = (kphs+krndphs+gk_20) * ilnDmem
kphs wrap kphs, 0, ilnDmem
kphs2 init 0
kphs2 phasor kphsrate, i(gk_13) ;** la fase del canale sinistro può essere variata per ottenere un effetto stereo
kphs2 = (kphs2+krndphs+gk_20)*ilnDmem
kphs2 wrap kphs2, 0, ilnDmem
kgliss = gk_5 ;** glissando dei grani
krnddur linrand gk_12 ;** variazione random della durata del grano
kdur = (1+krnddur) * gk_6
kris = kdur * gk_7
kdec = kdur * gk_8
iolaps = 10
kampenv linenr iamp*gk_16, 0,.1,.03
;** xfund koct kris kdec ifna itotdur kgliss
;** xamp xform kband kdur iolaps ifnb kphs
;** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
a1 fof3 kampenv, kfund, kform1, gk_15, 0, kris, kdur, kdec, iolaps, ifna, 101, 3600, kphs, kgliss
a2 fof3 kampenv, kfund*gk_19, kform2, gk_15, 0, kris, kdur, kdec, iolaps, ifna2, 101, 3600, kphs2, kgliss
vincr vincrgaout1, a1 * (1 - gk_9) ;** uscita principale sinistra
vincr gaout2, a2 * (1 - gk_9) ;** uscita principale destra
vincr garev1, (a1 + a2) * gk_9 ;** mandata a riverbero
endin
;*********** Granulare.sco ****************
f1 0 262144 -22 “c:\csound\icmc\voceGabEng.aif” 0 0 1
f2 0 524288 -22 “c:\csound\icmc\aiff\fm15 a(tema 2).aif” 0 0 1
f3 0 524288 -22 “c:\csound\icmc\aiff\fm15 m(arrich spett arm acute).aif” 0 0 1
f4 0 524288 -22 “c:\csound\icmc\aiff\fm15 t(arricchimento spettrale).aif” 0 0 1
f5 0 1048576 -22 “c:\csound\icmc\aiff\fm15 z(grave con arr spettr).aif” 0 0 1
f6 0 524288 -22 “c:\csound\icmc\aiff\fm15-f(iperarmonici).aif” 0 0 1
f7 0 131072 -22 “c:\csound\icmc\aiff\Gest9 (ottava gliss bassa).aif” 0 0 1
f8 0 524288 -22 “c:\csound\icmc\aiff\GestB (trilli glissati).aif” 0 0 1
f9 0 65536 -22 “c:\csound\icmc\aiff\GestD (batterie glissate).aif” 0 0 1
f10 0 65536 -22 “c:\csound\icmc\aiff\GestF (acciaccature).aif” 0 0 1
f11 0 524288 -22 “c:\csound\icmc\aiff\gyuto1 flang2 (pizzicati e raschiati).aif” 0 0 1
f12 0 262144 -22 “c:\csound\icmc\aiff\gyuto1 uuuamiu.aif” 0 0 1
f13 0 524288 -22 “c:\csound\icmc\aiff\Pigmei A(voce e flauto).aif” 0 0 1
f14 0 524288 -22 “c:\csound\icmc\aiff\Vid Nooo (E3).aif” 0 0 1
f15 0 262144 -22 “c:\csound\icmc\aiff\Vid uuuu(dissonanza).aif” 0 0 1
f16 0 262144 -22 “c:\csound\icmc\aiff\Clar PigmeiTema alto.aif” 0 0 1
f17 0 262144 -22 “c:\csound\icmc\aiff\Clar coppia temi paralleli3.aif” 0 0 1
f18 0 262144 -22 “c:\csound\icmc\aiff\Clar Tema2 retrogrado.aif” 0 0 1
f19 0 262144 -22 “c:\csound\icmc\aiff\Clar coppia temi veloce4.aif” 0 0 1
f20 0 131072 -22 “c:\csound\icmc\aiff\Clar coppia temi veloce6 cromatica2.aif” 0 0 1
f100 0 8192 5 .001 8192 1 ;** curva esponenziale per il mapping degli slider
f101 0 8192 19 .5 1 270 1 ;** curva sigmoide

;** unis / terza / quinta/ 7a min./ottava / ott+3a / ott+5a / ott+7a / doppia ottava
f102 0 32 -2 1 1.25 1.5 1.75 2 2.5 3 3.5 4

;** unis / -4 / 5 / -8 / 8 / -8 -4 / 8 +5 / -2ott / 2ott
f103 0 32 -2 1 .75 1.5 .5 2 .375 3 .25 4

;** scala maggiore naturale
f104 0 32 -2 1 1.125 1.25 1.33333 1.5 1.66666 1.875 2 2

;** progressione armonica
f105 0 32 -2 1 1.125 1.25 1.375 1.5 1.625 1.75 1.875 2

;** tabella delle frequenze
f151 0 32 -2 .5 1 .625 .75 .875 1 1.125 1.25 1.375 1.5 1.625 1.75 1.875 2

i100 0 3600
e

L’orchestra è piuttosto complessa, quindi procederemo a ritroso, partendo dall’uscita audio, situata alla fine dello strumento, per arrivare agli ingressi degli slider, situati all’inizio.

NOTA: si consiglia di analizzare le orchestre di una certa dimensione e complessità in questo modo, perché normalmente l’uscita audio consiste in una variabile (o due variabili, nel caso della stereofonia) facile da localizzare, mentre gli ingressi dei controlli possono essere molti (in questo caso sono costituiti da 21 controller continui, più il note-number MIDI e la velocity per ogni nota), e distinguere a colpo d’occhio le variabili degli ingressi iniziali da quelle intermedie è piuttosto difficoltoso. In questi casi l’uscita audio può essere considerata come la radice di un albero, mentre i controller degli ingressi come i rami o le foglie

L’orchestra consiste di due strumenti:

• lo strumento 100, contenente gli opcode relativi al controllo MIDI (slider8 e slider16), l’uscita audio principale e la linea di riverbero;
• lo strumento 1, contenente il codice relativo alla sintesi granulare.

Lo strumento 100 è facile da leggere. Partendo dalla fine verso l’inizio dell’orchestra (cioè dalla radice verso i rami) si può notare che:
le variabili audio globali contenenti i canali destro e sinistro (gaout1 e gaout2), così come l’uscita del riverbero (arev) sono inviate all’uscita stereo, poi vengono azzerate (insieme con la linea di riverbero garev1) per mezzo dell’opcode clear. Il segnale arev viene generato dall’opcode reverb2. garev1 (cioè la linea globale di riverbero) è connessa al riverbero dopo essere stata filtrata da un filtro passa-basso (tonex) per rendere il riverbero più gradevole all’ascolto.
La frequenza di taglio di tale filtro viene regolata dallo slider 10 (che genera la variabile globale gk_10). Notare che l’opcode tonex consiste in un banco di filtri del primo ordine connessi in serie. Questo tipo di connessione produce una curva di taglio più ripida, che genera un suono più caldo.
Gli argomenti degli opcode slider8 e slider16 vengono divisi in diverse linee di testo per permettere una leggibilità migliore (ricordiamo che il carattere ‘\’ permette di dividere una singola istruzione di Csound in più linee di testo).
Siccome nell’orchestra viene usato un totale di 20 segnali (regolati da controller MIDI), abbiamo usato due opcode, il primo contenente 16 slider, il secondo 8 slider. Così 4 slider rimangono inutilizzati, e rimane possibile aggiungere la regolazione di ulteriori parametri modificando l’orchestra.

Segue un elenco delle variabili globali relative ai parametri regolabili dagli slider MIDI:

gk_1 seleziona la tabella contenente i campioni (questa orchestra può usare diversi campioni allo stesso tempo);
gk_2 offset del pitch, che può essere selezionato cambiando l’indice di una tabella contenente una serie di rapporti frequenziali;
gk_3 velocità di ripetizione dei grani, cioè numero di grani al secondo;
gk_4 velocità di scansione del campione corrente. Questo parametro permette di cambiare la durata del campione corrente senza cambiarne l’altezza e viceversa;
gk_5 frequenza finale del glissando, possibile per ogni grano (vedi fof2 e fof3 nel manuale);
gk_6 durata totale di ogni grano, scalata in accordo alla velocità di ripetizione dei grani;
gk_7 tempo di attacco dei grani, scalato in accordo alla loro durata totale;
gk_8 tempo di decadimento dei grani, scalato in accordo alla loro durata totale;
gk_9 livello della mandata a riverbero;
gk_10 frequenza di taglio del filtro passa-basso usato per l’uscita del riverbero;
gk_11 quantità di variazione random della frequenza dei grani;
gk_12 quantità di variazione random della durata dei grani;
gk_13 differenza della fase di scansione tra canale destro e sinistro;
gk_14 quantità di variazione random della fase di scansione iniziale;
gk_15 fattore di ottavizzazione (vedi fof, fof2 e fof3 nel manuale);
gk_16 controllo generale del volume;
gk_17 numero di tabella contenente la scala armonica micro-tonale; gk_18 quantità random delle variazioni nella tabella contenente la scala armonica micro-tonale;
gk_19 differenza di velocità di ripetizione dei grani tra canale destro e sinistro;
gk_20 offset della fase iniziale dei grani. Se la velocità di scansione del campione corrente è posta a zero (slider gk_4), questo parametro permette un effetto di congelamento del suono campionato, una specie di effetto moviola.
gk_21 quantità di variazione random del tempo di inizio dei grani;
gk_22 non assegnato;
gk_23 non assegnato;
gk_24 non assegnato;

Ora, iniziamo a leggere lo strumento 1, partendo dalla fine.

Le tre linee di codice contenenti l’opcode vincr, assegnano i canali sinistro e destro, e la linea di riverbero alle variabili globali corrispondenti (gaout1,gaout2,grev1), che saranno usate come argomenti dell’uscita audio principale situata nello strumento 100.
Notare che la linea di riverbero (garev1) è ottenuta missando i canali sinistro e destro, e moltiplicando il risultato per il valore corrente dello slider 9 (gk_9), regolando anche il rapporto wet/dry; lo slider 9 modifica anche il livello del segnale diretto (a1 e a2), situato nelle variabili globali gaout1 e gaout2.
Le variabili a1 e a2 vengono riempite dagli opcode fof3, che sono il vero motore della sintesi granulare. Le chiamate a fof3 sono due al fine di processare un file stereo con la tecnica della sintesi granulare; comunque risulta possibile usare i due moduli fof3 anche con un campione mono, usando parametri leggermente differenti per produrre un effetto stereo.
L’opcode fof3 deriva da fof2, che a sua volta deriva da fof (vedi il manuale). Inizialmente fof non era stato progettato per la sintesi granulare, bensì per la sintesi vocale a formanti, essendo una implementazione del programma Chant dell’IRCAM (Xavier Rodet et al.).
Grazie alla loro struttura interna, fof, fof2 e fof3 possono essere usati anche per la sintesi granulare, con moltissime possibilità. Comparandolo con fof e fof2, l’opcode fof3 usa campioni interi a 16-bit posti in una tabella di Csound, mentre fof e fof2 supportano solo i campioni in virgola mobile a 32-bit; per questo motivo fof3 è più efficiente e consuma meno memoria, permettendo di caricare una doppia quantità di campioni nella stessa quantità di RAM. In più, fof3 usa l’interpolazione lineare per leggere i campioni, mentre fof e fof2 no, quindi la qualità audio di fof3 è migliore.
Analizziamo ora gli argomenti di ingresso della prima linea di codice contenente l’opcode fof3 (gli argomenti della seconda linea sono più o meno gli stessi):

a1 fof3 kampenv, kfund, kform, gk_15, 0, kris, kdur, kdec, iolaps, ifna, 101, 3600, kphs, kgliss

kampenv Inviluppo d’ampiezza. In questo caso il segnale viene generato dalla linea precedente, contenente l’opcode linenr. In questo strumento l’ampiezza varia in accordo alla velocity MIDI ricevuta dai messaggi di note-on (vedi la linea di codice contenente l’opcode ampmidi).
kfund Quando si usa fof3 per la sintesi granulare (invece che per la sintesi vocale), questo parametro contiene la velocità di ripetizione dei grani. Durante l’elaborazione kfund può variare, permettendo di controllare la distanza temporale di un grano dall’altro. Se kfund non varia, o varia molto lentamente, avremo a che fare con la sintesi granulare sincrona; se kfund varia caoticamente, avremo a che fare con la sintesi granulare asincrona. In questa orchestra la velocità base di ripetizione dei grani può essere modificata per mezzo dello slider 3 (variabile gk_3); mentre la variazione random di questa velocità viene modificata dallo slider 21 (variabile gk_21).
kform Quando fof3 viene usato per la sintesi granulare invece che per la sintesi vocale, questo parametro contiene la trasposizione in altezza del grano corrente. Il valore di kform viene catturato all’inizio di un grano e rimane costante per tutta la durata del grano stesso, anche se nel frattempo kform varia. E’ lo stesso concetto dei parametri ad i-rate, che vengono “campionati” all’inizio di una nota e rimangono costanti per tutta la durata della nota; la sola differenza è che in questo caso, kform rimane costante solo all’interno dello stesso grano, quindi, se tale variabile nel frattempo varia, il prossimo grano userà il nuovo valore, mentre il grano corrente continuerà ad usare il valore vecchio. kform è espresso in Hertz, che indicano il numero di volte al secondo con cui l’intera tabella audio viene scandita. Dovrebbe esser chiaro che pensare a questo parametro come ad una frequenza espressa in Hertz, risulta comodo soltanto quando nella tabella è contenuto un singolo ciclo della forma d’onda (per esempio una sinusoide); quando la tabella contiene un campionamento complesso (ossia, per esempio, contenente tutta l’evoluzione di una nota di uno strumento acustico), è meglio riferirsi al periodo del ciclo (il periodo è l’inverso della frequenza). Nel nostro caso il periodo corrisponde alla durata del suono contenuto nella tabella. Supponiamo di avere un campionamento di un secondo, contenente un suono con frequenza di 440 Hz. Se vogliamo riprodurre questo campionamento alla frequenza di 880 Hz, dobbiamo leggere la tabella al doppio della velocità, assegnando 2 a kform; se vogliamo riprodurlo a 220 Hz, dobbiamo assegnare 0.5 ecc. Se il nostro campionamento ha una frequenza originaria sempre di 440 Hz e una durata di 1.5 secondi, e intendiamo riprodurlo sempre a 440 Hz, dobbiamo considerare un periodo di 1.5 secondi (cioè la sua durata originale), ma, dal momento che questo valore deve essere assegnato a kform esprimendolo in Hertz (una unità di frequenza, non di durata), occorrerà ottenere l’inverso di quel periodo (ossia 1/1.5 = 0.6666... che non è più un periodo ma una frequenza); se vogliamo trasporlo un’ottava sopra, kform va posto a 1/(1.5/2) = 2/1.5 = 1.3333 (cioè l’inverso della metà del periodo, ossia il doppio della frequenza), e così via. Quindi è importante considerare la durata totale del campionamento contenuto nella tabella, così come la sua frequenza originaria. Inoltre dovremo considerare se il suono è stato campionato frequenza diversa da sr. Nella nostra orchestra, la trasposizione in altezza dei grani può essere modificata dallo slider 2 (la variabile gk_2) e dal messaggio MIDI di note-on (opcode cpsmidi), mentre la quantità random di variazione di altezza dei grani può essere modificata dagli slider 11 e 18 (variabili gk_11 e gk_18). Lo slider 18 permette di usare una tabella contenente rapporti micro-intervallari per variare la frequenza dei grani in modo random. Quindi ogni grano assumerà un valore frequenziale corrispondente al rapporto contenuto nella tabella di micro-intonazione corrente.
gk_15 nella sintesi vocale questo argomento contiene l’indice di ottavizzazione, che attenua il livello dei grani dispari. Ciò produce un effetto di abbassamento di ottava. Nella sintesi granulare sincrona, viene prodotto un effetto ritmico quando questo indice è maggiore di zero. Nella nostra orchestra questo parametro può essere controllato dallo slider 15.
0 questo argomento non viene usato nella sintesi granulare di questa orchestra. Nella sintesi vocale esprime la larghezza di banda della formante, espressa in Hertz
kris tempo di attacco dell’inviluppo trapezoidale dei grani. Può essere modificato in differenti grani. Nella nostra orchestra la regolazione del tempo di attacco avviene con lo slider 7 (variabile gk_7).
kdur durata totale del grano, che può essere variata in grani differenti. Nella nostra orchestra questo parametro può essere regolato dallo slider 6 (variabile gk_6); inoltre è possibile modificare la variazione random della durata dei grani con lo slider 12 (variabile gk_12).
kdec tempo di decadimento dell’inviluppo trapezoidale dei grani. Può essere variato in grani differenti. Nella nostra orchestra viene regolato dallo slider 8 (variabile gk_8).
iolaps numero massimo di grani sovrapposti. Se la durata dei grani eccede l’intervallo temporale relativo alla partenza del grano successivo, vi sarà un periodo di tempo in cui i grani risultano sovrapposti. Questo parametro definisce il numero massimo consentito di grani sovrapposti. Se la sovrapposizione supera questo valore, Csound si bloccherà. Nella nostra orchestra il numero di sovrapposizioni è stato posto a 10.
ifna nella sintesi granulare questo parametro esprime il numero della tabella contenente il suono campionato. Di solito in fof e fof2 questa tabella viene riempita usando GEN01 (per la sintesi granulare), mentre in fof3 (cioè nel nostro caso), viene riempita usando GEN22 (che è una GEN identica a GEN01, eccetto che per il fatto che vengono impiegati campioni a 16-bit). Nella nostra orchestra è possibile selezionare una tabella diversa per ogni nota, variando lo slider 1 (variabile gk_1).
101 numero di tabella contenente la forma dei segmenti di attacco e decadimento. Di solito si usa una linea retta o una sigmoide. La sigmoide viene ottenuta usando un ciclo di sinusoide positiva in cui vene tolto il primo quarto e l’ultimo quarto (usando la GEN19).
3600 durata massima della nota (non dei grani). In questa orchestra è stata posta a 3600 secondi.
kphs questo parametro tiene traccia della fase della tabella contenente il suono campionato. La fase inizia col valore 0 e termina con 1, in riferimento all’inizio e alla fine della tabella. Per ottenere questo risultato si usa normalmente l’opcode phasor, che genera la fase di una tabella, in cui il periodo (cioè l’inverso della frequenza) coincide con la durata della tabella scansionata. Variando la frequenza dell’opcode phasor, possiamo ottenere diverse velocità di lettura, rendendo possibile il time-stretching senza variare l’altezza del suono campionato. Se la frequenza del phasor viene posta a zero, cioè, se il parametro kphs rimane costante, si avrà un “congelamento” del suono campionato in un punto, una specie di fermo immagine applicato al suono. Nella nostra orchestra la frequenza del phasor (cioè la velocità dello scansionamento della tabella) può essere regolata dallo slider 3 (variabile gk_3). E’ possibile regolare anche un offset che rappresenta il punto iniziale dello scansionamento della tabella. Variando questo parametro e ponendo la frequenza del phasor a zero, è possibile effettuare uno “scrub” manuale muovendo il relativo slider. Nella nostra orchestra questo valore può venire regolato dallo slider 20 (variabile gk_20).
kgliss In fof2 e in fof3, è possibile avere un glissando all’interno di ciascun grano. Questo parametro indica la trasposizione finale dei grani, espressa per mezzo di un fattore moltiplicativo. Di conseguenza, assegnare 1 a questo parametro significa lasciare la frequenza del grano costante; assegnare 2 significa raddoppiare la frequenza alla fine del grano; assegnare 0.5 significa dimezzare la frequenza alla fine del grano (ossia trasporlo un’ottava più in basso), ecc. Se la durata del grano è molto breve, il glissando produrrà un effetto timbrico, o una specie di scordatura. Nella nostra orchestra questo parametro viene regolato dallo slider 5 (variabile gk_5).

Il segnale ampenv, contenente l’inviluppo di ampiezza, viene generato da linenr; l’ampiezza assoluta può essere regolata dallo slider 16 (gk_16), che è il controllo principale di volume. iolaps viene posto a 10. kris e kdec (attacco e decadimento del grano) vengono calcolati come frazioni di kdur; che vengono a loro volta regolate dagli slider 7 e 8 (gk_7 e gk_8).
La durata del grano kdur è controllata dallo slider 6 (gk_6) e la quantità di variazione random viene regolata dallo slider 12 (gk_12).
La frequenza di kgliss (glissando del grano) viene regolata dallo slider 5 (gk_5).
La tabella contenente il suono campionato viene scansionata separatamente nei canali destro e sinistro (kphs e kphs2), per mezzo delle due linee di codice contenenti l’opcode phasor.
L’argomento di entrata di phasor controlla la velocità di scansionamento del suono campionato. Questo argomento (kphsrate) può essere modificato con lo slider 4 (gk_4). Quando kphsrate assume il valore 0, il suono campionato viene congelato e tutti i grani vengono letti in un singolo punto. In questo caso è possibile modificare lo scansionamento manualmente, per mezzo dello slider 20 (gk_20), che aggiunge un offset al punto corrente di scansione. E’ possibile porre una differenza di fase tra i canali destro e sinistro, regolabile dallo slider 13 (gk_13).
Il posizionamento dei punti di lettura del suono campionato può essere effettuato a salti, per mezzo di un offset che varia in modo random. Questo offset (krndphs) viene generato dal’opcode linrand e la sua influenza casuale sulla lettura del suono campionato è regolabile dallo slider 14 (gk_14). In effetti, phasor genera un segnale muovendosi da 0 a 1, due numeri che rappresentano la fase iniziale e finale del suono campionato. Ma, dal momento che la lunghezza di tabella deve essere una potenza di due (una nota: con DirectCsound è in realtà possibile creare tabelle la cui lunghezza non è una potenza di due, assegnando un numero negativo al parametro indicante la lunghezza, durante la creazione della tabella, ma questa caratteristica è supportata solo da alcuni opcode, non da fof3), il numero dei campioni del suono potrebbe non coincidere con la lunghezza della tabella, è anzi quasi sicuro che sia così, perché il contrario sarebbe una coincidenza eccezionale. Per questa ragione viene usata la funzione nsamp( ). Questa funzione restituisce il numero di campioni effettivamente letti dal file contenente il campionamento.
L’ultima parte della tabella, che rimane inutilizzata, viene riempita con degli zeri.
Così se venisse scansionata tutta la tabella, udremmo il suono solo nella prima parte, mentre per la porzione rimanente non ci sarebbe nulla da ascoltare. Per tale motivo la fase della tabella non deve arrivare fino ad 1, ma solo fino al punto in cui il suono campionato termina, cioè un numero situato tra 0.5 (metà tabella) e 1 (fine tabella). Per questo scopo viene usato il moltiplicatore ilnDmem, che contiene il rapporto tra la lunghezza del suono campionato e la lunghezza della tabella.
Nel nostro caso phasor opera a k-rate, mentre le variabili kphs e kphs2 devono contenere anche un valore durante lo stadio di inizializzazione, perché fof3 lo richiede. Per questo motivo le due variabili vengono inizializzate a zero. La frequenza di phasor (kphsrate) è ottenuta dal prodotto tra l’uscita dello slider 4 per isrDdur, che è un fattore di riscalamento.
La frequenza di ripetizione dei grani (kfund) è ottenuta dallo slider 3 (gk_3) insieme con un offset random (generato dall’opcode trirand). Il valore di questo offset viene regolato dallo slider 21. Quando è diverso da zero ci sarà una variazione del ritmo dei grani. La frequenza di ogni grano è ottenuta dalle due variabili kform1 (canale sinistro) e kform2 (canale destro).
I valori frequenziali sono influenzati da diversi fattori: il numero di nota MIDI, lo slider 2 (gk_2, che genera una trasposizione), generatori random che variano la frequenza di ogni grano, regolabili dallo slider 11 (gk_11), generatori random che scelgono un rapporto intervallare in una tabella contenente una scala, regolabile dallo slider 18 (gk_18).

imemlen, ilen, ilnDmem, ifsr, isrDmem e isrDdur sono fattori di riscalamento che influenzano vari parametri. Eviteremo di entrare in dettagli matematici, il lettore potrà studiarsi egli stesso la loro funzione.

ifna e ifna2 sono i numeri delle tabelle contenenti il suono campionato (canali destro e sinistro). Questi numeri possono essere cambiati con lo slider 1 (gk_1).

iamp regola l’ampiezza delle note, che dipende dalla velocity MIDI.

ifmidi influenza la frequenza dei grani (insieme ad altri fattori). Viene prodotto dal numero di nota MIDI.

All’inizio della partitura, diverse tabelle (dalla 1 alla 20) vengono riempite con suoni campionati per mezzo della GEN22.
La tabella 101 contiene una curva sigmoide. Il suo scopo è di modellare i segmenti di attacco e di decay di ciascun grano. La curva sigmoide viene ricavata da una sinusoide positiva sfasata di 180 gradi a cui viene tolto il primo e l’ultimo quarto di periodo. Le tabelle 102, 103, 104 e 105 contengono rapporti frequenziali per le scale micro-tonali. La tabella 151 contiene fattori di trasposizione.
Infine, lo strumento 100 viene attivato per 3600 secondi, per permettere una sessione di Csound in tempo reale della durata di un’ora.

Qui termina la sezione riguardante gli esempi di DirectCsound in tempo reale. Ora il lettore si chiederà come si possano controllare tutti quei parametri MIDI in tempo reale. Si può collegare un dispositivo hardware munito di fader MIDI (ce ne sono diversi in commercio) all’ingresso MIDI del computer, fornendo all’utente gli slider MIDI fisici (non virtuali) che trasmetteranno messaggi MIDI di control-change quando vengono mossi. Normalmente i dispositivi che dispongono di fader MIDI non dispongono di più di 16 sliders, mentre i parametri di questa orchestra sono ben 21. Un’alternativa a dispositivi MIDI hardware è VMCI, un programma progettato per essere usato insieme a DirectCsound sotto Windows, che risulta più comodo sotto diversi aspetti, come vedremo nella seguente sezione.



 
English Version
Home
- - - - - - - - - - - -
Il Suono Virtuale
- - - - - - - - - - - -
Articoli
- - - - - - - - - - - -
Tutorial
- - - - - - - - - - - -
Corsi Online
- - - - - - - - - - - -
Software
- - - - - - - - - - - -
Forum
- - - - - - - - - - - -
Search
- - - - - - - - - - - -
Contact
- - - - - - - - - - - -