Inventare il suono con PURE DATA - Altervista
Transcript of Inventare il suono con PURE DATA - Altervista
Inventare il suono con
PURE DATAManuale introduttivo di musica elettronica
vers. 0.4.3
Francesco Bianchi
2013
a Mina,per il suo amore e il suo sostegno
NOTA SUL COPYRIGHT
Questo documento e il suo contenuto sono rilasciati sotto licenza CreativeCommons 2.5 di tipo Attribuzione-Non commerciale-Condividi allo stessomodo 2.5 Generico.
Sei quindi libero:
• di riprodurre, distribuire, comunicare al pubblico, esporre in pub-blico, rappresentare, eseguire e recitare quest’opera
• di modificare quest’opera
alle seguenti condizioni:
• Attribuzione. Devi attribuire la paternità dell’opera nei modi indi-cati dall’autore o da chi ti ha dato l’opera in licenza e in modo taleda non suggerire che essi avallino te o il modo in cui tu usi l’opera.
• Non commerciale. Non puoi usare quest’opera per fini commerciali.
• Condividi allo stesso modo. Se alteri o trasformi quest’opera, o sela usi per crearne un’altra, puoi distribuire l’opera risultante solo conuna licenza identica o equivalente a questa.
2
C O N T E N T S
Introduzione 9
i l’ambiente 10
1 fondamenti 11
1.1 Cos’è Pure Data? . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2 Pd-extended . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3 Installazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3.1 GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3.2 Windows e Mac Os X . . . . . . . . . . . . . . . . . . . 13
2 panoramica dell’ambiente 14
2.1 Pd window e patch window . . . . . . . . . . . . . . . . . . . . . 14
2.1.1 il motore DSP . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.2 print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2 Le scatole di Pd . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2.1 oggetti e connessioni . . . . . . . . . . . . . . . . . . . . 16
2.2.2 messaggi e liste . . . . . . . . . . . . . . . . . . . . . . . 18
bang e number box . . . . . . . . . . . . . . . . . . . . . . 19
3 basi di programmazione con pure data 21
3.1 Variabili e costanti . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1.1 pack e unpack . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2 Gestione del tempo . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.2.1 metro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
un contatore . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.2 line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.3 delay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.4 line multirampa con delay . . . . . . . . . . . . . . . . . 29
3.3 Aritmetica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3.1 operatori aritmetici . . . . . . . . . . . . . . . . . . . . . 29
3.3.2 expr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4 Generatori di numeri casuali . . . . . . . . . . . . . . . . . . . 32
3.5 Connessioni senza cavi . . . . . . . . . . . . . . . . . . . . . . . 34
3.6 Subpatches e Abstractions . . . . . . . . . . . . . . . . . . . . . . 34
3.6.1 subpatch . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.6.2 abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3
3.6.3 graph on parent . . . . . . . . . . . . . . . . . . . . . . . 39
4 vettori, grafici e tabelle 41
4.1 Vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1.1 leggere un vettore . . . . . . . . . . . . . . . . . . . . . 46
4.1.2 l’oggetto table . . . . . . . . . . . . . . . . . . . . . . . . 46
5 programmazione avanzata 48
5.1 Istruzioni condizionali . . . . . . . . . . . . . . . . . . . . . . . 48
5.1.1 operatori relazionali . . . . . . . . . . . . . . . . . . . . 48
5.1.2 select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.1.3 operatori logici . . . . . . . . . . . . . . . . . . . . . . . 51
5.1.4 If . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.2 loops e iterazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6 il midi 58
6.1 Panoramica sul protocollo MIDI . . . . . . . . . . . . . . . . . 58
6.1.1 anatomia di un messaggio MIDI . . . . . . . . . . . . . 59
6.2 Pd e il MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.2.1 midiin e midianalyze . . . . . . . . . . . . . . . . . . . . 61
6.2.2 altri oggetti MIDI . . . . . . . . . . . . . . . . . . . . . . 63
6.3 Un esempio di editing algoritmico MIDI . . . . . . . . . . . . 64
7 oggetti gui 71
7.1 Altre GUI dalle librerie di Pd . . . . . . . . . . . . . . . . . . . 75
ii audio 76
8 l’audio digitale 77
8.1 L’oscillatore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
8.1.1 frequenza e ampiezza del segnale . . . . . . . . . . . . 79
8.1.2 osc∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
8.1.3 tabwrite∼ . . . . . . . . . . . . . . . . . . . . . . . . . . 84
8.1.4 la rappresentazione del suono . . . . . . . . . . . . . . 84
8.2 Le forme d’onda . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.2.1 tabosc4∼ . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.2.2 onda quadra . . . . . . . . . . . . . . . . . . . . . . . . . 88
pulse width modulation (PWM) . . . . . . . . . . . . . 90
8.2.3 onda a dente di sega . . . . . . . . . . . . . . . . . . . . 92
phasor∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
8.2.4 onda triangolare . . . . . . . . . . . . . . . . . . . . . . 94
9 il panning 99
9.1 l’oggetto dac∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4
9.2 Controllo del panning . . . . . . . . . . . . . . . . . . . . . . . . 100
9.2.1 Segnali bipolari e unipolari . . . . . . . . . . . . . . . . 102
9.2.2 il DC offset . . . . . . . . . . . . . . . . . . . . . . . . . 102
10 sintesi additiva e sintesi vettoriale 106
10.1 Sintesi additiva . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
10.1.1 sintesi additiva a spettro armonico . . . . . . . . . . . . 106
10.1.2 sintesi additiva a spettro non armonico . . . . . . . . . 106
10.2 Sintesi vettoriale . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
10.2.1 dissolvenza incrociata fra due tabelle . . . . . . . . . . 109
10.2.2 dissolvenza incrociata fra quattro tabelle . . . . . . . . 110
11 sintesi sottrattiva 114
11.1 La sintesi sottrattiva . . . . . . . . . . . . . . . . . . . . . . . . 114
11.1.1 il rumore . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
11.2 I filtri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
11.3 I parametri dei filtri . . . . . . . . . . . . . . . . . . . . . . . . . 121
11.4 I filtri in pd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
11.5 Il filtro vcf∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
11.6 Un sequencer con vcf∼ e samphold∼ . . . . . . . . . . . . . . . 126
12 moulazione ad anello (rm), tremolo, modulazione d’ampiezza(am) 128
12.1 La modulazione ad anello . . . . . . . . . . . . . . . . . . . . . 128
12.2 Segnali bipolari e unipolari . . . . . . . . . . . . . . . . . . . . 130
12.3 Segnale di controllo dell’ampiezza: il tremolo . . . . . . . . . 131
12.4 La modulazione d’ampiezza . . . . . . . . . . . . . . . . . . . . 135
12.4.1 l’indice di modulazione . . . . . . . . . . . . . . . . . . 137
13 vibrato e modulazione di frequenza (fm) 142
13.1 Segnale di controllo della frequenza: il vibrato . . . . . . . . . 142
13.2 Modulazione di frequenza . . . . . . . . . . . . . . . . . . . . . 143
13.2.1 l’inviluppo . . . . . . . . . . . . . . . . . . . . . . . . . . 145
13.2.2 FM a spettro variabile . . . . . . . . . . . . . . . . . . . 148
13.3 Portanti multiple . . . . . . . . . . . . . . . . . . . . . . . . . . 150
13.4 Modulanti multiple . . . . . . . . . . . . . . . . . . . . . . . . . 152
14 introduzione alla sintesi granulare 157
14.1 Teoria della sintesi granulare . . . . . . . . . . . . . . . . . . . 157
14.1.1 dipendenza vs. indipendenza dei parametri . . . . . . 157
14.1.2 overlapping . . . . . . . . . . . . . . . . . . . . . . . . . 159
14.1.3 parametri e spettri risultanti . . . . . . . . . . . . . . . 162
14.1.4 Il dominio del tempo e la sintesi granulare . . . . . . . 164
5
14.2 Implementazione in pd . . . . . . . . . . . . . . . . . . . . . . . 166
14.3 Un esempio di Trainlet Synthesis . . . . . . . . . . . . . . . . . . 166
14.4 La Pulsar Synthesis . . . . . . . . . . . . . . . . . . . . . . . . . 167
14.5 Asyncronous Granular Synthesis . . . . . . . . . . . . . . . . . . 170
14.5.1 vline∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
14.5.2 rendere indipendente il parametro gdur . . . . . . . . . 176
14.6 Granulazione con suoni campionati . . . . . . . . . . . . . . . 182
15 lavorare con sorgenti audio esterne 185
15.1 Sintesi vs. campioni . . . . . . . . . . . . . . . . . . . . . . . . . 185
15.2 Alcuni oggetti utili . . . . . . . . . . . . . . . . . . . . . . . . . 185
15.3 Un semplice random slicer . . . . . . . . . . . . . . . . . . . . . 187
15.3.1 controllare lo slicer via segnale . . . . . . . . . . . . . . 191
15.4 Granulazione su files audio . . . . . . . . . . . . . . . . . . . . 195
iii applicazioni varie 202
16 estendibilità di pd 203
16.1 pd come linguaggio di programmazione . . . . . . . . . . . . 203
16.1.1 externals e librerie . . . . . . . . . . . . . . . . . . . . . . 203
16.1.2 alcune librerie . . . . . . . . . . . . . . . . . . . . . . . . 204
17 gem e il video 205
17.1 la libreria GEM . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
17.2 interazione audio e GEM . . . . . . . . . . . . . . . . . . . . . . 208
18 networking 213
18.1 Architettura di rete in Pd . . . . . . . . . . . . . . . . . . . . . 213
18.1.1 netsend e netreceive . . . . . . . . . . . . . . . . . . . . . 214
18.1.2 Dynamic patching . . . . . . . . . . . . . . . . . . . . . . 217
18.1.3 pdsend . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
18.2 il protocollo OSC . . . . . . . . . . . . . . . . . . . . . . . . . . 223
18.3 L’audio in streaming . . . . . . . . . . . . . . . . . . . . . . . . . 225
19 applicazioni sparse 233
19.1 Laptop Orchestra . . . . . . . . . . . . . . . . . . . . . . . . . 233
19.2 Il Live Coding . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
19.3 Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Conclusione 239
Bibliografia 241
Sitografia 242
Indice analitico 243
6
I N T R O D U Z I O N E
La diffusione massiccia che i moderni calcolatori hanno avuto negli ultimi30 anni ha prodotto un’onda d’urto dirompente nel mondo della musicaelettronica che fino agli anni ’70 era appannaggio di quei pochi fortunatiche potevano accedere ai rari centri europei e americani che disponevanodelle apparecchiature per realizzarla. In pochi anni, a partire dall’avventodei primi home computers si sono moltiplicati a dismisura i software di ma-nipolazione dell’audio e oggi chiunque può trovare in rete o in commer-cio programmi per produrre il proprio brano o il proprio disco di musicaelettronica, spesso senza il bisogno di conoscere a fondo i principi, il fun-zionamento e le tecniche che stanno alla base dell’audio digitale. Con unsemplice click è possibile proiettarsi nel mondo dei suoni più strani senzadover necessariamente conoscere una tecnica di sintesi o, quantomeno, unoscillatore.
Stando così le cose, qualcuno a questo punto potrebbe chiedersi, leggitti-mamente, perché dovrebbe leggere un manuale di musica elettronica. Ilpanorama del software è talmente vasto che chiunque può trovare il pro-gramma adatto alle sue esigenze, in linea con le proprie conoscenze infor-matiche e musicali. Eppure ci sono varie ragioni perché si potrebbe leggereun manuale del genere e imparare almeno le basi della programmazione edella sintesi dell’audio. Proviamo ad elencarne qualcuna:
- Studiare la musica elettronica aiuta a capire meglio quello che si facon i programmi, soprattutto aiuta a capire quali sono i limiti deiprogrammi stessi. Ad esempio i sintetizzatori software attualmentein commercio sono per lo più monofunzionali, cioè svolgono un com-pito e solo quello. Naturalmente in molti casi lo svolgono benissimo,ma non sanno fare altro. Ci sono sintetizzatori per la Modulazionedi Frequenza, sintetizzatori per la Sintesi Granulare o Additiva. Se sivuole possedere un sintetizzatore per una di queste tecniche bisognaacquistarlo o bisogna accontentarsi di prodotti che non danno ottimirisultati.
7
- Questi programmi costano molto, soprattutto i migliori. Se si vo-lessero avere dei sintetizzatori per realizzare 3 o 4 tecniche di sintesidel suono si dovrebbero acquistare 3 o 4 prodotti commerciali di-versi, questo a scapito del portafogli e del fatto che probabilmente fraqualche anno saranno obsoleti e diverranno quindi praticamente inu-tili. E’ molto meglio studiare le tecniche di sintesi e il funzionamentodell’audio digitale per avere l’opportunità di utilizzare programmiforse più complessi, ma che danno l’opportunità di costruirsi da solii propri suoni.
- Inventare i propri suoni non è una cosa da poco. I software commer-ciali sono corredati sempre da moltissimi suoni preconfezionati, dettipreset, molto utili, ma che affievoliscono inevitabilmente il desideriodi cercarne di nuovi. Si inizia ad accontentarsi di quello che offre ilconvento, che spesso è gradevole e non richiede dispendio eccessivodi energie. Ma quei suoni saranno sempre dei preset fatti da qualcunaltro, non apparterranno mai completamente a chi li usa. Quindi stu-diare e praticare la musica elettronica è un modo per appropriarsidel suono, per creare il proprio, che molte volte non sarà il più bello,ma alcune volte sarà sicuramente unico.
- Un ultimo argomento, ma non certo meno importante. Una voltaapprese le tecniche di sintesi si possono scegliere programmi a costozero, cioè freeware, come Pure Data, oggetto di questo manuale. Scegliereun programma gratuito implica molte cose, alcune meno scontate diquanto si pensi:
– Non è solo una scelta di risparmio, ma una rivendicazione etica.Sintetizzare il suono attraverso un software digitale implica laprogettazione e la realizzazione di algoritmi più o meno com-plessi. Gli algoritmi non sono altro che rappresentazioni delpensiero, e il pensiero non si paga, nessun prezzo.
– Usare un software libero significa condividerne una filosofiabasata sulla condivisione dei saperi. I programmi liberi sonotali in tutto e per tutto nella maggior parte dei casi. Si può prel-evare il sorgente, studiarlo, modificarlo e redistribuirlo. Non acaso intorno a questi software ci sono delle vere e proprie comu-nità che si scambiano opinioni, idee e progetti, condividendoliberamente il proprio pensiero con altri.
8
– Il software libero è soggetto a mutamento continuo, a un divenirecostante che lo pone nella condizione di migliorare molto piùvelocemente del software commerciale e di non invecchiare mai.
Studiate quindi la musica elettronica e praticatela, possibilmente con soft-ware libero.
Buon divertimento!
9
Part I
L’A M B I E N T E
1 F O N DA M E N T I
1.1 COS’È PURE DATA?
Traducendo dal sito ufficiale, apprendiamo che Pure Data è un ambiente diprogrammazione grafica in tempo reale per processare audio e video1. Cer-chiamo di entrare nel dettaglio di questa descrizione. Pure Data è primadi tutto un linguaggio di programmazione perché consente di realizzare al-goritmi più o meno complessi come tutti gli altri linguaggi2. L’interfacciacon cui il musicista-programmatore parla con Pd è grafica, quindi non c’èla necessità di scrivere il codice in un editor di testo, ma si realizzano dellepatch combinando fra loro vari tipi di oggetti grafici. Nel gergo dei sinte-tizzatori analogici una patch rappresentava l’insieme dei collegamenti fra isuoi moduli. Pd mutua questo concetto: attraverso una patch si definiscegraficamente l’ordine con cui i vari oggetti sono collegati fra loro. Gli al-goritmi vengono creati selezionando una serie di entità grafiche all’internodi una finestra, detta patch window.
Pd funziona in tempo reale, quindi gli algoritmi sono interattivi e i parametripossono essere modificati durante l’esecuzione. E’ anche possibile cam-biare la struttura stessa di tali algoritmi mentre sono attivi, aggiungendo orimuovendo moduli in modo semplice e intuitivo.
Pd nasce con la funzione di creare applicazioni audio e, da qualche tempo,video. Una foltissima comunità di sviluppatori, musicisti, hackers e appas-sionati sforna ogni giorno nuove applicazioni e librerie che potenziano eaumentano le funzionalità di questo ambiente versatile e libero. Si, perchéPure Data è un software libero, e i suoi sorgenti possono essere scaricati,
1 http://puredata.info/
2 Un algoritmo si può definire come un procedimento che consente di ottenere un risultatoatteso eseguendo, in un determinato ordine, un insieme di passi semplici corrispondenti adazioni scelte solitamente da un insieme finito http://it.wikipedia.org/wiki/Algoritmo
11
studiati, modificati e redistribuiti da chiunque. Inoltre Pure Data è mul-tipiattaforma, quindi gira sui sistemi operativi più comuni: GNU/Linux,Microsoft Windows, Apple Mac OS X, FreeBSD.
Pd è stato scritto nel 1996 da Miller Puckette, lo stesso che a metà deglianni ’80 aveva sviluppato Max, in seguito divenuto un software commer-ciale3. Pd riprende le idee e i concetti di quest’ultimo, pur basandosi suuna filosofia più libera e aperta che ne fa un sistema più dinamico e dalleprospettive future più interessanti.
1.2 PD-EXTENDED
Allo stato attuale Pd è arrivato alla versione standard 0.42.5, detta Vanilla,scaricabile dal sito del suo creatore4 . Il consiglio di chi scrive è però quellodi scaricare la versione extended, che contiene non solo il programma stan-dard, ma anche numerose librerie aggiuntive che estendono notevolmentele sue funzionalità. Attualmente Pd-extended è alla versione 0.41.45.
1.3 INSTALLAZIONE
1.3.1 GNU/LINUX
Prendiamo in esame solo l’installazione su Ubuntu GNU/Linux, sistemaoperativo sul quale è stato scritto in gran parte il presente manuale e alquale ci riferiamo citando le combinazioni di comandi da tastiera su Pd.Come già scritto in precedenza, il consiglio è quello di scaricare e installarel’ultima versione di Pd-extended. Per fare questo è sufficiente aggiungerela seguente riga al file /etc/apt/sources.list:
deb http://apt.puredata.info/releases hardy main
nel caso si stia operando in una distribuzione Ubuntu Hardy, in caso di-verso sostituire la dicitura hardy con il mome della distribuzione di Ubuntuinstallata.
3 Miller Puckett: http://crca.ucsd.edu/~msp/ Max-Msp: http://cycling74.com/
products/maxmspjitter/
4 http://crca.ucsd.edu/~msp/software.html
5 http://puredata.info/downloads
12
Successivamente si può eseguire l’installazione dal package manager diUbuntu, Synaptic. Aprirlo, aggiornare l’archivio dei pacchetti, cercare Pd-extended e dopo averlo marcato far partire il processo di installazione, allafine del quale Pd potrà essere richiamato da un terminale digitando sem-plicemente:
pd
Oppure dal menù Applicazioni/Audio e Video/Pd-extended
1.3.2 WINDOWS E MAC OS X
Dopo aver scaricato la versione di Pd-extended per Windows o per Mac OSX, eseguire il file scaricato e seguire le semplici istruzioni di installazione.
13
2 PA N O R A M I C A D E L L’A M B I E N T E
2.1 PD window E patch window
All’apertura di Pd compare la finestra principale del programma (Pd win-dow) che ha due funzioni principali:
- mostrare dei messaggi
- consentire la configurazione dell’audio e del MIDI e definire i per-corsi in cui Pd cerca le librerie da caricare
Alcuni messaggi vengono visualizzati in fase di avvio del programma,riguardano le librerie esterne caricate e gli eventuali errori nella configu-razione dell’audio o del MIDI. Altri messaggi possono essere mostrati nellaPd window durante la normale esecuzione del programmano e il più dellevolte riguardano errori di procedura o comunicazioni prodotte dall’utentetramite l’oggetto print che sarà esaminato successivamente (vedi 2.1.2).
La configurazione dell’audio avviene tramite la voce di menù Media checonsente di impostare il MIDI (MIDI settings), l’audio (Audio settings), diavviare il motore DSP (Audio on/off) e di testarne il funzionamento (testAudio and MIDI).
La voce di menù File permette di aprire, chiudere, salvare le patch e diconfigurare il percorso che Pd compie per trovare le librerie esterne (Path)e quali di esse caricare all’avvio (Startup)1.
Nella versione extended il Path e lo Startup sono già impostati per caricarela maggior parte delle librerie necessarie per una completa funzionalità
1 Esistono numerose librerie, generalmente scritte in C o in Pd stesso, molte delle quali sonogià incluse nel pacchetto Pd-extended, altre scaricabili dal sito ufficiale o da altri siti (vedisitografia)
14
dell’ambiente.
Generalmente all’apertura del programma ci si trova di fronte soltanto laPd window. Per iniziare a scrivere gli algoritmi è necessario aprire unafinestra di patch dal menù File/new. Compare così la patch window che èl’ambiente di programmazione vero e proprio. Il suo menù è molto sim-ile a quello della Pd window ma ovviamente più orientato all’editing dellepatch.
La patch window può trovarsi in due stati funzionali diversi: edit mode erun mode. Il primo permette di inserire tutti gli elementi all’interno dellafinestra, mentre il secondo è necessario per gestire la patch quando questaè in azione. Tutti gli oggetti interattivi cioè quelli che contengono parametrimodificabili via mouse o tastiera, funzionano soltanto in run mode, mentrein edit mode possono solo essere aggiunti o rimossi. Per passare da unostato all’altro si usa la combinazione di tasti ctrl-E.
2.1.1 IL MOTORE DSP
Quando gli algoritmi di Pd processano esclusivamente dati, il programmaè completamente attivo sin dalla sua apertura. Nel caso in cui invece sidevono processare segnali audio, è necessario attivare il motore DSP perascoltare il risultato delle operazioni sui segnali. Il motore DSP, acronimodi Digital Signal Processor, si occupa di elaborare il segnale in tempi ra-pidissimi e di permettere la sua trasformazione da digitale ad analogico eviceversa.Nel momento in cui il coder vuole suonare una patch deve quindi attivareil motore DSP, mediante l’apposita voce di menu Media/audio on. Inalternativa può premere la combinazione di tasti ctrl-/. Vedremo suc-cessivamente le altre possibilità di intervenire sull’attivazione e la disatti-vazione del motore DSP, quando si tratterà dell’audio nella seconda partedel presente manuale.
2.1.2 print
Durante l’esecuzione delle patch può accadere che vengano automatica-mente visualizzati dei messaggi nella Pd window, in particolare alla pre-senza di errori, ma c’è un oggetto che permette al programmatore di visu-alizzare nella Pd window il messaggio o dato che desidera. Si tratta di print,
15
che può solo ricevere dati o messaggi e stamparli a video nella Pd window.In alcune circostanze è utile per verificare il corretto funzionamento deglialgoritmi.
Hello World!
Figure 1: un click del mouse sul messaggio produce un output nella Pd window
2.2 LE scatole DI PD
La finestra di patch è il luogo che permette la realizzazione degli algoritmidi Pd. Essendo un ambiente grafico la finestra si riempirà di entità di varianatura, dette scatole (box). Queste scatole sono di quattro tipi: oggetti, mes-saggi, GUI e commenti e si creano dal menù Put oppure premendo ctrl+ndove n è 1 per gli oggetti, 2 per i messaggi, 5 per i commenti. I numeri3 e 4 creano delle GUI particolari, simboli e number box che esamineremosuccessivamente.
2.2.1 OGGETTI E CONNESSIONI
Gli elementi fondamentali della programmazione in Pure Data sono gli le object box
oggetti, rappresentati dalle object box, caratterizzate dalla forma rettango-lare e dalla presenza di entrate (inlets), nella parte superiore, e di uscite(outlets), nella parte inferiore.
Un oggetto può creare o processare dati oppure segnale audio e riceveattraverso gli inlets messaggi, liste o uscite di altri oggetti. Può inviare datio segnali ad altri oggetti. All’interno dell’object box si situano gli atomi, cioèstringhe di caratteri o simboli separati da spazi che rappresentano il tipodi oggetto e gli eventuali argomenti dell’oggetto stesso2.
2 il concetto di atomo è mutuato dal Lisp, un linguaggio di programmazione orientatoall’elaborazione di espressioni simboliche rappresentate sotto forma di liste e atomi. Una listasi ha in presenza di più espressioni Lisp, un atomo invece è una lista con una sola espres-sione. Per approfondire: www.diee.unica.it/~roli/IA/Materiale%20didattico/AA0910/
Lisp.pdf
16
random 250
Figure 2: un esempio di object box: l’oggetto metro con un argomento
I collegamenti fra oggetti, anzi fra tutte le object box avvengono tramitecavi di connessione che si realizzano tenendo premuto il tasto sinistro delmouse a partire dall’outlet mittente e rilasciandolo non appena si è rag-giunto l’inlet di arrivo.
+
random
select 0 5 7
Figure 3: collegamenti fra object box
L’inlet di sinistra di ogni oggetto è detto caldo poiché alla ricezione di unmessaggio, di un dato o di un segnale, produce immediatamente un’uscitadall’oggetto stesso. Tutti gli altri inlets sono freddi, quindi nel momentoin cui ricevono un dato, messaggio o segnale, lo inseriscono temporanea-mente all’interno dell’oggetto, fino a che lo stesso non viene processatoall’attivazione dell’inlet caldo.
pack 0 0
counter
Figure 4: l’entrata fredda riceve un dato dall’oggetto counter, ma pack non producealcun dato in uscita finché l’inlet caldo non riceverà qualcosa
17
Come già detto, gli oggetti insistono su dati o segnali audio. Graficamentegli oggetti-audio si distinguono da quelli per i dati perché il primo atomo(ovvero il nome) termina sempre con il segno della tilde (∼) e gli inlet eoutlet che processano segnale sono scuri. I cavi che trasportano segnalesono più spessi di quelli che trasportano dati.
random 1000
osc~
dac~
Figure 5: confronto visivo fra oggetti-dato e oggetti-audio
2.2.2 MESSAGGI E LISTE
Le message box hanno forma rettangolare con il lato destro rientrante. Pos-sono contenere stringhe di caratteri, numeri, liste o variabili e vengono at-tivati con un click del mouse quando si è in run mode oppure alla ricezionedi un altro messaggio o di particolari azioni.
questo è un messaggio
Figure 6: un click con il mouse sul messaggio produce un output del messaggiostesso nella Pd window
18
bang E number box
Un altro modo di attivare un messaggio è quello di utilizzare un bang, unodei più importanti oggetti di Pd. La sua funzione è quella di innescareun’azione o una sequenza di azioni, può mettere in funzione un algoritmo.Si avrà modo di incontrarne praticamente in ogni patch.
questo è un messaggio
Figure 7: la stessa patch precedente, con la differenza che il messaggio viene atti-vato da un click del mouse sul bang
Il bang ha una sua versione grafica (si ottiene premendo all’interno dellapatch ctrl+shift+b e una doppia versione testuale, che permette di evitareun eccessivo uso di elementi grafici che appesantiscono l’esecuzione deiprogrammi.
bang
b
bang grafico
oggetti bang
Figure 8: le varie versioni del bang
Un altro oggetto molto comune nelle patch di Pd è la number box checonsente di inviare messaggi numerici con il vantaggio di poter variarei numeri all’interno della box stessa con la pressione e il trascinamentodel mouse verso il basso per diminuire e verso l’alto per aumentare il nu-mero stesso. Per comodità è possibile stabilire eventuali minimi e massimidella number box premendo il destro del mouse e andando sulle proprietà
19
dell’oggetto3 . Una number box può inviare o ricevere dati attraverso i suoiinlet.
7
+ 5
12
Figure 9: l’oggetto ’+’ effettua in questo caso la somma fra il numero che entranell’inlet di sinistra e 5, e manda l’output alla number box sottostante
3 La finestra delle proprietà è attiva in Pd per tutti i tipi di GUI e consente di configurareuna serie di parametri come la veste grafica o i valori consentiti
20
3 B A S I D I P R O G R A M M A Z I O N E C O NP U R E DATA
3.1 VARIABILI E COSTANTI
Pure Data è un linguaggio di programmazione orientato all’audio, quindial tempo. Per tale ragione i valori e le quantità passate agli oggetti sonoquasi sempre variabili, interattivamente o meno. In fase di apertura di unapatch ci potranno essere delle quantità inizializzate, ma esse all’occorrenzapotranno essere variate durante l’esecuzione del programma. Ne sono es-empio i parametri passati agli oggetti dall’interno dell’objet box, cioè gliatomi che seguono il primo (il quale, ricordiamo, da il nome all’oggettostesso).
Per comprendere meglio questo concetto esaminiamo la patch che abbiamogià incontrato nella figura 9 . L’inlet di sinistra dell’oggetto ’+’ riceve unaquantità variabile che viene sommata alla costante ’5’ definita all’internodell’object box. Così com’è la patch non fa altro che operare una sommafra la quantità in entrata e la costante definita nell’oggetto. L’inlet destrodell’oggetto ’+’ offre però l’opportunità di variare il secondo addendodella somma.
30
10 20
+ 5
Figure 10: è possibile cambiare a piacimento gli addendi della somma
21
Esaminiamo il comportamento della patch in figura 10: se cambiamo ilprimo elemento dell’addizione senza toccare il secondo, l’output sarà lostesso di prima: somma del primo elemento con 5. Ora proviamo a cam-biare il secondo addendo. Non avremo alcun output!
Non va dimenticato che gli inlet successivi al primo di sinistra sono freddi:immagazzìnano il dato in entrata senza produrre uscita. E’ necessarioquindi dire all’oggetto ’+’ di effettuare l’operazione fra i due nuovi ad-dendi e di far uscire il risultato. Nel caso di questo oggetto è sufficienteinserire nell’inlet di sinistra un bang, collegato all’uscita del secondo ad-dendo, che ordina all’object box di far uscire il risultato immediatamente1 .
17
14 3
+ 5
Figure 11: il bang collegato all’uscita del secondo addendo, in entrata nell’inletsinistro dell’oggetto ’+’ rende caldo l’inlet destro dell’oggetto stesso
E’ buona norma stabilire dei valori in fase di inizializzazione della patch inmodo che essa sia immediatamente funzionante alla sua apertura. Per farequesto è sufficiente scrivere i parametri degli oggetti all’interno delle objectbox. Quando questo non è possibile si può ricorrere al’oggetto loadbang cheattiva un bang all’apertura della patch (figura 12).Vi sono circostanze in cui è necessario specificare delle variabili all’internodelle object box. Questo è possibile attraverso il simbolo $n, dove n è un
1 L’oggetto ’+’ oltre ad accettare numeri in entrata, accetta anche bang nell’inlet di sinistra. Ilbang non fa altro che dire all’oggetto di far uscire ciò che ha in memoria, cioè il risultatodell’addizione
22
12
7
loadbang
+ 5
Figure 12: all’apertura della patch si avrà come output la somma fra 7 e 12
numero identificativo. La variabile assume di volta in volta il valore che lamessage box riceve nel suo inlet (figura 13)2 .
scelgo il numero $1
12
Figure 13: variabile in una message box, osservare l’output nella Pd window
3.1.1 pack E unpack
Nel caso in cui una messege box contenga più di una variabile è necessarioche ognuna abbia un’univoca denominazione. Così la prima variabile sarà$1, la seconda $2 e così via.
L’inlet del messaggio riceve una lista con i valori che le variabili devonoassumere. Per realizzare tali liste esiste un oggetto apposito chiamato pack,
2 I simboli identificativi delle variabili devono iniziare da $1 e seguire ordinatamente. Se unamessage box ha 3 variabili $1 $2 ed $3 e riceve una lista di 3 atomi, il primo andrà nellavariabile $1, il secondo nella $2, etc. . .
23
che mette insieme diversi valori singoli (atomi), combinandoli in liste. Gliargomenti di pack inizializzano il valore del relativo inlet al valore segnato.Ad esempio pack 2 19 25 avrà 3 inlet rispettivamente inizializzati con i valori2, 19, 25. Un bang in entrata nell’inlet sinistro produrrà l’output della listain memoria in quel momento (fig. 14).
la data di oggi: giorno $1 mese $2 anno $3
pack 20 1 2010
0 0 0
Figure 14: pack: un click sul bang senza cambiare i valori delle number box producel’uscita dei valori inizializzati. Una variazione delle number box pro-duce un output nel momento in cui viene cambiato il valore dell’inletdi sinistra. Osservare il risultato nella Pd window
L’oggetto unpack fa il contrario rispetto a pack: prende una lista e ne con-voglia i singoli atomi attraverso i suoi inlet.
3.2 GESTIONE DEL TEMPO
Come detto in precedenza, Pd è un linguaggio orientato al tempo, quindici sono molti oggetti deputati alla gestione di eventi temporali. Esaminer-emo alcuni di questi senza dimenticare che la presente trattazione non puòtrattare di molti altri oggetti che il programmatore scoprirà nel suo cam-mino3.
3 Premendo il destro del mouse su un oggetto si può accedere all’help dello stesso. In molticasi la pagina dell’help rimanda anche ad oggetti simili a quello esaminato. E’ sempreutilissimo pertanto navigare fra le pagine di help che sono uno strumento di navigazionefondamentale fra gli oggetti di Pd.
24
unpack 0 0 0
20 1 2010
20 1 2010
Figure 15: unpack: un click sulla message box produce un output in ognuno dei treoutlet
3.2.1 metro
L’oggetto metro produce in output un bang ogni n millisecondi, dove n èl’argomento dell’oggetto e rappresenta la distanza temporale fra un bang el’altro. Per funzionare ha bisogno che sia attivato attraverso un messaggiodiverso da zero o un bang. Un messaggio uguale a zero oppure stop, spegnel’oggetto.
1
bang
0
stop
0
metro 500
un numero diverso da 0 o un
"bang" attivano metro
0 o "stop" fermano metro
l'inlet di sinistra consente
di modificare la distanza
temporale fra i "bang"
Figure 16: metro
25
UN CONTATORE
Attraverso l’oggetto metro e un altro oggetto che esamineremo in questoparagrafo, possiamo costruire un contatore4. La patch non fa altro cheemettere a intervalli regolari (nel nostro caso 500 ms) un numero intero apartire da zero tale che il successivo sia maggiore del precedente di unaunità. L’algoritmo necessita di un oggetto che permetta di conservare inmemoria un numero intero. L’oggetto che fa al caso nostro è int. L’inlet de-stro di int riceve un intero e lo memorizza finché un bang nell’inlet sinistronon lo costringe a inviarlo dall’outlet. All’apertura della patch l’oggettoint viene inizializzato con uno zero nella sua memoria (tramite loadbang.All’attivazione di metro, int riceve un bang nella sua entrata calda facendouscire zero, che viene mandato all’uscita della patch e contemporaneamenteviene sommato a 1, tramite l’oggetto ’+’. Quest’ultimo a sua volta spedisceil risultato, cioè uno, nell’entrata fredda di int. Il nuovo valore (uno) uscirànon appena il successivo bang prodotto da metro non sopravvenga, e cosìvia (figura 17).
3.2.2 line
Un oggetto molto comune in Pd è line, che generara delle rampe per rag-giungere un determinato valore. line ha bisogno di almeno due argomenti,il valore-obiettivo, cioè la quantità da raggiungere, e il tempo in millisec-ondi necessario a raggiungerlo. In presenza di un messaggio con una listadi due numeri, line raggiungerà il primo nel tempo in millisecondi indicatodal secondo (figura 18).Un oggetto molto comune in Pd è line, che generara delle rampe per rag-giungere un determinato valore. Accetta due argomenti via message box,ovvero il valore-obiettivo e il tempo in millisecondi per raggiungerlo (fig.18).Una volta terminato il suo percorso line mantiene in memoria il valore-obiettivo, quindi un secondo click sulla message box non produrrà un nuovooutput perché si direbbe a line di creare un percorso da 1000 a 1000 in5 secondi. Se volessimo reinizializzare ogni volta l’oggetto line ad esem-pio chiedendogli di creare ogni volta il percorso da 0 a 1000 in 5 secondi,basterà creare una lista di tre atomi, con il primo che indica il valore di
4 In generale un contatore è un dispositivo che memorizza (e a volte visualizza) il numerodi volte che un particolare evento o processo si verifica. In una caso molto semplice, uncontatore può contare i bang che riceve ed emettere il conteggio dal suo outlet.
26
metro 500
0 1
int
0
+ 1
23
loadbang
Figure 17: click su 1 per avviare il contatore, su 0 per fermarlo
partenza, il secondo con il valore-obiettivo, separato dal precedente dauna virgola e infine con il tempo in millisecondi (figura 19).line puÚ avere anche due argomenti interni alla object box:
1. Il valore da cui iniziare la prima rampa (default 0)
2. La distanza di tempo in millisecondi fra l’uscita di un valore e ilsuccessivo (default 20 ms)
Nella figura 20 il valore-obiettivo è 2000, da raggiungere in 5 secondi. Larampa inizia da 1000 e i valori escono ogni mezzo secondo (500 ms).
3.2.3 delay
L’oggetto delay emette un bang dopo aver ricevuto un bang a sua volta.L’unico argomento che accetta (dall’inlet destro) è il ritardo con cui verràemesso il bang stesso (figura 21).
27
1000 5000
line
0
Figure 18: line al momento della creazione è inizializzato a zero, quindi in questocaso al momento del click sulla message box inizierà un percorso da 0 a1000, completandolo in 5 secondi
line
0, 1000 5000
0
Figure 19: si può ricominciare la rampa da 0 a 1000 ogni volta che si preme sullamessage box
0
line 1000 500
2000 5000
Figure 20: rampa da 1000 a 2000 in 5 secondi, con step di mezzo secondo fra unvalore e l’altro in uscita
28
metro 1000
delay 500
1
0
Figure 21: i bang saranno intermittenti
3.2.4 line MULTIRAMPA CON delay
Con gli oggetti line e delay possiamo costruire rampe multiple in modomolto semplice. E’ sufficiente preparare tante message box quante sarannole rampe e metterle in azione in successione con delay. Nel caso della patchin figura 22 c’è un oggetto grafico per rappresentare le rampe, una sliderorizzontale, di cui ci occuperemo in un apposito capitolo.
3.3 ARITMETICA
Pd dispone di una serie di oggetti che consentono di effettuare le più co-muni operazioni matematiche. Abbiamo già incontrato l’oggetto ’+’ chepermette l’operazione di somma. Nel prossimo paragrafo esamineremoalcuni altri oggetti per operare sui numeri.
3.3.1 OPERATORI ARITMETICI
Gli oggetti per le operazioni aritmetiche e matematiche funzionano tuttiallo stesso modo, per ora ci limitiamo a darne qui un elenco. Successiva-mente avremo modo di usarli massicciamente.
Operazioni aritmetiche:
• +
• -
29
0, 127 1000 50 600 100 1500
line
0
delay 1000 delay 1600
Figure 22: click sul bang pi˘ in alto della patch
• *
• /
• pow
Operazioni trigonometriche:
• sin
• cos
• tan
• atan
• atan2
Operazioni sulle frazioni
• mod
• div
e molti altri...
30
3.3.2 expr
expr è un versatile strumento che permette di raggruppare in un unicooggetto una serie di operazioni. Con Pd può capitare spesso di dovereffettuare una sequenza di operazioni matematiche, attraverso expr si pos-sono combinare insieme in modo da non occupare spazio e da rendere piùchiara per il programmatore la sequenza delle operazioni stesse. Per poterfunzionare con dei dati in ingresso expr necessita di simboli per rappre-sentare delle variabili, che, a differenza delle variabili delle message box siscrivono in questa forma: $xn dove x è il tipo della variabile e n è il numeroordinale che la rappresenta (fig. 23).Le variabili possono essere di tipo intero, decimale, simbolo e rispettivamenteavranno la forma $in, $fn e $sn.
4
+ 12
42.6667 42.6667
/
* 24 - 7
expr (($f1 + 12) * 24)/(($f1 + 12) - 7)
Figure 23: nella parte sinistra le operazioni si succedono dall’alto verso il basso,nella parte destra le stesse vengono raggruppate da expr. Valutare idue algoritmi in parallelo con un click sul bang
31
3.4 GENERATORI DI NUMERI CASUALI
Dopo i più comuni operatori matematici é utile soffermarsi su alcuni oggettidi Pd che generano numeri casuali. Qualunque coder prima o poi si imbattenell’esigenza di usare numeri casuali e chi usa Pd non fa eccezione. Ilprimo strumento che esaminiamo é random che genera un numero casualeogni volta che riceve un bang. Questo numero viene scelto in un range com-preso fra 0 e il numero definito nel primo argomento dell’oggetto meno 1.Un secondo argomento, facoltativo, imposta il seme della sequenza. Senzavolersi soffermare troppo sulle implicazioni tecniche della generazione dinumeri casuali, c’é da dire quantomeno che generalmente quando si parladi generatori di numeri casuali si usa un termine improprio, perché inrealtà si tratta di generazione di numeri pseudo-casuali, poiché questi ven-gono generati da algoritmi. Nel caso di Pd alla base della generazionedi questi numeri c’é una complessa equazione con una serie di variabili.Il seme della sequenza generata non é altro che una variabile di questaequazione.
random 250
metro 500
1 0
0
Figure 24: la patch genera un numero pseudo-casuale ogni mezzo secondo
random produce solo interi, ma se volessimo generare dei numeri pseudo-casuali decimali potremmo semplicemente dividere l’output (figura 25).L’oggetto randomF fa la stessa cosa, ma con una precisione molto maggiore.Se invece volessimo creare una sequenza di numeri pesata, cioé generatacon una certa probabilità potremmo usare l’oggetto moses che consente diconvogliare un flusso di numeri in due outlet diversi in base a un valore-soglia definito come argomento. I numeri al di sotto del valore-soglia ven-gono convogliati dall’outlet sinistro, quelli al di sopra da quello destro.
32
metro 500
1 0
0
random 1001
/ 1000
Figure 25: la patch genera un numero pseudo-casuale compreso fra 0 e 1, con 3
cifre decimali
metro 500
1 0
random 100
moses 25
Figure 26: i numeri da 0 a 24 producono un bang dall’outlet sinistro, quelli da 25 a99 dal destro. Volendo parlare di percentuali, l’outlet sinistro ha il 25%di possibilità di produrre un bang, quello destro il 75%
L’oggetto decide produce pseudo-casualmente solo sequenze di 0 e 1, men-tre drunk funziona come random ma sceglie il numero effettuando un saltoche lo distanzia dal precedente al massimo quanto stabilito nel secondoargomento (stepsize).In figura 28 si può osservare il diverso andamento di due sequenze casuali.La prima, generata con random, ha una distribuzione lineare, la seconda,
33
metro 500
1 0
80
drunk 100 10
Figure 27: ogni mezzo secondo viene generato un numero compreso fra 0 e 99,dove ogni numero é a una distanza minore o uguale 10 dal precedente
frutto di drunk é molto più ordinata: gli elementi della sequenza si spostanoentro un range limitato (definito dal secondo argomento di drunk).
3.5 CONNESSIONI SENZA CAVI
Al fine di evitare di riempire la patch window di cavi che possono rendernemeno chiara l’interpretazione, si possono usare i due oggetti send e receive,che permettono di creare una connessione senza fili fra le box. L’argomentodi receive è un nome identificativo che deve essere identico a quello di send.E’ possibile avere più oggetti receive con lo stesso identificativo: tutti ricev-eranno dall’oggetto send che ha lo stesso nome. Un’ultima annotazione,send e receive possono essere abbreviati in ’s’ e ’r’ (fig. 29).
3.6 Subpatches E Abstractions
Ci sono circostanze in cui le patch sono molto complesse e articolate. Inquesti casi Pd mette a disposizione degli strumenti per annidare delle porzionidi patch in box apposite. Esistono due modi per annidare contenuti dentrotali box, il primo è quello di creare delle subpatch, l’altro quello di creareabstraction. Le subpatch appaiono come delle normali object box formatedal nome pd seguito da un nome identificativo per la subpatch, esse pos-sono essere utilizzate solo all’interno della patch dove sono state create oall’interno di altre subpatch della stessa patch. Le abstraction invece, pur ap-parendo come delle normali object box, hanno solo un nome identificativo,
34
random
drunk
Figure 28: in alto la sequenza generata da random, in basso quella creata con drunk,con una stepsize di 25
ma vengono salvate indipendentemente dalla patch in cui vengono usate esono riutilizzabili in altre patch.
3.6.1 subpatch
Per creare una subpatch é sufficiente scrivere all’interno di una nuova objectbox pd nome, si aprirà una nuova finestra all’interno della quale si inseriràil contenuto della subpatch. Questa nuova finestra si può chiudere in qual-sisasi momento senza bisogno di salvarla e riaprirla con un semplice clicksulla object box in run mode. La patch in figura 30 realizza un algoritmo at-traverso il quale vengono emessi dei bang da quattro outlet diversi, il primo
35
4
send numero
receive numero
r numero
r numero
4
4
8
* 2
Figure 29: connessioni senza fili
random 500
+ 1
moses 250
metro 500
moses 126 moses 376
Figure 30: un semplice algoritmo senza annidamenti
da sinistra se random emette un numero fra 1 e 125, il secondo se il numeroé compreso fra 126 e 250, e cosÏ via. L’algoritmo della figura 31 é identicoal precedente, con l’unica differenza che é realizzato con una subpatch. Le
36
subpatch funzionano esattamente come le patch solo che devono contenereal loro interno le entrate e le uscite necessarie perché siano, nella patch,collegabili alle box da cui ricevono dati e a cui li inviano.
pd miasubpatch
Figure 31: l’algoritmo precedente realizzato con una subpatch
Come si può vedere dalla figura 32 l’interno della subpatch del nostroalgoritmo é uguale alla porzione di patch della figura 30, ma in alto c’él’oggetto inlet che crea un inlet nella subpatch e 4 oggetti outlet, che creanoi rispettivi 4 outlet per i bang. Le subpatch possono essere modificate in
inlet
outlet
random 500
+ 1
moses 250
metro 500
moses 126 moses 376
outlet outlet outlet
Figure 32: l’interno della subpatch con gli inlet e gli outlet
qualunque momento e, soprattutto, possono essere duplicate a piacimento.Rappresentano uno strumento molto comodo per rendere più leggibile e
37
chiaro un algoritmo nella patch window, quindi il consiglio é di usarle il piùpossibile.
3.6.2 abstraction
Un’abstraction non è altro che una patch che può essere richiamata dall’internodi una patch. Anch’essa, come la subpatch contiene gli oggetti inlet e outletper creare le varie entrate e uscite dell’object box e, a differenza della sub-patch, può essere utilizzata in qualunque patch. L’importante è che il filedell’abstraction sia salvato con l’estensione .pd e che si trovi nella stessadirectory in cui si sta lavorando o in una delle directory definite nel Path delprogramma (cap. 2.1).
Per richiamare un’abstraction è sufficiente aprire un’object box e inserireil nome dell’abstraction senza l’estensione .pd. L’abstraction potrà essereaperta e chiusa in qualunque momento e anche modificata, a patto chesia salvata, ma il consiglio è di stare attenti a modificare un’abstractiondall’interno di una patch: l’abstraction risulterà modificata in tutti gli altriprogetti in cui viene utilizzata!
Un’abstraction può anche essere inizializzata con un argomento, questo èpossibile scrivendo l’argomento stesso (o gli argomenti) dopo il nome. Ilprimo argomento determina il valore della variabile $1, il secondo quellodella variabile $2 e così via. Queste variabili possono essere create all’internodegli oggetti dell’abstraction, ma non dentro le message box.
myabstraction 100 1000
0
Figure 33: un’abstraction con due argomenti
Osserviamo la figura 33: l’oggetto myabstraction viene inizializzato con dueargomenti: 100 per la variabile $1, 1000 per la variabile $2. Un bang mettein azione l’abstraction. Ma vediamo cosa accade al suo interno (figura 34).I due argomenti inviati tramite l’object box myabstraction si sostituiscono
38
inlet
outlet
pack $1 $2
line
Figure 34: l’interno dell’abstraction
a $1 ed $2, che sono le variabili di pack, che riceve quindi la lista (100
1000) che sono rispettivamente il valore-obiettivo e il tempo in millisecondidell’oggetto line. Un bang ricevuto dall’inlet dell’abstraction mette in azioneline restituendo la rampa all’outlet.
3.6.3 GRAPH ON PARENT
subpatch e abstraction possono anche essere pilotate dalla patch senza bisognodi essere aperte ogni volta ci fosse il bisogno di cambiare un valore. Insostanza subpatch e abstraction possono diventare oggetti interattivi. Perfare questo una delle soluzioni potrebbe essere quella di creare degli inletaggiuntivi nella subpatch oppure utilizzare un’altro metodo che Pd mette adisposizione. Se nelle proprietà della subpatch (o dell’abstraction, questo sis-tema funziona su entrambe), cui si accede premendo il sinistro del mousesu un punto qualunque della subpatch window, selezioniamo l’opzione graphon parent, comparirà all’interno della subpatch stessa un riquadro all’internodel quale possiamo mettere ciò che vogliamo sia visibile dalla patch geni-trice. Gli oggetti consentiti sono essenzialmente GUI’s, quindi number box,sliders, radio button etc. . .Nel caso della figura 35 la subpatch submetro contiene un oggetto metro conuna number box che regola la distanza in millisecondi fra i bang.I cavi di connessione vengono nascosti nella patch in modo da rendere piùchiara la lettura dell’algoritmo.
39
1 0
pd submetro
301
regola_metro
Figure 35: Una subpatch con una number box in graph on parent
inlet
outlet
metro 500
301
regola_metro
Figure 36: l’interno della subpatch. Per creare il riquadro di visibilità basta andaresulle proprietà della subpatch e selezionare l’opzione graph on parent
40
4 V E T TO R I , G R A F I C I E TA B E L L E
4.1 VETTORI
Un vettore (in inglese array) è un oggetto che permette di conservare e ma-nipolare comodamente una grande quantità di dati. Può essere pensatocome un contenitore di locazioni di memoria, identificate da un indice, at-traverso il quale è possibile accedere alla locazione desiderata. I vettoriin Pd sono rappresentati da grafici bidimensionali che hanno sull’ascissal’indice e sull’ordinata il valore corrispondente. Si tratta sempre di vettorimonodimensionali che gestiscono collezioni di numeri interi, decimali o disegnale (ma di questi ultimi ci occuperemo in seguito) quindi l’indice è unintero che identifica una e una sola posizione in memoria. Nel linguaggioC i vettori monodimensionali vengono definiti, come le variabili, in questomodo:
int i[4] = {5, 2, 7, 3}
che crea il vettore i di tipo intero di 4 elementi. Immediatamente doporiempie il vettore con i valori interi 5, 2, 7, 3. In Pd questo vettore vienerappresentato come in figura 37.Ricordiamo che l’indice di un vettore inizia da 0, quindi un vettore di4 elementi avrà un indice che va da 0 a 3. Un array in Pd si crea dalmenu Put/Array. Se premiamo col destro del mouse sul grafico possiamoaccedere alle proprietà dell’array, dove possiamo impostare la dimensionedel grafico e del vettore. Osserviamo dalla figura 37 le seguenti cose:
1. all’interno del grafico ci sono delle barrette orizzontali che rappresen-tano le coordinate (x, y) degli elementi
2. in alto a sinistra del grafico c’è il nome del vettore (in questo caso i)
3. incolonnati a sinistra ci sono dei valori che rappresentano il rangedell’ordinata, quindi dei valori che può assumere ogni elemento dell’array
41
i
0 1 2 3
0
5
10
Figure 37: vettori: sull’asse delle ascisse c’è l’indice, sull’ordinata il valore
4. in riga in basso ci sono invece i valori dell’indice
Punto 1. Il grafico di un vettore può essere riempito in numerosi modi:
- interattivamente, cioè con il mouse
- con una message box che invia i dati al grafico stesso. La sintassi diuna message box per un vettore è la seguente:
;
nome_vettore (comando) argomenti
Si possono scrivere esplicitamente i singoli valori inserendo nella mes-sage box l’indice del primo elemento da scrivere seguito da tutti i val-ori da inserire nel vettore. Si possono possono produrre i valori delvettore attraverso una funzione trigonometrica come sinesum (sommadi seni), seguita dal numero degli elementi del vettore e dal valore diogni curva sinusoidale (compreso fra 0 e 1), oppure cosinesum, ugualealla precedente, ma che genera una cosinusoide o una somma di cos-inusoidi. Si possono inoltre leggere i dati richiamandoli da un file ditesto con il comando read seguito dal nome del file che contiene didati (figura 38).
42
- con oggetti speciali che scrivono i dati all’interno dei vettori. L’oggettotabwrite scrive valori all’interno di un vettore. Nell’inlet di sinistra en-trano i valori, in quello di destra i relativi indici. Il messaggio setin entrata a sinistra determina il nome dell’array sul quale operare,nome che può anche essere inserito nell’oggetto come argomento,subito dopo il nome (figura 39).
;
i sinesum 32 0.5
;
i resize 4
i 0 0.5 0.75 -0.6 0.1
;
i cosinesum 32 0.25 0.5 0.25
i
Figure 38: attivare le tre message box con un click e verificarne il risultato sulgrafico. Il comando resize ridimensiona il vettore secondo quanto indi-cato dal suo argomento, in questo caso 32
Nella patch della figura 39 until provoca l’uscita di una sequenza di 32
bang che vengono numerati da un contatore, che a sua volta li spedisceall’inlet destro di tabwrite (l’indice dell’array). Contemporaneamente i bangproducono l’uscita di numeri pseudo-casuali decimali, compresi fra 0 e 2,dall’oggetto randomF. Da questi ultimi viene sottratto 1 in modo da avere
43
tabwrite i
int 1 + 1
randomF 2
- 1
1
until
32
i
-1
0
1
Figure 39: click sulla message box in alto e verificare il risultato sul grafico
un range compreso fra -1 e 1, che rappresentano i valori minimi e massimidel grafico del vettore.
Punti 2-4. L’interfaccia del vettore, il grafico, può presentare anche ele-menti come un etichetta che rappresenta l’ordinata e uno che rappresental’ascissa. Questi elementi si possono aggiungere tramite message box sec-ondo le seguenti sintassi:
44
nome_vettore xlabel posizione valori_ascissa_da_mostrare
nome_vettore ylabel posizione valori_ordinata_da_mostrare
nome_vettore xticks posizione intervallo intervallo_tick_grande
nome_vettore yticks posizione intervallo intervallo_tick_grande
Gli stessi comandi seguiti da hide rimuovono i risultati del comando. Perverificare il funzionamento di questi comandi si copi il codice della figura40, che mostra un vettore di 100 punti, con range da -1 a 1.
;
i ylabel hide
;
i ylabel -5.5 -1 0 1
;
i xlabel hide
;
i xlabel -1.2 0 100
;
i yticks hide
;
i xticks hide
;
i xticks 0 2 10
;
i yticks 0 0.1 5
i
0 100
-1
0
1
Figure 40: click sulle message box per aggiungere o rimuovere le etichette
45
Fra le proprietà del grafico si può anche impostare il modo con cui verràdisegnato il grafico: come punti discreti (draw as points), come punti inter-polati (polygon) cioè singoli punti uniti da una linea che traccia il percorsopi˘ breve fra punti adiacenti, infine come curva di bézier (bézier) che smussagli spigoli (figura 41).
punti polygon
bezier
i
i
i
Figure 41: le tre diverse rappresentazioni di un vettore di 16 punti
4.1.1 LEGGERE UN VETTORE
Un vettore può essere letto e utilizzato per processare altri dati. Uno deglioggetti che permettere di leggere i dati di un vettore è tabread che ha ununico inlet che riceve l’indice del valore da restituire. Nella figura 42 tabreadlegge tutti i valori del vettore i e a sua volta li riscrive in un nuovo vettore(new) che disegna i valori sul grafico uno ad uno. Allo stesso tempo tabreadmodifica la dimensione di un bang e il movimento dell’indicatore di unaslider verticale.
4.1.2 L’OGGETTO table
L’oggetto table è simile ad un normale oggetto array con l’unica differenzache crea il grafico in una subpatch invece che nella patch window doveviene creato l’oggetto. Il primo argomento è il nome dell’array, il secondo,opzionale è la sua dimensione. E’ inoltre possibile mandare messaggi alvettore, con i consueti metodi visti nei paragrafi precedenti.
46
until
16
int + 1
tabread i
tabwrite new
metro 1000
int 0
0
+ 1
line
1 0
mod 16
0
tabwrite new
0
t i i sel 15
reset
0, $1 950
size $1
line
$1 950
s reset
r reset
i
new
Figure 42: click sulle message box per aggiungere o rimuovere le etichette
47
5 P R O G R A M M A Z I O N E AVA N Z ATA
5.1 ISTRUZIONI CONDIZIONALI
Nella logica della programmazione le istruzioni condizionali sono gli stru-menti che permettono di verificare se una data condizione sia vera o falsa1.In Pd, come nella maggior parte degli altri linguaggi di programmazione,esistono degli oggetti e dei costrutti sintattici che permettono di verificareuna condizione e di eseguire delle operazioni al verificarsi di determinatesituazioni. Tutti queste istruzioni possono essere raccolte e combinate inalgoritmi di selezione.
5.1.1 OPERATORI RELAZIONALI
Gli operatori relazionali consentono di confrontare due valori fra loro, quindisono binari. Come nel linguaggio C producono un output uguale a 1 se lacondizione richiesta dall’operatore relazionale è soddisfatta, uguale a 0 incaso contrario. I principali operatori relazionali sono sei:
• > (maggiore di)
• < (minore di)
• >= (maggiore o uguale a)
• <= (minore o uguale a)
• == (uguale a)
• != (diverso da)
1 Il concetto di vero o falso è mutuato dalla logica classica che ha prestato al mondodell’informatica i suoi modelli. La primitiva fondamentale dell’informatica, il bit, può infattiassumere il valore di 1 o 0, acceso o spento, vero o falso.
48
> 10
0
0
Figure 43: L’output di ’>’ restituisce 0 finché il numero in entrata é minore ouguale a 10, 1 quando diventa maggiore di 10
5.1.2 select
select (forma abbreviata: sel) opera una selezione sugli atomi in entrataconfrontandoli con i suoi argomenti. Se la condizione è soddisfatta selectemette un bang dall’outlet corrispondente, in caso contrario spedisce fuoril’atomo in entrata dall’ultimo outlet a destra.
sel 10
5 123 10
0
Figure 44: select
select può selezionare più atomi, in tal caso avrà tanti outlet quanti sarannogli atomi da valutare, più uno, da cui farà uscire gli atomi che non soddis-fano la selezione (figura 45).Con gli operatori relazionali e select realizziamo un algoritmo che operauna selezione su dei numeri. Quando la selezione è soddisfatta e selectemette 1, verrà attivata una rampa con l’oggetto line (figura 46).
49
5
123
10
0
sel 10 4
4
Figure 45: select con più selezioni
> 50
sel 1
line
0, 127 2000
20 32 69
Figure 46: valutare l’algoritmo con un click sulle 3 message box in alto
Se volessimo modificare questo algoritmo in modo da operare una verificasu una rampa invece che su valori singoli, avremmo bisogno di uno stru-mento che individui il superamento di una soglia. L’oggetto che fa al casoin questione è change, che filtra le ridondanze in un flusso in entrata. Adesempio se in change entra per 10 volte consecutive il numero 1, emetterà 1
50
solo alla prima entrata. Combinando così ’>’ e change possiamo soddisfarela nostra richiesta.
line
0, 100 2000
> 50
sel 1
line
0, 127 2000
100
change
Figure 47: click sulla message box in alto
Esaminiamo la patch in figura 47: all’attivazione della rampa, inizia il cam-mino da 0 a 100 effettuato da line. Appena superato il valore-soglia di 50,l’operatore ’>’ emette 1 a ripetizione, ma change elimina tutte le ripetizionisuccessive, consentendo l’uscita solo del primo 1, attivando così il selettoresel un’unica volta. Si attiva in quel momento la rampa in basso.
5.1.3 OPERATORI LOGICI
Gli operatori logici eseguono operazioni secondo le tavole di verità dell’algebrabooleana2. In Pd ci sono operatori che operano al livello di bit e altri che op-erano sui numeri decimali. Nel primo caso i numeri interi decimali ricevutidagli operatori logici vengono trasformati nella loro forma binaria e ogni
2 Le tavole di verità sono tabelle usate nella logica per determinare se, attribuiti i valori diverità alle proposizioni che la compongono, una determinata proposizione è vera o falsa.
51
bit viene valutato con il bit dell’altro numero che si trova nella stessa po-sizione. Ad esempio l’operatore AND (oggetto ’& ’ in Pd) segue le regoledella tavola di verità illustrate nella tabella 1.
a b a ∧ b
0 0 00 1 01 0 01 1 1
Table 1: tavola di verità per l’operatore AND
Se volessimo realizzare un AND sugli interi 21 e 6, ’& ’ opererebbe nelmodo illustrato nella tabella 2.
21 = 1 0 1 0 1 ∧6 = 0 0 1 1 0 =
4 = 0 0 1 0 0
Table 2: operazione AND su gli interi 21 e 6
&
21 6
t b b
4
Figure 48: l’operatore AND in azione in una patch di Pd
52
L’operatore OR (in Pd ’|’) agisce allo stesso modo ma seguendo le regoledella tavola di verità dell’OR booleano (tabella 3).
a b a ∨ b
0 0 00 1 11 0 11 1 1
Table 3: tavola di verità per l’operatore OR
|
t b b
63
41 22
Figure 49: l’operatore OR
In relazione a questi due operatori ci sono due oggetti (’&& ’ e ’||’) checonfrontano due valori (interi o decimali) producendo come risultato lostesso delle tavole di verità su citato. Ad esempio ’&& ’ restituisce 1 se esolo se entrambi i valori sono diversi da zero, mentre restituisce 0 se unodei due valori o entrambi sono uguali a zero (tabella 1).Altri due operatori che lavorano a livello di bit sono ’«’ e ’»’, che potremmochiamare rispettivamente scivola a sinistra e scivola a destra. Il primo, ad es-empio, converte l’intero che riceve nel suo inlet sinistro nella sua forma bi-naria e aggiunge a destra tanti bit uguali zero quanti sono richiesti dall’inletdi destra. Nella tabella 4 c’è un esempio con il numero 113 da spostare asinistra di due posizioni.
53
1
&&
10 10
Figure 50: l’operatore ’&& ’ confronta due valori in base alla tavolà di verità perAND
113 = 1 1 1 0 0 0 1 <<
2 =
452 = 1 1 1 0 0 0 1 0 0
Table 4: scivola a sinistra di due posizioni
<<
113 2
t b b
452
Figure 51: La relativa patch di Pd che realizza lo scivolamento a sinistra
5.1.4 If
Per terminare il capitolo sulle istruzioni condizionali non resta che af-frontare il costrutto if. Pd non dispone di un oggetto if, ma consente diusare questo comando all’interno dell’oggetto expr che abbiamo già incon-trato (sezione 3.3.2). Nei comuni linguaggi di programmazione l’istruzione
54
if valuta un’espressione, se vera restituisce un certo risultato, se falsa nerestituisce un altro. Nel linguaggio C la sintassi del costrutto if è la seguente:
if (espressione)
fai una certa cosa;
else
fanne un’altra;
che significa: "Se l’espressione è vera fai una certa cosa, altrimenti fanneun’altra". In Pd invece la sintassi è:
if (espressione, a se vera, b se falsa)
0
0
expr if ($f1 < 10, $f1 * 5, 10)
Figure 52: se il numero in entrata è minore di 10 espr restituisce il numero stessomoltiplicato per 5, altrimenti restituisce 10
5.2 loops E ITERAZIONI
Le iterazioni in Pd si possono gestire in molti modi. Generalmente un’iterazionenei linguaggi di programmazione è la ripetizione di un evento fino all’uscitadall’evento stesso, determinata dal verificarsi di una certa condizione. InPd un’iterazione può essere l’emissione di un bang ogni mezzo secondoper un numero definito di volte. Come sappiamo metro genera bang a ripe-tizione, finché non viene spento. E’ semplice quindi inserire un contatoreche si occupa di contare i bang usciti e appena raggiungo il valore desider-ato si occupa di spegnere metro. Osserviamo la patch in figura 53.Pd implementa anche l’oggetto until che emette un numero di bang definitoda un numero in entrata nel suo inlet sinistro. A differenza della patch infigura 53 until non è orientato al tempo ma opera quasi istantaneamente
55
1 0
float + 1
0
sel 9
loadbang
metro 500
0
Figure 53: la patch produce 10 bang attraverso un oggetto metro controllato da uncontatore e da un selettore
come nei tradizionali linguaggi di programmazione. In effetti until fun-ziona secondo lo schema classico di un ciclo for del C:
for (i=0; i<100; i++)
espressione;
che significa: "finché il contatore, partito da 0 non arriva a 99, valutal’espressione". Se l’espressione fosse un ordine di stampare il valore dellavariabile-contatore avremmo:
for (i=0; i<100; i++)
printf("%d", i);
Nella figura 54 si vede la patch di Pd che fa la stessa cosa.
56
until
100
+ 1
0
loadbang
int
Figure 54: ciclo until: valutare l’algoritmo con un click sulla message box in alto eosservare il risultato nella Pd window
57
6 I L M I D I
6.1 PANORAMICA SUL PROTOCOLLO MIDI
Il protocollo MIDI (Musical Instrument Digital Interface) consente a dispos-itivi diversi di comunicare fra loro attraverso l’invio messaggi che vengonointerpretati e tradotti. È a tutti gli effetti un protocollo di comunicazione,quindi i messaggi sono formati esclusivamente da numeri. Il MIDI nonmanipola, non invia, non riceve, né gestisce suoni di alcun tipo.Anche se, tipicamente, il protocollo MIDI viene usato in ambito musicale,teoricamente può essere utilizzato anche per altri scopi.Affinché il MIDI possa funzionare è necessario che ci siano almeno duedispositivi che devono comunicare e che siano fornite di porte di comuni-cazione. Le porte di uscita dei messaggi sono le porte MIDI OUT, quelledi entrata MIDI IN. C’è un altro tipo di porta, MIDI THRU che consentedi reindirizzare un messaggio in entrata da una MIDI IN verso un altrodispositivo.Praticamente un dispositivo che invia (Master) dati, indirizza i propri mes-saggi attraverso la sua porta MIDI OUT. Il dispositivo ricevente (Slave) liriceve attraverso la sua porta MIDI IN ed eventualmente li indirizza a suavolta ad un altro SLAVE attraverso la sua MIDI THRU.Questo schema logico non è l’unico possibile, ma in questa sede non ciaddentreremo oltre negli schemi di collegamento MIDI, anche perché con-cettualmente lo schema appena illustrato è quello su cui si basano tutte lepossibili configurazioni.Il MIDI è anche in grado di permettere la comunicazione fra dispositivisoftware risiedenti su una stessa macchina, tipicamente un computer. Adesempio Pd potrebbe ricevere messaggi MIDI da un qualunque sequencere inviarli a sua volta alla scheda audio.
58
6.1.1 ANATOMIA DI UN MESSAGGIO MIDI
Il messaggi MIDI sono fondamentalmente costituiti da sequenze di due otre bytes, il primo dei quali è detto STATUS BYTE, gli altri DATA BYTE. Ilprimo si distinuge dal secondo perché il bit più significativo (quello più asinistra) è uguale a 1:
10000000 (statys byte)
00000000 (data byte)
Lo STATUS BYTE è concettualmente diviso in due nibble, cioè gruppi diquattro bit, il primo dei quali, quello a sinistra, contiene il bit più signi-ficativo e altro tre bit che indicano il tipo di messaggio. Il secondo nibbleinforma sul canale verso cui sarà inviato il messaggio.
Riassumendo, quindi, uno STATUS BYTE è costituito da 3 elementi infor-mativi: il primo bit, che indica che lo STATUS BYTE è tale, 3 bit per il tipodi messaggio e 4 bit per il canale o per un tipo particolare di messaggionel caso di un System Message. Poiché con quattro bit si possono avere 16
combinazioni diverse (0-15) un dispositivo MIDI può inviare e ricevere su16 diversi canali.
I 3 bit di tipo di dato ci danno 8 possibili tipi diversi:
000 Note OFF
001 Note ON
010 Polyphonic Key Pressure
011 Control Change
100 Program Change
101 Channel Pressure
110 Pitch Bend Change
111 System Message
Un esempio. Una macchina master invia un messaggio come questo:
10010000
59
si tratta di uno STATUS BYTE (il bit più a sinistra è 1) che sta per inviari unDATA BYTE di tipo Note ON (001) sul primo canale (0000). Abbreviando,potremmo anche pensare a questo come lo STATUS BYTE 144, che è il bytein question e convertito in decimale.
Un messaggio Note ON indica l’esecuzione di una nota, con un suo pitch,cioè una sua altezza e una sua velocity cioè il suo volume (velocity rimandaall’idea che la velocità con cui un tasto viene premuto è proporzionale alvolume che si ottiene)Uno STATUS BYTE di Note On quindi sarà sempre seguito da due DATABYTE, ognuno dei quali può assumere un valore compreso fra 0 e 127.Infatti il DATA BYTE, ha 7 bit a disposizione per informare (il primo bitindica che il DATA BYTE è tale).
Riprendendo l’esempio precedente:
10010000 (STATUS BYTE Note ON sul canale 0)
00111100 (DATA BYTE Pitch 60)
01000000 (DATA BYTE Velocity 64)
Come già detto, uno STATUS BYTE può essere seguito da uno o due DATABYTE. Ad esempio, un messaggio di Program Change (100), che serve adimpostare o cambiare il timbro per una determinata sequenza di eventiMIDI, il DATA BYTE è soltanto uno.Nel caso di un un System Message, codice 111, i 4 bit a destra dello STATUSBYTE non rappresentano il canale, ma, appunto, il codice di un particolaremessaggio detto messaggio di sistema, inviato a tutto il sistema per dareinformazioni generali. Gli altri sono detti Channel Voice Messages.La struttura quindi della comunicazione MIDI è quindi molto semplice.Uno STATUS BYTE indica il tipo di messaggio inviato, uno o due DATABYTE portano i dati del tipo di messaggio. Per maggiori informazioni suitipi di messaggio la rete è un’ottima fonte di informazioni.
6.2 PD E IL MIDI
Pd può ricevere e inviare messaggi MIDI. Dal menu MIDI settings (che siapre da Media o da preferences, in base al sistema operativo utilizzato) èpossibile impostare le porte di entrata e di uscita dei messaggi MIDI.
60
6.2.1 MIDIIN E MIDIANALYZE
L’oggetto che ci consente di far entrare in Pd messaggi MIDI puri, cioè an-cora non codoficati in base al tipo è midiin che manda fuori dall’outlet disinistra messaggi Channel Voice in forma decimale. In sostanza restituiscesequenze di numeri interi compresi fra 0 e 239 poiché gli STATUS BYTE ditipo SYSYTEM MESSAGE, che sono compresi fra 240 e 255 non vengonocatturati.
Ora proviamo a implementare un oggetto, midianalyze che analizza i datiricevuti da midiin convogliandoli a vari inlet in base al loro significato.Tale oggetto esiste già in una forma quasi uguale nella libreria che emulagli oggetti di Max/MSP e prende il nome di midiparse.midianalyze (fig. 55) non ha inlet in quanto contiene al suo interno l’oggettomidiin che riceve messaggi midi dall’esterno di Pd. Ha invece 6 outlets,il primo dei quali restituisce messaggi di noteON, il secondo di ChannelPressure, il terzo di Control Change, il quarto di Program Change, il quintodi Channel Pressure e l’ultimo di Pitch Bend. Sono esclusi i messaggi dinote OFF perché sono ormai inutilizzati dal protocollo. Per chiudere unanota infatti si usa un normale messaggio di Note ON con velocity pari azero. Ogni outlet formatta i messaggi restituendo una lista composta da idati e dal numero del canale.
midianalyze
45 0 0
prepend set prepend set
10 74 0
prepend set
16 40 0
prepend set
42 0
prepend set
51 9
prepend set
0 53 0NoteON keypressure controlchange programchange channelpressure pitchbend
Figure 55: midianalyze e i suoi outlets
L’interno dell’abstraction (fig. 56) è semplice, l’oggetto midiin invia i mes-saggi all’oggetto moses che li divide fra i suoi due outlet: se un messaggo(che, ricordiamo non è altro che un byte in forma decimale) è inferiore a128 (0-127) sarà inviato al primo outlet in quanto si tratterà di un DATABYTE, al contrario sarà uno STATUS BYTE e sarà inviato all’altro outletmoses smista i messaggi inviandoli a sei subpatches, ognuna delle qualicostruirà la lista appropriata. I messaggi di Program Change e di Chan-nel pressure saranno formati da una lista di due interi: il dato e il canale,
61
moses 128
outlet noteon outlet keypressure outlet cc outlet pgmchange outlet chnpressure outlet pitchbend
pd noteon pd keypressure pd cc pd pgmchange pd chnpressure pd pitchbend
midiin
Figure 56: L’interno dimidianalyze
tutti gli altri messaggi saranno formati da una lista di tre interi, due per idati, uno per il canale.
In figura (fig. 57) è mostrata la subpatch che interpreta e resistuisce la listadei messaggi di Program Change. Se lo STATUS BYTE è compreso fra192 e 207, l’algoritmo fa un AND restituendo 1 se entrambe le condizionisono soddisfatte e zero in ogni altro caso. In caso positivo l’oggetto spigot,ricevendo 1, permette al DATA BYTE ricevuto di uscire dal suo outlet e dientrare in list append, dove verrà unito al numero di canale.
spigot
t f f f
list append
>= 192 <= 207 - 192
outlet pgmchange
inlet data inlet status
&&
Figure 57: La subpatch che formatta la lista dei messaggi Program Change
Il caso di un messaggio Note ON (fig. 58) è un po’ più complesso perchéla lista è formata da 3 interi. I dati che spigot lascia passare vengono primapassati per list prepend che, ricorsivamente, li mette in lista per inserirli poi
62
nell’inlet destro di list append. Non appena la lista raggiunge i due elementi(list length si occupa di contare gli elementi di una lista) tramite sel 2 vieneemesso un bang che fa uscire la lista e permette che questa venga unita alterzo elemento, cioè il numero del canale.
spigot
<= 159
list append
list prepend t l
t f b
list length
t l l
sel 2
- 144
list append
t f f f
>= 144
outlet noteon
inlet statusinlet data
&&
Figure 58: La subpatch che restituisce la lista dei messaggi Note ON
Tutte le altre subpatches dell’oggetto midianalyze funzionano come quelleche abbiamo appena analizzato. Lasciamo al lettore la possibilità di ri-costruirle.
6.2.2 ALTRI OGGETTI MIDI
Una volta capito il funzionamendo dei messaggi MIDI ed aver implemen-tato l’oggetto midianalyze non ci sarà bisogno di soffermarsi troppo sugli
63
oggetti che in Pd si occupano del MIDI. Nella maggioranza dei casi glioggetti avranno una versione per l’input dei dati e una per l’output. Nediamo di seguito un elenco (parziale):
oggetti descrizione
midiin/midiout dati MIDI grezzinotein/noteout Note ONpgmin/pgmout Program Changebendin/bendout Pitch Bendctlin/ctlout Control Changetouchin/touchout Channel Pressurepolytouchin/polytouchout Polyphonic Key Pressure
Oltre a tali oggetti, ce ne sono altri legati alla gestione di eventi MIDI.Esaminiamo due oggetti, uno per la manipolazione di eventi Note ON inentrata, un altro per gli stessi tipi di eventi in uscita.
L’oggetto stripnote riceve coppie di valori (pitch,velocity) e lascia passaresltanto quelle coppie che hanno velocity diversa da zero. Può essere utilequando è necessario processare soltanto le altezze, evitando così la ripe-tizione del pitch. Infatti ogni volta che un messaggio note ON è ricevuto, èseguito sempre da un altro messaggio, con lo stesso pitch, ma con velocityuguale a zero. Piuttosto che fare un esempio di uso di stripnote, proviamoad implementare un oggetto che faccia la stessa cosa (fig. 59).L’oggetto makenote riceve coppie di valori (pitch,velocity), li fa uscire e ag-giunge un messaggio con lo stesso pitch, ma con velocity uguale a zero.In pratica chiude un evento Note ON. Può avere due argomenti: velocityiniziale e durata della nota.Un esempio di makenote sarà spiegato nella prossima sezione, dove verràimplementata una versione del brano di Steve Reich Piano Phase.
6.3 UN ESEMPIO DI EDITING ALGORITMICO MIDI
Nel 1967 il compositore americano Steve Reich compose un brano per duepianoforti intitolato Piano Phase che esplorava la tecnica del dephasing.Un pattern di 12 semicrome viene eseguito all’unisono e in ostinato dai duepianisti. Dopo un certo numero di ripetizioni il secondo pianista aumentaleggermente la velocitù in modo da produrre una sfasatura fra le due frasi,
64
60 64
60 0
70 25
unpack 0 0
!= 0
*
t f f
moses 1
spigot
t f f
print pitch print vel
Figure 59: L’oggetto clone di stripnote
sfasatura che si allarga fino a far si che i due pattern non si ritorvano dinuovo sovrapposti esattamente, ma ad una nota di distanza. I due pianistia questo punto suonano per un po’ allo stesso tempo per poi ricominciare ilprocesso, fino a che, completato il giro di tutte e 12 le note, non si ritrovanoall’unisono. A quel punto il primo pianista viene lasciato solo per un po’ einizia la seconda parte del brano, della quale non ci occuperemo.
Per implementare tale algoritmo è necessario formalizzare il problema. Laquestione principale da risolvere è data dal fatto che, mentre uno dei pi-anisti suona a velocità costante (avremo, intuitivamente, un oggetto metroche non cambia mai, il secondo pianista suona alla stessa velocità del primoper un po’, poi accelera per sfasare i pattern poi torna alla velocità inizialenon appena i pattern non sono sovrapposti esattamente a una nota di dis-tanza.
Bisogna quindi stabilire:
65
• quanti pattern i pianisti suonano allo stesso tempo;
• qual’è il tempo costante;
• qual’è il tempo del secondo pianista che produce la sfasatura;
• quanti pattern sono necessari perché i pattern si reincontrino esatta-mente a una nota di distanza;
Convenzionalmente scegliamo che i pianisti suoneranno quattro patternallo stesso tempo, poi il secondo pianista inizierà a suonare più veloce-mente. Se suonasse ogni nota 1 millesimo di secondo più velocementedel primo, alla fine del suo pattern avrà guadagnato 12 millisecondi. Persemplicità quindi assumiamo che ogni durata del primo pianista sarà unmultiplo di 12, per esempio 144 millisecondi. In questo modo dopo 12
esecuzioni del pattern i due si ritrovano nuovamente in fase.Riassumendo:
• 4 pattern in fase con durata di 144 ms per nota
• 12 pattern dove il primo pianista suona a 144 ms e il secondo a 143
ms
• il ciclo ricomincia a una nota di distanza.
Pima di tutto implementiamo la sequenza a velocità costante (fig. 60).L’oggetto metro è collegato ad un contatore che enumera le 12 note del pat-tern, ovviamente espresse in altezze MIDI. L’oggetto list-nth riceve la listadelle altezze e nel suo inlet destro l’indice della lista da far uscire dall’outlet.Infine makenote formatterà ogni altezza in modo che abbia velocity pari a 64
e durata di 120 ms.Come detto, il secondo pianista suonerà la stessa cosa, variando però la ve-locità. L’algoritmo sarà identico (fig. 60) cln le sole differenze che l’inlet de-stro di metro ospita le due possibili velocità di esecuzione e che l’oggetto no-teout invierà i dati al secondo pianoforte, sul secondo canale MIDI. Sarannoquindi caricati nell’eventuale gestore dei suoni due pianoforti, uno sulprimo, l’altro sul secondo canale.Infine la parte più interessante dell’algoritmo. Un contatore (fig. 62) enu-mera ogni pattern del pianista di sinistra, con modulo 16, in modo dacontare da 0 a 15. Un selettore poi emette un bang quando il contatore
66
noteout 1
list-nth
64 66 71 73 74 66 64 73 71 66 74 73
+ 1f 0
t f b
0
% 12
t b f
makenote 64 120
metro 144
Figure 60: La sequenza a velocità costante
raggiunge lo zero e il 4, cioè l’inizio della parte in fase e l’inizio di quella avelocità diverse. Quando il selettore banga in corrispondenza di uno zeroin entrata, metro riceve 144 nel suo inlet destro. Quando invece c’è il 4 metroviene settato a 143 finché il contatore non torna a zero.L’algoritmo così è concluso, ma se lo eseguiamo ci rendiamo conto chel’esecuzione è molto poco umana. Proviamo a modificare la patch in modoche ogni nota abbia una velocity leggermente diversa (fig. ??). Il risultatoche si ottiene è leggermente più realistico.Allo stesso modo si possono fare altre migliorie, come ad esempio ac-centare alcune note del pattern, aumentare il range dinamico, o inserireil pedale di risonanza (che è gestito dal controller 64 dello standard MIDIcon un normale messaggio di tipo Control Change) e altro, ma lasciamo allettore il divertimento di sperimentare eventuali modifiche alla patch.
67
noteout 1
list-nth
64 66 71 73 74 66 64 73 71 66 74 73
+ 1f 0
t f b
0
% 12
t b f
makenote 64 120
metro 144
144 143
list-nth
64 66 71 73 74 66 64 73 71 66 74 73
+ 1f 0
t f b
0
% 12
t b f
makenote 64 120
metro 144
noteout 2
Figure 61: I due pianisti virtuali di Piano Phase
68
noteout 1
list-nth
64 66 71 73 74 66 64 73 71 66 74 73
+ 1f 0
t f b
0
% 12
t b f
makenote 64 120
metro 144
sel 00
% 16
sel 0 4
+ 1f 0
144 143
list-nth
64 66 71 73 74 66 64 73 71 66 74 73
+ 1f 0
t f b
0
% 12
t b f
makenote 64 120
metro 144
noteout 2
reset counter
Figure 62: Il contatore che regola la velocità di esecuzione del pattern
69
noteout 1
list-nth
64 66 71 73 74 66 64 73 71 66 74 73
+ 1f 0
t f b
0
% 12
makenote 64 120
metro 144
sel 00
% 16
sel 0 4
+ 1f 0
144 143
list-nth
64 66 71 73 74 66 64 73 71 66 74 73
+ 1f 0
t f b
0
% 12
makenote 64 120
metro 144
noteout 2
reset counter
t b f b
random 32
+ 48
random 32
+ 48
t b f b
Figure 63: La sequenza a velocità costante
70
7 O G G E T T I G U I
Nel corso dei nostri primi esperimenti abbiamo già avuto modo di incon-trare alcuni oggetti grafici, che nell’ambito del mondo informatico sonodette GUI (graphical user interfaces). Pd mette a disposizione un certo nu-mero di GUI’s, alcuni nativi, cioè facenti parte del pacchetto standard delprogramma, altri derivati da librerie esterne, la maggior parte delle qualisono caricate nella versione extended. Genericamente possiamo dire chetutte le GUI di Pd possono essere configurate tramite le properties, accessi-bili col tasto destro del mouse sulla GUI stessa.
Le GUI native di Pd sono:
- bang
- toggle
- slider orizzontali e verticali
- radio button orizzontali e verticali
- VU-meter
- canvas
- number2
Sul bang non c’è molto altro da dire, lo abbiamo incontrato già moltissimevolte. toggle invece è un oggetto molto utile che permette di restituire 1
quando è attivo, 0 quando è disattivo. Praticamente è una variabile binariache si attiva con un click del mouse. Quando è attivato mostra una croceall’interno del quadrato che la costituisce (figura 64).
Pd offre due tipi di slider, che sono delle leve attivabili con il mouse o daaltri oggetti. Fra le due non c’è alcuna differenza se non nel fatto che un
71
tipo è verticale, l’altro orizzontale. Dalle proprietà si può impostare ladimensione, ma soprattutto il range dell’output.
1 0
metro 500
int 1 + 1
mod 2
sel 0
Figure 64: l’oggetto toggle
Nella figura 64 il toggle più grande attiva un oggetto metro che a sua voltamanda dei bang a un contatore che attraverso l’oggetto mod conta solo da0 a 1, quando è 0, il bang (grazie all’oggetto sel) esce da sinistra, quandoè 1 esce a destra. Nella figura successiva invece (fig. 65) lo slider verticaledi sinistra pilota gli altri due: quello di destra attraverso expr effettua ilmovimento contrario, mentre quello di sotto si muove in parallelo, ma som-mato a un movimento continuo generato dall’algoritmo a sinistra. metroattiva un contatore da 0 a 1. Il valore in uscita viene moltiplicato per unaltro valore che va da 0 a 20, gestito dallo slider principale. Il prodottodi questi due fattori diventa il valore-obiettivo dell’oggetto line che crea ilmovimento dello slider in basso. C’è da notare che ci sono due oggetti ’r’,cioè receive, ma non c’è nessun send! Le GUI infatti possono mandare o rice-vere messaggi senza bisogno di creare oggetti e supplementari. Possiedonodegli oggetti send e receive incorporati che possono essere impostati dalle
72
line
$1 90
int 1 + 1
mod 2
* 10
+
manovrare_da_qui
r slide
expr ($f1 / 127) * 20
r slide
expr (127 - $i1)
metro 100
Figure 65: lo slider verticale a sinistra pilota gli altri due
properties della GUI stessa.
I radio button sono oggetti formati da barrette orizzontali o verticali cos-tituite da caselle ordinate. L’uscita è il numero della casella a partire daquella più a sinistra nel caso di radio button orizzontali, e da quella più inalto nel caso di verticali. Ricordiamo che il conteggio inizia dallo 0, quindiun radio button di 16 elementi, avrà un output che va da 0 a 15. In figura66 due radio button disegnano un grafico. Unica annotazione, i valori delradio button verticale vengono invertiti per consentire un migliore adesione
73
al grafico, così il primo valore in alto diventa 9 in luogo di zero, il secondo8 invece che 1, etc. . . .
tabwrite array1
r ascissaexpr (9 - $i1)
r ordinata
array1
Figure 66: impostare prima l’indice (radio button) orizzontale, poi il valore conquello verticale
74
Della GUI VU-meter avremo modo di scrivere nella parte che riguardal’audio, mentre possiamo ora accennare alle canvas che sono oggetti sem-plici che servono a connotare graficamente le nostre patch in modo dacaratterizzare con i colori alcune zone della finestra. Possono essere utiliin patch molto articolate dove c’è bisogno di rendere riconoscibili le varieparti dell’algoritmo. Infine l’oggetto number2 è molto simile alla normalenumber box con qualche possibilità in più di configurazione grafica.
7.1 ALTRE GUI DALLE LIBRERIE DI PD
Oltre alle GUI native che abbiamo appena discusso, diamo ora una panoram-ica veloce di alcune altre GUI introdotte con le nuove librerie:
- grid
- gcanvas
- knob
- envgen
grid e gcanvas sono molto simili, sono due griglie bidimensionali che emet-tono la posizione del mouse (x, y) dai due outlet alla pressione di quest’ultimo.knob è la classica manopola tipo sintetizzatore analogico. Ha un’unica us-cita che emette l’output nel range impostato nelle properties. Infine l’oggettoenvgen è un envelope generator che emette dati in un formato compatibilecon la versione audio di line, cioè line∼ , del quale tratteremo approfondi-tamente nella parte di questo manuale dedicata all’audio.
Prima di concludere questo capitolo, va ricordato che l’uso massiccio diGUI nelle patch è sconsigliato. La grafica vettoriale che sta alla base ditali oggetti può rallentare la capacità di calcolo quindi quando è possibileevitarne l’uso, si eviti. Ad esempio in luogo dei bang grafici si cerchi diusare l’oggetto relativo bang o ’b’. Non è importante la bellezza estetica diuna patch quanto la sua chiarezza, quindi è meglio evitare troppi oggettigrafici e abbondare, al contrario, di subpatches e annidamenti.
75
Part II
A U D I O
8 L’A U D I O D I G I TA L E
8.1 L’OSCILLATORE
Il suono più semplice che può essere prodotto sinteticamente è quello gen-erato da un oscillatore. Nel mondo analogico un oscillatore è un circuito chegenera forme d’onda di vari tipi, anche se generalmente se non si specificaaltro si parla di oscillatore intendendo un generatore di onde sinusoidali.Un’ onda sinusoidale è un’onda generata da una funzione sinusoidale (vedifig. 67), che si può esprimere tramite la formula:
y = A sin(2π f x + φ)
dove A è l’ampiezza dell’onda, tipicamente impostata ad 1, quindi i valoridella funzione oscillano fra 1 e -1, 2π f = 2π
τ è la frequenza angolare cheindica quanti periodi ci sono in un intervallo di 2π, f = 1
τ è la frequenza,che indica quante volte la funzione si ripete nell’unità di tempo, φ è la fase,cioè lo scartamento che la funzione subisce, ovvero il parametro che perme-tte di anticipare o ritardare i valori della funzione1.
Per produrre una sinusoide con un calcolatore è necessario fare uso di unoscillatore digitale, un algoritmo che produca i valori della funzione sinu-soidale, ossia delle ampiezze dell’onda. A differenza di un segnale elettrico,che è continuo, il calcolatore può solo produrre segnali discreti, quindil’oscillatore digitale calcola i valori della funzione il numero delle volte in-dicato dalla frequenza di campionamento. Ad esempio se la frequenza dicampionamento è 44100 hertz, l’oscillatore calcola i valori della funziona44100 volte al secondo. Questa frequenza di campionamento approssimeràla forma d’onda desiderata, pur non riuscendo a costruirne una identica aquella analogica (fig. 68).
1 http://it.wikipedia.org/wiki/Sinusoide
77
Parametri di una sinusoide
tempo
ampiezza
−2
−1
01
2
−2
−1
01
2
Figure 67: il grafico di una funzione sinusoidale
In Pd l’oscillatore digitale è implementato nell’oggetto osc∼. Nella patchin figura 69 l’oscillatore produce una sinusoide di 440 hz che l’oggettodac∼ converte in segnale analogico, in modo da poter essere inviata aglialtoparlanti.In genere comunque oscillatori digitali non calcolano i valori della fun-zione sinusoidale in tempo reale, ma usano un sistema che rende le cosepiù veloci. Piuttosto che fare 44100 calcoli di funzioni sinusoidali al sec-ondo è preferibile leggere delle tabelle che hanno i valori di una fun-zione sinuoidali già pronti. Piuttosto che calcolare, leggere dei dati èun’operazione molto più rapida. Nella wavetable quindi c’è l’elenco deivalori di ampiezza indicizzati di un ciclo di forma d’onda, l’oscillatorenon deve fare altro che leggerli uno ad uno, iniziando dal primo (0) finoall’ultimo. La tabella può avere dimensioni arbitrarie: più è alto il numerodei punti più accurata è l’onda risultante. In figura 70 è mostrata la rap-presentazione grafica di una wavetable: sull’asse delle ascisse c’è l’indice,su quella delle ordinate il valore di ampiezza. Nella memoria del vet-tore che contiene il grafico ci saranno quindi delle coppie di valori (indice,ampiezza). In questo caso avremo (0, 0), (1, 0.3125), (2, 0.5748), (3, 0.6885),. . .L’oggetto osc∼ legge una cosinusoide scritta in una wavetable di 512 punti.La cosinusoide graficamente è identica ad una sinusoide, con l’unica dif-
78
Sinusoide digitale
tempo
ampiezza
−1.0
−0.5
0.0
0.5
1.0
−1.0
−0.5
0.0
0.5
1.0
Figure 68: il grafico di una funzione sinusoidale prodotta da un calcolatore
osc~ 440
dac~
Figure 69: l’oscillatore di Pd
ferenza che la sinusoide ha come primo valore 0, mentre la cosinusoide 1,quindi è sfasata rispetto alla prima di π
2 (vedi fig. 71).L’oggetto tabosc4∼ implementa un lettore di wavetable generiche, dove èpossibile disegnare una forma d’onda qualunque e sceglierne la dimen-sione. Di tale oggetto si farà larghissimo uso nelle sezioni successive delpresente manuale.
8.1.1 FREQUENZA E AMPIEZZA DEL SEGNALE
L’onda sinusoidale è un’onda periodica perché la sua forma si ripete iden-tica ad intervalli di tempo regolari. Il periodo è quindi il tempo neces-
79
●
●
●
●
●●
●
●
●
●
●
Wavetable
index
ampiezza
0 1 2 3 4 5 6 7 8 9 10
−0.5
0.0
0.5
1.0
0 1 2 3 4 5 6 7 8 9 10
−0.5
0.0
0.5
1.0
Figure 70: una cosinusoide
sario affinché l’onda compia un intero ciclo. Le oscillazioni dell’onda sialternano fra il campo positivo e quello negativo. Se prendiamo comepunto di riferimento il picco positivo dell’onda, la lunghezza d’onda sarà ladistanza (λ) fra tale picco e il successivo. Questo valore è inversamenteproporzionale alla frequenza dell’onda, maggiore sarà λ, minore sarà la fre-quenza, ovvero il numero di cicli completi dell’onda per secondo. Questovalore si misura in hertz (vedi fig. 72).Perché generi un segnale udibile dall’orecchio umano, l’onda deve avereuna frequenza compresa circa fra 20 e 20000 hertz. Tale range costituisce labanda udibile.Quando si parla genericamente dell’ampiezza del segnale si intende in-vece il picco massimo di ampiezza raggiunto dall’onda, cioè la distanzamaggiore dal punto di quiete (ovvero zero). Più specificamente si trattadell’ampiezza di picco dell’onda, mentre si parla di ampiezza istantanea quandosi tratta di un campione qualsiasi dell’onda. La massima ampiezza di unsegnale è 1, superato tale limite il segnale distorce.La frequenza è responsabile della percezione dell’altezza, mentre l’ampiezzadell’intensità del segnale.
80
Cosinusoide
tempo
ampiezza
−1.0
−0.5
0.0
0.5
1.0
−1.0
−0.5
0.0
0.5
1.0
Figure 71: una cosinusoide
➤❘
➤
❘
➤
❘
➤
❘
➤❘
➤
❘
Parametri di una sinusoide
tempo
ampiezza
τ
A
λ
−2
−1
01
2
−2
−1
01
2
Figure 72: parametri di una forma d’onda. A = ampiezza, τ = periodo, λ =lunghezza d’onda
8.1.2 osc∼
L’object box osc∼ implementa un oscillatore digitale. Accetta come argo-mento interno la frequenza (fig. 69) il cui valore può anche essere variato
81
dall’inlet di sinistra (fig. 73). Come vedremo successivamente oltre chedati, l’inlet di sinistra accetta anche segnali per controllare la frequenza.
osc~ 200
dac~
242
Figure 73: l’oggetto osc∼ con frequenza controllata da una number box
Nella patch in figura 74 un oggetto line permette di realizzare un glissando,cioè uno scivolamento da una frequenza ad un’altra, facendo udire tutte lefrequenze intermedie. In questo caso il glissando parte da 20 hz e giungea 1000 hz in 5 secondi.
dac~
line
20, 1000 5000
osc~ 20
Figure 74: la realizzazione di un glissando con l’oggetto line
Volendo invece intervenire sull’ampiezza del segnale, è necessario utiliz-zare un moltiplicatore, come un oggetto *∼, per moltiplicare l’ampiezzaistantanea del segnale per un fattore costante (o variabile). In figura 75
l’oggetto *∼moltiplica per 0.5 il segnale in entrata, dimezzandone l’ampiezza.L’ampiezza di picco del segnale in uscita sarà quindi di 0.5. In figura 76
è mostrata un’onda con ampiezza di picco 1, e una con ampiezza di picco0.5.
82
dac~
osc~ 440
*~ 0.5
Figure 75: la realizzazione di un glissando con l’oggetto line
a)
−1.0
−0.5
0.0
0.5
1.0
−1.0
−0.5
0.0
0.5
1.0
b)
−1.0
−0.5
0.0
0.5
1.0
−1.0
−0.5
0.0
0.5
1.0
Figure 76: la realizzazione di un glissando con l’oggetto line
Come per la frequenza, si può controllare l’ampiezza interattivamente, condati o segnali di controllo. Nel caso in figura 77 una slider verticale emettevalori compresi fra 0 e 1, i quali entrano in line. line emette i valori inentrata scivolando con rampe di 20 millisecondi fra un valore e il precedente
83
per evitare che l’ampiezza cambi troppo repentinamente producendo uneffetto scalino.
dac~
osc~ 440
*~ 0.5
amp
$1 20
line
Figure 77: la realizzazione di un glissando con l’oggetto line
8.1.3 tabwrite∼
Un oggetto molto utile è tabwrite∼ che consente di scrivere i valori diun segnale in una tabella. In questo caso lo utilizziamo per mostrare laforma d’onda di un segnale al variare dell’ampiezza e della frequenza. Infigura 78 l’oggetto tabwrite∼ scrive i valori ricevuti in una tabella (amp)ogni volta che riceve un bang. metro emette un bang ogni 100 millisecondiproducendo l’impressione dell’onda in movimento. Gli oggetti send∼ ereceive∼ sono come send e receive per i dati, ma inviano e ricevono seg-nale.
8.1.4 LA RAPPRESENTAZIONE DEL SUONO
Attraverso l’oggetto tabwrite∼ possiamo avere una rappresentazione delsegnale nel dominio del tempo, ovvero in ogni istante di tempo viene dis-egnato un punto in corrispondenza dell’ampiezza del segnale. Il risultatodi tale operazione permette di visualizzare la forma d’onda.In figura 79 è rappresentato un ciclo di un’onda periodica complessa, for-mata dalla somma di 3 sinusoidi. Come già detto questa rappresentazionemostra l’ampiezza in funzione del tempo, ma non da alcuna informazioneriguardo la frequenza del segnale. Per ottenere informazioni su un suonocomplesso è necessario scomporlo nelle sue componenti semplici e rapp-resentare ogni singola frequenza. Attraverso algoritmi che operano taliscomposizioni è possibile analizzare lo spettro di un suono, cioè la sua
84
dac~
osc~ 440
*~ 0.5
amp
$1 20
line
tabwrite~ amp
r~ sig
send~ sig
amp
metro 100
883
Figure 78: la realizzazione di un glissando con l’oggetto line
rappresentazione nel dominio della frequenza. L’analisi dello spettro puòessere visualizzata in modi molto diversi, anche se fondamentalmente cisono 2 tipi di analizzatori di spettro:
- gli analizzatori di ampiezza in funzione della frequenza
- gli analizzatori di ampiezza e frequenza in funzione del tempo
Nel primo caso (fig. 80) si ha un grafico bidimensionale nel quale vengonorappresentate la frequenza e l’ampiezza del suono in un dato momento.Questa rappresentazione ha il limite di non poter dare una visione delsuono nella dimensione temporale, ma si riferisce ha un istante di tempooppure ad un suono che non varia in funzione del tempo. L’invariabilitàdel suono in funzione del tempo esiste solo nei segnali prodotti digital-mente (probabilmente nemmeno un suono elettrico analogico resta sem-pre identico a se stesso). Nel mondo reale i suoni variano continuamente,quindi una rappreentazione che non tenga conto della funzione tempo havalore solo in determinate circostanze.Gli analizzatori del secondo tipo permettono di dare una visione più det-tagliata e pertinente del suono perché rappresentano l’ampiezza e la fre-quenza in funzione del tempo. La necessità di rappresentare 3 parametriobbliga ad usare un grafico tridimensionale oppure a gestire uno dei treparametri in modo diverso. Nel caso mostrato in figura 81 c’è il temposull’asse delle ascisse e la frequenza su quella delle ordinate, mentre l’ampiezza
85
Rappresentazione della forma d’onda
tempo
ampiezza
−0.5
0.0
0.5
−0.5
0.0
0.5
Figure 79: forma d’ondarisultante dalla somma di 3 sinusoidi
Spettrogramma ampiezza/frequenza
frequenza
ampiezza
0 100 200 300 400 500 600 700 800 900 1000
Figure 80: analizzatore di spettro bidimensionale, sull’asse delle ascisse c’è la fre-quenza, su quella delle ordinate l’ampiezza. Il suono è costituito dallasomma di onde di frequenza pari a 400, 700 e 800 hz
è rappresentata dal colore delle linee: nero per la massima ampiezza e varie
86
tonalità di grigio per ampiezza minore, fino al bianco, quando c’è assenzadi suono.
Spettrogramma ampiezza/frequenza/tempo
tempo
frequenza
0200
400
600
800
1000
0200
400
600
800
1000
Figure 81: l’ampiezza delle sinusoidi è rappresentata dal-l’intensità del coloredelle linee
8.2 LE FORME D’ONDA
Oltre alla forma d’onda più semplice, quella sinusoidale, che abbiamo esam-inato nella sezione precedente, esistono altre forme d’onda periodiche. Illoro numero è teoricamente infinito, anche se esistono alcune forme d’ondaclassiche che si possono ottenere dalla somma di sinusoidi semplici in rap-porto armonico fra loro.Forme d’onda classiche sono l’onda quadra, l’onda triangolare e l’onda adente di sega che esamineremo fra poco.
8.2.1 tabosc4∼
Nella sezione 8.1 abbiamo menzionato l’oggetto tabosc∼ che legge laforma d’onda da una tabella-vettore. Questo oggetto ci permette di trasfor-mare in segnale dei vettori che contengono forme d’onda diverse dallasinusoide ordinaria. Per mettere in funzione tabosc∼ è necessario:
- creare un vettore di 2n + 3 punti
87
- riempire il vettore con i valori desiderati
- creare l’oggetto tabosc∼ con il nome del vettore come argomento
- usare l’inlet di sinistra per impostare la frequenza dell’oscillatore
Per i primi due punti si rimanda al capitolo 4. Per il resto si esaminila patch in figura 82: l’oggetto tabosc∼ legge i dati dal vettore chiamatosinead una frequenza di 400 hz e invia tutto a dac∼, ma anche a tabwrite∼che mostra la forma d’onda ottenuta.
0
frq
metro 100
start
dac~
tabosc4~ sine
tabwrite~ wave
*~
amp
line
$1 20wave
sine
Figure 82: l’uso di tabosc∼ per leggere un vettore con una forma d’onda sinu-soidale
Nei prossimi paragrafi mostreremo l’uso di tabosc∼ per forme d’ondadiverse.
8.2.2 ONDA QUADRA
Quella quadra é una forma d’onda che alterna solo due valori, general-mente 1 e -1, ma anche 1 e 0 se si usa come segnale di controllo.
88
Onda quadra
tempo
ampiezza
−2
−1
01
2
−2
−1
01
2
Figure 83: un’onda quadra che alterna i valori 1 e -1
Secondo il Teorema di Fourier, un qualsiasi suono complesso periodicopuò essere ottenuto dalla somma di sinusoidi in rapporto armonico fraloro. Come abbiamo imparato dal capitolo sui vettori (4 possiamo dis-egnare in un vettore una forma d’onda ottenuta dalla somma di sinu-soidi tramite il comando sinesum. L’onda quadra si ottiene dalla sommadegli armonici dispari con ampiezza inversamente proporzionale al nu-mero d’ordine dell’armonico, schematizzando:
arm 1 arm 2 arm 3 arm 4 arm 5 arm 6 arm 7
1 013 0
15 0
17
L’oggetto tabosc4∼ può essere usato per implementare un’onda quadrascritta in un vettore tramite il comando sinesum. E’ sufficiente usare unamessage box con il comando sinesum e scrivere tutti i valori di ampiezzadelle varie armoniche. In alternativa é possibile costruire un algoritmoper disegnare la forma d’onda nel vettore. In figura 84 ci sono 3 formed’onda diverse, due realizzate con il comando sinesum, una con un algo-ritmo. Il risultato visivo sono 3 onde diverse, le prime sono due formed’onda quadra approssimativa, infatti nel caso del vettore quadra9 sono statiusati 9 armonici, nel secondo caso 40: più aumenta il numero degli ar-
89
monici, maggiore sarà la precisione della forma dell’onda. Nel terzo casol’onda é perfettamente quadrata.Se si ascoltano le 3 onde (il messaggio set seguito dal nome di un’arrayconsente di cambiare il vettore da leggere con tabosc∼) si noteranno delledifferenze. Nel caso del vettore quadra9 il suono sarà meno ricco di ar-monici di quello di quadra40, che a sua volta é meno ricco di quello diquadralg.
quadra40quadra9
;
quadra9 sinesum 512 1 0 0.33 0 0.2 0 0.1428 0 0.1111;
quadra9 normalize 1
tabosc4~ quadra9
set quadra9
set quadra40
0
dac~
;
quadra40 sinesum 512 1 0 0.33 0 0.2 0 0.1428 0 0.1111 0
0.0909 0 0.0769 0 0.0666 0 0.0588 0 0.0526 0 0.0476 0
0.0434 0 0.04 0 0.037 0 0.0344 0 0.0322 0 0.0303 0 0.0285 0
0.027 0 0.0256 0;
quadra40 normalize 1
quadralg
until
int 0 + 1
expr if (($f1 < 256), 1, -1)
tabwrite quadralg
set quadralg
0
515reset
Figure 84: tre tipi diversi di onda quadra
PULSE WIDTH MODULATION (PWM)
I due modi che abbiamo usato nella sezione precedente per generare un’ondaquadra non sono gli unici possibili. Un altro sistema infatti è quello di in-tervenire direttamente su un segnale sinusoidale e modificarlo in temporeale. Nella patch di figura 85 il segnale di osc∼ entra in expr∼ che generaun’onda quadra con un semplice ciclo if: se i valori sono positivi, esce 1,altrimenti esce -1.L’oggetto expr∼ è l’omologo di expr per i segnali. Oltre a operare sullesolite variabili numeriche ($fn o $in) può processare direttamente segnale.
90
osc~ 200
150
tabwrite~ wave
metro 100
expr~ if (($v1 > 0), 1, -1)
dac~
wave
Figure 85: onda quadra generata mediante intervento diretto su un segnale sinu-soidale
Il simbolo per le variabili-segnale è $vn.
Questo modo di produrre un’onda quadra non è certo il più economicodal punto di vista computazionale, ma consente di fare qualcosa che coni sistemi precedenti era complicato, cioè intervenire in tempo reale sullaforma dell’onda. Un’onda quadra è simmetrica, come del resto quella si-nusoidale. Ai valori positivi rispondono valori negativi, quindi la partepositiva dell’onda quadra è controbilanciata da una parte negativa dellastessa dimensione. Se si cambia il rapporto fra la parte positiva e quellanegativa si genera un cambiamento della forma dell’onda che ha ripercus-sioni sul timbro dell’onda stessa. Questo rapporto è chiamato duty cyclee si misura in genere con un valore compreso fra 0 e 1. Un duty cycle di0.5 rappresenta l’onda quadra mentre un duty cycle di 0.75 significa che laparte positiva è in rapporto di 3:1 rispetto a quella negativa.
In figura 86 l’oggetto expr∼ è modificato rispetto a quello della figura85. Se i valori superano il valore in entrata nell’inlet destro emetti segnale1, altrimenti emetti segnale di -1. Questo implica che possiamo variareil valore-soglia. Mentre prima il valore soglia era fissato a zero e quindil’onda risultava simmetrica, ora tale valore può essere cambiato: se aves-simo ad esempio un valore soglia pari a 0.75 (75 nella number box) exprtrasformerebbe questo valore in 0.5 e il il costrutto if risulterebbe essere: seil valore è maggiore di -0.5 emetti 1, altrimenti 0. Ne risulterebbe un’ondarettangolare con porzione positiva più lunga di quella negativa.
91
osc~ 200
tabwrite~ wave
metro 100dac~
expr~ if (($v1 > $f2), 1, -1)
expr ((1 - ($f1 / 100)) * 2) - 1
line
$1 40
200
frq
75
duty cycle
(0 - 100)
wave
Figure 86: duty cycle dell’onda quadra
Questa modificazione del duty cycle può essere gestita da un segnale, gen-eralmente un LFO, un Low Frequency Oscillator, di cui parleremo più avanti.Basti per ora sapere che un LFO è un normale oscillatore, specializzato nellagenerazione di frequenze molto basse, al di sotto della banda audio (<30 hz). Usare un segnale di controllo per modificare il duty cycle realizzala cosiddetta Pulse Width Modulation, utilizzata in molti sintetizzatori ana-logici negli anni ’70.In figura 87 un oscillatore con frequenza 0.25 controlla il duty cycle dell’ondaquadra. L’ampiezza viene moltiplicata per 0.99 in modo che non raggiungamai 1, poiché con ampiezza 1 il segnale è tutto positivo, quindi non c’èalternanza fra parte positiva e negativa del segnale. Di conseguenza cisarebbe assenza di oscillazione, e di suono.
8.2.3 ONDA A DENTE DI SEGA
L’onda a dente di sega ha un periodo costituito da un segmento che vada -1 a 1. Si ottiene sommando tutte le armoniche, con ampiezza pari alreciproco del numero d’ordine dell’armonico e moltiplicate per -1:
92
osc~ 200
tabwrite~ wave
metro 100dac~
300
frq
expr~ if (($v1 > $v2), 1, -1)
*~ 0.99
osc~ 0.25
wave
Figure 87: variazione del duty cycle tramite un segnale di controllo
arm 1 arm 2 arm 3 arm 4 arm 5 arm 6 arm 7
-1 − 12 − 1
3 − 14 − 1
5 − 16 − 1
7
In figura 88 ci sono due forme d’onda a dente di sega ottenute l’una con ilcomando sinesum l’altra con un algoritmo.
phasor∼
L’onda a dente di sega è utilizzata spessissimo come segnale di controllo.In Pd c’è un oggetto che implemente un’onda a dente di sega nel campo
93
;
dentedisega sinesum 515 -1 -0.5 -0.33 -0.25 -0.2 -0.166666
-0.142857 -0.125 -0.111111 -0.1 -0.0909 -0.0833 -0.0769
-0.0714 -0.0666 -0.0625 -0.0588 -0.0555 -0.0526 -0.05
-0.0476 -0.0454 -0.0434 -0.0416;
dentedisega normalize 1
until
515
int 0 + 1
mod 515
expr (($f1 / 515) * 2) - 1
tabwrite dentedisega2
dentedisega2dentedisega
Figure 88: l’onda a dente di sega ottenuta in due modi diversi
positivo, ovvero con valori che si muovono linearmente da 0 a 1. Taleoggetto è phasor∼, utile per moltissime applicazioni.Uno degli usi di phasor∼ è quello di utilizzarlo come segnale da modifi-care con l’oggetto expr∼ in modo molto versatile. Ad esempio è possibilecostruire una patch per la Pulse Width Modulation con un algoritmo più sem-plice di quello presentato in 8.2.2. La patch si può osservare in figura 90.Il ciclo if è leggermente diverso da quello precedente. La condizione deveverificare semplicemente il rapporto fra il segnale di phasor∼ e quello diosc∼.
8.2.4 ONDA TRIANGOLARE
Come per l’onda quadra, quella triangolare può essere generata con diversimetodi. Qui riproponiamo gli stessi della sezione precedente:
94
saw
tabwrite~ saw
phasor~ 100
metro 120
Figure 89: l’onda a dente di sega come segnale di controllo, generata con phasor∼
phasor~ 400
dac~
expr~ if (($v1 > $v2), 1, -1)
osc~ 0.125
expr~ ($v1 * 0.49) + 0.5
Figure 90: l’onda a dente di sega come segnale di controllo, generata con phasor∼
- vettore e comando sinesum
- vettore disegnato da algoritmo
- intervento diretto sul segnale
Nel primo caso dobbiamo usare le armoniche dispari con ampiezza inversarispetto al quadrato del numero d’ordine dell’armonico e poi moltiplicarele ampiezze alternativamente per 1 e -1
arm 1 arm 2 arm 3 arm 4 arm 5 arm 6 arm 7
1 0 − 132 0
152 0 − 1
72
Nel secondo caso dobbiamo disegnare il grafico del vettore costruendotre segmenti attraverso un algoritmo, il primo segmento va da 0 a 1, il
95
secondo da 1 a -1, il terzo da -1 a 0. In figura 91 ci sono le due formed’onda, la prima approssimata con il comando sinesum (somma dei primi19 armonici), la seconda perfetta. Nella figura successiva (92) è mostratol’algoritmo per disegnarla.
triang triang2
;
triang sinesum 515 1 0 -0.111111 0 0.04 0 -0.020408 0
0.012345 0 -0.008264 0 0.005917 0 -0.044444 0 0.00346 0
-0.00277;
triang normalize 1
pd triang2
Figure 91: nel grafico triang l’onda triangolare è approssimata con la somma di19 armonici, mentre in triang2 l’onda è disegnata in modo perfetto
Per l’intervento diretto sul segnale si può utilizzare un oggetto phasor∼filtrato da un oggetto expr∼ con un ciclo if a cui dire: se il segnale èminore di 0.5 scrive ina retta da 0 a 1, altrimenti scrivi una retta da 1 a 0,poi moltiplica per 2 e sottrai uno per riscalare il tutto fra -1 e 1.Anche nel caso dell’onda triangolare esiste il duty cycle che determina laposizione del vertice alto del triangolo. Un duty cycle di 0.5 è un’ondatriangolare isoscele mentre con un duty cycle ad esempio di 0.75 il verticealto del triangolo è spostato verso destra (fig. 94).
96
until
int 0 + 1
128
t f f
expr ($f1 / 128)
until
+ 1int 128
t f f
expr (1 - (($f1 - 128) / 128))
256
tabwrite triang2
until
+ 1int 384
t f f
expr (-1 - (($f1 - 384) / -128))
131
mod 256
+ 128
+ 384
mod 131
mod 128
loadbang
Figure 92: l’algoritmo per produrre una forma d’onda triangolare, in una tabelladi 512 + 3 punti
dac~
tri
tabwrite~ tri
metro 100
phasor~ 200
expr~ if (($v1 < 0.5), (($v1 * 2) * 2) - 1, (1 - (($v1 *
2)-1)) * 2 - 1)
Figure 93
97
dac~
tri
tabwrite~ tri
metro 100
dutycycle
0.367
expr~ if ($v1 <= $f2, $v1 * (1 / $f2), (1 - $v1) * (1 /
(1-$f2))) * 2 - 1
phasor~ 250
Figure 94
98
9 I L PA N N I N G
9.1 L’OGGETTO dac∼
Negli esempi proposti fino ad ora abbiamo sempre inviato il segnale inuscita all’oggetto dac∼ che ha il compito di convertire il segnale digitale inanalogico, in modo da poterlo ascoltare. Come si può osservare l’oggettosuddetto ha due inlet. In effetti abbiamo sempre inviato il segnale smistan-dolo in entrambi gli inlet. dac∼ infatti consente di inviare il suono versodue canali, uno sinistro e uno destro. Fino ad ora abbiamo sempre inviatoil segnale verso entrambi i canali ottenendo come risultato che il suonosia identico in entrambi, ma potremmo decidere di inviare il segnale versouno solo dei due.
osc~ 120
dac~
osc~ 120
dac~
*~ 0.25
1 2
Figure 95: in (1) il segnale dell’oscillatore è inviato al solo canale sinistro, in (2) ilsegnale viene inviato con massima ampiezza al canale sinistro, mentrecon ampiezza ridotta del 75% al canale destro
In figura 95(1) il segnale viene inviato solo al canale sinistro, mentre in (2)il segnale avrà un peso maggiore sul canale sinistro poiché prima di esserecollegato al canale destro viene ridotto in ampiezza.
99
9.2 CONTROLLO DEL panning
Nella prossima patch realizziamo un semplice algoritmo per controllare laposizione del suono nel campo stereofonico.
osc~ 440
dac~
*~ *~
0.808 0.588
line~ line~
$1 20 $1 20
dx sx
expr sqrt($f1 / 100)
expr sqrt(1 - ($f1 / 100))
expr ($f1 / 100)
0.346
Figure 96
In figura 96 è mostrato l’algoritmo di Pd. Attraverso una slider orizzontalepossiamo posizionare il suono nel campo stereo, se l’indicatore si trova alcentro avremo un suono posizionato esattamente a metà fra i due canali,in alternativa possiamo posizionare il suono verso destra o verso sinistraspostando l’indicatore.La slider è impostata in modo da agire in un range compreso fra 0 e 100, ilvalore in uscita viene diviso per 100 in modo da produrre un range com-
100
preso fra 0.0 e 1.0. Nel caso del canale destro questo valore decimale vienecollegato con il moltiplicatore per il canale destro impostando l’ampiezzadel segnale lo stesso canale. Per il canale sinistro invece il valore vienesottratto da 1.0 in modo da essere il complementare dell’altro. E’ neces-sario inoltre calcolare la radice quadrata dei due valori, poiché l’intensitàdel suono percepito è proporzionale al quadrato dell’ampiezza del seg-nale stesso. Entrambi i dati in uscita vengono infine passati per l’oggettoline∼ che rende più graduale il passaggio da un valore all’altro elimi-nando l’eventuale effetto a scalini che si produrrebbe.Invece di controllare direttamente la spazializzazione del segnale tramiteun oggetto grafico, possiamo ultilizzare un oscillatore a basse frequenze(LFO) per far muovere il suono fra i due canali in uscita.
osc~ 120 osc~ 1
expr~ ($v1 * 0.5) + 0.5
expr~ sqrt(1 - $v1)
expr~ sqrt($v1)
*~ *~
dac~
Figure 97
Nella figura 97 è mostrata questa situazione: il segnale dell’oscillatore didestra viene reso unipolare (vedi paragrafo successivo) producendo cosìun’onda con ampiezza compresa fra 0 e 1. Subendo le stesse operazionidella figura precedente (fig. 96) produce un’oscillazione del segnale frail canale sinistro e il canale destro. Analogamente possiamo controllare ilpanning attraverso un’onda quadra che alterni valori di 0 e 1 (fig. 98)
101
osc~ 120 osc~ 1
expr~ sqrt(1 - $v1)
expr~ sqrt($v1)
*~ *~
dac~
expr~ if($v1 < 0.5, 1, 0)
Figure 98
9.2.1 SEGNALI BIPOLARI E UNIPOLARI
Nella patch in figura 97 abbiamo usato un particolare tipo di segnale, dettounipolare. Fino ad ora tutti i segnali che abbiamo incontrato erano bipolari,perché la loro forma d’onda oscilla fra i valori positivi e i valori negativi.Per realizzare algoritmi in cui ci sono segnali che controllano altri segnali,come nel caso del panning o del tremolo è necessario avere a disposizionedei segnali unipolari, ovvero segnali con valori che oscillano solo fra i valoripositivi (fig. 99).
9.2.2 IL DC OFFSET
Per ottenere un’onda unipolare é necessario operare una variazione suun’onda bipolare. Questa variazione si realizza aggiungendo al segnalebipolare un valore costante detto DC offset. Se ad una sinusoide che oscillafra -1 e 1 si aggiunge il valore costante 1, si otterrà una nuova sinusoideoscillante fra 0 e 2, questo perché la distanza fra l’ampiezza massima equella minima della sinusoide equivale a e (1-(-1) = 2). In figura 129 sipuò osservare che la distanza del segnale unipolare, che oscilla fra 0 e 1,equivale alla metà di quello bipolare, che oscilla fra -1 e 1. Quindi oltreall’aggiunta della costante, é necessario dividere il segnale per 2 o, meglio,moltiplicarlo per 0.5 (le moltiplicazioni per il calcolatore sono più velocidelle divisioni). Ricapitolando:
102
Segnale bipolare e unipolare
a)
b)
Figure 99: L’ampiezza del segnale (a) oscilla fra valori positivi e negativi, mentre(b) è polarizzato nel campo positivo
(sig[−1,1] ∗ 0.5) + 0.5 = sig[−0.5,0.5] + 0.5 = sig[0,1]
Nella patch di Pd in figura 130 é mostrato un segnale bipolare trasformatoin un segnale unipolare tramite l’oggetto expr∼.
103
➤
❘
➤
❘
➤
❘
a)
−1.0
−0.5
0.0
0.5
1.0
−1.0
−0.5
0.0
0.5
1.0
b)
−1.0
−0.5
0.0
0.5
1.0
−1.0
−0.5
0.0
0.5
1.0
Figure 100: la distanza massima fra l’ampiezza positiva e quella negativa del seg-nale bipolare (a) é doppia rispetto a quella del segnale (b)
104
osc~ 200
expr~ ($v1 * 0.5) + 0.5
dac~
tabwrite~ bipolare
metro 100
tabwrite~ unipolare
bipolare
unipolare
Figure 101: l’oggetto expr∼ permette facilmente di effettuare le due operazionisul segnale per trasformarlo trasformano da bipolare a unipolare
105
10 S I N T E S I A D D I T I VA E S I N T E S IV E T TO R I A L E
10.1 SINTESI ADDITIVA
Definizione: Date n onde, si ha sintesi additiva quando si sommano talionde.Risultato: La somma di onde sinusoidali produce suoni complessi es-tremamente eterogenei.
Concettualmente la sintesi additiva è una tecnica semplice, ma può esseremolto costosa in termini di consumo di CPU e difficile da controllare egestire
10.1.1 SINTESI ADDITIVA A SPETTRO ARMONICO
La sintesi additiva a spettro armonico è costituita da sinusoidi che sono inrapporto frequenziale armonico, cioè ognuna multipla dell’altra.
Il sistema più semplice per implementare questo genere di sintesi in Pd èquello di utilizzare una tabella in cui disegnare la forma d’onda risultantedalla somma delle sinusoidi e l’oggetto tabosc4∼ per leggere il contenutodella tabella. È quello che abbiamo già visto in occasione della descrizionedelle varie forme d’onda e di come costruirle. Quella è una forma di sintesiadditiva, quindi non ci soffermeremo troppo a lungo su questo passaggio.Rimandiamo alla patch in fig. 102.
10.1.2 SINTESI ADDITIVA A SPETTRO NON ARMONICO
La sintesi additiva a spettro non armonico non può fare uso delle tabellepoiché le sinusoidi che compongono la forma d’onda non sono in rapportoarmonico fra loro una tabella comune non consentirebbe ai vari periodidelle onde di essere completi.
106
tabosc4~ waveform
0
Frequenza
dac~
;waveform sinesum 512 1 0.5 0.25 0.125 0.0625 0.031250.015625 0.078125;waveform normalize 1
waveform
Figure 102: Una patch per la sintesi additiva a spettro armonico
È necessario quindi implementare questa forma di sintesi additiva con tantioscillatori quante sono le sinusoidi che si vogliono utilizzare. Ogni oscilla-tore avrà la sua frequenza e la sua ampiezza. Nella patch in fig. 103 ci sono8 oscillatori con la propria frequenza (in alto a sinistra) e una subpatch percontrollare l’ampiezza.
10.2 SINTESI VETTORIALE
Gli esempi di sintesi additiva che abbiamo esaminato in precedenza hannoil limite di produrre spettri costanti, invariabili nel tempo. Questo pro-duce timbri fissi, quindi freddi e astratti. Ci sono molti modi per cambiareil timbro nel tempo: variare la frequenza di alcune sinusoidi nella sin-tesi a spettro inarmonico ad esempio, oppure cambiare l’ampiezza delleparziali. Uno dei sistemi usati per cambiare dinamicamente il timbro diuna forma d’onda è stato introdotto nel 1986 con la produzione del sinte-tizzatore Prophet VS. L’idea è quella di avere a disposizione delle formed’onda fisse e di un dispositivo che permetta di passare da una all’altratramite crossfading dell’ampiezza. In sostanza le onde vengono sommate,ma l’energia delle onde nella somma non è costante, all’aumentare diun’ampiezza diminuisce l’altra e viceversa. Questa tecnica, detta sintesivettoriale consente quindi di avere un dispendio di CPU molto basso per-ché le tabelle sono fisse. Si tratta semplicemente do organizzare l’algoritmo
107
osc~
dac~
osc~ osc~ osc~ osc~ osc~ osc~ osc~
80
*~
(0-1000)
/ 1000
$1 20
line~
pd ampiezze
*~ *~ *~ *~ *~ *~ *~ *~
320
150
500
712
1780
890
2615
tabwrite~ wf
wf
Figure 103: una patch per la sintesi additiva a spettro non armonico
in modo che esegua il passaggio da un’ampiezza all’altra in modo che lasomma rimanga costante. In figura 104 abbiamo implementato un sem-plice crossfading fra due entità che si muovono nel range di zero e uno.All’aumentare di una diminuisce l’altra. L’algoritmo non ha bisogno digrandi spiegazioni. L’oggetto swap consente di invertire la posizione dei
108
due valori che entrano dagli inlet, ma, come in questo caso, se swap ha unargomento, lo stesso sarà mandato fuori dall’outlet di sinistra consentendocidi sottrarre da questo il valore dell’outlet di destra.
A________________B
0.757
swap 1
-
0.242
Figure 104: Implementazione del crossfading
10.2.1 DISSOLVENZA INCROCIATA FRA DUE TABELLE
Nella patch di questa sezione mostriamo un algoritmo per la dissolvenza in-crociata (traduzione italiana di crossfading) fra due tabelle contenenti formed’onda semi-casuali. prima esaminiamo l’abstraction che genera tali onde(fig. 105
Grazie al contatore viene disegnata nella tabella, il cui nome è dato dalprimo argomento passato all’oggetto randomwave, un’onda sunosoidale adogni punto della quale è aggiunto un valore casuale determinato dal sec-ondo argomento passato all’oggetto. Ad esempio se tale valore è impostatoa 0.5, i valori random prodotti saranno compresi fra -0.25 e +0.25.
La patch della figura successiva (106) invece mostra l’algoritmo per la dis-solvenza vera e propria. L’algoritmo non necessita di spiegazioni partico-lari. La parte in altro a destra mostra la parte che si occupa del crossfadingmentre in basso c’è uno slider per impostare l’ampiezza dell’onda risul-tante.
109
until
+ 1
0
float 0
512
loadbang
Generatore di onde casuali
expr (sin(($f1 / 512) * 6.283185305)) + $f2
t b f
tabwrite $1
table $1 515
send $1
normalize 1
randomF $2
expr ($f1 - $f2)
t b b
1
expr $2 * 0.5
Figure 105: L’abstraction randomwave
10.2.2 DISSOLVENZA INCROCIATA FRA QUATTRO TABELLE
Il Prophet VS implementava una sintesi vettoriale che gestiva quattro formed’onda contemporaneamente. In Pd esiste un oggetto che ci consente difare la stessa cosa. Si tratta dell’oggetto grid che si presenta come unquadrato all’interno del quale si può muovere un cursore che ci permet-tere di gestire praticamente due slider contemporaneamente. Muovendo ilcursore da sinistra a destra si modificherà un valore, muovendosi dall’altoverso il basso si modificherà l’altro.
La patch in figura 107 mostra l’implementazione della sintesi vettorialecon quattro tabelle generate da randomwave. In alto a sinistra l’oggettogrid gestisce le ampiezze delle quattro forme d’onda. L’asse orizzontalegestisce le prime due (wave1 e wave2) mentre l’asse verticale le altre due.La subpatch pd grid eval (fig. 108) si occupa di fare gli opportuni calcoli perattribuire i valori ai quattro moltiplicatori di ampiezza.
110
A________________B
0
swap 1
-
1
tabosc4~ wf1 tabosc4~ wf2 line~
pack 0 15
line~
pack 0 15
*~ *~
8000
+~
*~
Amp
line~
pack 0 15
dac~
randomwave wf1 2
randomwave wf2 1.5
Figure 106: Dissolvenza incrociata fra due tabelle
111
pd grid_eval
tabosc4~ wave1 tabosc4~ wave2 tabosc4~ wave3 tabosc4~ wave4
dac~
*~
*~ *~ *~
+~
+~
+~
send grid
r grid
loadbang
Frequenza
60
color 200 200 200
randomwave wave1 0.5
randomwave wave2 0.25
randomwave wave3 0.74
randomwave wave4 1.75
Figure 107: Dissolvenza incrociata fra quattro tabelle
112
/ 100 / 100
expr (1 - $f1) expr (1 - $f1)
* * * *
inlet inlet
$1 25 $1 25 $1 25 $1 25
line~ line~ line~ line~
outlet~ outlet~ outlet~ outlet~
Figure 108: La subpatch che distribuisce le ampiezze fra i quattro segnali
113
11 S I N T E S I S OT T R AT T I VA
11.1 LA SINTESI SOTTRATTIVA
A differenza della sintesi additiva, che realizza la somma di sinusoidi perottenere spettri complessi, la sintesi sottrattiva insiste su spettri molto com-plessi per ottenere suoni più semplici. Per sottrarre frequenze da un suonocomplesso si usano dei dispositivi software detti filtri, che si applicano susuoni che hanno uno spettro estremamente ricco, come i rumori. Schematiz-zando, il suono sorgente prima di essere inviato all’uscita passa attraversoun filtro, che realizza certe condizioni richieste (fig. 109).
filtro
segnale in usci ta
segna le in en t ra ta
Figure 109: schema di un filtraggio di segnale semplice
11.1.1 IL RUMORE
In generale si intende per rumore un suono non desiderato che disturbala percezione di un’informazione sonora. In musica elettronica un rumoreè una sequenza di oscillazioni casuali. Si distinguono vari tipi di rumori.Il rumore bianco è quello costituito da frequenza uniformemente distribuite,
114
prodotte alla velocità della frequenza di campionamento. In altre parole,se ci si opera alla frequenza di campionamento di 44100 hertz, il rumorebianco è costituito da frequenze casuali (con ampiezza casuale) emesseogni 1
44100 di secondo. Lo spettro del rumore bianco si presenta come infigura 110: le frequenze occupano tutta la banda audio.
Rumore bianco
x
0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000
Figure 110: spettro del rumore bianco
Il rumore rosa ha una distribuzione spettrale diversa dal precedente: via viache le frequenza sono più alte l’ampiezza media del segnale si abbassa, perla precisione si abbassa di 3 db ogni ottava (fig. 111).
Rumore rosa
x
0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000
Figure 111: spettro del rumore rosa
115
In Pd questi due tipi di rumore sono implementati rispettivamente daglioggetti noise∼ e pink∼ che non accettano nessun tipo di argomento. L’oggettorand∼ invece genera un rumore limitato in banda, questo significa che ilgeneratore produce una banda di rumore che va da 0 alla frequenza im-postata, successivamente produce delle bande secondarie larghe quanto lafrequenza impostata ma di ampiezza sempre minore. L’esempio in figura(112) mostra lo spettro prodotto da rand∼ con frequenza 2500 hz.
Rumore band limited
x
0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000
Figure 112: spettro di rumore band-limited con frequenza di 2500 hz
Nella patch in figura 113 l’oggetto polygate∼ consente di scegliere qualegeneratore inviare a dac∼. Accetta come argomento il numero dei segnaliin entrata e il tempo con cui passare da uno all’altro. Il messaggio choiceconsente di effettuare la scelta.
I rumori con il loro spettro ricchissimo sono ideali per poter essere filtratie costituiscono i segnali sorgenti privilegiati per la sintesi sottrattiva.
11.2 I FILTRI
Molto genericamente un filtro digitale è un algoritmo attraverso il quale unsegnale viene trasformato in un altro segnale. Meno genericamente un fil-tro è un dispositivo software che attenua o intensifica alcune regioni di unospettro.
116
25000
noise~ pink~
dac~
rand~choice $1
polygate~ 3 100
Figure 113: selezione del tipo di rumore tramite l’oggetto polygate∼
Tali filtri possono essere implementati secondo i due schemi mostrati infigura 114.
Input Output
delay
(a)
+
Input Output
delay
(b)
+
Figure 114: I due più comuni schemi di implementazione per i filtri digitali
Nell’immagine (a) una copia del segnale viene ritardata nell’ordine dipochi campioni e sommata al campione in entrata. Tale modalità di im-
117
plementazione descrive i filtri a risposta finita all’impulso (Finite Impulseresponse, FIR) perché il segnale elaborato è solo quello in entrata. In (b)una copia del segnale in uscita viene ritardato e combinato con il segnalein entrata, in questo caso si parla di un filtro a risposta infinita all’impulso(Infinite Impulse Response, o IIR), poiché il segnale in uscita rientra nel filtroper essere rielaborato. Per tale ragione si parla in questo caso anche diFiltri Ricorsivi.
La somma (o la sottrazione) di tali campioni produce una forma d’onda di-versa dall’originale e quindi un nuovo spettro. L’aggiunta (o la sottrazione)di più campioni ritardati può produrre una grande varietà di filtri. Talerelazione fre segnale in entrata e segnale in uscita è descitta attraversoun’equazione. Il segnale in uscita è il risultato di somme, sottrazioni emoltiplicazioni fra il campione attuale e campioni ritardati. Questo tipo diequazione è detta equazione alla differenza lineare.
La figura 115 mostra lo schema di un semplice filtro mediano passa-basso.Si dice mediano perché fa la media fra il campione attuale e il campioneprecedente, cioè somma i due campioni e poi divide per due. Il risultato èun filtro passa-basso perché attenua le alte frequenze.
Input Output
delay
0.5
0.5
*
* +
Figure 115: Filtro di media passa-basso
L’equazione di questo filtro è la seguente:
y[n] = (0.5 ∗ x[n]) + (0.5 ∗ x[n− 1])
dove x è il segnale in entrata, y il segnale in uscita, n il numero del campi-one e 0.5 il coefficiente del filtro.
In pd tramite l’oggetto z∼ è possibile ritardare un segnale nell’ordine disingoli campioni. In figura 116 è mostrata l’implementazione del filtro ap-
118
pena descritto.
noise~
z~ 1
*~ 0.5
*~ 0.5
+~
dac~
Figure 116: Filtro di media passa-basso in pd
z∼ prende come argomento il numero dei campioni da ritardare, nel nos-tro caso 1. Tale filtro tende a smussare le spigolature del segnale, che sonoimprovvise e rapidissime, per tale motivo generano frequenze alte. Precisa-mente il filtro attenua le frequenze fino alla metà della frequenza di campi-onamento (tipicamente 22050). L’immagine in figura 117 mostra la curvadescritta dal filtro nel dominio della frequenza. Tale rappresentazione de-scrive la risposta in frequenza del filtro.
22050
amp
0
1
freq
Figure 117: Risposta in frequenza del filtro di media passa-basso
Se invece si sommare i due campioni, si sottraggono, si otterà un filtrag-gio delle basse frequenze, l’esatta inversione del precedente. Tale filtro èdetto passa-alto poiché lascia passare le alte frequenze fino alla metà della
119
frequenza di camipnamento. L’equazione diventa quindi:
y[n] = (0.5 ∗ x[n])− (0.5 ∗ x[n− 1])
e la risposta in frequenza di tale operazione è mostrata in figura 118.
22050
amp
0
1
freq
Figure 118: Risposta in frequenza del filtro di media passa-alto
Il numero dei campioniritardati determina anche l’ordine del filtro. Unfiltro del primo ordine sarà implementato con un unico campione ritardato,secondo questa equazione generica:
y[n] = (a0 ∗ x[n])± (a1 ∗ x[n− 1])
dove a0 e a1 sono, rispettivamente, il coefficienti del campione originalee del campione ritardato. Aumentando i campioni e quindi i coefficienti,aumenta anche l’ordine del filtro. Come vedremo, l’ordine del filtro deter-mina anche la sua risposta in frequenza.
Un filtro del secondo ordine avrà la seguente equazione:
y[n] = (a0 ∗ x[n])± (a1 ∗ x[n− 1])± (a2 ∗ x[n− 2])
Come abbiamo visto tali filtri sono detti FIR, perché non creano ricorsionifra il segnale di entrata e il segnale di uscita e fino al secondo ordine sono
120
molto stabili, infatti per creare filtri di ordine superiore si è solito usarefiltri del primo e del secondo ordine in scascata piuttosto che implementareun unico filtro di ordine superiore.
I filtri IIR invece sommano il segnale in entrata con i campioni ritardatirientranti nel sistema. L’equazione generale per un filtro IIR del primo or-dine è la seguente:
y[n] = (a0 ∗ x[n])± (a1 ∗ x[n− 1])± (b1 ∗ y[n− 1])
dove b1 è il coefficiente del campione ritardato. b0 ovviamente non è pre-sente perché sarebbe il coefficiente del campione originale in entrata, giàpresente.
Un’altro modo per rappresentara il comportamento di un filtro è quellodenominato risposta all’impulso (Impulse Response) che viene realizzato neldominio del tempo. Per rappresentare tale comportamento si una un im-pulso, cioè il segnale più breve che un sistema digitale possa realizzare:un singolo campione. Infine esiste un terzo modo, la risposta in fase, chedescrive lo spostamento della fase delle sinusoidi componenti del suonofiltrato.
Non ci addentreremo oltre nella descrizione tecnica dei filtri digitali, cheesulerebbe dagli scopi di questo testo, ma diremo che attualmente i filtripiù usati sono raggrupabili in 4 tipi:
• passa-basso
• passa-alto
• passa-banda
• escludi-banda
11.3 I PARAMETRI DEI FILTRI
I filtri passa-basso e passa-alto devono avere almeno un parametro perpoter funzionare, cioè la frequenza di taglio (cutoff frequency). Nel primo
121
caso tale quantità indica la frequenza al di sopra della quale vengono atten-uate le altre frequenze, nel secondo, al contrario, indica la frequenza sottola quale inizia l’attenuazione.
Per essere precisi la frequenza di taglio è, convenzionalmente, il punto incui il filtro riduce il segnale allo 0.707 del suo massimo valore, il che, conapiezza pari a 1, corrisponde a una riduzione di 3 decibel. Per questo avolte la frequenza di cutoff viene definita 3dB point.
Le frequenze attenuate al di sopra (o al di sotto nel caso di un passa-alto)della frequenza di cutoff costituiscono la banda bloccata del filtro stopband, lefrequenze passanti costituiscono invece la banda passante (passband).
Gli altri due filtri (passa-banda e escludi-banda) sono una derivazione deiprimi. infatti se si filtra un segnale con una coppia passa-basso/passa-altosi realizzarà un filtro passa-banda o escludi-banda. L’immagine 119 mostraquesta situazione. Nella figura in alto la zona quadrettata rappresenta laregione dello non filtrata, in quella in basso la zona quadrettata in alto rap-presenta la zona eliminata dallo spettro.
I valori necessari per tali filtri sono due frequenze di cutoff, una per il passa-basso, l’altra per il passa-alto.
I filtri passa-banda (ed escludi-banda, che è il suo inverso) sono comunqueormai algoritmi indipendenti dagli altri filtri e usano parametri diversiper funzionare. Il primo valore è sempre una freuqneza centrale (center fre-quency) e una larghezza di banda bandwidth, che corrisponde alla frequenzadi taglio superiore meno quella inferiore. Tale valore è spesso sostituitodal fattore Q, che corrisponde al rapporto fra la frequenza centrale e lalarghezza di banda:
Q = fcB
Ovviamente vale anche l’operazione opposta, per sapere qual’è la larghezzadi banda partendo da Q, si avrà:
B = fcQ
122
bandpass filter
highp
ass lowpassbandreject filter
highpass lowpass
Figure 119: Filtro passa-banda e filtro escludi-banda creati a partire da un filtropassa-basso e uno passa-alto
La larghezza di banda è quindi inversamente proporzionale al fattore Q.
Ma quanto è efficace un filtro? In altre parole, di quanto attenua le fre-quenze? Naturalmente dipende dal filtro, e in base alla capacità di atten-uazione i filtri vengono classificati secondo ordini che definiscono il livellodi attenuazione in dB per ottava, cioè a ogni raddoppio della frequenza.Un filtro del primo ordine attenua di 6dB per ottava le frequenze, uno delsecondo ordine le attenua di 12 dB, e così via. questo significa ad esempioche in presenza di un filtro passa-basso del primo ordine con frequenza ditaglio di 200 hertz. L’ampiezza a 400 hertz sarà ridotta di 6 db, a 800 hertzci sarà una riduzione di 12 dB, a 1600 hertz di 18 db e così via. La figura120 mostra la risposta in frequenza di due filtri di primo e secondo ordine.Naturalmente l’ordine di un filtro può riguardare i filtri passa-basso epassa-alto, ma non i passa-banda e gli escludi-banda che aumentano odiminuiscono la loro capacità di attenuazione in base alla bandwidth definita.La figura 121 mostra il comportamento di un filtro passa-banda al variaredel fattore Q.
123
-12 dB
-6 dB
4x2xx
II ord.
I ord.
Figure 120: Curva della risposta in frequenza di filtri del primo e secondo ordine,x è la frequenza di cutoff
Fc
-3 db
Q = 8
Q = 2
Figure 121: Comportamento di un filtro passa-banda in relazione al fattore Q
11.4 I FILTRI IN PD
Pd possiede una vasta collezione di filtri, la maggior parte dei quali in-trodotti da librerie esterne nella versione extended. Per brevità analizzer-emo l’uso di alcuni oggetti della versione nativa.
I due oggetti lop∼ e hip∼ implementano rispettivamente un filtro passa-basso e uno passa-alto del primo ordine, mentre bp∼ e vcf∼ sono deipassabanda. I primi due accettano come unico argomento la frequenza dicutoff, mentre gli altri la frequenza centrale e il fattore Q. Con questi oggettiè anche possibile realizzare un filtro escludi-banda, sia usando una coppiadi passa-basso/passa-alto che usando un passabanda (basta sottrarre il seg-
124
nale del passabanda dal segnale originale).
La figura 122 mostra lop∼, hip∼ e bp∼ in azione sulla stessa sorgente.L’oggetto polygate∼ permette di lasciar passare il segnale indicato dalmessaggio choice seguito dal numero dell’inlet scelto. Un messaggio pari azero chiude l’uscita per qualunque segnale. I due argomenti dell’oggettosono il numero degli inlet e il tempo in millisecondi in cui avviene la tran-sizione fra un segnale e l’altro.
noise~
dac~
*~
lop~ 5
sig~
choice $1
polygate~ 3 80
bp~ 200 10
194 bp_cutoffhip~ 10000
lop~ 40
off
lp
hp
bp
Figure 122: I filtri semplici di pd in azione
11.5 IL FILTRO vcf∼
Il filtro vcf∼ è uguale a bp∼ eccetto per il fatto di poter controllare il cutoffvia segnale. Questo consente dei realizzare dei controlli della frequenza ditaglio molto dinamici.
Nella patch in figura 123 un phasor∼ controlla il cutoff di un vcf∼ che filtrail segnale di un altro phasor∼.Il phasor∼ di destra crea 2 volte al secondo una rampa che viene molti-plicata per 720 e sommata a 80, quindi va da 80 a 800. Questo rampava nell’inlet del cutoff del vcf∼. L’argomento dell’oggetto è il fattore Q,che nella patch può essere variato attraverso la number box. La frequenzaprincipale del suono sorgente è generata da un altro phasor∼ a frequenza
125
vcf~ 5
phasor~ 80
+~ 80
sig~
lop~ 5
*~
dac~
8
phasor~ 2
*~ 720
Figure 123: Un filtro vcf∼ con controllo del cutoff attraverso un phasor∼
costante.
Nella patch c’è una particolarità: lo slider (con valori da 0 a 1) invia at-traverso sig∼ il segnale che controllerà l’ampiezza a un filtro passa-bassocon frequenza 5. lop∼ smusserà le spigolature del segnale consentendoil passaggio da un valore all’altro in modo graduale. Diminuendo la fre-quenza del filtro l’interpolazione sarà più lenta, al contrario, sarà più rap-ida all’aumentare della stessa.
11.6 UN sequencer CON vcf∼ E samphold∼
Nella prossima patch implementiamo un algoritmo che crea dei pattern, omeglio, delle sequenze di note che vengono filtrate da un vcf∼. Si tratta diuna forma rudimentale di sequencer, cioè un dispositivo che emette segnalidi controllo per pilotare degli eventi sonori.
Gli oggetti principali della patch li conosciamo quasi tutti, un phasor∼ perla lettura delle tabelle e il timing del sequencer, un vcf∼ per filtrare viasegnale la sorgente sonora e infine samphold∼, oggetto utilissimo per nu-merose implementazioni.
126
samphold∼ è la forma contratta di sample and hold, campiona e trattieni edè, a modo suo, una forma di filtro. Generalmente un algoritmo sample andhold prevede due parametri: un segnale da campionare e un segnale perscandire il campionamento secondo certi criteri. Nel caso di samphold∼,l’inlet di sinistra è deputato ad accettare il segnale che verrà campionato,mentre quello di destra accetta il segnale di trigger. Ma come e quandoavviene il campionamento del segnale? esattamente quando il segnale didestra passa da un valore non-zero a zero. Tipicamente si usa un phasor∼:ogni volta che termina la rampa arrivando a uno, torna a zero, innescandoil processo di campionamento. Il segnale da campionare può essere invecedi qualunque tipo.
In figura 124 samphold∼ campiona 4 volte al secondo il segnale inviato danoise∼, tale segnale viene, in uscita, costrotto nel range [0,1], poi molti-plicato per 800 e sommato a 100, generando così valori casuali compresifra 100 e 900, che vanno a cambiare la frequenza di un oscillatore. La sub-patch per l’ampiezza è solo un’incapsulamento di uno slider con un oggettolop∼, come abbiamo visto prima.
samphold~
phasor~ 4noise~
abs~
*~ 800
+~ 100
osc~
*~
dac~
5
interp_time
Figure 124: La frequenza di un oscillatore controllata da samphold∼
127
12 M O U L A Z I O N E A D A N E L LO ( R M ) ,T R E M O LO, M O D U L A Z I O N ED ’A M P I E Z Z A ( A M )
12.1 LA MODULAZIONE AD ANELLO
Definizione: Dati due segnali, si ha la modulazione ad anello (Ring Modu-lation, RM) quando si moltiplicano l’uno per l’altro nel dominio dell’ampiezza:
RM = sigα ∗ sigβ
Risultato: La RM produce un suono complesso, formato da tutte le fre-quenze ottenute dalla somma e dalla differenza dei due segnali. Nel casopiù semplice, con due sinusoidi, avremo quindi:
RM = (α f + β f ), (α f − β f )
In termini matematici, la seconda regola di Werner esprime proprio questaidentità:
cos(α) ∗ cos(β) =12[cos(α + β) + cos(α− β)] (1)
Quando i due segnali sono suoni complessi, il risultato della modulazionead anello sarà l’insieme delle somme e differenze fra tutte le frequenzedei due suoni. Nella patch in figura 127 si ha una doppia modulazionead anello, con le sinusoidi di frequenza 2000, 500 e 650 hertz. Il risultatodella prima RM da frequenze di 2500 e 1500 hertz che vengono modulaticon la terza sinusoide (650 hz), producendo un suono finale formato dallasomma di 4 onde: 3150, 1850, 2150, 850 hertz (vedi lo spettro in figura 128.Schematizzando:Dati i segnali α(2000hz), β(500hz), γ(650hz), si applica la modulazione adanello ai primi due e il risultato si ring-modula con il terzo:
- RM1 = (α f + β f ), (α f − β f )
128
Modulazione ad anello
x
0 1000 2000 3000
Figure 125: lo spettro risultante di una modulazione ad anello. Le frequenze dellesinusoidi sono di 2000 Hz e 500 hz. Il risultato è un suono compostoda frequenze di 2500 hz e 1500 hz
osc~ 2000
*~
dac~
osc~ 500
Figure 126: la patch di Pd che implementa la Modulazione ad anello dello spettroin figura 125
- RM1 = (2000 + 500), (2000− 500)
- RM1 = 2500, 500
- RM2 = RM1 f ∗ γ f
129
- RM2 = RM1 f ∗ 650
- RM2 = (2500 + 650), (2500− 650), (1500 + 650), (1500− 650)
- RM2 = 3150, 1850, 2150, 850
osc~ 2000
*~
dac~
osc~ 500
*~
osc~ 650
Figure 127: doppia modulazione ad anello: 2 segnali vengono ring-modulati fraloro e successivamente con un terzo
Storicamente la Modulazione ad anello è stata utilizzata per modificare iltimbro degli strumenti tradizionali. In quel caso un suono complesso vienering-modulato con un suono di sintesi, una sinusoide ad esempio. Tecnica-mente non c’è alcuna differenza con la modulazione vista qui sopra, masi preferisce in queste circostanze parlare di suoni che vengono modifi-cati con altri suoni: il suono da modulare viene definito Portante (Carrier),mentre il segnale che modula è detto Modulante (Modulator).
12.2 SEGNALI BIPOLARI E UNIPOLARI
Per ottenere un’onda unipolare é necessario operare una variazione suun’onda bipolare. Questa variazione si realizza aggiungendo al segnalebipolare un valore costante detto DC offset. Se ad una sinusoide che oscillafra -1 e 1 si aggiunge il valore costante 1, si otterrà una nuova sinusoide
130
Modulazione ad anello doppia
x
0 1000 2000 3000 4000
Figure 128: lo spettro risultante dalla doppia modulazione ad anello
oscillante fra 0 e 2, questo perché la distanza fra l’ampiezza massima equella minima della sinusoide equivale a e (1-(-1) = 2). In figura 129 sipuò osservare che la distanza del segnale unipolare, che oscilla fra 0 e 1,equivale alla metà di quello bipolare, che oscilla fra -1 e 1. Quindi oltreall’aggiunta della costante, é necessario dividere il segnale per 2 o, meglio,moltiplicarlo per 0.5 (le moltiplicazioni per il calcolatore sono più velocidelle divisioni). Ricapitolando:(sig[−1,1] ∗ 0.5) + 0.5 = sig[−0.5,0.5] + 0.5 = sig[0,1]
Nella patch di Pd in figura 130 é mostrato un segnale bipolare trasformatoin un segnale unipolare tramite l’oggetto expr∼.
12.3 SEGNALE DI CONTROLLO DELL’AMPIEZZA: IL TREMOLO
Definizione: Dato un segnale bipolare e uno sinusoidale unipolare, haluogo un tremolo quando il segnale unipolare, a basse frequenze, modulal’ampiezza di quello bipolare.
Risultato: il tremolo non è altro che una variazione dell’ampiezza di unsegnale prodotta da un altro segnale. L’oscillatore che modula l’ampiezzadella Portante deve necessariamente emettere basse frequenze, per non
131
➤
❘
➤
❘
➤
❘
a)−1.0
−0.5
0.0
0.5
1.0
−1.0
−0.5
0.0
0.5
1.0
b)
−1.0
−0.5
0.0
0.5
1.0
−1.0
−0.5
0.0
0.5
1.0
Figure 129: la distanza massima fra l’ampiezza positiva e quella negativa del seg-nale bipolare (a) é doppia rispetto a quella del segnale (b)
interferire con la frequenza del suono modulato. Inoltre una frequenzatroppo alta non permetterebbe di percepire l’effetto tremolo desiderato.Tradizionalmente esistevano degli oscillatori specializzati nella generazionedi basse frequenza, sotto i 30 hertz circa, utilizzati proprio come strumentidi controllo di altri oscillatori. Gli LFO (Low Frequency Oscillator) in Pdpossono essere sostituiti dai normali oscillatori, che generano qualsivogliafrequenza.La patch in figura ?? realizza un tremolo semplice. Si può controllare inter-attivamente la frequenza del tremolo con la number box in alto e l’ampiezzadel segnale in uscita con la slider orizzontale. Come si intuisce l’oscillatoremodulante determina la frequenza della variazione d’ampiezza, ma nonl’escursione dell’ampiezza stessa, che oscilla sempre fra 0 e 1. La figura
132
osc~ 200
expr~ ($v1 * 0.5) + 0.5
dac~
tabwrite~ bipolare
metro 100
tabwrite~ unipolare
bipolare
unipolare
Figure 130: l’oggetto expr∼ permette facilmente di effettuare le due operazionisul segnale per trasformarlo trasformano da bipolare a unipolare
132 mostra proprio questa situazione, il segnale (a) viene modulato inampiezza da (b) e il risultato (c) è un’oscillazione percepibile dell’ampiezzafra 0 e 1.Con la prossima patch un algoritmo più articolato del precedente realizzaun tremolo controllabile in frequenza, ma anche in ampiezza, in mododa poter decidere anche l’escursione del tremolo. La figura 133 mostraproprio questa situazione. L’onda (b) varia l’ampiezza producendo in (c)un cambiamento graduale dell’entità del tremolo. In figura 134 la patch diPd che implementa l’algoritmo relativo. Le due number box consentono diintervenire interattivamente sulla frequenza e sull’ampiezza del tremolo.La frequenza agisce esattamente come in figura 131 mentre per l’ampiezzail numero in entrata dalla number box di destra ha un range compreso fra0 e 50 e in uscita viene diviso per 100, in modo da emettere un range fra0 e 0.5. Il segnale viene moltiplicato per quel valore e il risultato vienesommato al risultato di 1 meno il valore in entrata.
133
*~
osc~ 1
expr~ ($v1 * 0.5) + 0.5
2
controllo_tremolo
dac~
*~
line~
$1 20
osc~ 800
Figure 131: con la number box si può aumentare o diminuire la frequenza deltremolo
Tremolo
a)
b)
c)
Figure 132: il segnale (a) viene moltiplicato per il segnale (b) generando il tremolorappresentato in (c)
134
Tremolo controllato in ampiezza
a)
b)
c)
Figure 133: il segnale (b) varia in ampiezza generando una variazionedell’ampiezza di (c)
12.4 LA MODULAZIONE D’AMPIEZZA
Definizione: Dato un segnale bipolare, detto Portante, e uno unipolare,detto Modulante, ha luogo una modulazione d’ampiezza (AM) quando ilsegnale unipolare modula l’ampiezza di quello bipolare.
Risultato: La modulazione d’ampiezza produce un suono con uno spet-tro in cui è presente la frequenza Portante e tutte le frequenza somma e dif-ferenza fra Portante e Modulante. Tecnicamente la Modulazione d’ampiezzaè molto simile al tremolo, con la differenza che per il tremolo il segnaleModulante è costituito da un segnale di frequenza molto bassa. Nell’AMinvece la frequenza Modulante è compresa nella banda audio. Dal puntodi vista trigonometrico abbiamo:
sin(α) ∗ (1 + sin(β)) = sin(α) ∗ sin(β) + sin(α) =12 (cos(α− β)− cos(α + β)) + sin(α)
135
*~
osc~ 1
1
frequenza
dac~
*~
line~
$1 20
wave
tabwrite~ wave
metro 25
37
ampiezza
/ 100
osc~ 1600
expr~ ($v1 * $f2) + (1 - $f2)
Figure 134: con la number box a destra si può controllare l’ampiezza del tremolo
Rispetto alla Modulazione ad anello, nello spettro è quindi presente ancheil segnale Portante. In figura 135 viene mostrato lo spettro di una modu-lazione d’ampiezza con Portante di 800 hz e modulante 160 hz. Lo spettrosarà quindi:
(Pf ), (Pf + M f ), (Pf −M f ) =
800, (800 + 160), (800− 160) =
800, 960, 640Come nel caso della modulazione ad anello, nella Modulazione d’ampiezzai segnali possono essere costituiti da suoni complessi. Lo spettro risultantesarà sempre l’insieme delle somme e differenze fra le frequenze della por-tante e della modulante e in più le frequenze della portante. La patch infigura 138 mostra una doppia modulazione d’ampiezza. La portante di1500 hz viene modulata con un segnale di 500 hz. Il risultato di tale modu-
136
Modulazione d’ampiezza semplice
x
0 500 1000 1500 2000
Figure 135: Il segnale portante ha frequenza di 800 hz, mentre il modulante hafrequenza di 160 hz
lazione è la portante di una nuova modulazione con un segnale di 300 hz.Schematizzando:
(Pf ∗M1) ∗M2 =
[1500, (1500 + 500), (1500− 500)] ∗M2 =
(1500, 2000, 1000) ∗M2 =
(1500, 2000, 1000) ∗ 300 =
[1500, (1500 + 300), (1500− 300)], [2000, (2000 + 300), (2000− 300)],[1000, (1000 + 300), (1000− 300)] =
1500, 1800, 1200, 2000, 2300, 1700, 1000, 1300, 700
Lo spettro risultato è mostrato in figura 138.
12.4.1 L’INDICE DI MODULAZIONE
La patch in figura 136 genera una semplice modulazione d’ampiezza dovela Portante e le frequenze laterali hanno la stessa ampiezza. Oltretutto im-postare a zero la frequenza o l’ampiezza della Modulante porterebbe a zeroanche l’ampiezza della Portante, poiché il segnale Portante sarebbe molti-
137
*~
expr~ ($v1 * 0.5) + 0.5
dac~
*~
line~
$1 20
osc~ 800 osc~ 160
Figure 136: la patch che produce lo spettro della figura precedente
plicato per zero. Attraverso un indice di modulazione è possibile controllareil rapporto fra l’ampiezza della Portante e quella della Modulante.L’algoritmo per implementare l’indice di modulazione deve assicurare chel’ampiezza in uscita dall’AM sia sempre pari a 1, quindi al diminuiredell’ampiezza della modulante ci sarà un aumento della costante che sisomma all’ampiezza della Modulante e che si moltiplica alla Portante. Ifigura 139 c’è lo spettro di una modulazione con Portante a 800 hz e Mod-ulante a 160 hz. Nella figura 140 c’è la relativa patch di Pd.
138
*~
expr~ ($v1 * 0.5) + 0.5
dac~
*~
line~
$1 20
expr~ ($v1 * 0.5) + 0.5
*~
osc~ 1500
osc~ 500
osc~ 300
Figure 137: la patch realizza una modulazione d’ampiezza con due modulanti
139
Modulazione di ampiezza con 2 modulanti
x
0 1000 2000 3000
Figure 138: la patch che produce lo spettro della figura precedente
Indice di modulazione 0.25
x
0 500 1000 1500
Figure 139: spettro di modulazione di ampiezza con indice di modulazione paria 0.25
140
*~
expr~ ($v1 * 0.5) + 0.5
dac~
*~
line~
$1 20
osc~ 800
line~
$1 20
osc~ 160
expr~ ($v1 * $v2) + (1 - $v2)
Figure 140: la slider verticale a destra controlla l’indice di modulazione, con rangeda 0 a 1
141
13 V I B R ATO E M O D U L A Z I O N E D IF R E Q U E N Z A ( F M )
13.1 SEGNALE DI CONTROLLO DELLA FREQUENZA: IL VIBRATO
Prima di trattare della Modulazione d’ampiezza avevamo visto che conun’oscillazione a basse frequenze è possibile modulare l’ampiezza di unonda producendo un effetto di tremolo. Analogamente, agendo sulla fre-quenza del segnale con un LFO possiamo modulare la frequenza dell’oscillatoreproducendo l’effetto del vibrato. Invece di utilizzare un segnale unipolarepossiamo usare un normale segnale bipolare.
+~
*~
osc~
sig~
8040
dac~
osc~ 1
metro 100
vibrato
tabwrite~ vibrato
Figure 141
142
Nella patch in figura 141 il segnale bipolare dell’LFO sarà moltiplicato per40, producendo un’onda che varierà in ampiezza fra -40 e 40 hz. Questosegnale modulerà la frequenza dell’oscillatore di sinistra che ha una fre-quenza base di 2000. L’effetto sarà di avere un segnale di frequenza 2000
che oscilla fra 1660 e 2040 hz alla velocità di un ciclo al secondo.
13.2 MODULAZIONE DI FREQUENZA
Definizione: Dato un segnale Portante e uno Modulante, ha luogo unamodulazione di frequenza (FM) quando il segnale Modulante modula lafrequenza di quello Portante.
Risultato: La FM produce uno spettro molto ricco costituito dal segnalePortante e da un certo numero di parziali con frequenza pari alla distanzafra la Portante e un multiplo intero della Modulante. Schematizzando:
FM f = Pf , (Pf + M f ), (Pf −M f ), (Pf + 2M f ), (Pf − 2M f ), (Pf + 3M f ), (Pf −3M f ), . . .
Come per la modulazione ad anello e d’ampiezza, lo spettro della FMè simmetrico rispetto all’asse della frequenza Portante, ma contiene unnumero di bande laterali dipendendente dalla deviazione di picco.La deviazione di picco è ”il massimo mutamento di frequenza che l’oscillatoreportante subisce”1. La deviazione di picco si stabilisce attraverso un indice dimodulazione secondo la formula:
I = DM f
Dove I è l’indice di modulazione e D è la deviazione di picco. Ne consegueche:
D = I ∗M f
Più elevato è il valore dell’indice di modulazione, maggiore sarà la devi-azione di picco, più numerose le componenti della portante modulata infrequenza. In figura 142 è mostrata una patch per la modulazione di fre-quenza semplice. Fa uso di tre subpatch che esaminiamo una alla volta.
1 R. Bianchini, A. Cipriani, "Il Suono Virtuale", ed. Contempo, pag. 244
143
dac~
pd modulante
200
freq
1000
indice
10
Deviazione
2000
pd uscita
pd portante
4000
freq
Figure 142: la patch per la modulazione di frequenza semplice
In figura 143 è raffigurata la subpatch per la portante. L’inlet riceve il seg-nale prodotto dalla modulante, che viene sommato alla frequenza dellaportante, che si puòimpostare con la number box in alto.In figura 144 si puòosservare che la number box a sinistra imposta la fre-quenza dell’oscillatore modulante. Tale frequenza viene anche moltiplicataper l’indice di modulazione. Il prodotto di tale moltiplicazione determina ladeviazione di picco, quindi l’ampiezza dell’oscillatore modulante. Il segnale
144
osc~
+~
0
freq
inlet~
outlet~
Figure 143: la subpatch per il segnale portante
in uscita dall’outlet entra nell’inlet della Portante.
Sulla patch per l’uscita (fig. 145) non c’è molto da dire: una slider verticalecontrolla l’ampiezza del segnale prodotto dalla FM.Maggiore è la deviazione di picco, maggiore sarà il numero di componentipresenti nello spettro. In figura 146 l’indice di modulazione pari a 0.1determina una deviazione di picco di 20 hz (0.1 * M f , ovvero 0.1 * 200 = 20)quindi un numero esiguo di componenti spettrali. In figura 147 l’indicepari a 10 determina una devizione di 2000 hz, quindi uno spettro moltopiù ricco: nella banda di frequenza compresa fra (Pf − D) e (Pf + D)(2000 - 6000) le ampiezze grosso modo si equivalgono mentre al di sotto e aldi sopra di tali limiti inizia una diminuzione graduale delle ampiezze.
13.2.1 L’INVILUPPO
Fino ad ora il risultato delle operazioni ha sempre prodotto segnali con-tinui. Non ci siamo occupati di definire un evento nel dominio del tempo,che fosse provvisto di un inizio e di una fine, come invece accade per ognisuono reale. Con gli strumenti digitali abbiamo la possibilità di crearesuoni di durata indefinita, ma anche di definire la loro durata nel tempo.Per disegnare un suono definito nel dominio del tempo abbiamo bisognodi un inviluppo, ovvero di un profilo che determini la forma che il suono
145
*~
osc~ 200 $1 20
line~
$1 20
line~
*~
200
freq
1000
indice
outlet~
/ 100
10
Deviazione
2000
*
t b f
Figure 144: la subpatch per il segnale modulante
assume rispetto al tempo. In figura 148 si può osservare la forma d’ondaprodotta da un suono di tromba della durata di circa 6 decimi di secondo.Approssimando molto si può distinguere una fase (attacco in cui l’ondapassa da uno stato di quiete ad uno di massima ampiezza, una secondafase in cui c’è un calo dell’ampiezza (decadimento), una terza fase in cui ilsuono si mantiene più o meno costante (sostegno) e un’ultima fase (rilascio)in cui l’onda torna allo stato di quiete. Queste quattro fasi, a volte indicatecon l’acronimo ADSR, costituiscono l’inviluppo del suono.Naturalmente l’ADSR costituisce un’approssimazione, ci sono nella realtàdei suoni che non hanno la fasi di sostegno o quella di decadimento, adesempio alcuni suoni percussivi. Sicuramente però l’attacco e il rilasciodel suono sono nei suoni reali sempre presenti. Nella musica elettronica
146
*~
$1 20
line~
outlet~
inlet~
Figure 145: la subpatch per l’uscita
Spettro FM indice 0.1
x
0 1000 2000 3000 4000 5000 6000 7000 8000
Figure 146: FM con frequenza portante di 4000 hz, modulante di 200 hz e indicedi modulazione 0.1
un esempio tipico di inviluppo è quello mostrato in figura 149(b), che vieneapplicato al segnale (a), producendo la forma d’onda mostrata in (c).Uno degli strumenti per generare inviluppi in Pd è l’oggetto envgen che ciconsente di disegnare inviluppi costituiti da segmenti. L’output dell’oggettoè un messaggio leggibile con line (fig. 150). Nella prossima sezione faremouso di generatori di inviluppo nella modulazione di frequenza.
147
Spettro FM indice 10
x
0 1000 2000 3000 4000 5000 6000 7000 8000
Figure 147: FM con frequenza portante di 4000 hz, modulante di 200 hz e indicedi modulazione 10
Inviluppo di tromba
tempo
ampiezza
Figure 148
13.2.2 FM A SPETTRO VARIABILE
Un uso interessante della modulazione di frequenza è quello di usare degliinviluppi per creare spettri variabili. Con la prossima patch generiamo una
148
a)
b)
c)
Figure 149: l’inviluppo disegnato in (b) ha valori compresi fra 0 e 1. L’onda (a)viene inviluppata da (b), ovvero istante per istante le ampiezze is-tantanee di (a) vengono moltiplicate per i relativi valori di (b), pro-ducendo (c)
sequenza di suoni brevi che simulano il timbro di un woodblock, secondoun algoritmo proposto da John Chowning2.L’algoritmo è semplice: una FM con portante di 80 hz e modulante di55 hz. Un indice di modulazione gestito da un inviluppo con una puntamassima di 25 e un altro inviluppo per l’ampiezza del suono. In figura151 c’è l’intero algoritmo. La durata di un evento è di 200 millisecondi.La subpatch pd indexenv serve semplicemente a rescalare i valori in uscitadell’oggetto envgen che emette solo valori di ampiezza compresi fra 0 e 1
(fig. 152. La subpatch envamp invece memorizza i dati del’altro envgen e lispedisce a line senza alcun riscalamento.
2
149
Figure 150: l’oggetto envgen
Infine in figura 154 c’è il sequencer per la generazione dei bang per in-nescare gli eventi sonori. L’oggetto list-idx riceve una lista di 0 e 1, 1 laddovel’evento deve essere on, 0 quando dev0essere off. metro collegato a un con-tatore costringe list-idx ad emettere uno ad uno i valori della lista, quandoil valore è uguale a uno la patch invia un bang agli inviluppi, creando lasequenza desiderata.
13.3 PORTANTI MULTIPLE
Fino ad ora abbiamo implementato la Modulazione di Frequenza facendouso di un oscillatore portante e di uno modulante. Questo modello, facendouso appropriato di inviluppi e del controllo dei rapporti di frequenza e diindice di modulazione può produrre timrbi molto complessi e interessanti,ma la FM può anche essere realizzata ampliando il campo degli attori ingioco. Ad esempio se con un un’unica onda modulante si modulano piùportanti lo spettro risultante sarà ancora più complesso.
Nella figura 155 un’unica modulante agisce su tre portanti delle quali sipuò impostare la frequenza ma che hanno un unico controllo dell’ampiezza.
Il modello della FM a portanti multiple diventa estremamente complessose si controllano le singole ampiezze delle portanti con inviluppi diversi.In figura 156 quattro envgen controllano rispettivamente le tre ampiezze
150
dac~
*~
osc~
*~
pd indexenv
duration $1 dump r envindex
duration $1 dump r envamp
pd envamp
r dur
r dur r trig
r trig
200
s dur
loadbang
200
osc~ 55
*~ 55
+~ 80
pd seqz
START SPEED
150
Figure 151: la patch per l’FM semplice di Chowning
delle portanti e l’indice di modulazione.
151
unpack f f
pack f f
outlet~
inlet
s envindex
inlet
prepend set
1 16 0 184 0
loadbang* 25
line~ 0 5
Figure 152: La subpatch per il riscalamento dei valori di envgen. Le ampiezzevengono scalate in un range fra 0 e 25. La parte destra della patchserve a memorizzare i dati disegnati in envgen. L’help dell’oggettospiega come salvare i dati.
line~
outlet~
inlet
inlet
prepend set
0.807143 17 0.95 15 1 15.0001 0.971429 7.99998 0.914286
3.99979 0.792857 18.0001 0.35 22.9999 0.142857 41.0006
0.0142857 58.9995 0
loadbang
s envamp
Figure 153: la subpatch envamp
13.4 MODULANTI MULTIPLE
Allo stesso modo si può aumentare il numero delle modulanti che agisconosu un’unica portante. Nella figura 157 tre oscillatori modulanti agisconosu un’unica portante.
Tale configurazione, come quella precedente, è solo una delle tantissimepossibili. Lasciamo il lettore sperimentare qualche soluzione diversa, con-
152
b
metro 250
int 0 + 1
START
list-idx
sel 1
pack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
s trigmod 16
r trig
SPEED
150
Figure 154: la subpatch seqz
trollando indici di modulazione con envgen e aumentando il numero dellemodulanti (o delle portanti).
153
pd carrier pd carrier pd carrier
pd mod
*~
line~
$1 20
dac~
250
frq
500
frq
750
frq
50
frq
90
index
Figure 155: FM con portanti multiple
154
pd carrier pd carrier pd carrier
pd mod
dac~
250
frq
500
frq
750
frq
50
frq
*~ 0.3
*~ *~ *~
line~ line~ line~ line
bang
* 200
duration 1000
index
Figure 156: FM con portanti multiple con controllo di singole ampiezze e indicedi modulazione tramite envgen
155
dac~
pd modulante
160
freq
230
indice
2.3
Deviazione
368
pd modulante
320
freq
400
indice
4
Deviazione
1280
pd modulante
40
freq
500
indice
5
Deviazione
200
+~
+~
pd uscita
pd portante
80
freq
Figure 157: FM con modulanti multiple
156
14 I N T R O D U Z I O N E A L L A S I N T E S IG R A N U L A R E
14.1 TEORIA DELLA SINTESI GRANULARE
La sintesi granulare muove dal concetto che eventi sonori molto brevi,emessi in rapidissima successione, perdono la loro singolarità e costitu-iscono un continuum sonoro unitario.
Tali brevi segmenti sonori sono detti grani, o quanta sonori. Un flussocontinuo di grani costituisce un treno, mentre più treni contemporanei for-mano nuvole.
Il grano è l’unità elementare su cui si basa questa tecnica di sintesi. Esso èdotato di forma d’onda e inviluppo di ampiezza. Entrambi questi parametriassumono caratteri molto eterogenei: la forma d’onda può essere di qualunquetipo, mentre l’inviluppo, per ragioni computazionali, ha tipicamente, manon necessariamente, forma simmetrica (158).In figura 159 troviamo un segnale con forma d’onda sinusoidale invilup-pato da una forma a campana e da una forma trapezoidale. Il risultato sonodue grani simmetrici.Il flusso di grani costituisce i treni, il cui principale carattere distintivo è ladensità per secondo, che si misura in hertz. Tale densità definisce il periodo,cioè l’intervallo fra l’inizio di un grano e l’inizio del successivo. Il periodoè costituito dal grano e da una certa quantità di silenzio (s, fig. 160). Ladurata del periodo è inversamente proporzionale alla densità (fig. ??).
14.1.1 DIPENDENZA VS. INDIPENDENZA DEI PARAMETRI
Densità dei grani e durata del grano sono due parametri che possono es-sere o meno dipendenti l’uno dall’altro. Quando all’aumentare della den-sità dei grani diminuisce la durata del singolo grano densita e durata delgrano sono parametri dipendenti. In questo caso il rapporto di inversaproporzionalità rimane costante. Nel caso di indipendenza dei parametri
157
!"#$%&'(
gpg
upg)(##
gpg
upg
*+",(-.&/"#
gpg
upg*+&"'01#"+
gpg
upg
21"&z0"1%%&"'
gpg
upg,1#%(
gpg
upg
Figure 158: Possibili inviluppi di un grano
invece all’aumentare della densità dei grani, diminuisce il periodo, ma ladurata del grano rimane costante. In tal caso il rapporto fra la durata delgrano e la porzione di silenzio cambia in favore della durata del granoe quando la densità dei grani raggiunge un certo limite e il periodo di-venta minore della durata del grano si ha un fenomeno di troncamento,che viene sublimato attraverso la tecnica dell’overlapping di cui ci occuper-emo fra poco.
In figura 161(a) con densità pari a 25 hz e durata del grano (gdur) di 20 mil-lisecondi, si ha un periodo di 40 millisecondi. Quando la densità aumentaa 50 hz, come in (b), periodo e gdur coincidono, quindi è il limite entro ilquale i grani ancora non si toccano. Quando la densità supera quella soglia,come nell’esempio (c), dove è di 70 hz, il periodo diventa minore di gdur esi realizza il troncamento: il grando inizia prima che il precedente sia ter-minato. Nell’ultima situazione, la (d), si applica un overlapping per evitare
158
sine wave
-1,0
0,0
1,0
bell envelope
-1,0
0,0
1,0trap envelope
-1,0
0,0
1,0
resulting grain
-1,0
0,0
1,0resulting grain
-1,0
0,0
1,0
Figure 159: Sinusoide con inviluppi a campana e trapezoidale
il clicking determinato dal troncamento.
14.1.2 OVERLAPPING
L’overlapping consiste nella somma di treni diversi di grani. Nel momentoin cui il periodo è minore della durata del grano è necessario sdoppiare iltreno di grani in due o più treni in modo da evitare il troncamento deglistessi.
Nella situazione mostrata in figura 162, quando gdur è uguale a 50 mse gdens a 50 hz il periodo è pari a 20 ms. Questo significa che ogni 20
ms (parametro che chiameremo offset un nuovo grano fa la sua comparsa,quindi prima che un grano termini, altri due ne sono comparsi.
L’overlapping si realizza creando tre treni di grani, ognuno con la stessadensità, ma con un suo offset. Potremmo dire che ogni treno avrà una fase
159
Figure 160: Periodo e densità del grano
diversa. Nel caso dell’immagine in figura 162 il primo treno avrà offsetzero, il secondo 20 ms, il terzo 40 ms. per ogni treno il periodo avrà duratadi 60 ms.
Il numero dei treni necessari per realizzare l’overlapping è un numero interodetto overlapping factor e si calcola dividendo innanzitutto 1000 (i millisec-ondi in un secondo) per la densità, operazione che ci dà l’offset, poi divi-dendo la durata del grano per l’offset appena ottenuto ed eventualmenteapprossimando all’intero superiore. In C scriveremmo la seguente fun-zione:
int overfactor (gdur, gdens) {
float offset, factor;
int overlapfactor;
offset = 1000.0 / gdens;
factor = gdur / offset;
160
���������� �
����������
��������
���������� �
�����������
��������
���������� ������������
�����������
��������
���������� ��������������
�����������
��������
Figure 161: Troncamento e Overlapping
if (factor - (int)factor == 0.0) {
overlapfactor = int(factor);
else {
161
gdens: 50hz
offset2: 40ms
offset1: 20ms
pdur: 60msgdur: 50ms
Figure 162: Overlapping dei treni
overlapfactor = int(factor)+1;
}
}
}
Nella figura 163 si vede la rappresentazione di una situazione con gdenspari a 50 hz, gdur di 45 ms, con relativo offset di 20 ms e overlapping factordi 3.
14.1.3 PARAMETRI E SPETTRI RISULTANTI
Data la complessità e la varietà delle possibilità realizzabili con la sintesigranulare, non è agevole descrivere gli spettri risultanti da questa tecnica.A parità di densità ad esempio, un cambio di durata del grano può cam-biare sensibilmente lo spettro del suono risultante. A parità di densità edurata del grano, un cambio dell’inviluppo del grano o della sua formad’onda può produrre risultati diversissimi. I parametri che contribuisconoalla formazione di uno spettro sono tantissimi e se si pensa che la densitàdei grani può essere un parametro variabile nel tempo le possiblità combi-natorie diventano praticamente infinite.
Consideriamo l’inviluppo del grano. Se l’inviluppo fosse l’unica formadisponibile, cioè se dentro l’inviluppo ci fosse segnale nullo, con densità
162
����������� ���������
���������
���������
��������������������� ����������
Figure 163: Overlapping con overlapping factor pari a 3
superiore alla soglia udibile (oltre i 20hz circa) si produrrebbe già un suonoben distinguibile.
In sostanza, ogni parametro contribuisce alla formazione del suono, quindinell’implementazione della sintesi granulare vanno trattati con attenzionei seguenti parametri:
• durata del grano (gdur)
• inviluppo del grano (grainenv)
• densità del treno (gdens)
• rapporto gdens/gdur
• variabilità nel tempo di gdens e degli altri parametri
163
14.1.4 IL DOMINIO DEL TEMPO E LA SINTESI GRANULARE
Nell’implementare la sintesi granulare è necessario fare delle scelte in mer-ito al tipo di sintesi che si vuole realizzare. Prima di tutto bisogna de-cidere se gdens e gdur saranno parametri dipendenti o indipendenti fra loro.Nel primo caso sarà necessario realizzare un algoritmo per l’overlapping, equesto vale per la maggiorparte dei tipi di sintesi granulare, nel secondocaso no, perché all’aumentare della frequenza, diminuirà la durata delgrano. Questo secondo caso è implementato grazie alla cosiddetta GrainletSynthesis.La seconda scelta iniziale da fare consiste nell’optare per una densità costantenel dominio del microtempo o per una densità variabile.
Il microtempo è quella dimensione nell’ambito della quale non c’è unapercezione dei cambiamenti temporali, ma timbrici. Se si sceglie di variarela durata del periodo nell’ambito di 10 ms, cioè se si applica una variazionealla densità comprsa fra [-5,+5]ms rispetto alla frequenza stabilita, non siavrà percezione di tale cambiamento se non nel dominio del timbro.
Timbro e tempo sono due parametri strettamente connessi. Come sappi-amo la frequenza è direttamente proporzionale al tempo, la sua unità dimisura (l’hertz) indica la velocità con cui un’onda compie il suo ciclo. Nat-uralmente a frequenza alta non abbiamo nessuna percezione temporale,ma una totale percezione timbrica. C’è però una zona confusa, quella com-presa fra i 20 e i 40 hz circa, dove la percezione si divide fra timbro etempo, perché gli eventi sono vissuti come ritmici e dove all’aumento dellafrequenza corrisponde la sensazione di una precipitazione ritmica, fino asuperare una certa soglia, oltre la quale il ritmo non viene più percepito.
Possiamo distinguere, generalizzando molto, tre tipi di tempo (fig. 164), dalpiù indistinguibile, il tempo microscopico, fino al tempo formale, che dal puntodi vista percettivo ha una dimensione fenomenica piuttosto che temporale,attiene quindi alla capacità del percettore di ricostruire soggettivamente lasequenza degli eventi.
Quando si realizza una sintesi granulare in cui nel microtempo la densitàdimane costante, si ha la sintesi granulare sincrona (Syncronous GranularSynthesis), mentre in presenza di densità variabile nel microtempo si ha lasintesi granulare asincrona Asyncronous Granular Synthesis. Nel primo caso
164
tempomicroscopico dominio del timbro
tempomacroscopico dominio del tempo musicale
tempoformale dominio del tempo culturale
Figure 164: I domini del tempo
si parla a volte di Quasi-Syncronous Granular Synthesis perché la densitànon varia nel microtempo, ma può variare nel dominio del tempo percepi-bile. Se ad esempio implementiamo un algorimo dove decidiamo che ladensità passa da 50 a 100 hz in 10 secondi, si ha una percezione ben dis-tinta del cambiamento, ma nel microtempo possiamo dire che non ci sonocambiamenti.
Asyncronous Granular Synthesis
Grainlet Synthesis Glisson SynthesisSampled Sounds Granulation
Syncronous (Quasi-Syncronous) Granular Synthesis
Trainlet Synthesis
Pulsar Synthesis FOF Synthesis
Figure 165: Alcune tipologie di Sintesi Granulare
La complessità generata dalla combinazione dei parametri ha dato vita,storicamente, ha molti tipi di sintesi granulare. Da Gabor a Curtis Roads,passando per Xenakis, sono stati implementati diversi tipi di Granulazione,semplicemente agendo sull’idea generale di treni di grani combinati inmodi diversi. Nella figura 165 proponiamo uno schema riassuntivo di al-cuni dei più importanti tipi di sintesi granulare, collegando per sommi
165
capi le famiglie tipiche e le relative derivazioni.
14.2 IMPLEMENTAZIONE IN PD
La prima cosa da fare è creare un algoritmo che generi le tabelle perl’inviluppo del grano. Usando come di consueto gli oggetti tabread (fig. ??).In questo esempio la patch genera quattro diverse forme per l’inviluppo:una campana, una forma trapezoidale, una mezza sinusoide e una curvaesponenziale.
14.3 UN ESEMPIO DI Trainlet Synthesis
Il primo tipo di sintesi granulare che implementiamo è una Trainlet Synthe-sis semplificata: gdur e gdens sono strettamente dipendenti l’una dall’altra,per l’esattezza inversamente proporzionali. Ne consegue che all’aumentaredella densità, diminuisce la durata del grano. Si tratta di una sintesi sin-crona con parametri dipendenti. Quello che si può pilotare in questa patchè:
• densità dei grani in hz
• frequenza all’interno del grano
• forma dell’inviluppo
La durata del grano gdur naturalmente non è impostabile perché dipendeda gdens.
Cerchiamo di capire cosa accade all’interno della patch (fig. 166). L’oggettotabread4∼ legge la tabella dell’inviluppo del grano. phasor∼ alla fre-quenza scelta moltiplica la sua uscita per 512, in modo da leggere i 512
indici della tabella. L’inviluppo viene moltiplicato per il segnale generatoda osc∼.Se si realizza questa semplice patch la cosa più interessante è verificare ladifferenza di timbro a parità di frquenza e densità, al variare della formadell’inviluppo.
166
pd envelope
set bell
set halfsine
set trap
set expdec
*~
dac~
*~
$1 50
line~amp
phasor~ 4
30
densità
tabread4~ bell
pd frequenza
osc~ 440
*~ 512
r frq
expr 1000 / $f1
s graindur
r princfrq
467
frequenza
r amp
graindur
33.33
inviluppo
Figure 166: Implementazione della Trainlet Synthesis
14.4 LA Pulsar Synthesis
La Pulsar Synthesis prende il nome da un tipo di stella che emette impulsidi radiazioni a intervalli regolari. Questa tecnica di sintesi è relativamentesimile alla Trainlet Synthesis, ma si basa sul principio della variabilità delrapporto fra gdur e s all’interno del periodo. È quindi una tecnica sincronacon parametri dipendenti, anche se esitono implementazioni a parametriindipendenti.
L’elemento informativo più importante è il pulsaret, costituito da un peri-odo in rapporto inverso rispetto alla densità. Tale periodo contiene il granoe un frammento di silenzio. il rapporto fra queste due misure è detto DutyCycle.
L’algoritmo è simile a quello che abbiamo implementato per la TrainletSynthesis, ma in questo caso è importante che l’oggetto phasor∼ invia un
167
segnale a tabread4∼ tale che ci sia dopo il grano una porzione di silenzio.Cerchiamo di spiegare meglio questo concetto. In presenza di una tabelladi 512 punti un phasor∼ con frequenza 1 con moltiplicazione del segnaleper 512 leggerà tutta la tabella in un secondo. Cosa accade se moltiplichi-amo il segnale in uscita da phasor∼ per 1024? In un secondo il suo segnalecreerà una rampa da 0 a 1023. Fino a quando il valore sarà minore di 512
leggerà i valori della tabella, oltre 512 leggerà valori pari all’ultimo indiceletto nella tabella (che andrà SEMPRE impostato a zero). Raddoppiandoquindi il valore dei punti da far leggere a phasor∼ si genera un Duty Cycledi 1:1, una parte di grano e una uguale di silenzio.
Figure 167: Duty Cycle con phasor∼
168
In figura 167 viene mostrato un Duty Cycle di 1:3. phasor∼ viene molti-plicato per 2048, il quadruplo della tabella da leggere, quando il valore inuscita è minore di 0.25 leggerà tutti i valori della tabella, oltre 0.25 nonleggerà più nulla e tabread4∼ emetterà l’ultimo indice.
Nell’algoritmo è di fondamentale importanza implementare il calcolo delDuty Cycle. Poniamo di poter impostare il Duty Cycle con uno slider cheagisce nel range [0,1], dove 0.5 rappresenta il rapporto di 1:1, 0.25 il rap-porto di 1:3, 0.75 il rapporto 3:1 e così via. Basta dividere la dimensionedella tabella per la quantità impostata con lo slider per ottenere la giustamisura per cui moltiplicare l’uscita di phasor∼. In linguaggio di pd, costru-endo una piccola subpatch ci troveremo di fronte all’immagine di figura 168.
inlet ratio
expr 512 / $f1
$1 50
line~
outlet~ ratio
Figure 168: Calcolo del Duty Cycle
la patch per l’implementazione della Pulsar Synthesis appare nella figura169. A parte la scelta del Duty Cycle, per il resto è molto simile alla patchper la Trainlet Synthesis, quindi si può scegliere la densità dei grani e lafrequenza interna al grano, nonché il rapporto grano/silenzio.
Il comportamento spettrale della Pulsar Synthesis è tale che all’ aumentaredella quantità di s tende all’entropia, cioè ad uno spettro molto ampio conampiezze estremamente omogenee. Lo spettrogramma della figura 170 eil sonogramma di figura 171 ne sono prova visibile.
169
set bell
set halfsine
set trap
set expdec
choose envelope shape
pd ratio
*~
*~
dac~
*~
$1 50
line~
phasor~ 4
0
frequenza
osc~ 880
0
0
tabread4~ trap
Figure 169: Implementazione della Pulsar Synthesis
14.5 Asyncronous Granular Synthesis
La Asyncronous Granular Synthesis si realizza intervenendo sulla densità deigrani in modo da renderla variabile nel contesto del tempo microscopico.
Per implementarla in modo semplice si può realizzare una subpatch inter-venga sulla frequenza del solito phasor∼ variandone la frequenza entro unrange di valori prestabilito (fig. 172).
L’inlet di sinistra riceve la frequenza di base mentre quello di destra l’indicedi variazione. Tale misura rappresenta, in percentuale, l’ambito entro ilquale deve avvenire la variazione. Se, per esempio, si stabilisce una vari-azione del 50% con frequenza base 16 hz, la variazione sarà di 8 hz, quindi
170
Figure 170: Lo spettro risultante della Pulsar Synthesis
la densità sarà variabile nel range [12,20]hz.
Tipicamente, la sintesi granulare asincrona generalizza il concetto di vari-azione nel dominio del microtempo. Non solo la densità dei grani può esserevariabile, ma anche tutti gli altri parametri. Nella nostra patch completa sipossono impostare i seguenti parametri, con relativo indice di variazione:
• densità dei grani
• frequenza interna al grano
• ampiezza
• distribuzione sul fronte stereo
In figura 173 osserviamo la patch nella sua forma finale.
171
Time (s)0 11.420
7500
Frequency (Hz)
Figure 171: Il sonogramma risultante della Pulsar Synthesis
+~
sig~ *~ 0
expr ($f1 * $f2) / 200
*~ 512
inlet gdens inlet %
outlet~ gdens
phasor~
noish~
Figure 172: Variazione di gdens
La patch contiene due grandi subpatch, una per la gestione di tutti i parametridei grani, l’altra per la gestione dell’ampiezza e la distribuzione sul fronte
172
*~
dac~
*~ *~
throw~ rev1
pd envelope
throw~ rev2
%_ampvar_(0-100)
amp_(0-1)
stereospread
48.48
0.505
1
gdens
34
gdensvar_(0-100)
frqvar_(0-100)
frq
475
30.30
20.20
bell
trap
halfsineexpdec
ampenv
waves
sine
rect
trisaw
pd reverb
1 1
Figure 173: La patch che implementa la sintesi granulare asincrona
stereo. In basso un’ulteriore subpatch permette di impostare un riverbero.
La subpatch deputata alla gestione dei grani ha come centro vitale unoggetto phasor∼ (fig. 174)che riceve la frequenza, variata com l’implementazioneche abbiamo visto in figura 172. Analogamente la frequenza interna all’oscillatoreviene impostata nello stesso modo e l’indice di variazione può essere rego-lato tramite una slider. Questa subpatch si occupa anche di permettere laselezione dell’inviluppo del grano e della forma d’onda interna al grano.In questo secondo caso si tratta di semplici tabelle che contengono la formad’onda (fig. 175). L’uscita di phasor∼ infine, invia il suo segnale attraversothrow∼ in modo che l’altra subpatch possa riceverlo ed usarlo come trigger.
173
+~
sig~ *~ 0
expr ($f1 * $f2) / 200
*~ 512
phasor~
noish~
gdens
34
gdensvar_(0-100)
tabread4~ bell
+~
sig~
expr ($f1 * $f2) / 200
samphold~
noise~
*~ 0
frqvar_(0-100)
frq
475
*~
outlet~ throw~ phas
30.30
20.20
sel 0 1 2 3
bell
trap
halfsineexpdec
ampenv
r waveform
set bell
set trap
set halfsine
set expdec
pd waves
set osc
set rect
set tri
set saw
waves
sine
rect
trisaw
sel 0 1 2 3
r waves
Figure 174: La subpatch per la gestione dei grani
L’altra subpatch riceve con chatch∼ il segnale di phasor∼ dell’altra sub-patch. Due oggetti samphold∼ servono l’uno a produrre la variazione diampiezza, l’altro la distribuzione stereo (fig. 176). Quest’ultima partedell’algoritmo, in basso a destra, funziona in modo tale da produrre adogni campionamento di samphold∼ un valore casuale compreso fra [-1,1].Tale valore, in uscita, viene moltiplicato per l’indice del fronte stereo (com-
174
inlet~
outlet~
table osc 515
table rect 515
table tri 515
table saw 515 ;osc sinesum 515 1
;rect sinesum 515 1 0 0.333333 0 0.2 0 0.142857 0 0.111111 00.0909091 0 0.0769231 0 0.0666667 0;rect normalize 1;
;tri sinesum 515 1 0 -0.111111 0 0.04 0 -0.0204082 00.0123457 0 -0.00826446 0 0.00591716 0 -0.00444444;tri normalize 1
;saw sinesum 515 -1 -0.5 -0.33 -0.25 -0.2 -0.16 -0.142-0.125 -0.111 -0.1 -0.09 -0.083 -0.076 -0.071 -0.066-0.0625;saw normalize 1
inlet
tabosc4~ osc
loadbang
Figure 175: Le tabelle per la forma d’onda interna al grano
preso fra [0,1]). Questo significa che se l’indice è impostato a 0 produrràvalori nulli, se impostato a 1 manterrà i valori originali [-1,1]. L’oggettosuccessivo riscala tali valori nel range [0,1] e successivamente tali valorivengono distribuiti fra canale destro e sinistro. Se l’indice di variazionestereo è impostato a zero, i valori in uscita saranno sempre pari a 0.5,quindi distribuiti equamente fra canale destro e sinistro. Se invece l’indiceè 1 i valori si muoveranno iberamente fra destra e sinistra.
14.5.1 vline∼
Prima di proseguire con la disamina di alcuni metodi di implementazionedella sintesi granulare, esaminiamo un oggetto molto potente che ci saràutile fra poco. Si tratta di vline∼, che produce rampe come line∼ mache è in grado di agire a livello di campioni, quindi in modo più preciso erapido di quest’ultimo. L’oggetto accetta in entrata terne di valori: target,tempo di raggiungimento e delay, dove target è il valore da raggiungere, tempodi raggiungimento è il tempo in millisecondi per raggiungerlo e delay è ilritardo con cui iniziare la rampa rispetto all’attivazione. L’oggetto puòaccettare anche target multipli, con gli altri argomenti relativi separandocon la virgola le terne di valori. Se volessimo creare un inviluppo comequello mostrato nella figura 177 dovremmo ragionare in questo modo:
• Vai da 0 a 1 in 50 millisecondi iniziando subito (0, 1 50 0)
175
samphold~
noise~
abs~%_ampvar_(0-100)
expr~ 1 - $v1
*~ 0
/ 100
*~
amp_(0-1)
$1 20
line~
outlet~ amp
samphold~
noise~
expr~ 1 - $v1
sqrt~
sqrt~
*~ 0
expr~ ($v1 * 0.5) + 0.5
outlet~ sx outlet~ dx
stereospread
catch~ phas
48.48
0.505
1
Figure 176: La subpatch per ampiezza e panning
• Resta a 1 per 100 millisecondi a partire dal millisecondo 50 (1 100 50)
• Vai a 0 in 150 millisecondi iniziano al millesecondo 150.
Nella lingua di pd, con vline∼ dovremmo implementare come in figura178.
14.5.2 RENDERE INDIPENDENTE IL PARAMETRO gdur
Anche nell’implementazione precedente la durata del grano è inversamenteproporzionale alla densità dei grani. Per far si che anche tali parametri
176
�����������������
� �� ��� ��� ��� ��� ���
Figure 177: Un inviluppo da generare con vline∼
vline~
0, 1 50 0, 1 100 50, 0 150 150
Figure 178: L’inviluppo della figura 177 realizzato con vline∼
siano indipendenti è necessario svinvolarli l’uno dall’altro in modo che sipossa impostare gdur e renderla fissa al variare della densità.
Per implementare questo algoritmo è necessario fare uso di vline∼ pergenerale una rampa che legga la tabella dell’inviluppo e controllarla conun oggetto che sia indipendente dal trigger principale, cioè il phasor∼ checontrolla la densità dei grani.
Il limite di questa implementazione risiede nel fatto che vline∼ viene at-tivato tramite un bang e non tramite segnale, quindi a velocità molto altepotrebbe peccare in precisione. Per quello che è stato fatto fino ad ora,sappiamo che l’oggetto che produce bang a intervalli prestabiliti è metro,che potrebbe rappresentare una buona soluzione, ma non ottimale perchéquello che ci occorre veramente è la possibilità di emettere un bang allafrequenza del phasor∼ che controlla la densità dei grani, che, come sappi-
177
amo, è variabile nell’ambito del microtempo.
Per implementare tale sistema si può usare l’oggetto edge∼, della libreriacyclone, che clona gli oggetti di MaxMSP. Questo oggetto emette un bangdall’outlet sinistro ogni volta che il segnale in entrata passa da zero a non-zero e un bang dal destro quando il segnale passa da non-zero a zero. L’helpdell’oggetto mostra un esempio di utilizzo.
In questo modo un unico oggetto phasor∼ controlla la densità dei grani eallo stesso tempo innesca vline∼ per la lettura della tabella dell’inviluppodel grano. Come nella patch della sezione precedente lo stesso oggetto con-trollerà la distribuzione stereo e l’ampiezza dei singoli grani. La figura 179
riassume l’algoritmo della patch.
phasor~
grain density(gdens)
grain triggering(edge~)
amplitudevariation
(samphold~)
stereo spreading(samphold~)
grain duration(vline~/tabread~)
Figure 179: Schema generale dell’algoritmo per la gestione indipendente deiparametri
La subpatch per l’innesco di vline∼ tramite edge∼ è mostrata in figura 180.L’oggetto expr∼ riceve il segnale e lo processa in modo che restituisca 1
se il segnale è minore di 0.5, zero se maggiore. edge∼ produrrà un banga sinistra quando il segnale passerà da zero a non-zero, cioè ogni voltache phasor∼ conclude un ciclo e ricominci la sua rampa da zero. Il bangemesso da edge∼ innesca l’oggetto float che restituisce la durata del granoe attiva l’oggetto vline∼ in modo che quest’ultimo crei la rampa da 0 a 1
in 20 ms (il tempo di default). Naturalmente una number box consente di
178
cambiare a piacimento la durata del grano.
phasor~ 8
expr~ $v1 < 0.5
edge~
vline~
0, 1 $1
f 20
tabread4~ bell
0
*~ 512
Figure 180: La subpatch per l’innesco di vline∼
Una volta resi indipendenti densità e durata dei grani c’è il rischio che adensità alta avvenga un troncamento fra i grani, quindi è necessario im-plementare un algoritmo per l’overlapping. La soluzione per questa patch èsemplice, anche se computazionalmente dispendiosa: invece di attivare unnuovo treno di grani quando il fattore do overlapping lo richieda, creiamopiù treni a prescindere e tramite un contatore inneschiamo un grano allavolta per ogni treno.
La figura 181 mostra un esempio di questo procedimento, con tre treni.Sopra l’overlapping factor non produce sovrapposizione di grani, in bassoil fattore 2 provoca sovrapposizione di due grani. In entrambi i casi i tretreni sono attivi a turno.In pd l’algoritmo per implementare tre treni come nella figura precedenteè mostrato in figura 182. Un contatore invia il suo conteggio all’oggetto %che calcola il modulo in modo da restituire il conto da 0 a 2, sel indirizza ibang ai tre treni, zero attiva il primo treno, 1 il secondo, 2 il terzo.
179
overlapping factor: 1
train 2
train 1
train 0
overlapping factor: 2
train 2
train 1
train 0
Figure 181: Overlapping con tre treni
Naturalmente questo procedimento può essere realizzato anche per atti-vare molti più treni. I limiti sono determinati dalla capacità di calcolo delcomputer e dal fatto che in pd i dati di controllo sono meno affidabili deisegnali, che hanno sempre la precedenza.
A questo punto la patch per la sintesi granulare asincrona con parametri in-dipendenti può essere implementata. La figura 183 mostra l’interfaccia peril controllo dei parametri. Nelle properties di ogni GUI e di ogni number boxsono impostati, tramite send-symbol, i nomi degli oggetti che riceveranno irelativi dati.L’interno della patch è mostrato in figura 184. I treni attivi sono otto, per ilresto la patch è uguale a quella implementata per la sintesi asincrona conparametri dipendenti (sez. 14.5) quindi lasciamo al lettore il compito dianalizzarla. In figura 185 è mostrato l’interno della subpatch envgen dove
180
tabread4~ bell
vline~
f 20
0, 1 $1
*~ 512
phasor~
expr~ $v1 < 0.5
edge~
f + 1
% 3
sel 0 1 2
tabread4~ bell
vline~
f 20
0, 1 $1
*~ 512
tabread4~ bell
vline~
f 20
0, 1 $1
*~ 512
0
gdur
Figure 182: Overlapping con tre treni
gdens
0
gdur
0
frq
0
gdensvar_(0-100)
gdensvar_(0-100)
waveform
osc
rect
trisaw
envform
bell
trap
halfsine
expdec
amp_(0-1)
ampvar_(0-100)
amp_(0-1)
gain
feedback
Reverb
Figure 183: Interfaccia per il controllo dell’Asyncronous Granular Synthesis conparametri indipendenti
abbiamo incapsulato ogni generatore di treni.
181
pd envelope
phasor~
expr~ $v1 < 0.5
edge~
f + 1
+~
sig~
*~ 0
expr ($f1 * $f2) / 200noish~
*~ *~ *~ *~
dac~
*~ 0.25
+~
sig~
expr ($f1 * $f2) / 200
samphold~
noise~
*~ 0
pd waves
set osc
set rect
set tri
set saw
sel 0 1 2 3
r waves
set bell
set trap
set halfsine
set expdec
throw~ phas
*~ *~
*~
throw~ rev1 throw~ rev2
pd envgen
pd envgen
pd envgen
pd envgen
pd envgen
pd envgen
pd envgen
pd envgen
% 8
sel 0 1 2 3 4 5 6 7
*~ *~ *~ *~
s envform
r gdens
t f f f
r gdensvar
r frqvarr frq
r eform
sel 0 1 2 3
samphold~
noise~
abs~
expr~ 1 - $v1
*~ 0
/ 100
*~
$1 20
line~
samphold~
noise~
expr~ 1 - $v1
sqrt~
sqrt~
*~ 0
expr~ ($v1 * 0.5) + 0.5
r amp
r ampvar
r stereospread
rev3~ 100 90 3000 20
catch~ rev1
catch~ rev2
r gain r feedback
Figure 184: La patch finale
14.6 GRANULAZIONE CON SUONI CAMPIONATI
L’ultimo tipo di sintesi granulare prevede l’uso di suoni campionati per laforma d’onda interna al grano. Come già detto in precedenza infatti, laforma d’onda interna ad un grano può essere di qualunque tipo e nullavieta di usare come sorgente un file audio o il segnale di ingresso di unmicrofono.
Come negli altri tipi di implementazione, anche in questo caso le scelte dafare prima di realizzare l’algoritmo sono molte e riguardano prima di tutto
182
tabread4~ bell
vline~
f 20
0, 1 $1
*~ 512
r gdur
outlet~ env
inlet bang
r envform
Figure 185: La subpatch per la generazione di un treno di grani
la scelta della sorgente e poi la modalità di scansione della stessa. In figura186 è mostrato uno schema di tali possibilità.
audio source
adc~ audio file
normalplayback
manipulatedplayback
forward
backward
random
variablespeed
Figure 186: Tipi di utilizzo di audio campionato
La sintesi granulare sui campioni permette non solo di generare timbri in-teressanti, ma anche di processare i campioni stessi per il time stretchinge il pitch shifting. L’argomento richiederebbe uno spazio ben più ampio
183
rispetto a quello che possiamo dedicargli in questo testo, ma nel prossimocapitolo proporremo alcuni esempi di granulazione applicati a suoni cam-pionati.
184
15 L AV O R A R E C O N S O R G E N T IA U D I O E S T E R N E
15.1 SINTESI VS. CAMPIONI
Concettualmente pd lavora nel dominio del suono intervenendo su tuttele fasi della costruzione e della gestione dell’audio. Fino ad ora ci siamooccupati di suoni creati dentro pd stesso, abbiamo capito come crearli, ge-stirli, manipolarli, senza mai uscire dal sistema. Abbiamo imparato adusare i generatori di segnale principali (osc∼, phasor∼, noise∼ e altri)e da quelli abbiamo imparato a crearne di nuovi. Grazie alle tabelle ea tabosc4∼ etabread4∼ abbiamo acquisito le capacità per creare pratica-mente qualunque tipo di forma d’onda.
La sintesi audio però è solo una parte di quello che pd ci permette difare. Ci sono tutta una serie di oggetti e procedure che permettono dielaborare sorgenti sonore esterne. L’antica distanza fra suoni di sintesi eMusique Concrète in pd è definitivamente superata non solo in termini diconvivenza dei due mondi, ma perché il suono campionato può diventarefonte di produzione di suoni sintetici.
15.2 ALCUNI OGGETTI UTILI
Il primo oggetti che esaminiamo in questa sezione è adc∼, che è l’alterego del ben noto dac∼. Quest’ultimo si occupa di convertire il segnale dalformato numerico a quello analogico, mentre il primo converte il segnaleanalogico in segnale numerico in modo che possa essere utilizzato in pd (oin qualunque altra applicazione digitale). Sostanzialmente adc∼ prende ilsuono in entrata della scheda audio e lo campiona al samplerate scelto (tipi-camente 44100 campioni al secondo) rendendolo disponibile a pd per l’uso.
185
Una volta dentro il segnale può essere trattato come un qualunque seg-nale numerico. Dopo essere stato processato, elaborato, manipolato oquant’altro può essere riconvertito tramite dac∼ e rimandato alla schedaaudio.
L’oggetto accetta anche degli argomenti numerici, che definiscono l’indicedelle eventuali entrate. Ad esempio adc∼ 1 2 3 4 5 6 7 8 istanzia unadc∼ con otto canali in entrata. La stessa cosa può essere fatta con dac∼.Ovviamente la scheda deve permettere l’entrata e l’uscita del numero dicanali desiderato. Se la scheda permette solo quattro canali, gli altri quat-tro resteranno inattivi.
La figura 187 mostra una situazione in cui il suono entra in pd con adc∼ed esce con dac∼ (una patch assolutamente inutile, ma esplicativa).
adc~
dac~
adc~ 1 2 3 4 5 6 7 8
dac~ 1 2 3 4 5 6 7 8
Figure 187: adc∼ e dac∼ in azione
Il secondo oggetto in questione è openpanel, che insieme a soundfiler con-sente di aprire un file audio e inserirlo in una tabella per essere utilizzatoin vari modi. openpanel alla ricezione di un bang apre una finestra di di-alogo da cui è possibile scegliere un file situato nell’hardisk del computer.soundfiler, tramite il messagio read, consente di convertire un file binario inuna lista di numeri in virgola mobile e inserirli in una tabella. Al contrario,tramite il messaggio write fa esattamente il contrario: converte in binarioil contenuto di una tabella. La figura 188 mostra una patch in cui un fileaudio viene messo in un’array. Tramite openpanel si sceglie il file da aprire esoundfiler lo inseriamo nell’array. L’argomento -resize adatta la dimensionedella tabella tab-file a quella del file stesso. Oltretutto soundfiler emette dalsuo outlet la dimensione in campioni del file importato.
186
openpanel
soundfiler
read -resize $1 tab-file
60480
tab-file
Figure 188: Importazione di un file audio in una tabella
Come sempre i file di help dei due oggetti sono utili per una conoscenzacompleta di tutti i messaggi che gli oggetti accettano.
Gli ultimi due oggetti di questa sezione sono readsf∼ e writesf∼. Ilprimo consente di aprire un file audio e di eseguirlo, il secondo consentedi registrare il flusso audio di pd in un file audio. La figura 189 esemplifical’uso di entrambi. Al contrario di openpanel, savepanel consente di creare unfile su cui si andrà a scrivere. Per utilizzare writesf∼ è necessario ine ffettiprima creare il file vuoto su cui si scriverà il segnale, poi si può avviare laregistrazione tramite il messaggio start (oppure 1, in alternativa. stop in-terromperà la scrittura (zero in alternativa). Analogamente readsf∼ avviail playback del file con start (1), lo interrompe con stop (zero). Entrambigli oggetti accettano alcuni argomenti, il primo dei quali è il numero deicanali.
15.3 UN SEMPLICE random slicer
Già con la conoscenza di questi pochi oggetti è possibile fare cose interes-santi con i file audio. In questa sezione implementiamo un random slicer,cioè un algoritmo che prende un file audio, tipicamente un pattern di batte-
187
readsf~ 2
openpanel
open $1
writesf~ 2
start
stop
start
stop
savepanel
open $1
Figure 189: readsf∼ e writesf∼
ria e lo fa a fette (slice significa fetta per l’appunto) e lo riesegue cambiandocasualmente l’ordine di esecuzione delle fette. È una tecnica molto usatain certa dance music per rendere meno ripetitivo un pattern ritmico.
Prima di procedere è necessario preparare o procurarsi un file audio chesia loopabile, cioè che funzioni bene nel momento in cui venga eseguito informa circolare, cioè quando giunto al termine ricominci da capo senzasoluzione di continuità. La rete offre gratuitamente tantissimi pattern dibatteria scaricabili gratuitamente 1.
Tipicamente uno slicer divide il pattern per una potenza di due perché ilsistema ritmico della tradizione occidentale tendenzialmente tende ad es-sere binario, soprattutto in circostanze di questo tipo. Quindi prima ditutto implementeremo un sistema per scegliere in quante slices dividere ilpattern.
Come si vede in figura 190 l’oggetto soundfiler restituisce la dimensione incampioni del file audio. Tale dimensione viene divisa per 44.1 per avernela dimensione in millisecondi. Questa misura viene divisa per il numerodi slices che si scelgono con la GUI (16 di default) per avere la durata inmillisecondi di una singola fetta. D’altra parte la dimensione in campi-
1 Si veda per sesmpio il sito http://www.freesound.org
188
oni viene divisa per il numero delle fette per avere la dimensione in cam-pioni di ogni fetta. I due valori ottenuti saranno gli unici necessari perl’implementazione dell’algoritmo.
openpanel
soundfiler
read -resize $1 drumfile
f
/ 44.1
/ 16 / 16
pow 4
2
t b
t b b f
inlet div
inlet bang
s slicenum
s msdur s sampdur
Figure 190: Scelta del numero di slices
In figura 191 un oggetto metro controlla l’emissione ordinata delle slices.L’algoritmo non fa altro che riprodurre le fette una alla volta, eseguendo ilfile come è in origine.Ogni fetta è attivata tramite vline∼ che legge la porzione di tabella in-teressata alla velocità di msdur, cioè alla velocità della durata di una slice.All’uscita di vline∼ il segnale viene prima moltiplicato per la durata diuna fetta in campioni, poi viene sommato a questo segnale l’offset di let-tura. Il contatore infatti conta da 0 a 15, cioè le slice da leggere, il risultatoè moltiplicato per la durata della slice in campioni e il tutto viene aggiuntoal segnale di vline∼.
Una volta costruito il motore che gestisce l’esecuzione delle slices al giustotempo si può aggiungere la parte di algoritmo che si occupa della sceltadelle fette da eseguire. Nell’esempio precedente infatti la scelta è quella dieseguire tutte le slice nell’ordine, il che ha poco senso perché si ha una ripe-tizione pedissequa del pattern sempre uguale. L’intervento più semplice dafare è quello di sostituire al contatore un oggetto random che scelga casual-
189
tabread4~ drumfile
dac~
*~
line~
$1 20
+~
vline~
start
t b b
f + 1
% 16
0, 1 $1
f
s cursor
*~ *
pd slicersettings
choose_division
1
1/2
1/4
1/8
1/16
1/32bang
r msdur
metro
r slicenum
r sampdur
open a file
drumfile
Figure 191: Slicer che riproduce il pattern in ordine
mente la slice da eseguire. Il risultato sarebbe sicuramente più interessante,ma si perderebbero i punti di riferimento perché presumibilmente i colpiaccentati e quelli non accentati della batteria sarebbero distribuiti troppocasualmente.
Un risultato sicuramente migliore è quello di far eseguire le prime 8 slicesin ordine, e di scegliere casualmente fra le restanti 8 quelle da eseguire. Lafigura 192 mostra la parte di algoritmo da sostituire per realizzare le duepossibilità appena descritte. Nel secondo caso l’oggetto expr esegue un ifsul numero in entrata: se minore di 8 (quindi tutte le slices da 0 a 7) le fauscire così come sono entrate, se maggiore di 8 emette un numero casualecompreso fra 8 e 15.In quella porzione di algoritmo si può fare qualunque cosa che renda inter-essante l’esecuzione attraverso scelte più o meno randomiche. Ad esempiosi può fare in modo che le slices pari restino invariate nell’ordine di ese-
190
tabread4~ drumfile
dac~
*~
line~
$1 20
+~
vline~
start
t b b
f + 1
% 16
0, 1 $1
f
s cursor
*~ *
r msdur
metro
r slicenum
r sampdur
random 16
f + 1
% 16
r slicenum
expr if($f1 < 8, $f1, random(8, 16))
sezione da sostituire
------> ------>
Figure 192: Slicer che riproduce il pattern in ordine
cuzione e le dispari siano casuali, oppure si può costruire un dispositivoche effettua un freezing, cioè che blocca la manipolazione delle slices ripe-tendo l’esecuzione della slice attiva al momento del freezing stesso. Si puòanche decidere di eseguire alcune slices al contrario, magari scegliendo laprobabilità con cui una fetta venga eseguita in questo modo.
La figura 193 mostra il random slicer con un freezer e con la possibilità diimpostare la probabilità di slices eseguite al contrario.L’oggetto expr lascia passare le prime 4 fette e le fette dall’ottava all’undicesimanell’ordine giusto, mentre randomizza tutte le altre. spigot invece gestisceil freezing filtrando le comunicazioni. Infine random in combinazione con <e sel gestisce la probabilità di reversing.
15.3.1 CONTROLLARE LO slicer VIA SEGNALE
Implementando il random slicer abbiamo usato un oggetto metro per control-lare il timing dell’emissione delle slices. Naturalmente la stessa cosa puòessere realizzata controllando il tutto via segnale. Per la verità lo stessoalgoritmo della patch della sezione precedente può essere realizzato concontrollo via segnale. Invece di usare metro come trigger principale puòessere usato phasor∼.
191
tabread4~ drumfile
dac~
*~
line~
$1 20
+~
vline~
start
f
s cursor
*~ *
pd slicersettings
choose_division
1
1/2
1/4
1/8
1/16
1/32bang
r msdur
metro
r sampdur
open a file
f + 1
% 16
r slicenum
t b b
random 100
$2, $3 $1
pack 0 0 0
sel 1 0
< 90
freeze!expr 1 - $i1
0 1 1 0
unpack 0 0
spigot 1
expr if($f1 < 4 || ($f1 > 7 && $f1 < 12), $f1, random(0, 8))
r probrev
expr 100 - $i1
5 prob_reversing
drumfile
Figure 193: Il random slicer con freeezer e probabilità di reversing
La frequenza di phasor∼ sarà quella necessaria a compiere una rampa da0 a 1 nel tempo corrispondente alla durata complessiva del pattern ritmico.Poi tale rampa dovrà essere manipolata in modo tale da innescare le slicesin base al numero delle stesse. Per questo useremo l’oggetto wrap∼ checostringe un segnale in entrata a restare nel range [0,1]. L’oggetto, esat-tamente, restituisce il segnale in entratta sottratto dall’intero immediata-mente superiore al segnale stesso. La figura 194 mostra un esempio delsuo funzionamento. il segnale generato da un phasor∼ viene moltiplicatoper 4, generando quindi una rampa che va da 0 a 4. wrap∼ compie la suaoperazione generando 4 rampe da 0 a 1.
La prossima figura (195) mostra come si possa leggere una tabella a fram-menti tramite phasor∼, wrap∼ e samphold∼.
192
phasor~(x)
0,0
1,0
2,0
3,0
4,0
*~ 4
0,0
1,0
2,0
3,0
4,0
wrap~
0,0
1,0
2,0
3,0
4,0
Figure 194: L’oggetto wrap∼
L’algoritmo necessita di qualche spiegazione. Supponiamo di avere unatabella con un file audio della durata di un secondo esatto, quindi dellalunghezza di 44100 campioni e supponiamo di voler dividere il file in 4
slices. L’oggetto phasor∼ avrà frequenza 1. Ciò significa che in un secondogenera una rampa che va da 0 a 1. Si moltiplica il segnale per 4 (cioè peril numero di slices che abbiamo scelto), quindi la rampa generata in un sec-ondo andrà da 0 a 4. wrap∼ genera quatro rampe da 0 a 1 al tempo totaledi un secondo. Ogni rampa quindi durerà 1/4 di secondo. Il segnale inuscita viene moltiplicato per la durata di una slice in campioni, cioè 1/4 di44100 nel nostro caso. Escludendo tutto il resto della patch in questo modoin un secondo vengono letti 4 volte i primi 11025 campioni della tabella.Se terminassimo qui il nostro algoritmo e se i primi 11025 campioni dellatabella contenessero il suono della cassa di una batteria si udirebbe unrullo continuo di questa cassa.
193
wrap~
*~ 4
+~
samphold~
tabread4~ drum
table drum 44100
phasor~ 1
*~ 11025
*~ 11025
Figure 195: Leggere una tabella affettata via segnale
La parte destra della patch invece permette di proseguire nella lettura dellatabella oltre i primi 11025 campioni. L’oggetto samphold∼ campiona il seg-nale che arriva nell’inlet di sinistra ogni volta che il segnale di destra tornaa zero. Nel nostro caso ogni volta che la rampa generata da wrap∼ torna azero il segnale in uscita dal moltiplicatore viene fatto uscire da samphold∼.In pratica quando wrap∼ genera la prima delle 4 rampe samphold∼ faràuscire il primo campione della rampa moltiplicata, cioè zero, con la sec-onda rampa di wrap∼ uscirà 1, con la terza 2 e così via. Usciranno cosìin ordine il numero delle slices, che vengono immediatamente moltiplicateper la durata in campioni. Rappresentano un offset che viene sommato alprimo segnale.
Con questo principio è possibile costruire un random slicer controllato viasegnale. Attraverso expr∼ si possono anche compiere varie operazioni sulsegnale in modo da manipolare la scelta delle fette come nell’algoritmodella sezione precedente.
Le prossime immagini mostrano un algoritmo simile a quello, con possibitàdi freezing, reversing e rolling cioè ripetizione rapidissima di una slice. Perquest’ultimo caso basta raddoppiare (o quadruplicare) la velocità di lettura
194
ed eseguire per un po’ la stessa fetta. Le immagini seguenti mostranol’algoritmo generale (fig. 196), e la varie subpatches (figg. 197,198 e 199).
tabread4~ drumfile
dac~
*~
line~
$1 20
AMPLITUDE
pd slicersettings
choose_division
1
1/2
1/4
1/8
1/16
1/32bang
wrap~
samphold~
*~
expr 1 - $i1
+~
samphold~
expr~ random(0, 100)
*~
*~
sig~ 16
snapshot~
edge~
expr~ $v1 < 0.5
s cursor
random 100
expr if($f1 < $f2, 1, 0)
pd freezerep
freeze!expr~ if($v1 < $f2, -1, 1)
r sampdur
r phasordur
r slicenum
expr~ if($v1 < (($f2 / 2) - 1), $v1, random($f2 / 2, $f2))
*~
r sampdur
*~
s freeze
r freeze
pd rollphasor~
choose a file
0rep_prob
10rev_prob
drumfile
Figure 196: Il random slicer controllato da phasor∼
15.4 GRANULAZIONE SU FILES AUDIO
Una volta che un file audio è stato caricato in una tabella può essere ma-nipolato, come abbiamo visto, in modi diversi. Uno dei comportamenti piùvisibili è determinato dal cambiamento della velocità di lettura dei campi-oni. Aumentare la velocità di lettura comporta un aumento della frequenzadel file e una diminuzione del tempo di esecuzione, viceversa, diminuire la
195
openpanel
soundfiler
read -resize $1 drumfile
f
/ 44.1
/ 16
pow 4
2
t b
t b b f
inlet div
inlet bang
s slicenum
s sampdur
expr 1000 / $f1
s phasordur
Figure 197: la subpatch che gestisce la scelta del file e il numero delle slices in cuisuddividerlo
outlet
== 1
+ 1
* 16
r sampdur
expr $f2 / $f1
r slicenum
r freeze
Figure 198: La subpatch per impostare la velocità di lettura della tabella
velocità farà diminuire la frequenza e aumentare la durata dell’esecuzione.
Se leggiamo un file di un secondo in mezzo secondo, quindi con un fattoredi moltiplicazione 0.5, dimezzeremo il tempo ti esecuzione e trasporremole frequenze esattamente del doppio. La patch in figura 200 mostra un al-goritmo che permette di cambiare la frequenza del phasor∼ che legge latabella. All’aumentare della frequenza si osserva una trasposizione della
196
* 100
f spigot
outlet rep
t b
t f f b
inlet freeztog inlet repprob
Figure 199: La subpatch per il freezing e il rolling
frequenza del campione.
phasor~ 1
4.7
expr $f1 / 10 - 5
openpanel
soundfiler
read -resize $1 audiofile
open_file
f
t b f
tabread~ audiofile
dac~
*~
lop~ 1
sig~
AMPLITUDE
*~ expr 1000 / ($f1 / 44.1)
s origdur
r origdur
SPEED(-5/5)
audiofile
Figure 200: Modifica della durata e della frequenza
197
Certamente la cosa più interessante è cercare di svincolare i due compor-tamenti, cioè rendere indipendente la durata dalla trasposizione. Questo èpossibile farlo, realizzando un algoritmo di tipo granulare, che segmenta ilfile audio in piccoli segmenti e su quelli opera una trasposizione, ma allostesso tempo lascia invariata la durata del file stesso.
Il principio è semplice: si divide il file in grani, si stabilisce un fattore ditrasposizione e uno di time stretching. Nel caso si voglia allungare la duratadi un file audio i grani verranno eseguiti non proprio uno dietro l’altro, macon una certa distanza l’uno dall’altro. Se, in questo caso, si decide di nontrasportare il campione, la frequenza delle altezze rimarrà la stessa, mentreaumenterà la durata del file. Viceversa si può lasciare invariata la duratadel campione e di trasportare il grano aumentando o diminuendone la ve-locità di esecuzione. In entrambi i casi però si produrrà un intervallo disilenzio fra un grano e l’altro.
Quando un grano viene trasposto verso l’acuto si accorcia inevitabilmentee nel momento in cui la durata totale resta la stessa, al termine del granoci sarà una certa quantità di silenzio. Quando invece il grano non vienetraposto, rimane identico all’originale, ma se si rallenta l’esecuzione si pro-durrà lo stesso fenomeno.
La fig. 201 mostra questo comportamento. La prima immagine mostrail frammento di file suddiviso in grani di uguale durata ed equidistanti.Nella seconda immagine i grani, di identica durata rispetto all’immagineprecedente, vengono rarefatti in modo da allargare il tempo di esecuzione(in questo caso la metà del tempo) mentre nella terza immagine il temporimane uguale all’originale, ma i grani vengono trasposti di un’ottava (fre-quenza doppia).
L’algoritmo che descriveremo è stato implementato e proposto come tuto-rial di pd da Miller Pusckette stesso 2.
La figura 202 mostra l’algoritmo nella sua interezza.Per semplicità abbiamo diviso la patch in regioni etichettate con letteremaiuscole per facilitare i riferimenti. La regione A permette di impostare
2 Si tratta della patch-tutorial che si chiama B14.rockafella.sampler.pd che si può trovare nellacartella doc/3.audio.examples dentro la cartella principale di pd
198
original file
samples0 200 400 600 800 1000
time stretching
samples0 200 400 600 800 1000
pitch transposing
samples0 200 400 600 800 1000
Figure 201: Principio di granulazione di un file audio per time stretching e pitchshifting indipendenti
la dimensione del grano (chunk size), scelta in millisecondi, ma poi trasfor-mata in secondi moltiplicando il valore per 0.001. La regione B impostala velocità in percentuale del campione da manipolare e la sua lunghezza(in millisecondi, trasformati in secondi). La regione C invece permette latrasposizione del campione, in decimi di mezzitoni. Le regioni D1 e D2
infine processano il tutto. Sono due frammenti di codice identici perchéc’è anche un fattore di overlapping di due grani, quindi ci saranno duetreni di grani sovrapposti, al fine di evitare quella frammentazione di cuisi è parlato prima.
199
hip~ 5
40
50
+~
samphold~
*~
r~ phase
s~ phase
r~ phase
r~ phase
s chunk-sizechunk sizein seconds
r chunk-size
t b f
-~ 0.5
*~ 0.5
cos~
phasor~
s~ read-pt
r~ read-pt
+~
<-- transposition, halftones/10
* 0.001
phasor~
*~ 44100
tabread4~ table23
r chunk-size
+~ 1
12.5s precession
t b f
r precession
* 0.01
*~
+~
samphold~
*~
-~ 0.5
*~ 0.5
cos~
r~ read-pt
*~ 44100
tabread4~ table23
r chunk-size
+~ 1
r~ phase2
r~ phase2
r~ phase2
<-- precession, percent
900
* 0.001
900
<-- chunk size (msec)
expr (pow(2, $f1/120)-$f3)/$f2
t b f
loadbang
<-- loop length(msec)
*~
/
+~ 0.5
wrap~
*~
s~ phase2
0
A
B
C
D1 D2
output~
volume
dsp
pd table
choose_a_file
Figure 202: la patch per il time stretching e il pitch shifting indipendenti
Sulla regione A non c’è nulla da aggiungere. Nella regine B la percentualedella velocità del campione da leggere (per esempio il 50% significa che ilframmento di file sarà eseguito a velocità dimezzata) viene divisa per ladurata in secondi del campione che si vuoi eseguire. Il risultato diventa lafrequenza di un phasor∼ il cui segnale viene a sua volta moltiplicato per
200
la durata del file da eseguire. In sostanza phasor∼ restituisce una rampache va da 0 alla lunghezza del campione da processare con una frequenzache corrisponde alla velocità a cui vogliamo sia eseguito.
Se volessimo una lunghezza del file da eseguire pari a 900 millisecondi,cioè 0.9 secondi alla velocità originale (il 100% della velocità), phasor∼covrebbe compiere 1000/900 rampe al secondo, cioè 1.1111. Nel caso di ve-locità al 50%, come nel nostro esempio, si dividerà 500 per 900, cioè 0.5555.Questa è la rampa che va da 0 a 0.9. Come si vede dalla regione D1 (e D2)è sufficiente moltiplicare tale rampa per 44100 per avere la lettura dellatabella dal primo campione fino al campione 44100*0.9, cioè 39690.
La regione C genera una rampa da aggiungere alla rampa principale. È nec-essario calcolare la velocità di lettura dei grani che consenta di mantenereindipendente l’altezza del campione rispetto alla velocità di riproduzione.Se, ad esempio, decidiamo di eseguire il campione a una velocità del 100%non ci sarà alcuna granulazione e la regione C attribuirà alla rampa secon-daria il valore di zero, ma se vogliamo eseguire il campione al 50%, senzaavere trasposizione, i grani dovranno essere eseguiti più velocemente, inmodo da mantenere la frequenza originale.
Oltretutto vengono create due rampe, una con differenza di fase di 0.5, inmodo da creare un overlapping per riempire i vuoti generati soprattutto infase di riduzione della velocità.
Le regioni D1 e D2, tramite samphold∼ eseguono la rampa principale (r∼read-pt) e aggiungono la rampa secondaria, D1 quella con fase zero (r∼phase), D2 quella con fase 0.5 (r∼ phase2).
201
Part III
A P P L I C A Z I O N I VA R I E
16 E S T E N D I B I L I TÀ D I P D
16.1 PD COME LINGUAGGIO DI PROGRAMMAZIONE
Come abbiamo già avuto modo di mostrare, Pd è un vero e proprio lin-guaggio di programmazione. Pur essendo nato per gestire, creare, ma-nipolare applicazioni audio Pd ha anche le consuete capacità di calcolo diqualunque linguaggio e anche numerose estensioni che permettono di farecose che vanno ben oltre gli scopi per cui fu pensato in origine.
16.1.1 externals E LIBRERIE
La comunità di sviluppatori e artisti che si muove intorno a Pure Data èmolto vasta e ogni giorno vengono annunciate nuove estensioni al softwareche ne espandono le potenzialità.
Tali estensioni, tipicamente, consistono in nuovi oggetti che possono omeno essere raccolti in librerie di oggetti. Nella sezione relativa abbiamovisto che in Pd c’è la possibilità di incapsulare degli algoritmi dentro lesubpatches, che possono però essere utilizzati solo nel contesto della patchin cui sono creati. Quando tali algortimi affrontano problemi più generalie devono quindi essere utilizzati in contesti diversi, possono essere riutiliz-zati come abstractions. In questo caso si tratterà di normali patch con inlete outlet che vengono salvate con estensione pd e poste all’interno del pathper poter essere richiamate ogni qualvolta siano necessarie.
Un terzo tipo di incapsulamento degli algoritmi è quello costituito dagli ex-ternals che si presentano come normalissimi oggetti pd, ma che non fannoparte della libreria standard del programma e non possono essere visibilial loro interno come le normali abstractions perché sono realizzate in lin-guaggio C e compilate appositamente per l’uso in Pd.
203
Gli externals a volte vengono organizzate in librerie che possono esserecaricate per intero all’apertura del programma. Il menu Startup serve alocalizzare la posizione di tutte le librerie che bisogna caricare all’avviodel programma.
16.1.2 ALCUNE LIBRERIE
Pd nella sua versione extended include già numerose librerie, che rendonoil programma funzionale a un utilizzo molto esteso. la libreria GEM, cheesamineremo più dettagliatamente nel capitolo successivo, offre una seriedi oggetti per manipolare immagini e video. cyclone mette a disposizionedegli utenti di pd una serie di oggetti-cloni de Mas/Msp, di cui fra l’altroabbiamo già fatto uso più volte(Uzi, counter, drunk, etc. . . ). La libreria zexy
estende genericamente sia il parco degli oggetti audio che quelli dati. pmpd
è una libreria di oggetti per simulare comportamenti fisici del mondo reale.
per una lista completa delle librerie e delle loro funzionalità rimandiamoal portale di pure data (http://puredata.info/).
204
17 G E M E I L V I D E O
17.1 LA LIBRERIA GEM
La libreria GEM è una libreria per la gestione del video e delle immaginiin pd.
Si basa sull’uso di alcuni oggetti fondamentali che consentono di creare,gestire, aprire o chiudere una finestra particolare attivata tramite l’oggettogemwin in cui viene effettuato il rendering video. Come mostrato in figura203 l’oggetto gemwin riceve i messaggi create e destroy per creare e distrug-gere la finestra grafica e i messaggi 1, per attivare il rendering e 0 perdisattivarlo.
gemwin
create
destroy
Figure 203: Gestione della finstra grafica di GEM
uns volta abilitato il rendering nella finestra grafica, è possibile creare delleforme all’interno di essa. L’oggetto gemhead abilita il rendering di ognitipo di forma e deve essere presente all’inizio di una catena di creazionedella forma. L’oggetto che identifica una forma, ad esempio square per unquadrato, deve trovarsi alla fine di questa catena. Fra questi due estremidella catena possono essere presenti molti atri oggetti che gestiscono laforma: colore, dimensioni, posizione, etc.Nella figura 204 creiamo prima la finestra di GEM con create, poi attiviamo
205
il rendering con toggle e quindi vedremo apparire un quadrato di colorebianco (l’argomento dell’oggetto color 1 1 1 scala fra 0 e 1 i valori di RGB,cioè rosso, verde e blu, tutti impostati al massimo per dare il bianco).
gemwin
destroy
create gemhead
square
color 1 1 1
Figure 204: Creazione di un quadrato
L’oggetto color fa parte di quella categoria di oggetti detti manipulators checonsentono di manipolare le forme in vari modi. L’oggetto translateXYZconsente di spostare nello spazio una forma. Come si intuisce le dimen-sioni sono tre, quindi lo spazio è tridimensionale. Nella prossima patch(fig. 205), c’è un quadrato di dimensione 0.25 che si sposta in uno spazioa due dimensioni (la coordinata Z quindi non ci interessa) ogni quarto disecondo.
Le coordinate variano da -4 a 4 sia per l’asse delle x che per quella della y,quindi il punto [0,0] rappresenta il centro del piano.
Le forma possibili,chiamate Geos nella terminologia GEM e identificate daoggetti con lo stesso nome, sono:
• square
• circle
• triangle
• cube
• sphere
• cone
206
gemwin
destroy
create gemhead
color 1 1 1
translateXYZ
t b b
/ 100 / 100
random 800 random 800
- 4 - 4
square 0.25
metro 250
Figure 205: Traslazione di un quadrato
Invece i manipulators sono:
• color
• colorRGB
• rotate
• rotateXYZ
• scale
• scaleXYZ
• translate
• translateXYZ
Come sempre gli help di ognuno di tali oggetti possono essere un va-lidissimo ausilio per la comprensione del loro comportamento. Il sito in-ternet http://gem.iem.at/documentation/manual/manual presenta inveceun manuale abbastanza esaustivo sulla libraria GEM.
207
17.2 INTERAZIONE AUDIO E GEM
Già con queste poche nozioni possiamo creare un algoritmo in cui audioe video interagiscono. Nella patch in figura 206 metro invia un bang ad uninviluppo d’ampiezza controllato da line∼ per l’oscillatore, ma allo stessotempo controlla il colore del quadrato con un inviluppo identico, che vaa modificare il primo dei tre colori dell’oggetto color, che varia dal rosso(quando è 1) al nero quando è zero.
gemwin
destroy
create
gemhead
activate
square 0.25
color 0 0 0
dac~
*~
line~
1 25
delay 50
metro 500
line
* 0.01
100 25
$1 0 0
0 1500 150 osc~ 80
Figure 206: Esempio di interazione audio/video
Volendo usare più oscillatori e più quadrati no dovremmo fare altro checopiare la aprte di patch che ci interessa e aggiungere un oggetti transla-teXYZ per sistemare opportunamente i quadrati nello spazio.
la prossima patch è un po’ più elaborata (fig. 207. Un oggetto metro emettebang ogni 125 o 250 millisecondi. random genera un numero compreso fra
208
0 e 6 inviandolo a sel che smista i bang di uscita fra varie combinazioni: glioscillatori possono suonare tutti insieme, due alla volta oppure uno allavolta, in base al numero generato da random.
La subpatch di sinistra (quadsx) invia il segnale a sinistra nel campo stereoe in minor quantità a destra, viceversa quella di destra. Il segnale dellasubpatch centrale è in posizione centrale.
La patch di sinistra e quella di destra possono anche ricevere frequenza di-verse e in base a quelle il quadrato si sposterà sull’asse verticale (y) mentrel’oscillatore centrale suonerà sempre la stessa frequenza, lasciando il suoquadrato nella stessa posizione.
la figura 208 mostra l’interno della subpatch quadsx. Il bang ricevuto dall’inletattiva l’inviluppo di ampiezza del generatore dell’onda (in questo caso unphasor∼) e la produzione del colore. Allo stesso tempo mette in azioneun oggetto random che genera numeri compreso fra 0 e 2, che andrannoa modificare la posizione del quadrato sull’asse delle y e la frequenza delgeneratore audio, che varierà fra i valori 500, 1000 e 1500.
La subpatch quaddx è identica, con l’unica differenza che l’oggetto transla-teXYZ ha come argomento 2 invece di -2, quindi sarà traslata un a destrarispetto al centro.
la subpatch quadc, del quadrato centrale (fig. 209), è più semplice. mancainfatti tutta la gestione della frequenza di osc∼, che ha frequenza fissa (100
hz).
209
gemwin
destroy
create activate
pd quadsx pd quadc
metro 250
*~ *~ *~
dac~
*~ 0.25
*~ 0.25
line~
$1 5
expr (random(1, 3) * 125)
pd quaddx
random 7
sel 0 1 2 3 4 5 6
Figure 207: interazione audio video con tre oscillatori e tre quadrati
210
gemhead
square 0.25
color 0 0 0 *~
line~
line
* 0.01
outlet~
inlet
translateXYZ -2 0 0
100 5 0 10
1 5 0 10
delay 100
+ 1
random 3
- 1
* 2
phasor~ 1000
* 500
$1 $1 $1
Figure 208: la subpatch del quadrato sinistro (quadsx)
211
gemhead
square 0.25
color 0 0 0
*~
line~line
* 0.01
$1 0 0outlet~
inlet
translateXYZ 0 0 0
100 5 1 5
delay 100
0 100 10 osc~ 100
Figure 209: la subpatch del quadrato centrale (quadc)
212
18 N E T W O R K I N G
18.1 ARCHITETTURA DI RETE IN PD
Il concetto di Networking assume in pd sfaccettature diverse e complesse.Semplificando molto si può affermare che l’architettura del sistema sia giàdi per sé basata sul modello di comunicazione client-server, laddove unsistema di messaggistica interna (internal messaging system), basato su unprotocollo di comunicazione detto FUDI, consente di inviare messaggi frapatch e verso il server.
Tale sistema di messaggistica incorpora due tipi di messaggi, quelli indi-rizzati al processo che gestisce l’intero sistema compreso il motore audio(pd messages) e quelli che viaggiano da patch a patch, anche nel caso di patchprive di interfaccia grafica.
In effetti pd può funzionare, quindi produrre audio, ricevere e inviare mes-saggi, anche in assenza dell’interfaccia grafica consueta. Questo implica lapossibilità di creare e gestire interfacce implementate in altri linguaggi 1.Questo non significa che pd possa comunque fare a meno delle patch, masolo che possa nasconderne la visuale grafica all’utente. La patch infattinon è altro un file di teso in cui compaiono i comandi attraverso i quali sicreano gli oggetti e tutte le altre istanze di un algoritmo.
Una patch si concretizza in quella che in pd si chiama canvas, cioè il con-tenitore dove gli oggetti, i messaggi e tutto il resto vengono creati e postiper far si che un algoritmo prenda vita. Solo dalla canvas è possibile dire almotore audio cosa fare esattamente. Sulla macchina in cui risiede il motoreaudio (il pd process) ci dovrà essere necessariamente una patch con relativacanvas, che avrà il compito di contenere gli oggetti audio e di spedire mes-
1 http://jeraman.info/2009/03/22/how-to-use-pure-data-as-a-api/
213
saggi al motore.
Per semplificare: gli oggetti audio dovranno necessariamente risiederenella canvas vicina al server. Tutte le altre macchine remote potranno soloinviare messaggi alla patch principale, che per semplificare chiameremoproxy patch, che si occupera di far funzionare tutto. le macchine remoteperò potranno costruire e distruggere oggetti dalla loro postazione.
In figura 210 viene mostrato il modello di comunicazione attraverso cui pdfunziona.
client patch
proxy patch
client patch
pd engine
Figure 210: Il modello di comunicazione di pd
18.1.1 netsend E netreceive
Proviamo ad esemplificare quanto detto sopra. In concreto dovremo aprireil pd-engine e una patch che funzioneranno da server e attivare delle clientpatch altrove (nel nostro caso tutto avverrà sulla stessa macchina, ma è lastessa cosa).
214
Nella client patch avremo un oggetto che si occuperà di connettersi allaproxy patch per inviarle dei messaggi. Tale oggetto è netsend. D’altra parte,la proxy patch conterrà l’oggetto netreceive che aprirà la porta di una connes-sione socket e si metterà ina ttesa dei messaggi. A sua volta la proxy patchpotrà inviare messaggi al pd engine tramite normali messaggi preceduti dalpunto e virgola e dalla dicitura pd. In figura 211 abbiamo schematizzatoquesto comportamento.
client patch netsend
proxy patchnetreceive
; pd
pd engine
Figure 211: Il modello di comunicazione di pd in dettaglio
Realizzando il tutto in pd ci toroviamo di fronte alla client patch rappresen-tata in figura 212 e alla proxy patch in figura 213.L’oggetto netsend necessita di una message box per la connessione (in questocaso si connette a localhost sulla porta 5555). Una volta stabilita la connes-sione invierà qualunque tipo di messaggio compatibile con pd, preceden-dolo dalla parola chiave send. In questo caso potrà inviare due tipi dimessaggio: un numero per la frequenza di un oscillatore e un altro nu-mero (che sarà zero o 1) per attivare o disattivare l’audio.
215
netsend
connect localhost 5555
send frq $1
send active $1
active_audio_engine
connect to port 5555
440
send_osc_frquency
Figure 212: la client patch che si occupa di inviare messaggi al proxy
netreceive 5555
;pd dsp $1
osc~ 200
*~ 0.5
dac~
route frq active
active audio to pd engine
receive message fromclient
Figure 213: la proxy patch che si occupa di ricevere messaggi dalla client patch e diinviare comandi al pd engine
I messaggi saranno precedute da parole-selettori (frq e active, in modo cheil proxy possa smistarli tramite l’oggetto route.
216
La proxy patch è in ascolto sulla porta 5555 con l’oggetto netreceive. L’oggettoroute smista i messaggi. Nel caso riceva un messaggio preceduto dallaparola-selettore active invierà il numero ricevuto alla message box che si oc-cupa di spedire il comando di accensione dell’audio al pd engine, comandoche deve essere preceduto dal punto e virgola.
18.1.2 Dynamic patching
Nell’ipotesi di controllare pd da una macchina remota, abbiamo visto cheper ora è possibile, di fatto, inviare da remoto dati numerici ad una proxypatch che risiede nella stessa macchina del pd engine. In questo modo laproxy patch riceve solo dati di controllo su una serie di oggetti che costitu-iscono un algoritmo preconfezionato.
Questa limitazione impedirebbe quindi di programmare gli algoritmi intempo reale su un unico motore audio. Allo stato attuale la cosa non èimpossibile, anche se non è agevole come in un linguaggio come SuperCol-lider 2 dove l’architettura client-server è basata sul protocollo OSC e nonnecessita di alcun proxy intermediario fra il client e il server audio.
Negli ultimi tempi la pratica del Live Coding sta prendendo sempre piùpiede nell’ambiente dei programmatori dell’audio e anche nella comunitàdi pd stanno anscendo applicazioni che rendono possibile il Live Codingcondiviso, cioè la creazione di un’unica patch da postazioni diverse.
Tutte le implementazioni si basano sullo sfruttamento dei patch messages, dicui abbiamo parlato prima. Attraverso questi particolari internal messagesè possibile creare, distruggere, manipolare oggetti residenti in altre patch,anche remote.
Ogni internal patch message è costituito da una parola chiave che rappre-senta l’oggetto da creare o l’azione da compiere, seguita da altri argomenti.Ad esempio il messaggio:
obj 100 100 osc~ 200
2 http://supercollider.sourceforge.net/
217
crea un oggetto osc∼ in posizione [100,100] della canvas con argomento200 per la frequenza. Nella figura 214 mostriamo un esempio di questaprocedura.
send pd-internalmessage01.pd
obj 100 200 osc~ 200
obj 100 250 dac~
floatatom 100 150 5
connect 6 0 7 0, connect 6 0 7 1
connect 8 0 6 0
Figure 214: una patch per l’invio di internal messages all’interno della stessa patch
L’oggetto send invia i messaggi alla patch in cui si trova, in questo casointernalmessage01.pd. Il nome della patch di destinazione deve essere pre-ceduta dal prefisso pd-. I due messaggi con parola chiave obj creano glioggetti osc∼ e dac∼ alle coordinate indicate. Il messaggio floatnum creauna number box e i tre messaggi connect (i primi due si trovano all’internodella stessa message box, separati da una virgola, connettono gli oggetti fraloro.
Cosa significano i numeri che seguono i messaggi di connect? Si tratta diquadruple di valori che identificano il numero dell’oggetto e l’inlet o l’outletda connettere. Il numero dell’oggetto viene attribuito allo stesso nel mo-mento in cui viene creato, secondo l’ordine di creazione. Questo significache, visto che nella patch prima della creazione dei tre oggetti ci sono giàaltri sei oggetti, che vengono numerati virtualmente da zero a 5, i nuovioggetti saranno numerati a partire da 6, secondo il loro ordine. osc∼ saràl’oggetto numero 6, dac∼ il 7, infine la number box l’8.
Il secondo e il quarto numero della quadrupla rappresentano, rispettiva-mente l’outlet e l’inlet da connettere. Ad esempio il messaggio:
connect 8 0 6 0
218
connette il primo outlet dell’oggetto 8, cioè la number box con il primo inletdi osc∼, che è l’oggetto numero 6. La figura 215 chiarifica il tutto.
send pd-internalmessage01.pd
obj 100 200 osc~ 200
obj 100 250 dac~
floatatom 100 150 5
connect 6 0 7 0, connect 6 0 7 1
connect 8 0 6 0
osc~ 200
dac~
0
---> 6
---> 7
---> 8
in 0
in 1in 0
out 0
out 0
Figure 215: La numerazione degli oggetti e degli inlet-outlet all’interno dellastessa patch
Per far si che la numerazione degli oggetti creati inizi da zero è sufficientecreare nella patch principale una subpatch vuota in cui risiederanno i nuovioggetti.
Con lo stesso principio possiamo inviare dei messaggi per creare deglioggetti da una postazione remota facendo uso degli oggetti netsend e ne-treceive e con opportuno routing di tali messaggi (tramite route). Le figure216 e 217 illustrano questo procedimento alla fine del quale la subpatch ob-jecthost si configurerà come nella figura 218.
219
netsend
connect localhost 5555
send active $1
active_audio_engine
connect to port 5555
send create obj 20 20 osc~ 200
send create obj 20 50 *~ 0.5
send create connect 0 0 1 0
send create obj 20 80 dac~
send create connect 1 0 2 0
send create connect 1 0 2 1
send create vis 1, send create editmode 1
Figure 216: la client patch per l’invio dei messaggi che creano gli oggetti
18.1.3 pdsend
pd dispone di due programmi standalone per la gestione di ciò che abbi-amo appena esaminato. Si tratta di pdsend e pdreceive che possono essereeseguiti da linea di comando e fanno le veci di netsend e netreceive.
Questi due programmi consentono di creare delle interfacce con altri lin-guaggi di programmazione, il che potrebbe essere utilissimo se si riescea creare un codice in grado di gestire la creazione di messaggi da unapostazione remota.
Senza entrare troppo nel dettaglio, proviamo a illustrare un esempio diuso di pd send. in questo caso faremo un uso ibrido dei comandi, ossiautilizzeremo pdsend per inviare i messaggi e netreceive dentro una proxy
220
netreceive 5555
;pd dsp $1
active audio to pd engine
receive message fromclient
route create active
pd objecthost
send pd-objecthost
Figure 217: La proxy patch che contiene la subpatch objecthost in cui comparirannoi nuovi oggetti
osc~ 200
*~ 0.5
dac~
Figure 218: la subpatch objecthost con gli oggetti appena creati
patch per ricevere ed eseguire i comandi. La fig. ??) mostra la proxy patch.Si tratta semplicemente di una canvas che contiene l’oggetto netreceive inascolto sulla porta 3001 e con l’argomento zero, che significa che riceveràmessaggi TCP (che sono più affidabili degli UDP, indicati con l’argomento1). L’ulteriore argomento old è necessario per ricevere qualunque tipo dimessaggio da pdsend.
Prima di tutto è necessario aprire pd, poi la proxy patch, infine aprire unafinestra di terminale. Da lì è necessario navigare fino alla posizione del
221
programma pdsend ed eseguirlo in questo modo:
./pdsend 3001 localhost
oppure
pdsend.exe 3001 localhost
se si è su windows. Poi eseguiamo i seguenti comandi, uno alla volta ter-minandoli ognuno con il punto e virgola:
pd filename n ./; //crea un nuovo file di nome n
#N canvas; //crea la canvas
#X pop 1; //la apre
pd-n obj 100 100 osc~ 200; //crea un oscillatore con
frequenza 200
pd-n obj 100 150 dac~; //crea un’uscita
pd-n connect 0 0 1 0; //connette i due oggetti
pd dsp 1; //attiva l’audio
Si potrebbe anche aprire pd da terminale senza la GUI, con la linea di co-mando (supponiamo di aver salvato la patch con netreceive nel file proxy.pd):
./pd -nogui proxy.pd
a questo punto pd è un programma senza interfaccia grafica, completa-mente gestito da linea di comando. Naturalmente scrivere i messaggi unoalla volta e con la dicitura completa non è molto comodo, ma ci sono già al-cune implementazioni reperibili in rete che rendono il tutto estremamenteintuitivo e immediato. La maggior parte fanno uso di Python, ma non man-cano applicazioni in Perl, Lisp, Scheme, e altri, e c’è da scommettere chenell’immediato futuro l’uso di pd come motore audio pilotato da interfaccediverse sarà all’ordine del giorno!
222
18.2 IL PROTOCOLLO OSC
Nato intorno al 1997, OSC è un protocollo che consente la comunicazionefra computer collegati in rete. I messaggi vengono impacchettati secondocerti criteri e trasportati tramite i consueti protocolli di trasporto, tipica-mente UDP, ma anche OSC.
Generalmente i messaggi OSC possono essere di qualunque tipo e si usafarli precedere da prefissi che rendono semplice il routing nella macchinaricevente. Tali prefissi hanno la struttura degli indirizzi web, sono prece-duti cioè da una ’/’ (slash).
Il protocollo OSC è molto utile quando si vuole far comunicare pd con unsoftware diverso, sulla stessa macchina o verso altre macchine. La comu-nicazione fra pd e pd è implementata benissimo con gli oggetti netsend enetreceive quindi non avrebbe molto senso usare OSC, anche se gli esempiche seguono rimangono nel contesto di pd sia in ricezione che in invio.
In pd le implementazioni del protocollo OSC sono numerose, ma quellamigliore, e forse la più utilizzata in questo momento, è quella costituitadalla libreria mrpeach. Nonostante questo pd-extended, pur contenendotale libreria, non la carica di default all’avvio del programma. Quindi ènecessario caricarla nella tramite il messaggio import.Gli oggetti necessari a stabilire una connessione OSC e a ricevere/inviarei messaggi sono udpsend, udp receive, packOSC e unpackOSC. I primi dueservono a stabilire la connessione e a inviare i paccheti, gli altri due aprepararli per essere spediti, formattano cioè i dati nel formato interno delprotocollo. Nella figura 219 viene mostrato un semplice esempio di comu-nicazione via OSC.
La macchina che spedisce i messaggi (sender) usa udpsend, si connette allaporta 3001 dell’indirizzo dell’interfaccia di loopback, cioè localhost perchési tratta di comunicare nello stesso computer. Infine impacchetta i mes-saggi, facendoli precedere dalla parola chiave send, tramite packOSC e lispedisce tramite udpsend.
Il destinatario (receiver) riceve i messaggi tramite udpreceiver, li interpretae li spacchetta grazie a unpackOSC, infine li invia a route che li indirizza
223
import mrpeach
connect localhost 3001
packOSC
udpsend
send /test $1
unpackOSC
route /test
0
0
sender receiver
udpreceive 3001
Figure 219: Una semplice connessione OSC
opportunamente.
Il meccanismo di indirizzamento tramite le slash può essere molto elabo-rato, si tratta semplicemente di organizzare l’indirizzamento per route inmodo da instradare i messaggi in modo coerente.
La figura 220 mostra un esempio di istradamento più elaborato.
Naturalmente nulla impedisce di creare connessioni duplex, dove una macchinainvia e riceve messaggi allo stesso tempo. È sufficiente creare due oggettiudpsend e udpreceive, ovviamente su porte diverse. in pratica si creanodue connessioni OSC diverse, una per ricevere, l’altra per inviare dati.Nell’esempio di figura 221 la macchina A invia dati sulla porta 3001 ericeve sulla porta 3002, la macchina B, viceversa, invia sulla 3002 e ricevesulla 3001.
Tutte le comunicazioni che abbiamo realizzato nei precedenti esemi fannouso del protocollo UDP per trasportare i dati, ma nulla vieta di utilizzare ilprotocollo TCP, che è più affidabile anche se a volte meno veloce. Se si usauna connessione internet per comunicare con pd probabilmente potrebbeessere meglio usare il TCP, ma in una LAN locale è preferibile in generale
224
import mrpeach
connect localhost 3001
packOSC
udpsend
udpreceive 3001
unpackOSC0
sender receiver
0
0
0
route /data /audio
route /sliderA /sliderB
route /frq /amp
0 0
send /data /sliderA $1
send /data /sliderB $1
send /audio /amp $1
send /audio /frq $1
Figure 220: Routing elaborato dei messaggi
utilizzare il protocollo UDP.
Per realizzare connessioni che facciano uso di TCP è sufficiente usare glioggetti tcpsend e tcpreceive al posto di udpsend e udpreceive.
18.3 L’AUDIO IN streaming
I protocolli che abbiamo esaminato fino ad ora (MIDI, OSC, FUDI) trasportanofondamentalmente dati numerici, simboli, liste, ma non consentono di in-viare e ricevere campioni audio. Per fare questo occorre utilizzare proto-colli diversi, implementati in pd da oggetti specifici.
La prima coppia di oggetti che esaminiamo è streamin∼ e streamout∼che servono a inviare segnale audio fra pd e pd in una LAN o attraversouna connessione internet.
225
import mrpeach
connect localhost 3001
send /data $1
packOSC
udpsend
udpreceive 3001
unpackOSC
30
route /data
udpsend
unpackOSC
udpreceive 3002
route /audio
connect localhost 3002
packOSC
0
send /audio $1
00
A B
Figure 221: Connessione OSC duplex
Sostanzialmente sono l’omologo audio di netsend e netreceive, con alcunedifferenze che vedremo fra poco. Anche in questo caso è necessario sta-bilire una connessione tramite la definizione di un indirizzo e di una portadi comunicazione (fig. 222).Come appena detto, ci sono delle differenze con netsend e receive, infattistreamin∼ può accettare un solo segnale per porta, quindi nel caso si vo-lesse usare tale oggetto come server audio per più client o per un client conun segnale stereo, ogni segnale dovrebbe essere instradato su una porta dif-ferente e per ogni porta ci dovrebbe essere un oggetto streamin∼ diverso(fig. 223).
Per ovviare a questa complicazione è in fase di testing una coppia dioggetti, netsend∼ e netreceive∼ che consentono di inviare e ricevere seg-
226
streamout~
connect localhost 3001
osc~ 200
streamin~ 3001
dac~
client server
Figure 222: Connessione audio con streamin∼ e streamout∼
nali multicanale su una stessa porta 3.
Un’altra possibilità notevole che pd offre, è quella di inviare il flusso audiodirettamente ad un server per il media streaming, tramite un protocollo ditipo multicast. In pratica pd può andare in diretta radio!.
L’oggetto mp3cast∼ svolge questa funzione. Naturalmente bisogna esserein possesso dell’account e dell’indirizzo di un server streaming, stabilire unmountpoint, cioè un file temporaneo che funziona come un buffer per mem-orizzare il segnale e infine è necessario dire all’oggetto che tipo di serversi utilizza (fig. 224).
Come si può notare è possibile inviare un segnale stereofonico. Il segnaleviene compresso nel formato mp3 e inviato in tempo quasi-reale (il ritardopuò essere di circa 10 secondi. A questo punto non è difficile implementareuna semplicissima postazione radio (fig. 225).La patch è semplice: subpatch che si occupa della connessione (fig. 226),una che si occupa di inviare tre segnali a mp3cast∼, cioè il microfono, unamini implementazione di modulazione di frequenza e un oggetto sfplay chelegge file audio per una eventuale esecuzione di playlist (fig. 227). Infinela subpatch che si occupa dei controller pilotati via MIDI tramite l’oggettoctlnin (fig. 228). Va ricordato che le GUI possono ricevere e inviare mes-saggi tramite send e receive semplicemente impostando il destinatario e ilmittente dalle properties della GUI stessa (fig. 229).Esiste un altro oggetto che implementa le connessioni a tali tipi di server, sichiama oggcast∼, che differisce da mp3cast∼, come si intuisce dal nome,
3 http://www.nullmedium.de/dev/netsend~/
227
streamout~
connect localhost 3001
osc~ 200
streamin~ 3001
dac~
client A
server
streamin~ 3002
streamin~ 3003
streamin~ 3004
streamout~
connect localhost 3002
client B
streamout~
connect localhost 3003
client C (stereo)
osc~ 300
osc~ 600
streamout~
connect localhost 3004
osc~ 1200
*~ 0.25
*~ 0.25
*~ 0.25
Figure 223: Connessione audio multiple
per il fatto di comprimere l’audio non in mp3 ma in formato Ogg Vorbis.
228
mp3cast~
osc~ 200
passwd mypass
connect shoutcast.host.com 8000
mountpoint mymusic.mp3
shoutcast
Figure 224: Trasmettere il proprio segnale in una webradio
mic mysound playlist
bang_to_connect!
choose_a_file_to_playCarrier
109
Modulating
70
playlistmysound
start/stop
Figure 225: Una semplice postazione radio
229
passwd mypass
mountpoint mymusic.mp3
shoutcast
connect shoutcast.host.com 8000
outlet
t b b b b
bang_to_connect!
Figure 226: la subpatch per la connessione al server multicast
adc~
sfplay 2
*~ *~
*~
*~ *~
open astronomydomine.wav l
r mic
$1 20
line~ $1 20
line~
r mysound
$1 20
line~
r playlist
loadbang
openpanel
choose_a_file_to_play
prepend open
osc~ 100
osc~ 400*~ 0.5
+~ 0.5
*~
Carrier
109
Modulating
70
start stop
playlistmysound
mp3cast~
inlet messages
start/stop
sel 1 0
Figure 227: Implementazione dei segnali da inviare alla radio
230
ctlin 1
/ 128
send sld1
/ 128
ctlin 2
send sld2
/ 128
ctlin 3
send sld3
mic mysound playlist
Figure 228: Configurazione dei controller da pilotare via MIDI
231
Figure 229: la finestra delle properties della vertical slider dove impostare send ereceive
232
19 A P P L I C A Z I O N I S PA R S E
19.1 LAPTOP ORCHESTRA
Come si avrà avuto modo di intuire, le potenzialità di pd in merito alnetworking sono moltissime. L’idea quindi di organizzare gruppi che suo-nano su un palco facendo uso di questo programma è molto concreta. LaCLOrk, Concordia Laptop Orchestra 1, ha sviluppato con pd un sistemadi sincronizzazione dei dati all’interno di una Lan. Pd è usato anche dallaLinux laptop orchestra 2 e da molte altre.
Quando si tratta di mettere in piedi un’orchestra di laptop le problematichesono molte: Ognuno suona un proprio strumento sul suo motore audio oci si serve di un motore audio comune? Si improvvisa o si eseguono branistrutturati? Si suona stereo o in multifonia? Questi problemi naturalmentepossono essere affrontati in base alle condizioni di ogni orchestra.
Il modo più semplice, ma meno orchestrale, è quello di suonare sul propriolaptop in modo indipendente. Ogni postazione ha in attivo la propria patchsul proprio motore audio. La figura 230 mostra questa configurazione, chedefiniamo di tipo PUNCTUAL.
Nel capitolo sul Networking abbiamo illustrato molte delle funzionalità direte offerte da pd. Reamite gli oggetti netsend e netreceive strutturare unarete di postazioni in cui gira pd è estremamente facile. Una configurazionepossibile è quella in cui il motore audio e la patch principale sono avviatiin un server con l’oggetto netreceive. I client inviano dati al server. Ognunosi occupa di pilotare parti specifiche della server patch. La comunicazione
1 http://music.concordia.ca/news-and-events/events/dance-music-laptop-orchestra.
php
2 http://l2ork.music.vt.edu/main/
233
PUNCTUAL Architecture
LAPTOP 1
AUDIO ENGINE
LAPTOP 4
AUDIO ENGINE
LAPTOP 2
AUDIO ENGINE
LAPTOP 3
AUDIO ENGINE
LAPTOP 5
AUDIO ENGINE
LAPTOP 6
AUDIO ENGINE
Figure 230: Architettura con postazioni indipendenti
quindi avviene solo dai client verso il server (fig. 231).
Audio centralized
SERVER
netreceive 3001route /A /B /C /D
part A part B part C part D
AUDIO ENGINE
CLIENT 1
Data control part A
netsend 3001 /A
CLIENT 2
Data control part B
netsend 3001 /B
CLIENT 3
Data control part C
netsend 3001 /C
CLIENT 4
Data control part D
netsend 3001 /D
Figure 231: Architettura con un server che riceve dati di controllo per il motoreaudio
Al contrario, in una tipica architettura UNICAST, un server può generaredegli eventi di controllo e inviarli ai client: Si tratta di una sorta di diret-
234
tore d’orchestra che dice ad ogni client quello che deve fare. In questo casol’audio è decentralizzato, ogni client ha il proprio motore, incluso il server(fig. 232).
UNICAST Architecture(Audio decentralized)
SERVEREvent Generator
netsend 192.168.0.2 3000
netsend 192.168.0.3 3001
netsend 192.168.0.4 3002
netsend 192.168.0.5 3003
localhost
AUDIO ENGINE
CLIENT 1
netreceive 3000
AUDIO ENGINE
CLIENT 2
netreceive 3001
AUDIO ENGINE
CLIENT 3
netreceive 3002
AUDIO ENGINE
CLIENT 4
netreceive 3003
AUDIO ENGINE
Figure 232: Architettura UNICAST, il server genera gli eventi-partitura che ven-gono selettivamente inviati ai client
Un ultimo tipo di proposta è quella che si può definire BROADCAST Ar-chitecture con audio centralizzato. Un server invia un messaggio comune(BROADCAST) a tutta la rete, tipo un messaggio di sincronizzazione (clock)e riceve a sua volta da tutti i client i dati per il controllo del motore audio(fig. 233). È l’architettura più complessa, poiché richiede una connessionefull-duplex, cioè con doppia direzionalità. la trasmissione viaggia dal cliental server e viceversa.
Naturalmente queste architetture proposte sono legate alle condizioni incui si opera, ma sono anche funzionali al concetto di localizzazione dellasorgente sonora. Un’architettura audio centralized accentra l’audio su unapostazione specifica, di conseguenza non permette realmente di associareil gesto di chi suona a ciò che si ascolta. D’altro canto è più sempliceda gestire dal punto di vista dell’hardware, è sufficiente un impianto diamplificazione con stereofonia. Molto più complessa è la condizione di
235
BROADCAST FULL-DUPLEX Architecture(Audio centralized)
SERVER
netreceive 3000
(audio control data)
netsend 3001(broadcast)
(clock)
AUDIO ENGINE
CLIENT 1
netreceive 3001 (clock)
netsend 3000
(audio control data)
CLIENT 2
netreceive 3001 (clock)
netsend 3000
(audio control data)
CLIENT 3
netreceive 3001 (clock)
netsend 3000
(audio control data)
CLIENT 4
netreceive 3001 (clock)
netsend 3000
(audio control data)
Figure 233: Architettura BROADCAST FULL-DUPLEX, il server invia un clock ericeve i controlli del motore audio
audio decentralized, dove ogni laptop produce il suo segnale. È ipotizz-abile un’uscita su canali multipli anche in termini di amplificazione. Lasoluzione della PLork (Princeton laptop Orchestra 3) è degna di citazione:si tratta di un’architettura audio decentralized dove ogni componente escecon il proprio segnale e lo diffonde con uno speaker a irradiamento circo-lare.
le soluzioni possibili sono tante quante le problematiche, ma le prospettivedi questo modo di suonare sono interessanti e in un futuro molto prossimo
3 http://plork.cs.princeton.edu/
236
le Laptop Orchestra si moltiplicheranno a dismisura.
19.2 IL LIVE CODING
Una delle direzioni più recenti intraprese nell’ambito della musica elettron-ica è quella del Live coding, o della programmazione in tempo reale (On thefly programming o Just in time Programming).
Il principio su cui si basa il Live coding è quello per cui lo strumento (quindiil suono) e la composizione vengono creati contemporaneamente in temporeale dal musicista, che si occupa di scrivere il codice pensandolo nel mo-mento stesso della messa in atto. Il processo di creazione/composizionediventa trasparente e accessibile a chi ascolta. Per agevolare questa com-prensibilità spesso i Live coders si servono di proiettori per divulgare leimmagini del codice creato, commentandolo opportunamente durante ilprocesso.
Le implicazioni di questa tecnica, di questo modo di procedere, sono moltissime,soprattutto perché propone un approccio diverso non solo dal punto divista del musicista, ma anche da quello dell’ ascoltatore che assume unruolo inevitabilmente più consapevole, dal momento che viene diretta-mente accompagnato alla condivisione di quello che viene creato.
Un software storico come il già citato SuperCollider ha una libreria di Classidi oggetti (JITlib) che consentono di programmare in tempo reale. Chuck4 invece è stato pensato proprio per questo, è fortemente orientato allaprogrammazione in tempo reale. Sono entrambi ambienti testuali, anchese hanno la possibilità di generare oggetti grafici.Impromptu è un’ambiente di programmazione con una spiccata predispo-sizione al live programming 5. È un ambiente basato sul linguaggio Scheme,un dialetto del Lisp, un linguaggio funzionale molto usato negli studi sull’IntelligenzaArtificiale. È un linguaggio elegante ed estremamente espressivo, tanto dasomigliare in certi casi al linguaggio umano.
4 http://chuck.cs.princeton.edu/
5 http://impromptu.moso.com.au/
237
Pd può essere annoverato fra i software più adatti per il Live coding peralcune ragioni:
• la sua vocazione grafica Dataflow consente di capire esattamente comeviene creato un algoritmo. Gli oggetti vengono collegati in modologico attraverso cavi di collegamento, dando un’idea molto precisadei rapporti di causa-effetto fra gli eventi;
• gli oggetti grafici GUI, che tendono a nascondere i processi, sonorelativamente limitati e se ne può evitare l’uso molto agevolmente;
• a differenza di Max, suo fratello maggiore, non crea problemi di click-ing audio quando si stacca un cavo o se ne crea uno.
Pd per adesso non ha librerie specifiche per il Live coding, anche perchénon ne ha bisogno. Di fatto usare pd significa programmare sempre intempo reale! Naturalmente questo non significa che tutti i programmatoridi pd siano dei buoni live coders. Si tratta infatti di acquisire una certadimestichezza con l’immaginare algoritmi in tempi rapidi e di realizzarlisenza troppi errori.
La disciplina è in continua espansione e il sito toplap.org, il centro nevral-gico del Live coding, propone anche degli esercizi per imparare a realizzarealgoritmi in modo chiaro e rapido. La soluzione agli esercizi è quasi sem-pre scritta in codice per SuperCollider, ma nessuno impedisce di provare arisolverli in pd!
19.3 ARDUINO
238
C O N C L U S I O N E
239
B I B L I O G R A F I A
AA.VV. [2000], The CSound Book, ed. by R. Boulanger, The MIT Press, Cam-bridge.
– [2010b], The Audio programming Book, ed. by R. Boulanger and V. Laz-zarini, The MIT Press, Cambridge.
– [2011], The SuperCollider Book, ed. by S. Wilson, D. Cottle, and Collins N.,The MIT Press, Cambridge.
Bianchini, Riccardo and Alessandro Cipriani [1998], Il suono virtuale. Sintesied elaborazione del suono. Teoria e pratica con Csound. Con CD-ROM, Con-TempoNet.
Blum, Frank [2007], Digital Interactive Installations: Programming interactiveinstallations using the software package Max/MSP/Jitter, VDM Verlag Dr.Mueller e.K., Cambridge.
Collins, Nick [2010], Introduction to Computer Music, Wiley, Chichester.Cope, David [2004], Virtual Music, The MIT Press, Cambridge.Dodge, Charles and Thomas A. Jerse [1997], Computer Music, Schirmer.Farnell, Andy [2010], Designing Sound, The MIT Press, Cambridge.Giri, Maurizio and Alessandro Cipriani [2009], Musica Elettronica e Sound
Design, ConTempoNet.Manning, Peter [2004], Electronic and Computer Music, Oxford University
Press, Oxford.Manzo, V.J. [2011], Max/MSP/Jitter for Music: A Practical Guide to Developing
Interactive Music Systems for Education and More, Oxford University Press,Oxford.
Puckette, Miller [2007a], The Theory and Technique of Electronic Music, WorldScientific Publishing Company.
Roads, Curtis [1996], The Computer Music Tutorial, The MIT Press, Cam-bridge.
– [2004], Microsound, The MIT Press, Cambridge.Rowe, Robert [2004], Machine Musicianship, The MIT Press, Cambridge.Taube, Heinrich K. [2004], Notes from the Metalevel, Taylor & Francis, Lon-
don.Temperley, David [2010], Music and Probability, The MIT Press, Cambridge.
240
Winkler, Todd [2001], Composing Interactive Music. Techniques and Ideas Us-ing Max, The MIT Press, Cambridge.
241
S I TO G R A F I A
AA.VV. [2009], Pure Data Floss Manual, un buon manuale di Pure Data ininglese, http://flossmanuals.net/puredata/.
– [2010a], Pure Data, il sito ufficiale di pd-extended, dove si possono scari-care tutte le versioni del software e la relativa documentazione, http://www.puredata.info/.
Kreidler, Johannes [2011], Programming Electronic Music in Pd, un ottimomanuale di Pure Data, disponibile in varie lingua, ma non in italiano,http://www.pd-tutorial.com/.
Puckette, Miller [2007b], The Theory and Technique of Electronic Music, il li-bro di Miller Puckette, creatore di Max e di Pure Data, scaricabile libera-mente dal suo sito, http://crca.ucsd.edu/~msp/.
Valle, Andrea [2008], the SuperCollider Italian Manual, un manuale in ital-iano di SuperCollider, scritto da Andrea Valle e distribuito sotto licenzaCreative Commons, http://www.fonurgia.unito.it/andrea/wikka.php?wakka=SuperCollider.
Wang, Ge, Cook amd Perry R., et al. [2007], Chuck Manual, il sito dedicatoa Chuck, un altro linguaggio di programmazione dedicato all’audio intempo reale. Da qui è possibile scaricare il software dell’ambiente, ilmanuale e la documentazione varia, http://chuck.cs.princeton.edu/.
242 242
I N D E X
vline∼, 177, 179
vline∼, 175–178, 189
bang, 19
if, 54
Modulazione di Frequenza, 143–145
object box, 16
print, 15
243 243
I N D E X
vline∼, 177, 179
vline∼, 175–178, 189
bang, 19
if, 54
Modulazione di Frequenza, 143–145
object box, 16
print, 15
244 244