Lezione 9 Spazializzazione Programmazione timbrica - Prof. Luca A. Ludovico Orchestre stereofoniche: opcode outs • Finora nell’header: nchnls = 1 → ogni strumento era monofonico. Opcode per valorizzare il buffer di accumulazione: out avar. • In Csound è possibile utilizzare un numero n di canali con n > 1. Per le orchestre stereofoniche: nchnls = 2. Opcode di output: outs, che scrive dati audio stereo (cioè in un buffer di accumulazione stereo) • Sintassi: outs asig1, asig2 ove asig1 e asig2 in generale sono totalmente indipendenti tra loro. • Il tipo di opcode di scrittura dovrebbe tener conto di nchnls. Ma dalla versione 3.50, Csound cerca di correggere eventuali errori nell’uso degli opcode autonomamente. Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Possibilità fornite dalla stereofonia In un contesto stereofonico, è possibile: 1. definire uno strumento le cui caratteristiche timbriche variano di canale in canale, e/o… 2. … considerare un timbro monofonico (ossia le cui caratteristiche risulterebbero identiche sui due canali) e stabilire il posizionamento di ogni evento sonoro prodotto sul fronte stereo. – Se tale impostazione è fissa per tutta la durata dell’evento sonoro, è possibile esprimere questa informazione all’interno dello score, attraverso la valorizzazione di un opportuno pn con n > 3. – Se invece si vuole far variare il posizionamento durante l’emissione, bisogna affidarsi a opportune variabili di controllo o audio all’interno dell’instrument block dell’orchestra. • Esempio: → 09_01_2channels.csd Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Posizionamento «statico» nel fronte stereo • Si consideri uno strumento che supporta il posizionamento di ogni evento sonoro sul fronte stereo in modo statico, ossia senza variazioni per tutta l’accensione dell’evento stesso. • Un possibile approccio è calcolare opportunamente la variabile audio d’uscita e pesarne la presenza sul canale destro e sinistro attraverso un fattore moltiplicativo. • Ad esempio, sia p6 il p-field dello score con informazioni sul canale. Ci consideri una valorizzazione normalizzata sull’intervallo [0..1], ove 0 significa suono presente tutto e solo sul canale sinistro e 1 sul canale destro. Allora si può scrivere: outs aout * (1 – p6), aout * p6 → 09_02_stereo_position_1.csd Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Osservazioni • Il metodo descritto è molto semplice, ma non è del tutto soddisfacente. Infatti, mano a mano che il segnale si avvicina alla posizione centrale si percepisce un’intensità minore. Questo perché l’intensità percepita è proporzionale alla potenza del segnale, ossia al quadrato dell’ampiezza. • Poiché P = A2: – se A = 0 allora P = A = A2 = 0 (nessuna differenza rispetto a prima) – se A = 1 allora P = A = A2 = 1 (nessuna differenza rispetto a prima) – se però le sorgenti sono 2, e per ciascuna si ha A = 0.5 (segnale al centro), Psx = Asx2 = 0.52 = 0.25 e analogamente Pdx = Adx2 = 0.52 = 0.25 quindi Ptot = Psx + Pdx = 0.5, che è la metà della potenza che si registrerebbe concentrando il segnale su un solo canale. Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Posizionamento «statico» nel fronte stereo • Esistono varie soluzioni al problema. Proposta semplice ma efficace di Charles Dodge: definire i fattori moltiplicativi per i canali sinistro e destro, sempre definiti nell’intervallo [0..1], come la radice quadrata del segnale di controllo per lo stereo. • In Csound il calcolo della radice quadrata si effettua tramite la funzione matematica sqrt (square root). • Prima: Ora: outs outs aout * (1 – p6), aout * sqrt(1 - p6), aout * p6 aout * sqrt(p6) Ad esempio, se p6 = 0.5, la radice è circa 0.71 quindi l’attenuazione dovuta al fattore moltiplicativo è inferiore a 0.5. → 09_03_stereo_position_2.csd Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Posizionamento «dinamico» nel fronte stereo • Se si vuole implementare uno strumento che supporta variazioni del posizionamento di ogni evento sonoro sul fronte stereo durante l’accensione dell’evento stesso, è necessario basarsi su variabili audio (presumibilmente sovradimensionate per lo scopo) o – meglio ancora – su variabili di controllo. • Ad esempio, si voglia implementare nota per nota un posizionamento che varia ciclicamente dal canale sinistro al canale destro a una data frequenza. Deve essere possibile identificare il punto iniziale del posizionamento stereo, nonché fissare la frequenza nota per nota all’interno dello score. • Nell’esempio → 09_04_stereo_circles.csd si affronta prima quest’ultimo problema (instr 1), per poi introdurre il secondo aspetto (instr 2). Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Quadrifonia, esafonia, ottofonia, … • Se il formato scelto per l’output li supporta, Csound gestisce un numero di canali maggiore di 2. – – Ad esempio, i formati WAV e AIFF sono tra quelli che supportano più di 2 canali Per l’ascolto è però necessario hardware dedicato, ad esempio una scheda audio multi-canale e un numero adeguato di diffusori. In alternativa, è possibile aprire il file con un editor di forma d’onda per «vedere» il risultato. • Casi notevoli – 4 canali, o quadrifonia: non esiste un’unica disposizione delle casse; – 6 canali, o esafonia: la configurazione tipica è lo standard surround 5.1 (Dolby Digital AC3, DTS e THX), ma anche altre disposizioni sono possibili; – 8 canali, o ottofonia: a parte lo standard cinematografico 7.1 Sony S.D.D.S., non esiste una disposizione tipica. Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Quadrifonia, esafonia, ottofonia, … • Sintassi in Csound: innanzi tutto, il numero di canali nell’header deve essere opportunamente valorizzato. • Negli instrument block, vanno usati gli opcode: outq asig1, asig2, asig3, asig4 outh asig1, asig2, asig3, asig4, asig5, asig6 outo asig1, asig2, asig3, asig4, asig5, asig6, asig7, asig8 outx asig1, asig2, asig3, asig4, asig5, asig6, asig7, asig8, …, asig16 out32 asig1, asig2, asig3, asig4, asig5, asig6, asig7, asig8, …, asig32 • L’opcode outc scrive in uscita il numero di canali forniti in ingresso. Ogni canale che supera nchnls viene ignorato. Se invece nchnls è maggiore, vengono aggiunti degli 0. • Esempi: → 09_05_fourchannels.csd, 09_06_fivechannels.csd Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Output indirizzato al canale n • Esistono opcode per redirigere il suono su un particolare canale scelto tra quelli disponibili nel contesto multi-canale corrente. • La sintassi degli opcode necessari allo scopo prende spunto dal nome dell’opcode da usare nel contesto multi-canale corrente (quindi outs per la stereofonia, outq per la quadrifonia, ecc.), ma prevede un suffisso con il numero di canale su cui operare la redirezione, numerato a partire da 1. Inoltre, l’argomento in ingresso è uno solo. • Ad esempio, outs1 avar invia l’uscita al canale stereo 1, e outs2 avar al canale stereo2. Analogamente, in un contesto di quadrifonia outq3 avar scrive i dati relativi al canale 3. • Esempio: → 09_07_incrementalchannels.csd Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Output indirizzato al canale n • L’opcode outch scrive dati audio multicanale con la possibilità per di controllare il canale di uscita, anche alla frequenza di controllo. • Sintassi: outch kchan1, asig1 [, kchan2] [, asig2] [...] ove asig1 viene inviato sul canale individuato – potenzialmente a krate - da kchan1, asig2 su kchan2, e via dicendo. • Osservazione: il massimo valore ammesso per kchanX dipende da nchnls. Se kchanX supera nchnls, asigX verrà silenziato. In tal caso, l’opcode outch segnalerà un warning ma non una condizione di errore. • Esempio: → 09_08_dynamic_redirect.csd Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Simulazione della spazializzazione 3D • Spazializzazione binaurale (ovvero a due orecchie): metodo di registrazione e riproduzione 3D del suono per riprodurre in cuffia il più fedelmente possibile le percezioni acustiche di un ascoltatore situato nell'ambiente originario di ripresa dell'evento sonoro, mantenendone le caratteristiche direzionali a 360° sferici. • Si utilizzano i 2 canali stereo per ricreare lo spazio tridimensionale. L’ascolto deve avvenire in cuffia, perché i dettagli dell’immagine spaziale andrebbero perduti a causa degli effetti dell’ambiente di ascolto (riverberi, filtraggi, ecc.) • Tecnica nota dall’ottocento, ma difficile da riprodurre prima della diffusione del walkman. Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Simulazione della spazializzazione 3D • Varie tecniche di registrazione tridimensionale: – due microfoni posti su un sostegno in direzione reciprocamente divergente, a circa 18 cm di distanza l'uno dall'altro. Tecnica semplice, ma non tiene conto dell’effetto della fisica della testa; – utilizzo di una testa di manichino (dummy head), costruita con dimensioni e materiali atti a riprodurre fedelmente l'assorbimento sonoro di una vera testa umana e la sua funzione di separatore naturale tra i due canali uditivi (destro e sinistro). La testa riproduce con particolare fedeltà la forma dei padiglioni auricolari e i canali uditivi, all'interno dei quali vengono posti due microfoni ad alta fedeltà. In tal modo i microfoni captano il suono come risulta equalizzato e modificato in fase dalla testa, e quindi nel modo più simile a come l'avrebbe percepito un ascoltatore reale. Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Simulazione della spazializzazione 3D • Alla base del sistema vi è la riproduzione di una serie di dati sperimentali attraverso microfoni ad alta fedeltà. I suoni impulsivi vengono emessi a distanza ed angolazione differente. • In tal modo si costruisce una base di dati con i parametri per il filtraggio in funzione della direzione del suono da ricostruire. • Il modello di testa artificiale è detto HRTF, ossia Head-Related Transfer Function. Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Implementazione in Csound: opcode hrtfer • Sintassi: aleft, aright hrtfer asig, kaz, kelev, “HRTFcompact” dove – asig è il segnale audio monofonico da posizionare; – kaz è il valore di azimuth (posizione orizzontale) in gradi. Valori positivi rappresentano posizioni sulla destra, valori negativi sulla sinistra rispetto al punto di vista dell’ascoltatore; – kelev è il valore di elevazione (posizione verticale) in gradi. Valori positivi rappresentano posizioni sopra l’orizzonte, negativi sotto l’orizzonte; – HRTFcompact è al momento l’unico file supportato che contiene la funzione di trasferimento. Esso deve essere passato come costante stringa, denotata da doppi apici. HRTFcompact si può inoltre ottenere via FTP al seguente link: ftp://ftp.cs.bath.ac.uk/pub/dream/utilities/Analysis/HRTFcompact Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione Implementazione in Csound: opcode hrtfer • Sintassi: aleft, aright hrtfer asig, kaz, kelev, “HRTFcompact” • I segnali di uscita sono contenuti in aleft e aright. Spesso tali valori devono essere riscalati in ampiezza (attraverso la moltiplicazione per una costante) per poter risultare apprezzabili. • Limitazioni: – – Per poter apprezzare la spazializzazione binaurale, il file prodotto deve essere stereo e deve essere ascoltato in cuffia; La frequenza di campionamento deve necessariamente valere sr = 44100 Hz, in quanto il file con la funzione di trasferimento è stato generato a questa frequenza. • Esempio: → 09_09_hrtf.csd Programmazione timbrica - Prof. Luca A. Ludovico Spazializzazione