Lezione 6 Uso delle variabili di controllo Programmazione timbrica - Prof. Luca A. Ludovico Introduzione • Durante l’esercitazione scorsa, si sono visti esempi semplici di strumenti musicali (generatori di sinusoidi) il cui comportamento era predefinito (ampiezza e frequenza prefissati) o al più reso parametrico e definito a init-time. • Introducendo l’utilizzo delle variabili di controllo – il cui valore viene ricalcolato a k-rate – sarà possibile far variare il comportamento dello strumento durante l’emissione dell’evento sonoro. Ci si concentrerà dunque sulla sezione di orchestra. • Si ricorda che le variabili di controllo: – – – vengono adottate quando la risoluzione del parametro da calcolare non deve essere elevata quanto quella dell’output audio fanno risparmiare tempo di calcolo hanno una convenzione di naming per cui le etichette identificative iniziano con k Programmazione timbrica - Prof. Luca A. Ludovico Uso delle variabili di controllo Interpolazione lineare: opcode line • Per generare un’interpolazione lineare all’interno di un instrument block dell’orchestra si può usare l’opcode line. • Sintassi: ares line ia, idur, ib kres line ia, idur, ib ove ia è il valore iniziale dell’interpolazione e ib è il valore assunto dopo idur secondi. • Attenzione: ib non è (necessariamente) il valore finale che assume la variabile. – – Se infatti la durata dell’emissione dell’evento sonoro è inferiore a idur, l’interpolazione viene interrotta. Se invece è superiore, vengono calcolati nuovi valori sulla base della pendenza della retta (quindi l’interpolazione prosegue oltre idur). Programmazione timbrica - Prof. Luca A. Ludovico Uso delle variabili di controllo Interpolazione esponenziale: opcode expon • Per generare un’interpolazione esponenziale all’interno di un instrument block dell’orchestra si può usare l’opcode expon. • Sintassi: ares expon ia, idur, ib kres expon ia, idur, ib ove ia è il valore iniziale dell’interpolazione e ib è il valore assunto dopo idur secondi. • Ancora una volta, ib non è (necessariamente) il valore finale che assume la variabile. • Attenzione: non sono ammessi valori nulli. Si può ovviare all’inconveniente usando valori piccoli a piacere (ad es. 0.0001). Programmazione timbrica - Prof. Luca A. Ludovico Uso delle variabili di controllo Esempi di utilizzo • E’ possibile creare uno strumento che fa variare l’ampiezza della sinusoide per avere un decadimento lineare a partire dal valore impostato come parametro in ingresso. Scegliendo opportunamente la valorizzazione di kr nell’header si determina la risoluzione delle variabili di controllo. Esempio: → 06_01_kamplitude.csd • E’ possibile creare uno strumento che, data in ingresso un’altezza espressa in Hz, generi in uscita una sinusoide che glissa fino alla metà della suddetta frequenza con interpolazione esponenziale. Il glissando suona più naturale in quanto la percezione delle frequenze (e la loro mappatura su semitoni «uguali») ha una logica logaritmica. Esempio: → 06_02_kfreq.csd Programmazione timbrica - Prof. Luca A. Ludovico Uso delle variabili di controllo Interpolazione a segmenti: linseg ed expseg • L’opcode linseg disegna una serie di segmenti di retta tra i punti specificati. La variante a interpolazione esponenziale è expseg. • Sintassi: ares linseg ia, idur1, ib [, idur2] [, ic] [...] kres linseg ia, idur1, ib [, idur2] [, ic] [...] ove ia è il valore iniziale, e ib, ic ecc. sono i valori rispettivamente raggiunti dopo idur1, idur2 ecc. Secondi • L’ultimo segmento, con la propria pendenza, viene mantenuto indefinitamente finché si prolunga l’esecuzione dell’evento sonoro. Sono consentiti punti di discontinuità, ossia valori distinti separati da idurn = 0. • Esempio: → 06_03_segments.csd Programmazione timbrica - Prof. Luca A. Ludovico Uso delle variabili di controllo Inviluppi d’ampiezza: opcode linen • L’opcode linen permette di specificare un valore di riferimento (tipicamente l’ampiezza di un segnale), la durata complessiva dell’inviluppo, il tempo di raggiungimento del valore a regime e il tempo di decadimento del valore a 0. • Sintassi: ares linen xamp, irise, idur, idec kres linen kamp, irise, idur, idec • Possibile applicazione: inviluppo d’ampiezza tipico delle note musicali, in cui si riconosce una fase crescente (attack), una fase costante (sustain) e una fase calante (decay). • Esempio: → 06_04_amplitude_envelope.csd Programmazione timbrica - Prof. Luca A. Ludovico Uso delle variabili di controllo Osservazione: ampiezze negative • Cosa succede quando si utilizza per il parametro di ampiezza di una sinusoide un’interpolazione che assume valori negativi (in quanto esplicitamente indicati o come risultato del prosieguo di un’interpolazione)? • Si genera una sinusoide con picchi prima negativi e poi positivi, quindi una sinusoide in controfase. • A parte il punto di discontinuità (che comunque si raggiunge ad ampiezza 0), il nostro orecchio non è sensibile alla fase. Programmazione timbrica - Prof. Luca A. Ludovico Uso delle variabili di controllo ESERCIZIO Si scrivano due strumenti nell’orchestra che implementano un comportamento simile per quanto riguarda l’inviluppo dell’ampiezza delle note (sinusoidi pure). Tale inviluppo deve essere trapezoidale, con una fase crescente che si prolunga per ¼ della nota, la fase costante per ¼ della nota e la fase decrescente per il restante ½ della nota. I due strumenti devono implementare tale comportamento rispettivamente facendo uso dell’opcode linseg e dell’opcode linen. Programmazione timbrica - Prof. Luca A. Ludovico Uso delle variabili di controllo Inizializzazione delle variabili di controllo • Come visto durante l’esercitazione, inizializzare una variabile da ricalcolare a init-time può essere svolto indifferentemente tramite l’operatore = o tramite la parola riservata init. In entrambi i casi, il right value (costante, variabile, espressione) viene assegnato al left value (variabile di inizializzazione). • Nel caso di variabili di controllo, il comportamento di = e init invece differisce: – init agisce solo all’istante di calcolo delle variabili di inizializzazione, dopo di che viene ignorato; – al contrario, l’operatore = effettua l’assegnamento a ogni passo di ricalcolo delle variabili di controllo. • Esempio: → 06_05_initialize.csd Programmazione timbrica - Prof. Luca A. Ludovico Uso delle variabili di controllo