Lezione 8 Istruzione f e GEN Programmazione timbrica - Prof. Luca A. Ludovico Funzionamento dell’oscillatore digitale • Come è noto dalla prima lezione, l’opcode oscil (e la sua variante a interpolazione lineare oscili) funziona andando a leggere ciclicamente da una tabella tutti e soli i valori di un singolo periodo. • Tali valori vengono «consumati» alla velocità opportuna, con eventuale replica o interpolazione nel caso sia necessario leggere un valore non scritto nella tabella (argomento frequenza); essi vengono inoltre riscalati in ampiezza (argomento ampiezza). • Per semplicità, finora si è considerato: – – Una forma d’onda sinusoidale pura, in cui il ciclo è rappresentato dal calcolo dei valori della funzione f = sin(x) Una versione semplificata dell’opcode oscil, in cui non si è specificato il terzo parametro (quindi per default la forma d’onda elementare riprodotta da oscil è proprio la sinusoide) Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN Sintassi completa di oscil/oscili • L’opcode oscil legge la tabella ifn in modo sequenziale e ripetuto alla frequenza xcps. L’ampiezza viene riscalata del valore xamp. • Sintassi ares oscil xamp, xcps [, ifn, iphs] kres oscil kamp, kcps [, ifn, iphs] • L’argomento ifn (opzionale) rappresenta il numero di una tabellafunzione. La tabella di default è -1, che indica una sinusoide. • L’argomento iphs (opzionale, default=0) è la fase iniziale espressa come una frazione del ciclo, quindi [0..1]. Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN Cos’è una tabella-funzione • Le tabelle-funzione sono array di valori in virgola mobile, identificate da un numero intero positivo. Esse vengono definite nella sezione di score. • Tramite un’opportuna sintassi, è possibile definire l’istante di creazione (ed eventualmente di distruzione) di una data tabella, esprimendolo in beat (in accordo con la misura del tempo nello score). • In generale va inoltre definita la dimensione della tabella, intesa come numero di punti. Essa deve essere una potenza di 2 (in alcuni casi una potenza di 2 + 1). La dimensione massima è 16777216 (224) punti. – Storicamente, Csound accettava solo tabelle con dimensione potenza di 2. Nelle versioni più recenti è ammessa una dimensione qualsiasi. In tal caso però, la dimensione va espressa attraverso un valore negativo. Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN Come si riempie una tabella-funzione: GEN • Le GEN sono routine di generazione di dati per le tabelle. Ne esistono diverse famiglie: – – – – – – – – – – – Sine/Cosine Generators Line/Exponential Segment Generators File Access GEN Routines Numeric Value Access GEN Routines Window Function GEN Routines Random Function GEN Routines Waveshaping GEN Routines Amplitude Scaling GEN Routines Mixing GEN Routines Pitch and Tuning GEN Routines Named GEN Routines • Elenco completo: http://www.csounds.com/manual/html/ScoreGenRef.html Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN L’istruzione f • L’istruzione f (o Function Table Statement) è una delle istruzioni di score. Essa fa in modo che una routine GEN ponga dei valori all’interno di una tabella-funzione. Il calcolo dei valori dipende dalla specifica GEN. • Sintassi: f p1 p2 p3 p4 p5 ... PMAX, ove – p1 è il numero di tabella con cui ci si riferirà ai valori memorizzati. Un valore negativo implica la distruzione della tabella – p2 è l’istante di generazione (o distruzione) della tabella, espresso in pulsazioni – p3 è la dimensione della tabella-funzione, espressa in numero di punti – p4 è il numero di routine GEN richiamata. Normalmente i valori in tabella vengono normalizzati nell’intervallo [-1..+1], ma se il numero di GEN è reso negativo, allora non viene eseguita la normalizzazione – p5 ... PMAX sono parametri il cui significato cambia di GEN in GEN Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN GEN10 • GEN10 è una routine di generazione dati per le tabelle-funzione che appartiene alla famiglia dei generatori di seni/coseni. Essa è in grado di generare forme d’onda composte, fatte di somme pesate di sinusoidi semplici. • Sintassi: f # time size 10 str1 str2 str3 str4 ... ove str1, str2, str3, …, strn (ossia da p5 in avanti) sono il peso relativo rispettivamente della fondamentale, 2a, 3a, …, n-esima armonica. Alle componenti non richieste sarà attribuito peso 0. • Vi sono due limitazioni di GEN10: le componenti sinusoidali devono essere armoniche e devono essere in fase. Questi limiti vengono superati da GEN09 e GEN19, come si vedrà nel seguito. Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN Esempi di GEN10 • Esempi di GEN10 si trovano in → 08_01_gen10.csd Forme d’onda dell’esempio, con diagrammi a lato: f 1 0 16384 10 1 onda sinusoidale con la sola fondamentale f 2 0 16384 10 1 0.5 0.3 0.25 0.2 0.167 0.14 0.125 0.111 dente di sega, fondamentale e 8 armoniche f 3 0 16384 10 1 0 0.3 0 0.2 0 0.14 0 0.111 onda quadra, fondamentale e 8 armoniche (4 senza energia) f 4 0 16384 10 1 1 1 1 0.7 0.5 0.3 0.1 impulso, fondamentale e 8 armoniche Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN GEN09 • GEN09 – al pari di GEN10 - è una routine della famiglia dei generatori di seni/coseni, in grado di generare forme d’onda composte, fatte di somme pesate di sinusoidi semplici. La principale differenza è che la definizione di ogni componente parziale richiede di specificare 3 campi. • Sintassi: f # time size 9 pna stra phsa pnb strb phsb ... ove – – – pna, pnb, ecc. danno il numero di componente sinusoidale parziale rispetto a una fondamentale il cui ciclo occupa l’intera tabella. Il valore deve essere positivo, ma non intero (quindi sono consentite componenti inarmoniche) e l’ordine non deve essere rispettato; stra, strb, ecc sono i pesi relativi delle parziali pna, pnb, ecc., solitamente poi normalizzati. Valori negativi sono consentiti: implicano una fase di 180°; phsa, phsb, ecc. esprimono la fase iniziale delle parziali pna, pnb, ecc. in gradi [0..360]. Ogni fase può assumere un valore differente. • Esempio: → 08_02_gen09.csd Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN Forma d’onda: La normalizzazione • I valori scritti nelle tabelle-funzione dalle varie GEN sono in generale normalizzati, ossia riscalati di modo che i picchi si trovino in +1 e -1. – Si osservi che il contenuto di una tabella-funzione non è necessariamente il ciclo di una sinusoide semplice: ad esempio, già GEN10 è in grado di valorizzare la tabella con una somma pesata di sinusoidi. • Per evitare l’effetto di normalizzazione, il numero identificativo della GEN deve essere preceduto dal segno meno. • Ad esempio, la seguente riga ha picchi in +500 e -500: f 1 0 4096 -10 100 100 100 100 70 30 Di conseguenza, la seguente riga dello score genera un’ampiezza compresa nell’intervallo [-30000..+30000] aout oscil 60, 200, 1 Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN GEN19 • GEN19 – al pari di GEN09 e GEN10 - è una routine della famiglia dei generatori di seni/coseni, in grado di generare forme d’onda composte, fatte di somme pesate di sinusoidi semplici. La principale differenza è che la definizione di ogni componente parziale richiede di specificare 4 campi. • Sintassi: f # time size 19 pna stra phsa dcoa pnb strb phsb dcob ... • Rispetto a GEN09, oltre alla terna di parametri [numero di armonica, peso, fase] per ciascuna componente è possibile specificare il DC offset, ossia una traslazione sull’asse y. • Il DC offset è applicato sulle singole componenti prima della normalizzazione. Ad esempio, se il peso è 2 i picchi si trovano in [-2..+2]. Con un DC offset di +2, i picchi traslano in [0..+4] Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN DC offset in elettronica Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN Esempio di GEN19 • Nell’esempio → 08_03_gen19.csd viene realizzata una curva a campana, la cui forma è mostrata a lato attraverso la riga di codice f 1 0 16384 -19 1 1 270 1 ossia un generatore di sinusoidi a 4 argomenti, senza normalizzazione finale e con un’unica quaterna: – – – – numero di componente: 1, quindi la fondamentale peso: 1, quindi picchi in +1 e -1 fase: 270, quindi inizio a ¾ del ciclo della sinusoide (vedi figura a lato) DC offset = 1, quindi picchi in +2 e 0 (traslazione al semiasse positivo delle y) Programmazione timbrica - Prof. Luca A. Ludovico Istruzione f e GEN