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
Scarica

Presentazione del corso