Lezione 4 Basi sintattiche: score Programmazione timbrica - Prof. Luca A. Ludovico Riassunto <CsoundSynthesizer> <CsOptions>/* opzioni */</CsOptions> <CsInstruments> ; header ; strumenti ORC CSD ; UDO </CsInstruments> <CsScore> ; partitura </CsScore> </CsoundSynthesizer> Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score SCO Partitura numerica standard • La sezione di score contiene eventi che istanziano strumenti dell’orchestra. Il termine più corretto è eventi (sonori) anziché note. • Attualmente, la lunghezza massima consentita per la partitura è 231-1 periodi di controllo. – Ad esempio, se kr=1500, si tratta di circa 16.5 giorni prima che si verifichino problemi a causa dell’overflow delle variabili intere (con segno) a 32 bit. • Inoltre, utilizzando valori numerici con virgola a precisione singola anziché doppia, l’accuratezza delle temporizzazioni peggiora con l’avanzare della performance, effetto che diventa percepibile solo con esecuzioni lunghe. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Preprocessing delle partiture numeriche • Una partitura – intesa come una collezione di istruzioni di partitura – è divisa in sezioni ordinate temporalmente attraverso istruzioni s. In altre parole, un’istruzione s apre una nuova sezione della partitura, al cui interno la temporizzazione degli eventi riparte dall’istante 0 (che però è successivo a un generico istante n della sezione precedente) Prima di leggere l’orchestra, una partitura viene pre-elaborata (preprocessing) una sezione alla volta. L’ultima sezione è denotata dall’istruzione e (end). • Ogni sezione viene poi elaborata da 3 routine: Carry, Tempo, e Sort. Prima di descriverne il significato, introduciamo l’istruzione i Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Istruzione i (instrument statement) • L’istruzione i – detta anche istruzione strumento o istruzione nota – è fondamentale per la definizione di una partitura, che in termini semplici può essere vista essenzialmente come una sequenza di tali istruzioni. • L’istruzione i rende attivo un determinato strumento a un dato istante di tempo e per una certa durata. • I valori dei parametri vengono passati allo strumento prima della sua inizializzazione, e rimangono validi e fissati per tutta la sua esecuzione (nota per nota). • Sintassi i p1 p2 p3 p4 ... Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Parametri dell’istruzione i • Sintassi i p1 p2 p3 p4 ... • p1: Numero dello strumento, tipicamente intero non negativo. Questo parametro crea il legame tra il sorgente dello score e quello dell’orchestra, di fatto assegnando l’evento sonoro corrente a un dato strumento. – – Un’eventuale parte frazionaria può specificare un tag per stabilire una legatura tra note di cluster consecutivi. Un valore negativo può essere utilizzato per spegnere una nota tenuta. • p2: Istante di inizio/accensione dell’evento (start time), espresso in unità di tempo arbitrarie chiamate beat. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Parametri dell’istruzione i • Sintassi i p1 p2 p3 p4 ... • p3 – Durata dell’evento (duration time) in beat, tipicamente positiva. – – Un valore negativo può essere utilizzato per dare avvio a una nota tenuta (si veda ihold), oppure per contrassegnare strumenti “always on” quali un riverberatore. Queste note non vengono terminate da istruzioni s. Un valore zero invocherà un passo di inizializzazione senza esecuzione associata. • p4 ...: Parametri opzionali il cui significato viene determinato dal singolo strumento. Ad esempio, può trattarsi dell’intensità iniziale che si vuole assegnare alla nota, o delle frequenze di taglio di un banco di filtri, ecc. – Tali valori dovranno essere letti e gestiti all’interno dello strumento. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Esempio • Sintassi i p1 p2 p3 p4 ... • Esempio ;p1 p2 p3 i1 0 .5 i1 0.5 .5 i1 1.0 .5 i1 1.5 .5 ; silenzio/pausa i1 3.0 1 p4 p5 0 8.01 0 8.03 0 8.06 0 8.08 di 1 beat 0 8.10 Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score (il primo p è spesso contiguo a i) (non sono propriamente secondi) Temporizzazione dell’istruzione i • Gli istanti di start degli eventi sono relativi all’inizio della sezione corrente, cui è assegnato un (nuovo) istante 0. • Di deafault, i beat presentano come unità di misura il secondo, a meno che all’interno della sezione corrente si trovi un’istruzione t (o un flag –t nell’invocazione a riga di comando o nelle opzioni del CSD). • Di fatto, il metronomo di default (che può essere variato attraverso un’istruzione t, ed è contestuale alla singola sezione dello score) è 60 BPM (beats per minute). • L’istruzione t verrà trattata nel seguito della presentazione. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Esecuzione dell’istruzione i • Le istruzioni i all’interno di una sezione possono trovarsi in qualsiasi ordine. Prima di essere inviate all’orchestra, vengono processate dal modulo detto Sorter che le riordina in base al valore crescente di p2. – Eventi con lo stesso valore di p2, sono ordinati per p1 crescente, e infine per p3 crescente. • Un singolo strumento può eseguire un numero a piacere di note simultanee, che comportano invocazioni “indipendenti” dello strumento – Lo spazio dati per ogni copia dello strumento viene allocato dinamicamente dal modulo Loader dell’orchestra • Ogni evento verrà normalmente spento quando si consuma la durata specificata da p3. – Uno strumento può comunque forzare questo vincolo modificando il p3 all’inizializzazione della nota, o utilizzando opcode quali linenr o xtratim. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Routine di riporto (carry) • In un gruppo di istruzioni i consecutive aventi lo stesso p1, ogni campo p lasciato vuoto sarà valorizzato copiando il valore dall’istruzione precedente. Per rendere esplicito questo comportamento, si può utilizzare la notazione con un singolo . separato da spazi • Dopo la pre-elaborazione della routine, i valori compariranno nello score in modo esplicito. • L’output non viene influenzato da eventuali commenti o righe vuote. L’operazione di riporto viene invece interrotta da qualsiasi istruzione diversa da i e da istruzioni i con p1 differente, cioè riferite a un altro strumento Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Routine di riporto (carry) • Per il solo parametro p2 (quello legato allo start time dell’evento) sono consentiti altri 3 operatori: – L’operatore + attribuisce al nuovo start time lo start time p2 dell’evento precedente incrementato del p3 precedente. In pratica, la nuova nota inizia immediatamente dopo lo spegnimento di quella precedente. L’operatore + viene a sua volta riportato, come mostrato dall’esempio sotto i i i – 1 . 0 + .5 100 diventa i i i 1 1 1 0 .5 1 .5 .5 .5 100 100 100 Gli operatori ^+x e ^-x, ove x è un valore numerico con virgola, determina il p2 dell’evento corrente sommando o sottraendo il valore di x dal p2 dell’evento precedente. Per questi operatori non è ammesso il riporto. i i i 1 . . 0 ^+1 ^+1 .5 100 Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score diventa i i i 1 1 1 0 1 2 .5 .5 .5 100 100 100 Routine di tempo e ordinamento (sort) • La routine di tempo converte gli start time p2, e per le istruzioni I anche p3, da beat a secondi, essendo quest’ultima l’unità di misura richiesta dall’orchestra. – Perché non usare direttamente i secondi nello score? Diventerà chiaro affrontanto l’istruzione t (vedi slide successive) • La routine di ordinamento riordina tutte le istruzioni presenti nel codice a seconda del loro valore di p2. Assegna inoltre a eventi coincidenti un ordine di precedenza. Questo consente di scrivere le istruzioni di uno score in qualsiasi ordine all’interno di una sezione. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Altre score features • Al termine di ciascuna operazione di Carry, Sort e Tempo, all’atto della scrittura del file vengono interpretati altri elementi sintattici dello score: next-p, previous-p e ramping. • Next-p e previous-p, espressi tramite le sintassi npn e ppn con n intero positivo implicano di copiare il valore di quel dato parametro (cioè pn) dall’evento avente uguale p1 (quindi assegnato allo stesso strumento) rispettivamente all’istruzione i precedente o successiva. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Next-p e previous-p • Caratteristiche e limiti – Ignorano eventuali eventi interpolati affidati ad altri strumenti, ma non le interruzioni di sezione – Possono essere richiamati ricorsivamente e possono far riferimento ad altri simboli next-p e previous-p (ma ad un certo punto la catena deve condurre a un valore effettivo) – Non possono essere utilizzati nelle colonne p1, p2 e p3, ma possono riferirsi ai valori di tali colonne – Possono essere oggetto di riporto (ossia carry) – Riferimenti a valori non esistenti vengono sostituiti da 0 – E’ necessario evitare loop, ossia definizioni cicliche Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Next-p e previous-p: esempi i1 0 1 10 np4 pp5 i1 1 1 20 i1 1 1 30 → i1 0 1 10 20 0 i1 1 1 20 30 20 i1 2 1 30 0 30 in quanto np4 e pp5 si propagano per via del riporto i1 0 1 10 np4 i1 1 1 pp5 0 dà problemi per via del riferimento ciclico i1 0 1 10 np1 i1 1 pp3 0 dà problemi (solo alla seconda istruzione) per via NON del riferimento a p1 e a p3 ma a causa della posizione in cui si trova pp3 Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Ramping lineare • I parametri delle istruzioni i contenenti il carattere < saranno sostituiti da valori calcolati da interpolazione lineare tra il primo numero reale precedente e successivo trovato sulla stessa colonna per eventi eseguiti dallo stesso strumento. • Le rampe non possono estendersi attraverso sezioni. I simboli di ramping non sono ammessi su p1, p2 and p3. I simboli possono essere soggetti a riporto. • E’ necessario prestare attenzione a quanto avviene con il riordino delle istruzioni ad opera della routine di Sort. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Esempio di ramping lineare i1 i1 i1 i1 i1 i1 0 1 2 3 4 5 1 1 1 1 1 1 100 < < 400 < 0 Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score diventa i1 i1 i1 i1 i1 i1 0 1 2 3 4 5 1 1 1 1 1 100 200 300 400 200 1 0 Ramping esponenziale e randomico • A partire da Csound versione 3.52, è possibile ottenere ramping esponenziale utilizzando i simboli ( o ). • L’utilizzo del carattere tilde ˜ avrà come risultato una distribuzione casuale uniforme tra il primo e l’ultimo valore della rampa. • Le regole e le limitazioni di uso di queste altre forme di ramping sono le stesse del ramping lineare. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score PRINCIPALI ISTRUZIONI DI SCORE Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score L’istruzione t (tempo statement) • L’istruzione t (tempo) permette di specificare un’associazione tra beat e secondi, sezione per sezione e con possibilità di variazione. Di default il metronomo è 60 BPM (1 beat = 1 secondo). • Un’istruzione t può apparire in qualsiasi punto della sezione. Ne fosse presente più d’una, solo la prima verrebbe presa in considerazione. • Sintassi dell’istruzione t t p1 p2 p3 p4 ... (unlimited) ove p1 deve essere 0, p2 è il tempo iniziale in BPM, e i successivi argomenti vanno letti a coppie interpolate: p3, p5, p7,... - Istanti in beat, specificati in ordine non decrescente p4, p6, p8,... - Nuovi valori di metronomo in corrispondenza dei beat • Si viene così a determinare un grafico beat – secondi. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Esecuzione dell’istruzione t • Sintassi dell’istruzione t: t p1 p2 p3 p4 ... (unlimited) Tra i valori di BPM via via specificati avviene interpolazione lineare. Un accelerando tra i valori di metronomo M1 e M2 fa variare in modo lineare la durata in secondi della pulsazione da 60/M1 a 60/M2. – Ad esempio, se M1 = 60 ed M2 = 120, la durata della pulsazione passa da 1s a 0.5s • Per impostare un bpm costante: – – si specifica un unico valore (ma tale valore non potrà mai cambiare nella sezione corrente), oppure si specificano due istanti temporali distinti valorizzati allo stesso bpm Una volta assegnato, l’ultimo BPM rimane fisso per tutta la sezione. • Il diagramma può contenere punti di discontinuità, ossia due valori di BPM distinti collegati allo stesso istante temporale. Questo implica un cambio istantaneo del BPM. Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Esempio t i1 i1 i1 i1 i1 i1 i1 0 60 0 3 6 9 12 15 18 6 60 2 2 2 2 2 2 2 6 120 15 110 220 440 880 110 220 440 60 ;start tempo = 60 ;tempo = 60 ;stay at tempo 240 ;jump to 120 ;slow down to 60 ;slow down to 60 ;tempo = 60 Secondi Osservazione: il quarto evento inizia alla nona pulsazione, ma come si vede dal diagramma inizia prima di 9s. Infatti le prime 6 pulsazioni hanno avuto luogo nei primi 6 secondi (BPM = 60), ma le successive 3… Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score Esempio t i1 i1 i1 i1 i1 i1 i1 i1 0 240 0 3 6 9 12 15 18 21 12 30 2 2 2 2 2 2 2 2 15 240 110 220 440 880 110 220 440 880 Secondi Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score ;start tempo = 240 ;tempo = 240 ;slow down & ;slow down & ;slow down & ;slow down to 30 at 12 seconds ;speed up to 240 again ;stay at tempo 240 Riassunto sulle principali istruzioni • Nello score è possibile specificare le seguenti istruzioni: – Istruzione i istruzione strumento o nota, dà inizio e specifica la durata degli eventi sonori, associandoli a un dato strumento e consentendo un passaggio parametri – Istruzione s istruzione di sezione, crea una nuova sezione – Istruzione e istruzione di terminazione dello score – Istruzione t istruzione tempo, permette di impostare il metronomo di riferimento di una nuova sezione ed eventualmente di variarlo – Elenco completo: http://www.csounds.com/manual/html/ScoreStatements.html Programmazione timbrica - Prof. Luca A. Ludovico Basi sintattiche: score