Relazione di Filippo Bergamo
Controllo in tempo reale
di strumenti Csound
Programmazione timbrica (Prof. Luca A. Ludovico)
Perché Csound in tempo reale?
• Multipiattaforma → il codice sviluppato può essere
utilizzato senza modifiche su qualunque macchina
Linux/Mac/Win che abbia i necessari moduli Csound
installati.
• Offre sia controllo completo a livello elementare (oscil
ecc.), sia metodi già implementati a livello complesso
(pluck, reverb, delay, ...)
• Buona reperibilità di pattern e UDO.
Comunità di discussione e sviluppo molto attiva.
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Fine-tuning per il tempo reale
• Lavorare in tempo reale pone un problema
fondamentale: la latenza. Non è trascurabile ai fini
dell'esecuzione musicale. E' sempre presente,
indipendentemente dal sistema specifico.
• Macchine odierne → processori potenti e grande
quantità di RAM (relativamente al fabbisogno)
Latenza minimizzabile fino a livelli trascurabili.
• Necessari accorgimenti e impostazioni per ottimizzare
le risorse:
Ottimizzazione codice + “tweaking” parametri
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Ottimizzare il codice (1)
●
A parità di punti in tabella oscili produce un output più
definito, tuttavia impegna circa il DOPPIO di cpu
rispetto a oscil.
→ maggiore latenza di calcolo!
●
●
L'occupazione di memoria non è critica.
Dimensioni memoria allocata non impoveriscono
latenza. Surplus di memoria a disposizione.
Soluzione: utilizzo di oscil “grezzo”, con dimensioni
maggiori della wavetable:
oscil con 16536 punti è più definito rispetto ad
oscili con 1024 punti!
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Ottimizzare il codice (2)
●
●
●
Evitare istruzioni condizionali e branch (if, goto...)
Ottimizzare operazioni matematiche: dove possibile
evitare divisioni e sostituirle con moltiplicazioni per
l'inverso (es. kvar / 4 diventa kvar * 0,25)
Con i-variabili:
ivol midictrl 7
ivol = ivol*200
aout oscil ivol, 1000, 1
VS.
Moltiplica solo ad inizializ.
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
ivol midictrl 7
aout oscil ivol*200, 1000, 1
Moltiplica ad ogni k-time
Tweaking
• Come funziona Csound?
Buffer memoria
Motore di
calcolo
Campioni audio
Buffer
DAC
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Tweaking
• Calcola campioni audio (impiega tempo CPU)
Buffer memoria
Motore di
calcolo
Campioni audio
Buffer
DAC
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Tweaking
• Scrive i campioni in un buffer nella propria porzione di
memoria
Buffer memoria
Motore di
calcolo
Campioni audio
Buffer
DAC
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Tweaking
• Quando il buffer interno è pieno, trasferisce al DAC
l'intero blocco di campioni
Buffer memoria
Motore di
calcolo
Campioni audio
Buffer
DAC
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Tweaking
• Il DAC consuma il proprio buffer interno, producendo
in output l'equivalente segnale analogico
Buffer memoria
Motore di
calcolo
Campioni audio
Buffer
DAC
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Tweaking – buffers (1)
●
●
●
●
Le dimensioni del buffer interno a Csound (e di quello
del DAC) influenzano latenza e definizione del suono
Finchè Csound non ha riempito il proprio buffer
interno NON passerà alcun campione al DAC
→ nessun output
Buffer grandi aumentano latenza
Buffer ristretti aumentano rischio di lacune nello
stream audio (salto di campioni)
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Tweaking – buffers (2)
●
●
●
Esempio:
buffer di 1024 campioni
sr=44100 → 23.2 ms di audio (mono)
Csound ha 23.2 ms per riempire nuovamente il buffer,
prima che il DAC esaurisca i campioni, producendo
una lacuna nello stream audio.
Quanto tempo impiega Csound a produrre 1024
campioni? Dipende dal codice, dalla potenza di calcolo
della macchina, dallo scheduling, ...
Dimensioni del buffer gestite empiricamente
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Tweaking – buffers (3)
●
●
●
Formula guida per il calcolo della latenza MAX:
MAX_LAT= (buff_sw + buff_hw) * nchnls / sr
Esempio:
sr = 44100
●
buff_sw=1024, buff_hw=256, stereo
●
latenza max = 0,058 sec (58ms) → eccessiva!
Massima latenza tollerabile in esecuzione musicale =
20ms
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Tweaking – buffers (4)
●
●
●
●
●
●
Per cambiare le dimensioni dei buffer:
Da riga di comando:
csound -b [buffSW] -B [buffHD] nomefile.csp
Da file csp:
<CsOptions> -b [buffSW] -B [buffHD] </CsOptions>
[buffSW]= dimensioni buffer interno a Csound
[buffHD]= dimensioni buffer DAC
Entrambi devono essere potenze di 2!!!
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Tweaking – altri parametri
●
●
●
Alzare il k-rate. K-rate più alti generano minor numero di
campioni per periodo, quindi minor latenza, a spese della
risoluzione temporale.
Impostare scheduling a priorità più alta per Csound
(disponibile sotto linux/ALSA richiede privilegi root)
●
tag --sched
Cambiare i driver di gestione audio:
Csound usa di defauld PortAudio, multipiattaforma.
Risultati migliori possono essere ottenuti con driver
specifici al OS (ALSA, ASIO, …)
●
tag -+rtaudio=[nome_driver]
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Input / Output in tempo reale
●
Di default Csound scrive l'output su file.
È necessario reindirizzare l'output alla scheda audio
●
tag -o dac[numDAC]
●
Per ottenere elenco dei dac disponibili: -o dac99
●
Diverse modalità di controllo dell'esecuzione:
●




MOUSE
ASCII KEYBOARD
WIDGETS (sliders, bottoni, ecc..)
MIDI
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Controllo via mouse - xyin
L'opcode xyin ritorna la posizione del puntatore del
mouse, in termini di coordinate x, y e la scrive sulle due
k-variabili kx, ky
Sintassi:
kx, ky xyin iprd, ixmin, ixmax, iymin, iymax
[, ixinit] [, iyinit]
iprd = periodo di refresh (tipicamente 0.1s)
Ixmin, ixmax, iymin, iymax = dimensioni della finestra entro
cui si muove il puntatore
ixinit, iyinit = valori iniziali di x e y (facoltativi)
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Controllo via mouse - xyin
ESEMPIO XYIN:
File xyin.csd
controllo di frequenza centrale e ampiezza di banda in un
filtro passa banda risonante su rumore bianco
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Controllo via tastiera ascii
●
●
●
L'opcode FLkeyIn fa parte della famiglia FLTK (Fast Light
Tool Kit, libreria grafica open source). È utilizzabile dopo
aver definito un pannello FLpanel entro il quale sono
ascoltati gli input.
Quando il focus è sulla finestra lanciata da FLpanel,
ritorna il codice ascii di un tasto premuto, o il codice ASCII
* -1 al rilascio del medesimo tasto.
È quindi possibile utilizzare i tasti ASCII per gestire
variabili di controllo come frequenza e ampiezza.
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Controllo via tastiera ascii (2)
●
●
●
È un metodo di controllo limitato.
Non è implementabile in polifonia (le note sono comunque
allocate staticamente nello score).
I codici ASCII non sono ordinati seguendo la disposizione
dei tasti
→ occorre mappare ogni singolo codice
ad un corrispondente valore utile
→ esempio: tastiera cromatica 1 ottava
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Controllo via tastiera ascii
ESEMPIO FlkeyIn:
File keymap.csd
controllo della frequenza di un semplice oscillatore digitale
tramite tastiera ASCII con mappatura in ftable GEN17.
La riga di tasti da [a] a [ù] compone una tastiera cromatica
a 12 semitoni / 1 ottava.
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Controllo via Widgets FLTK
●
●
●
●
FLTK, libreria che offre metodi grafici per lo sviluppo di
interfacce. Modulo incluso in Csound di default.
Consente la creazione di finestre contenenti slider,
bottoni, contatori, ecc.
I controller così creati modificano in tempo reale
parametri a k-rate
Esempio: gestione di portante, modulante e volume in un
semplice esempio di sintesi FM
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Controllo via Widgets FLTK
ESEMPIO FLTK:
File widgets.csd
gestione di portante, modulante e volume con knob e slider
grafici controllati via mouse.
Un semplice esempio di sintesi FM (opcode foscil)
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Controllo via Widgets FLTK (2)
Per maggiori dettagli e specifiche complete:
www.csounds.com/manual/html/ControlFltkIntro.html
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Controllo via MIDI – Perché?
●
●
●
●
È il metodo di controllo privilegiato per una efficacie
gestione in tempo reale di Csound
MIDI è lo standard che garantisce alto livello di di
interoperabilità tra diversi ambienti di generazione del
suono. Codice trasparente all'esecutore musicale, che ha
a disposizione un metodo di controllo familiare (tastiera)
Offre metodi per un controllo (quasi) totale della
performance musicale.
Csound offre un'interfaccia completa e già implementata
per la gestione di messaggi MIDI, attraverso una
collezione di opcode dedicati.
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Score-activated VS. MIDI-triggered (1)
●
●
●
Attivazione degli strumenti non più attraverso lo
score, ma con messaggi di NOTE-ON letti attraverso
opcode.
Uno strumento diventa automaticamente MIDItriggered se contiene almeno un opcode di lettura MIDI
(es. cpsmidi, ampmidi)
MIDI e score possono coesistere anche per lo stesso
strumento (vengono allocate più istanze), con
opportuni opcode
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Score-activated VS. MIDI-triggered (2)
●
●
●
Uno strumento MIDI necessita sempre e comunque di
essere attivato da un messaggio NOTE-ON sul relativo
canale (opcode cpsmidi), anche se non deve riprodurre
alcun suono. NOTE-ON alloca un'istanza dello
strumento ed inizia l'esecuzione (equivalente ad una istatement)
Gli opcode MIDI (ampmidi, cpsmidi, midictrl..) non
supportano l'interazione con eventi dello score
(comportamento imprevedibile)
Sono necessari opcode specifici “MIDI-oriented” per
garantire tale interazione
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Score-activated VS. MIDI-triggered (2)
●
●
Opcode MIDI
l'informazione di canale non è esplicita. I canali 1-16
vengono assegnati agli strumenti 1-16, non possono
interagire con istanze allocate da score.
(ampmidi, cpsmidi, midictrl, ...)
Opcode MIDI-oriented
leggono informazione da porta midi, ma non
necessitano di noteon (strumento interamente scoreactivated)
l'informazione di canale è passata esplicitamente
all'opcode, questo garantisce comportamento stabile
nello score.
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Tag per MIDI realtime
●
●
●
Per attivare il controllo MIDI in realtime è necessario
specificare la porta (reale o virtuale) su cui Csound si
mette in ascolto:
tag -M[numeroporta] (default -M0)
É inoltre possibile specificare il driver (default
PortMidi):
tag -+rtmidi=[nomedriver]
Per comodità useremo controller virtuale integrato in
Csound:
tag -+rtmidi=virtual
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
MIDI - Esempi
ESEMPIO MIDI:
File midi.csd
Strumento midi corda pizzicata (opcode pluck).
Generazione di una catena virtuale del suono (opcodes “connect”,
“alwayson”) e gestione di porte virtuali (opcode “outleta”).
Output instradato ad uno strumento riverbero, con decay time
controllato via midi (opcode ctrl7)
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
MIDI – opcode fondamentali
Lettura di informazioni nota:
•
ifreq cpsmidi – restituisce la frequenza di un noteon
cpsmidib – variante sensibile a pitch wheel
•
ivel ampmidi iscal – restituisce la velocity scalata ad iscal
•
Ivel veloc [, imin, imax] – restituisce velocity entro valori
imin-imax (valori esterni mantengono l'ultimo valore)
Lettura valori controller:
•
kctrl midictrl inum [, imin, imax] – restituisce il valore del
controller numero inum tra imin-imax. (solo midi)
•
[i,k,a]ctrl ctrl7 ichn, inum, kmin, kmax – restituisce il
valore del controller inum su canale ichn (score-comp.)
Programmazione timbrica (Prof. Luca A. Ludovico)
Controllo in tempo reale di strumenti Csound
Scarica

Presentazione del corso