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
Scarica

Presentazione del corso