Incontri sulla Musica Elettronica


Franco Degrassi
Appunti sulla composizione di "Zoloft" e di "3112"



LOA Hacklab
Luned́ 28-10-2002
Ore 21.00



  • Algoritmo 1 (.orc)

  • Algoritmo 1 (.sco)

  • Algoritmo 2 (.orc)

  • Algoritmo 2 (.sco)


  • Recensioni


  • Da alcuni anni utilizzo per i miei lavori la risintesi granulare di suoni "acustici".

    La modalita' operativa e' quella della variazione continua di un materiale iniziale dato, scegliendo in primo luogo una tecnica di analisi e risintesi, in secondo luogo i parametri su cui operare le trasformazioni, in terzo luogo l'approccio della composizione algoritmica. In questo senso Csound e' usato non solo come software per la sintesi del suono ma anche come vero e proprio linguaggio di programmazione in grado di modificare, su indicazione dell'utente, il normale percorso di generazione di un suono attraverso loop e salti condizionati: e' attraverso queste istruzioni che e' possibile scrivere delle orchestre complesse in grado di supportare un approccio algoritmico alla composizione.


    1) risintesi granulare


    La sintesi granulare consiste nella generazione di un gran numero di frammenti sonori, detti grani, della durata generalmente variante fra 20 e 100 millisecondi.

    La risintesi granulare, nell'implementazione Csound attraverso l'opcode Sndwarp consiste prima di tutto nella lettura del file audio sul quale si vogliono operare trasformazioni sonore. La lettura avviene da una tabella nella quale attraverso il metodo di generazione Gen 01 e' stato trasferito il suono.

    Esempio: nel file .sco dells partitura si trovera' l'istruzione

    f30 0 83888602 1 "suono.wav" 0 0 0

    La funzione n.30 attivata all'istante 0 del processo di generazione del suono contiene il suono campionato "suono" in formato wav che, in questo caso, occupa piu' di 8 mega di memoria ( Csound richiede sempre un numero potenza di2, in questo caso 2 elevato alla 32sima ).

    Il suono viene letto e suddiviso, attraverso l'apertura di finestre temporali, in grani che vengono poi giustapposti e sovrapposti nella risintesi.


    Per la sintassi dell'opcode Sndwarp


    http://www.csounds.com/manual/siggen/sndwarp.htm


    2) parametri interessati alla trasformazione del suono


    Le caratteristiche del suono originario su cui sono intervenuto sono :


    a) istante d'inizio e fine del frammento del campione iniziale su cui operare ( ex. dal secondo 8 al secondo 9.2 )

    b) durata del suono ( rallentamento, accellerazione )

    c) altezza del suono ( trasposizione )


    A queste caratteristiche si e' aggiunto il "numero di voci": il file "monofonico" e' diventato composizione "polifonica"


    3) dimensione algoritmica della composizione


    Una volta definiti alcuni aspetti macroformali lascio che sia il software, l'orchestra csound strutturata in maniera tale da supportare processi stocastici, a compiere le scelte "fini".

    Cio' avviene in due modi:


    a) reinizializzando il normale flusso del programma attraverso l'opcode Timout ( http://www.csounds.com/manual/siggen/timout ) : la durata di ogni evento, definita attraverso le note presenti nel file .sco di partitura, viene suddivisa in N eventi, che nell'orchestra sono definiti attraverso un generatore di numeri casuali. Per esempio in partitura ( file .sco ) si definisce una nota di 1 secondo ; sempre in partitura si definisce un limite massimo di reinizializzazione ( cioe' un limite massimo nella durata dei singoli eventi ) di 0.1 secondi; in tal modo la generazione del suono di 1 secondi sara' suddivisa in un gruppo di N suoni, di durata compresa fra un massimo di <1 secondi ed un minimo > 0.

    Ad esempio ecco il risultato di una generazione casuale, i numeri rappresentano gli istanti di inzio di ogni evento :


    0.026438 0.055165 0.066521 0.093985 0.127030 0.165120 0.200360

    0.256209 0.294910 0.332286 0.382687 0.405911 0.439305 0.474874

    0.479333 0.534718 0.586239 0.597241 0.616083 0.703360 0.762041

    0.780398 0.854833 0.909623 0.957442 0.964684 0.973452



    b) estraendo i valori casuali di istante inizio-istante fine del file campionato da leggere ed estraendo i valori di partenza e di arrivo dell'altezza


    Le istruzioni chiave sono

    x) apuntilettura line iniziowavx,itimout,ifinewawx


    Ad esempio apuntilettura line 2,1,5 significa : "Leggi in un secondo il frammento del file sonoro che va dall'istante 2 ( secondi ) all'istante 5." Cio' determina un accellerazione del suono originale. Alo stesso modo


    y) amodaltezza line ihzpartex,itimout,ihzendx

    ex. amodaltezza line 1,1,2 significa "Sullo stesso frammento sonoro varia l'altezza da quella originaria ( 1 ) ad un ottava sopra ( 2 ) cioe' al raddoppio della frequenza fondamentale."


    Questo e' l'approccio base che ho utilizzato ( esempi Proc1.ORC Proc1.SCO )


    Sviluppo A


    E' possibile utilizzare una maschera di tendenza per gestire la casualita' nell'estrazione dei valori di altezze e durate. Una maschera di tendenza definisce il range entro il quale vengono estratti i valori

    delimitandolo mediante due curve, una per i valori minimi una per i massimi.

    In questo caso basta portare fuori dal ciclo timout le istruzioni chiave

    Ad esempio


    kminimo oscil1 0,1,p3,10

    kmassimo oscil1 0,1,p3,11

    krange=kmassimo-kminimo

    khzparte rand krange,-1

    ihzpartex = i(khzparte )

    amodaltezza line ihzpartex,itimout,ihzendx


    con nel file .sco

    f10 0 512 -7 1 512 1.5

    f11 0 512 -7 2 512 2.5


    A k-time vengono estratti random valori nel range definito dalle funzioni f10 e f11, che tracciano la maschera di tendenza. I valori sono convertiti in valori di inizializzazione ( i).




    Sviluppo B


    E' possibile creare, a sua volta, una maschera di tendenza con strumenti casuali con una procedura stocastica che, dati i valori di partenza del range, opera per modifiche condizionate dei valori.


    E cioe' ad esempio se il range di partenza e' minimo 1 massimo 2

    potremo avere le seguenti operazioni:


    a destra


    a)estensione 1 3

    b)contrazione 1 1.5

    c)slittamento 1.5 2.5

    d)fuoriuscita 2.5 3.5


    a sinistra


    e)estensione 0.5 2

    f)contrazione 1.5 2

    g)slittamento 0.5 1.5

    h)fuoriuscita 0.1 0.6



    i)piramide 0.8 2.2

    l)piramide rovesciata 1.2 1.8


    m) uguale


    Le righe chiave sono



    if iscelta1==0 igoto estensdestra

    if iscelta1==1 igoto contrdestra

    if iscelta1==2 igoto contrsinistra

    if iscelta1==3 igoto estensinistra

    if iscelta1==4 igoto slittdestra

    if iscelta1==5 igoto slittsinistra

    if iscelta1==6 igoto piramdritta

    if iscelta1==7 igoto piramrovescia

    if iscelta1==8 igoto fuoridestra

    if iscelta1==9 igoto fuorisinistra

    if iscelta1==10 igoto uguali


    Per controllare a grandi linee la generazione di una maschera di tendenza occorrera' condizionare l'estrazione casuale dei valori da 0 a 10 a seconda del tipo di curva che si immagina. Ad esempio se si ipotizza una maschera di tendenza in cui il range si allarga progressivamente si rendera' probabile ( scrivendo alcune righe aggiuntive di orchestra ) l'estrazione del numero 6 ( piramdritta ). E via di seguito.


    esempi Algoritmo1.ORC Algoritmo.SCO