Introduzione a Csound

 di Riccardo Bianchini

PREMESSA

UN PO' DI STORIA

FUNZIONAMENTO

COSTANTI E VARIABILI

LA SINTASSI DI CSOUND


PREMESSA

Vi sono attualmente diversi sistemi software per la sintesi diretta del suono mediante elaboratore. Da quelli storici e non più in uso, come MAESTRO, MUSIC4BF, MUSIC IV, a quelli realizzati già da alcuni anni ma ancora utilizzati, come MUSIC V, MUSIC 360, music11, a quelli più recenti come CMusic, CMix e, appunto, CSound.

Condizione necessaria perché un linguaggio per la sintesi diretta del suono abbia successo è che sia disponibile sul maggior numero di macchine e sistemi operavi possibili, e che non dipenda da un particolare hardware.

CSound è disponibile su minicomputers in ambiente Unix, su personal computers MS-DOS, su Macintosh. L'unico hardware aggiuntivo necessario (ma solo per l'ascolto del suono, non per la sintesi) è un convertitore digitale-analogico, che può benissimo essere una delle numerosissime schede audio a 16 bit oggi in commercio.

CSound necessita di processori veloci e dotati di coprocessore matematico, quindi è consigliabile un Pentium o un 80486 (non un SX, che manca del coprocessore), anche se l'utilizzo di processori inferiori (come le coppie 80386/387 o 80286/287) porta agli stessi risultati, seppure ottenuti in tempi più lunghi.

La scheda audio utilizzata influenza la qualità del suono riprodotto, specialmente n termini di fruscio di fondo e di distorsione armonica e di intermodulazione. Ma i files sonori presenti su hard-disk sono intrinsecamente di qualità paragonabile al CD o migliore. È anche possibile utilizzare una scheda di collegamento digitale con un DAT, e utilizzare quest'ultimo come convertitore D/A, anche se in questo modo si è legati all'uso di frequenze di campionamento standard, in pratica 44.1 e 48 kHz.

Csound, come tutti i linguaggi per la sintesi del suono, funziona in tempo differito. Ciò significa che il tempo necessario per la sintesi, per esempio, di un minuto di suono è superiore a un minuto, e sarà quindi necessario attendere il termine del processo di sintesi per l'ascolto del suono generato.

Il tempo necessario per la sintesi del suono varia a seconda della complessità del suono stesso, o meglio della complessità degli algoritmi usati per la sintesi. Con elaboratori molto veloci e con algoritmi di media complessità è possibile anche la sintesi in tempo reale, almeno con il sistema operativo Unix.


UN PO' DI STORIA

Il capostipite di tutti i linguaggi per la sintesi del suono è indubbiamente MUSIC V, scritto da Max Mathews ai Bell Laboratories; da questo derivano, più meno, tutti gli altri.

Csound è l'ultimo di tre linguaggi per la sintesi del suono scritti da Barry Vercoe al MIT (Massachussets Institute of Technology). Il primo fu MUSIC 360, che girava esclusivamente su grandi elaboratori IBM 360, e sui successivi 370 e 83xx. Era scritto in linguaggio assembler 360, e non era quindi assolutamente portabile su macchine diverse. Il secondo fu Music 11, scritto in assembler DEC PDP-11, e che girava su PDP-11, appunto, e sul successivo VAX.

Csound, che conserva, migliorate, tutte le caratteristiche dei linguaggi precedenti, è invece scritto in linguaggio C. Questo permette una facile portabilità su macchine diverse, e anche la implementazioni che facciano uso di processori o schede acceleratrici particolari, purché sia disponibile un sistema di sviluppo in linguaggio C.


FUNZIONAMENTO

Csound conserva il concetto di strumento e di nota. Un complesso di più strumenti si chiama orchestra, ed è a tutti gli effetti un programma eseguibile che utilizza un file di dati chiamato partitura (score), composto da una serie di note.

Csound utilizza due distinte frequenze di campionamento, una audio (sr) e una per i segnali di controllo (kr), tipicamente pari a 1/10 di sr. Infatti, se per i segnali audio è necessaria una frequenza di campionamento almeno doppia della massima frequenza audio che interessa, i segnali di controllo (come per esempio gli inviluppi di ampiezza o la spazializzazione stereofonica) possono variare con una frequenza di campionamento molto più bassa; ciò riduce la quantità di calcoli necessaria e accelera il processo di sintesi.

Alla partenza, CSound compie una serie di operazioni preliminari, poi inizia a leggere la score. Genera le eventuali tabelle di forma d'onda richieste dalla score, poi inizia a leggere le note. Compie quindi alcune operazioni di inizializzazione, operazioni che vanno svolte una sola volta all'inizio di ogni nota (conversione da pitch a Hertz, da deciBel ad ampiezze assolute etc.), poi calcola il primo valore dei segnali di controllo. Passa quindi alla generazione dei segnali audio, di cui genera un numero di campioni pari al rapporto sr/kr. Se, per esempio, sr=20000 e kr=2000, genera 20000/2000=10 campioni audio. Genera poi i successivi segnali di controllo, e nuovamente altri 10 campioni audio, e così via fino al termine della nota.

Innanzitutto viene letta la nota dalla partitura (score) e vengono calcolate le variabili di inizializzazione, cioè quelle che non cambieranno più nel corso della nota, come per esempio l’action time, la durata etc.

Poi vengono calcolate le variabili di controllo, quelle cioè che non hanno bisogno di cambiare tanto frequentemente quanto l’ampiezza istantanea del suono. Per definire un inviluppo di ampiezza, ad esempio, non è necessario specificare il valore istantaneo dell’andamento dell’inviluppo alla frequenza di campionamento audio, che può arrivare a 44100 kHz; sarà sufficiente specificare questo valore istantaneo un migliaio di volte al secondo. Viene perciò definita una frequenza di controllo (kr), che è tipicamente dieci volte inferiore alla frequenza di campionamento audio (sr).

Infine vengono calcolate le variabili audio, quelle per le quali è necessaria la frequenza di campionamento effettiva. Questo calcolo viene effettuato un numero di volte pari a sr/kr, rapporto che in Csound ha il simbolo ksmps. Dopo di che si passa a calcolare nuovamente le variabili di controllo, e si prosegue così fino alla fine della nota.


COSTANTI E VARIABILI

Csound utilizza diverse costanti, cioè valori che non cambino nel corso dell'esecuzione, e variabili, cioè celle di memoria identificate con nomi che seguono certe convenzioni, e che contengono valori che cambiano nel corso dell'esecuzione.

Le costanti sono: la frequenza di campionamento dei segnali audio (sr) e la frequenza di campionamento dei segnali di controllo (kr), già viste nel paragrafo precedente; il rapporto sr/kr (che deve obbligatoriamente essere un numero intero); e il numero di canali di uscita, che può assumere i valori 1 (suono monofonico), 2 (suono stereofonico) o 4 (suono quadrifonico).

Esistono tre tipi di variabili:

· di inizializzazione (il loro nome deve incominciare con la lettera i), e vengono calcolate una sola volta per ogni nota, all'inizio della stessa; per esempio, nomi validi di variabili di tipo i sono: i1, ifreq, istart, iend, i121 etc.

· di controllo (il loro nome deve incominciare con la lettera k), e vengono calcolate alla krequenza kr; per esempio, nomi validi di variabili di tipo i sono: k1, kfreq, kstart, kend, k444 etc.

· audio (il nome deve iniziare con la lettera a), e vengono calcolate alla frequenza sr. Per esempio, nomi validi di variabili di tipo i sono: a1, aout, astart, aend, a99 etc.

Tutte queste variabili sono visibili (cioè sono conosciute e utilizzabili) solo all'interno dello strumento nel quale sono definite. Vi è però un modo per passare variabili fra uno strumento e un altro. Se al nome della variabile si premette la lettera g, questa assume l'attributo globale, ed è perciò visibile da tutta l'orchestra. Nomi validi di variabili globali sono: ga1 (variable globale di tipo audio), gkloop (variabile globale di tipo controllo), gi1 (variabile globale di tipo inizializzazione).


LA SINTASSI DI CSOUND

a) Orchestra

CSound è un linguaggio di sintesi molto potente, ma richiede in cambio all'utente di seguire in modo rigido certe convenzioni sintattiche.

Una orchestra CSound è costituita da un file di testo, ed è composta da una intestazione (header) nella quale vengono dichiarate sr, kr, il rapporto sr/kr, e il numero di canali di uscita. Un esempio di header può essere:

sr=20000 ;frequenza di campionamento audio
kr=1000 ;frequenza di controllo
ksmps=20 ;rapporto sr/kr
nchnls=2 ;numero di canali di uscita

Tutto quanto, in una riga, segue un punto e virgola è considerato un commento, e non viene considerato da CSound.

Segue poi l'orchestra vera e propria, costituita da uno o più strumenti, che devono essere compresi fra l coppia di istruzioni instr e endin:

instr 1
...
...
...
endin

instr 2
...
...
...
endin

...

La forma generale di una istruzione è la seguente:

[etichetta:] [risultato] opcode [arg1, arg2, arg3...]

Le parentesi quadre indicano che l'elemento contenuto fre esse può esserci o no; quindi l'etichetta può mancare, così come il risultato e gli argomenti.

L'opcode è il simbolo della particolare unità generatrice utilizzata; ma alcuni esempi chiariranno questo punto.

a1 oscil iamp, ifreq, itab

viene invocata l'unità generatrice oscil (oscillatore) che deposita il risultato nella variabile audio a1, e utilizza gli argomenti iamp (ampiezza), ifreq (frequenza) e itab (numero della tabella contenente la forma d'onda).

out ax

viene invocata l'unità generatrice out (uscita o scrittura dei campioni di suono su disco) con l'argomento ax.

ifreq = cpspch(8.09)

viene invocata l'uguaglianza della conversione da pitch a Hertz o cps (cpspch) del valore 8.09 (LA3), e assegnato il risultato alla variabile di inizializzazione ifreq.

Nel caso di errori di sintassi, quando si lancia CSound si ricevono messaggi di errore che contengono, oltre alla diagnostica, anche il numero di riga del file orchestra al quale si riferiscono.

b) Score

Anche la partitura è costituita da un file di testo, ma la sua sintassi è diversa. Il codice operativo è indicato dal primo carattere di ogni riga, che può assumere i valori i, f, a, t, s ed e. I più importanti sono i (nota) e f (funzione o forma d'onda). Al codice operativo seguono i parametri separati da almeno uno spazio, in numero variabile, e con un massimo che dipende dalla particolare versione di CSound (in genere almeno 50).

Esempi di righe di partitura possono essere:

f1 0 4096 10 1 .5
i1 9 1.5 80 6.078 1 3 6 .66.