Lezione 3 Basi sintattiche: orchestra Programmazione timbrica - Prof. Luca A. Ludovico Riassunto <CsoundSynthesizer> <CsOptions>/* opzioni */</CsOptions> <CsInstruments> sr = 44100 ksmps = 128 nchnls = 2 0dbfs = 1.0 ORC CSD ; strumenti </CsInstruments> <CsScore> ; partitura </CsScore> </CsoundSynthesizer> Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra SCO Un esempio <CsoundSynthesizer> <CsOptions></CsOptions> <CsInstruments> ; Initialize the global variables sr = 44100 kr = 4410 ksmps = 10 nchnls = 1 ; Instrument #1 instr 1 a1 oscils p1, p2, p3 out a1 endin </CsInstruments> <CsScore> /* partitura */ </CsScore> </CsoundSynthesizer> Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Riassunto della scorsa lezione • In Csound un’orchestra si compone di: – Una sezione di intestazione (header), che specifica le opzioni globali per l’esecuzione da parte degli strumenti – Una lista di definizioni di strumenti – Eventuali opcode definiti dall’utente (UDO) • Un blocco viene racchiuso dalle seguenti istruzioni: instr n /* istruzioni che definiscono il comportamento dello strumento */ endin • Un’istruzione di orchestra in Csound ha il formato: etichetta: risultato opcode argomento1, argomento2, ... ; commenti Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Istruzioni ordinarie • Un’istruzione ordinaria (ordinary statement) viene lanciata all’istante di inizializzazione o all’istante di esecuzione (o in entrambe le situazioni). • Dal punto di vista formale, le operazioni che producono un risultato vengono eseguite alla frequenza di tale risultato: quindi, all’istante di inizializzazione (a i-time) per risultati a i-rate, e durante l’esecuzione (a p-time) per i risultati a k-rate e a-rate. – Fa eccezione l’opcode init, illustrata nel seguito. • I valori in ingresso a un’operazione sono detti argomenti. La maggior parte degli argomenti ammettono espressioni aritmetiche composte da costanti, variabili, simboli riservati, operatori aritmetici e condizionali e convertitori di valore. – Ad esempio, è possibile impostare la frequenza di un oscillatore a 220Hz (costante numerica) così come a un decimo della frequenza di campionamento corrente (combinazione di simboli riservati, costanti numeriche e operatori aritmentici) Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Tipi, costanti e variabili • Le costanti sono numeri in virgola mobile, disponibili con continuità e dal valore immutabile. • Le variabili sono celle di memoria cui è associata un’etichetta che funge da nome e atte a contenere valori numerici. Sono disponibili con continuità e il loro contenuto può essere aggiornato a una delle seguenti quattro frequenze: al solo momento di setup, a i-rate, k-rate, o a-rate. Dunque le variabili in Csound risultano “tipizzate”. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Utilizzo dei diversi tipi di variabile • Variabili calcolate a i- e k-rate sono scalari che a ogni istante possono assumere un solo valore. Sono utilizzate principalmente per memorizzare e richiamare valori di controllo, ossia dati che cambiano all’avvio di una nuova nota (i-rate) o alla frequenza di controllo (k-rate). Sono utili quindi per memorizzare parametri di nota quali altezza e durata o tracciare variazioni lente. • Le variabili calcolate ad a-rate sono vettori di informazione. I loro valori multipli sono quindi calcolati anch’essi a frequenza kr. Esse consentono però una rappresentazione più raffinata a livello temporale (vedi ksmps: a ogni valore calcolato a frequenza kr ne corrispondono ksmps). Sono utilizzate per memorizzare e richiamare dati che variano alla frequenza di campionamento sr, quali i segnali audio in uscita da oscillatori e filtri. • Le variabili possono essere viste come segnali con frequenza di aggiornamento fissa. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Variabili locali e globali • Un’ulteriore distinzione ha luogo tra variabili locali e globali. • Le variabili locali sono private per un dato strumento, e gli altri strumenti non vi possono accedere in lettura e/o scrittura. Lo stesso nome può comparire in più strumenti senza generare conflitto. Il loro nome può iniziare per p, i, k, o a. • Le variabili globali sono celle di memoria condivisa tra tutti gli strumenti. Il loro nome segue le convenzioni delle variabili locali, con il prefisso g. Vengono utilizzate per veicolare valori di interesse generale, per porre in comunicazione diversi strumenti (ad es. semafori) o per passare suoni da uno strumento a un altro e creare effetti (ad es. il riverbero). Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Variabili locali e globali Esistono 9 tipi di variabili locali e globali: • In verde le tipologie già descritte; • In arancio quelle non ancora descritte; • In grigio quelle non di immediato interesse nell’ambito del corso. Simboli riservati Parametri della partitura Variabili di inizializzazione Segnali di controllo permanente i-time i-time p-time, k-rate p numero i k Prefisso globale rsymbol gi gk Segnali audio p-time, k-rate a ga w f S t gf gS Tipo Prefisso locale Istante di ricalcolo tutti i campioni in un unico passaggio k Tipi di dato spettrale k-rate Tipi di dato spettrale in streaming k-rate Variabili stringa i-time e opzionalmente k-rate Variabili vettore k-rate Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Inizializzazione delle variabili • Gli opcode che permettono di inizializzare le variabili sono 4: 1. Operatore di assegnamento = Sintassi ares = xarg ires = iarg kres = karg ires, ... = iarg, ... kres, ... = karg, ... Come si legge la sintassi nella documentazione: - a denota variabili audio (calcolate ad a-rate) i denota variabili di inizializzazione (calcolate a i-rate) k denota variabili di controllo (calcolate a k-rate) x denota una qualsiasi delle precedenti Note Dalla versione 5.13 si possono fare assegnamenti multipli tra variabili calcolate a i-rate e tra variabili a k-rate. In tal caso normalmente il numero di valori a destra dell’operatore = è uguale rispetto al numero di valori a sinistra. Può anche essere minore, in tal caso viene ripetuto l’ultimo valore disponibile Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Inizializzazione delle variabili • Gli opcode che permettono di inizializzare le variabili sono 4: 2. Opcode divz Sintassi ares divz xa, xb, ksubst ires divz ia, ib, isubst kres divz ka, kb, ksubst Divide “in modo sicuro” a per b e assegna il risultato a res. Se b è nullo, allora assegna il valore subst. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Inizializzazione delle variabili • Gli opcode che permettono di inizializzare le variabili sono 4: 3. Opcode init Sintassi ares init iarg ires init iarg kres init iarg ares, ... init iarg, ... ires, ... init iarg, ... kres, ... init iarg, ... Dalla versione 5.13 accetta assegnamenti multipli purché il num di input sia minore o uguale a quello di output. Comportamento apparentemente simile all’operatore =, ma attenzione: inizializza solo una volta il risultato. Si tratta dell’unico caso di istruzione a init-time cui è permesso di scrivere in una cella risultato a perf-time (k- o arate). Dopo la prima inizializzazione, durante l’esecuzione dell’evento sonoro l’istruzione non viene più presa in considerazione. → 06_05_initialize.csd (esercizio della Lezione 6) Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Inizializzazione delle variabili • Gli opcode che permettono di inizializzare le variabili sono 4: 4. Opcode tival Sintassi ir tival Deposita in una variabile di inizializzazione il valore di un flag – detto internal tie-in - che tiene conto di un’eventuale legatura tra la nota corrente e quella precedentemente emessa dallo strumento. Assegna 1 se la nota corrente risulta “legata” a una nota precedente dello stesso strumento, 0 altrimenti. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Espressioni • Le espressioni si possono comporre e annidare. Ogni parte dell’espressione viene valutata al rate più opportuno. • Esempio: k1 + abs(int(p5) + frac(p5) * 100/12 + sqrt(k1)) – il rapporto 100/12 viene valutato all’inizializzazione dell’orchestra – l’espressione p5 all’inizializzazione della nota – tutto il resto viene valutato a ogni periodo della frequenza di controllo Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Costanti matematiche predefinite • Csound definisce le più importanti costanti matematiche come macro. • Le macro in una orchestra operano come le macro del pre-processore C: vengono sostituite nell’orchestra con i corrispettivi valori prima della compilazione. Macro $M_E $M_LOG2E $M_LOG10E $M_LN2 $M_LN10 $M_PI $M_PI_2 $M_PI_4 $M_1_PI $M_2_PI $M_2_SQRTPI $M_SQRT2 $M_SQRT1_2 Valore 2.7182818284590452354 1.4426950408889634074 0.43429448190325182765 0.69314718055994530942 2.30258509299404568402 3.14159265358979323846 1.57079632679489661923 0.78539816339744830962 0.31830988618379067154 0.63661977236758134308 1.12837916709551257390 1.41421356237309504880 0.70710678118654752440 Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Equivalente a e log_2(e) log_10(e) log_e(2) log_e(10) pi pi/2 pi/4 1/pi 2/pi 2/sqrt(pi) sqrt(2) 1/sqrt(2) Macro d’orchestra • Le macro sono sostituzioni di testo che vengono operate all’interno dell’orchestra quando questa viene valutata. • In Csound il sistema di definizione e richiamo di una macro è molto semplice. Si usano: – il carattere # per definire una macro – il carattere $ per richiamarla • Sintassi per macro semplice e macro con argomenti: #define NAME # replacement text # #define NAME(a' b' c') # replacement text # Attenzione: replacement text non può contenere caratteri # Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Definizione delle macro d’orchestra • #define NAME Definisce una macro semplice. Il nome NAME deve iniziare per lettera e può essere composto da una qualsiasi combinazione di lettere e numeri. Il nome è case sensitive. In questa forma semplice, i nomi delle variabili sono fissi. Per ottenere maggiore flessibilità… • #define NAME(A'B'C') Definisce una macro con argomenti, separati dal carattere apice. All’interno del testo che sostituisce la macro, gli argomenti si possono sostituire con la forma $A (come se fossero macro semplici). Ci possono essere fino a 5 argomenti, il cui nome è composto da sole lettere ed è case sensitive. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Esempio di macro semplice <CsInstruments> sr = 44100 kr = 4410 nchnls = 1 ; Define the macros #define VOLUME #5000# #define FREQ #440# instr 1 ; Use the macros. The following line will be expanded to "a1 oscil 5000, 440, 1" a1 oscil $VOLUME, $FREQ, 1 … endin </CsInstruments> Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra Esempio di macro con argomenti <CsInstruments> sr = 44100 kr = 4410 nchnls = 1 Nell’esempio precedente, la sostituzione da parte della macro era fissa e non parametrica. Ma il testo sotteso dalla chiamata della macro può essere molto lungo e complesso, con alcune parti che si ripetono pedissequamente e altre che variano in funzione degli argomenti specificati. ; Define the macros #define OSCILMACRO(VOLUME'FREQ'TABLE) #oscil $VOLUME, $FREQ, $TABLE# instr 1 ; Use the macros. The following line will be expanded to "a1 oscil 5000, 440, 1" a1 $OSCILMACRO(5000'440'1) … endin </CsInstruments> Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra User Defined Opcodes (UDO) • Csound consente di definire nuovi opcode nell’intestazione dell’orchestra per poi usarli all’interno della definizione dei propri strumenti. L’argomento sarà ripreso nella Lezione 20. • Questo permette all’utente di definire nuove funzionalità aggregando opcode esistenti, o metodi più agevoli (alias) per impostare gli argomenti di opcode già esistenti. – – Ad esempio, un opcode predefinito può richiedere l’inserimento di numerosi argomenti, ma in un dato progetto molti di questi argomenti possono presentare valori fissi che dunque è inutile reimpostare ogni volta nei vari strumenti che fanno uso di tale opcode (se invece l’opcode venisse usato in un unico strumento, sarebbe motlo più semplice inserire delle costanti anziché delle variabili) Ad esempio, alcuni opcode – ad esempio quelli che realizzano filtri passabanda – utilizzano argomenti che si preferisce esprimere in altra forma (vedi Lezione 11) Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: orchestra