Inventare il suono con
PURE DATA
Manuale introduttivo di musica elettronica
vers. 0.1.2
Francesco Bianchi
elettrochuck@gmail.com
2010
N OTA SUL C OPYRIGHT
Questo documento e il suo contenuto sono rilasciati sotto licenza
Creative Commons 2.5 di tipo Attribuzione-Non commerciale-
Condividi allo stesso modo 2.5 Generico.
Sei quindi libero:
• di riprodurre, distribuire, comunicare al pubblico, esporre
in pubblico, rappresentare, eseguire e recitare quest’opera
• di modificare quest’opera
alle seguenti condizioni:
• Attribuzione. Devi attribuire la paternità dell’opera nei
modi indicati dall’autore o da chi ti ha dato l’opera in li-
cenza e in modo tale da 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 se la usi per crearne un’altra, puoi distribuire l’-
opera risultante solo con una licenza identica o equivalente
a questa.
2
INDICE
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 . . . . . . . . . . . . . . . . . . . . . . . 16
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
ii DATI 21
3 BASI DI PROGRAMMAZIONE CON PURE DATA 22
3.1 Variabili e costanti . . . . . . . . . . . . . . . . . . . 22
3.1.1 pack e unpack . . . . . . . . . . . . . . . . . . . 25
3.2 Gestione del tempo . . . . . . . . . . . . . . . . . . . 26
3.2.1 metro . . . . . . . . . . . . . . . . . . . . . . . 26
un contatore . . . . . . . . . . . . . . . . . . . 26
3.2.2 line . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.3 delay . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.4 line multirampa con delay . . . . . . . . . . . 29
3.3 Aritmetica . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3.1 operatori aritmetici . . . . . . . . . . . . . . . 31
3.3.2 expr . . . . . . . . . . . . . . . . . . . . . . . . 32
3.4 Generatori di numeri casuali . . . . . . . . . . . . . 32
3.5 Connessioni senza cavi . . . . . . . . . . . . . . . . . 35
3.6 Subpatches e Abstractions . . . . . . . . . . . . . . . . 36
3.6.1 subpatch . . . . . . . . . . . . . . . . . . . . . 37
3
Indice
3.6.2 abstraction . . . . . . . . . . . . . . . . . . . . 39
3.6.3 graph on parent . . . . . . . . . . . . . . . . . 41
4 VETTORI, GRAFICI E TABELLE 43
4.1 Vettori . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.1.1 leggere un vettore . . . . . . . . . . . . . . . 46
4.1.2 l’oggetto table . . . . . . . . . . . . . . . . . . 48
5 PROGRAMMAZIONE AVANZATA 50
5.1 Istruzioni condizionali . . . . . . . . . . . . . . . . . 50
5.1.1 operatori relazionali . . . . . . . . . . . . . . 50
5.1.2 select . . . . . . . . . . . . . . . . . . . . . . . 51
5.1.3 operatori logici . . . . . . . . . . . . . . . . . 53
5.1.4 If . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.2 loops e iterazioni . . . . . . . . . . . . . . . . . . . . . 57
6 OGGETTI GUI 60
6.1 Altre GUI dalle librerie di Pd . . . . . . . . . . . . . 63
7 LISTA DEGLI OGGETTI PER MANIPOLARE DATI 66
iii AUDIO 67
8 L’AUDIO DIGITALE 68
8.1 L’oscillatore . . . . . . . . . . . . . . . . . . . . . . . 68
8.1.1 frequenza e ampiezza del segnale . . . . . . 70
8.1.2 osc∼ . . . . . . . . . . . . . . . . . . . . . . . 73
8.1.3 tabwrite∼ . . . . . . . . . . . . . . . . . . . . 74
8.1.4 la rappresentazione del suono . . . . . . . . 74
8.2 Le forme d’onda . . . . . . . . . . . . . . . . . . . . . 78
8.2.1 tabosc4∼ . . . . . . . . . . . . . . . . . . . . 79
8.2.2 onda quadra . . . . . . . . . . . . . . . . . . . 79
pulse width modulation (PWM) . . . . . . . 82
8.2.3 onda a dente di sega . . . . . . . . . . . . . . 85
phasor∼ . . . . . . . . . . . . . . . . . . . . . 86
8.2.4 onda triangolare . . . . . . . . . . . . . . . . 86
9 IL panning 90
9.1 l’oggetto dac∼ . . . . . . . . . . . . . . . . . . . . . . 90
9.2 Controllo del panning . . . . . . . . . . . . . . . . . . 91
9.2.1 Segnali bipolari e unipolari . . . . . . . . . . 93
9.2.2 il DC offset . . . . . . . . . . . . . . . . . . . 93
10 SINTESI ADDITIVA, SINTESI TABELLARE E SINTESI VET-
TORIALE 97
10.1 Operatori di segnale . . . . . . . . . . . . . . . . . . 97
10.1.1 expr∼ . . . . . . . . . . . . . . . . . . . . . . 97
4
Indice
10.2 Sintesi additiva . . . . . . . . . . . . . . . . . . . . . 97
10.2.1 sintesi additiva a spettro armonico . . . . . . 97
10.2.2 sintesi additiva a spettro non armonico . . . 97
10.2.3 spettro fisso . . . . . . . . . . . . . . . . . . . 97
10.2.4 spettro variabile . . . . . . . . . . . . . . . . . 97
10.3 Sintesi vettoriale . . . . . . . . . . . . . . . . . . . . . 97
10.3.1 dissolvenza incrociata automatica fra due
tabelle . . . . . . . . . . . . . . . . . . . . . . 97
10.3.2 dissolvenza incrociata automatica fra più
tabelle . . . . . . . . . . . . . . . . . . . . . . 97
10.3.3 algoritmo di selezione per il crossfading fra
tabelle . . . . . . . . . . . . . . . . . . . . . . 97
10.3.4 controllo del crossfading attraverso grid . . . 97
11 SINTESI SOTTRATTIVA 98
11.1 La sintesi sottrattiva . . . . . . . . . . . . . . . . . . 98
11.1.1 il rumore . . . . . . . . . . . . . . . . . . . . . 98
11.2 I filtri . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
11.2.1 filtri passa-alto . . . . . . . . . . . . . . . . . 101
11.2.2 filtri passa-basso . . . . . . . . . . . . . . . . 101
11.2.3 filtri passa-banda . . . . . . . . . . . . . . . . 101
11.2.4 filtri escludi-banda . . . . . . . . . . . . . . . 101
11.2.5 gli ordini dei filtri . . . . . . . . . . . . . . . . 101
12 MOULAZIONE AD ANELLO (RM), TREMOLO, MODULAZIONE
D’AMPIEZZA (AM) 102
12.1 La modulazione ad anello . . . . . . . . . . . . . . . 102
12.2 Segnali bipolari e unipolari . . . . . . . . . . . . . . 105
12.3 Segnale di controllo dell’ampiezza: il tremolo . . . 106
12.4 La modulazione d’ampiezza . . . . . . . . . . . . . . 109
12.4.1 l’indice di modulazione . . . . . . . . . . . . 112
13 VIBRATO E MODULAZIONE DI FREQUENZA (FM) 116
13.1 Segnale di controllo della frequenza: il vibrato . . . 116
13.2 Modulazione di frequenza . . . . . . . . . . . . . . . 117
13.2.1 l’inviluppo . . . . . . . . . . . . . . . . . . . . 119
13.2.2 FM a spettro variabile . . . . . . . . . . . . . 123
13.2.3 algoritmo per il controllo random dei parametri124
13.3 Portanti multiple . . . . . . . . . . . . . . . . . . . . 124
13.4 Modulanti multiple . . . . . . . . . . . . . . . . . . . 124
14 SINTESI PER DISTORSIONE NON LINEARE (DNL) 128
14.1 Ancora sulle tabelle . . . . . . . . . . . . . . . . . . . 128
14.2 Teoria della sintesi per distorsione non lineare . . . 128
5
Indice
14.3 Sintesi per distorsione non lineare . . . . . . . . . . 128
15 INTRODUZIONE ALLA SINTESI GRANULARE 129
15.1 Teoria della sintesi granulare . . . . . . . . . . . . . 129
15.1.1 Panoramica dei tipi di sintesi granulare . . . 129
15.2 Algoritmo per la sintesi Pulsar . . . . . . . . . . . . 129
16 ALTRE APPLICAZIONI DI PURE DATA 130
16.1 GEM e il video . . . . . . . . . . . . . . . . . . . . . 130
16.1.1 un esempio con GEM . . . . . . . . . . . . . 130
16.2 Arduino . . . . . . . . . . . . . . . . . . . . . . . . . 130
16.2.1 pduino . . . . . . . . . . . . . . . . . . . . . . 130
16.3 Il protocollo osc . . . . . . . . . . . . . . . . . . . . . 130
16.3.1 netsend e netreceive . . . . . . . . . . . . . . . 130
16.4 Il Live coding . . . . . . . . . . . . . . . . . . . . . . . 130
16.4.1 suonare in rete: oggcast∼ . . . . . . . . . . . 130
Conclusione 131
Bibliografia 131
Sitografia 131
Indice analitico 131
6
INTRODUZIONE
La diffusione massiccia che i moderni calcolatori hanno avuto
negli ultimi 30 anni ha prodotto un’onda d’urto dirompente nel
mondo della musica elettronica che fino agli anni ’70 era ap-
pannaggio di quei pochi fortunati che potevano accedere ai rari
centri europei e americani che disponevano delle apparecchia-
ture per realizzarla. In pochi anni, a partire dall’avvento dei
primi home computers si sono moltiplicati a dismisura i software
di manipolazione dell’audio e oggi chiunque può trovare in rete
o in commercio programmi per produrre il proprio brano o il
proprio disco di musica elettronica, spesso senza il bisogno di
conoscere a fondo i principi, il funzionamento e le tecniche che
stanno alla base dell’audio digitale. Con un semplice click è pos-
sibile proiettarsi nel mondo dei suoni più strani senza dover nec-
essariamente conoscere una tecnica di sintesi o, quantomeno, un
oscillatore.
Stando così le cose, qualcuno a questo punto potrebbe chiedersi,
leggittimamente, perché dovrebbe leggere un manuale di musi-
ca elettronica. Il panorama del software è talmente vasto che
chiunque può trovare il programma adatto alle sue esigenze, in
linea con le proprie conoscenze informatiche e musicali. Eppure
ci sono varie ragioni perché si potrebbe leggere un manuale del
genere e imparare almeno le basi della programmazione e della
sintesi dell’audio. Proviamo ad elencarne qualcuna:
- Studiare la musica elettronica aiuta a capire meglio quel-
lo che si fa con i programmi, soprattutto aiuta a capire
quali sono i limiti dei programmi stessi. Ad esempio i sin-
tetizzatori software attualmente in commercio sono per lo
più monofunzionali, cioè svolgono un compito e solo quello.
Naturalmente in molti casi lo svolgono benissimo, ma non
sanno fare altro. Ci sono sintetizzatori per la Modulazione
di Frequenza, sintetizzatori per la Sintesi Granulare o Ad-
ditiva. Se si vuole possedere un sintetizzatore per una di
7
Indice
queste tecniche bisogna acquistarlo o bisogna accontentarsi
di prodotti che non danno ottimi risultati.
- Questi programmi possono costare molto, soprattutto i migliori.
Se si volessero avere dei sintetizzatori per realizzare 3 o
4 tecniche di sintesi del suono si dovrebbero acquistare
3 o 4 prodotti commerciali diversi, questo a scapito del
portafogli e del fatto che probabilmente fra qualche anno
saranno obsoleti e diverranno quindi praticamente inutili.
E’ molto meglio studiare le tecniche di sintesi e il fun-
zionamento dell’audio digitale per avere l’opportunità di
utilizzare programmi forse più complessi, ma che danno
l’opportunità di costruirsi da soli i propri suoni.
- Inventare i propri suoni non è una cosa da poco. I software
commerciali sono corredati sempre da moltissimi suoni
preconfezionati, detti preset, molto utili, ma che affievolis-
cono inevitabilmente il desiderio di cercarne di nuovi. Si
inizia ad accontentarsi di quello che offre il convento, che
spesso è gradevole e non richiede dispendio eccessivo di
energie. Ma quei suoni saranno sempre dei preset fatti da
qualcun altro, non apparterranno mai completamente a chi
li usa. Quindi studiare e praticare la musica elettronica è
un modo per appropriarsi del 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
volta apprese le tecniche di sintesi si possono scegliere
programmi a costo zero, cioè freeware, come Pure Data,
oggetto di questo manuale. Scegliere un programma gra-
tuito implica molte cose, alcune meno scontate di quanto
si pensi:
– Non è solo una scelta di risparmio, ma una riven-
dicazione etica. Sintetizzare il suono attraverso un
software digitale implica la progettazione e la realiz-
zazione di algoritmi più o meno complessi. Gli al-
goritmi non sono altro che rappresentazioni del pen-
siero, e il pensiero non si paga, nessun prezzo.
– Usare un software libero significa condividerne una
filosofia basata sulla condivisione dei saperi. I pro-
8
Indice
grammi liberi sono tali in tutto e per tutto nella mag-
gior parte dei casi. Si può prelevare il sorgente, stu-
diarlo, modificarlo e redistribuirlo. Non a caso in-
torno a questi software ci sono delle vere e proprie
comunità che si scambiano opinioni, idee e proget-
ti, condividendo liberamente il proprio pensiero con
altri.
– Il software libero è soggetto a mutamento continuo, a
un divenire costante che lo pone nella condizione di
migliorare molto più velocemente del software com-
merciale e di non invecchiare mai.
Studiate quindi la musica elettronica e praticatela, possibilmente
con software libero.
Buon divertimento!
9
Parte I
L’A M B I E N T E
1
FONDAMENTI
1.1 C OS ’ È P URE D ATA ?
Traducendo dal sito ufficiale, apprendiamo che Pure Data è un
ambiente di programmazione grafica in tempo reale per pro-
cessare audio e video1 . Cerchiamo di entrare nel dettaglio di
questa descrizione. Pure Data è prima di tutto un linguaggio di
programmazione perché consente di realizzare algoritmi più o
meno complessi come tutti gli altri linguaggi2 . L’interfaccia con
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 delle patch combinando fra loro vari tipi di oggetti
grafici. Nel gergo dei sintetizzatori analogici una patch rappre-
sentava l’insieme dei collegamenti fra i suoi moduli. Pd mutua
questo concetto: attraverso una patch si definisce graficamente
l’ordine con cui i vari oggetti sono collegati fra loro. Gli algo-
ritmi vengono creati selezionando una serie di entità grafiche
all’interno di una finestra, detta patch window.
Pd funziona in tempo reale, quindi gli algoritmi sono interat-
tivi e i parametri possono essere modificati durante l’esecuzione.
E’ anche possibile cambiare la struttura stessa di tali algoritmi
mentre sono attivi, aggiungendo o rimuovendo 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,
1 http://puredata.info/
2 Un algoritmo si può definire come un procedimento che consente di ottenere
un risultato atteso eseguendo, in un determinato ordine, un insieme di passi
semplici corrispondenti ad azioni scelte solitamente da un insieme finito http:
//it.wikipedia.org/wiki/Algoritmo
11
1.2 PD-EXTENDED
musicisti, hackers e appassionati sforna ogni giorno nuove ap-
plicazioni e librerie che potenziano e aumentano le funzionalità
di questo ambiente versatile e libero. Si, perché Pure Data è
un software libero, e i suoi sorgenti possono essere scaricati, stu-
diati, modificati e redistribuiti da chiunque. Inoltre Pure Data è
multipiattaforma, 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à degli anni ’80 aveva sviluppato Max, in seguito divenuto
un software commerciale3 . Pd riprende le idee e i concetti di
quest’ultimo, pur basandosi su una filosofia più libera e aperta
che ne fa un sistema più dinamico e dalle prospettive future più
interessanti.
1.2 P D - EXTENDED
Allo stato attuale Pd è arrivato alla versione standard 0.42.5, det-
ta Vanilla, scaricabile dal sito del suo creatore4 . Il consiglio
di chi scrive è però quello di scaricare la versione extended, che
contiene non solo il programma standard, ma anche numerose
librerie aggiuntive che estendono notevolmente le sue funzional-
ità. Attualmente Pd-extended è alla versione 0.41.45 .
1.3 I NSTALLAZIONE
1.3.1 GNU/L INUX
Prendiamo in esame solo l’installazione sul sistema Ubuntu GNU/
Linux, sistema operativo sul quale è stato scritto il presente man-
uale e al quale ci riferiamo citando le combinazione di comandi
da tastiera su Pd. Come già scritto in precedenza, il consiglio è
quello di scaricare e installare l’ultima versione di Pd-extended.
Per fare questo è sufficiente aggiungere la seguente riga al file
/etc/apt/sources.list:
deb http://apt.puredata.info/releases hardy main
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
1.3 INSTALLAZIONE
nel caso si stia operando in una distribuzione Ubuntu Hardy, in
caso diverso sostituire la dicitura hardy con il mome della dis-
tribuzione di Ubuntu installata.
Successivamente si può eseguire l’installazione dal package man-
ager di Ubuntu, Synaptic. Aprirlo, aggiornare l’archivio dei
pacchetti, cercare Pd-extended e dopo averlo marcato far partire
il processo di installazione, alla fine del quale Pd potrà essere
richiamato da un terminale digitando semplicemente:
pd
Oppure dal menù Applicazioni/Audio e Video/Pd-extended
1.3.2 W INDOWS E M AC O S X
Dopo aver scaricato la versione di Pd-extended per Windows
o per Mac OS X, 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 P D window E patch window
All’apertura di Pd compare la finestra principale del programma
(Pd window) che ha due funzioni principali:
- mostrare dei messaggi
- consentire la configurazione dell’audio e del MIDI e definire
i percorsi in cui Pd cerca le librerie da caricare
Alcuni messaggi vengono visualizzati in fase di avvio del pro-
gramma, riguardano le librerie esterne caricate e gli eventuali
errori nella configurazione dell’audio o del MIDI. Altri messag-
gi possono essere mostrati nella Pd window durante la normale
esecuzione del programmano e il più delle volte riguardano er-
rori di procedura o comunicazioni prodotte dall’utente tramite
l’oggetto print che sarà esaminato successivamente (vedi 2.1.2).
La configurazione dell’audio avviene tramite la voce di menù
Media che consente di impostare il MIDI (MIDI settings), l’audio
(Audio settings), di avviare il motore DSP (Audio on/off) e di
testarne il funzionamento (test Audio and MIDI).
La voce di menù File permette di aprire, chiudere, salvare le
patch e di configurare il percorso che Pd compie per trovare le
librerie esterne (Path) e quali di esse caricare all’avvio (Startup)1 .
1 Esistono numerose librerie, generalmente scritte in C o in Pd stesso, molte
delle quali sono già incluse nel pacchetto Pd-extended, altre scaricabili dal sito
ufficiale o da altri siti (vedi sitografia)
14
2.1 PD window E patch window
Nella versione extended il Path e lo Startup sono già impostati
per caricare la maggior parte delle librerie necessarie per una
completa funzionalità dell’ambiente.
Generalmente all’apertura del programma ci si trova di fronte
soltanto la Pd window. Per iniziare a scrivere gli algoritmi è nec-
essario aprire una finestra di patch dal menù File/new. Com-
pare così la patch window che è l’ambiente di programmazione
vero e proprio. Il suo menù è molto simile a quello della Pd
window ma ovviamente più orientato all’editing delle patch.
La patch window può trovarsi in due stati funzionali diversi: edit
mode e run mode. Il primo permette di inserire tutti gli elementi
all’interno della finestra, mentre il secondo è necessario per ge-
stire la patch quando questa è in azione. Tutti gli oggetti interat-
tivi cioè quelli che contengono parametri modificabili via mouse
o tastiera, funzionano soltanto in run mode, mentre in edit mode
possono solo essere aggiunti o rimossi. Per passare da uno stato
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 si devono processare segnali audio, è neces-
sario attivare il motore DSP per ascoltare il risultato delle op-
erazioni sui segnali. Il motore DSP, acronimo di Digital Signal
Processor, si occupa di elaborare il segnale in tempi rapidissimi
e di permettere la sua trasformazione da digitale ad analogico e
viceversa.
Nel momento in cui il coder vuole suonare una patch deve quindi
attivare il motore DSP, mediante l’apposita voce di menu Medi-
a/audio on. In alternativa può premere la combinazione di
tasti ctrl-/. Vedremo successivamente le altre possibilità di
intervenire sull’attivazione e la disattivazione del motore DSP,
quando si tratterà dell’audio nella seconda parte del presente
manuale.
15
2.2 LE scatole DI PD
2.1.2 print
Durante l’esecuzione delle patch può accadere che vengano auto-
maticamente visualizzati dei messaggi nella Pd window, in par-
ticolare alla presenza di errori, ma c’è un oggetto che permette
al programmatore di visualizzare nella Pd window il messaggio
o dato che desidera. Si tratta di print, che può solo ricevere
dati o messaggi e stamparli a video nella Pd window. In alcune
circostanze è utile per verificare il corretto funzionamento degli
algoritmi.
Hello World!
print
Figura 1: un click del mouse sul messaggio produce un output nella
Pd window
2.2 L E scatole DI P D
La finestra di patch è il luogo che permette la realizzazione degli
algoritmi di Pd. Essendo un ambiente grafico la finestra si riem-
pirà di entità di varia natura, dette scatole (box). Queste scatole
sono di quattro tipi: oggetti, messaggi, GUI e commenti e si cre-
ano dal menù Put oppure premendo ctrl+n dove n è 1 per gli
oggetti, 2 per i messaggi, 5 per i commenti. I numeri 3 e 4 cre-
ano delle GUI particolari, simboli e number box che esamineremo
successivamente.
2.2.1 OGGETTI E CONNESSIONI
Gli elementi fondamentali della programmazione in Pure Data le object box
sono gli oggetti, rappresentati dalle object box, caratterizzate dal-
la forma rettangolare 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
riceve attraverso gli inlets messaggi, liste o uscite di altri oggetti.
16
2.2 LE scatole DI PD
Può inviare dati o segnali ad altri oggetti. All’interno dell’object
box si situano gli atomi, cioè stringhe di caratteri o simboli sepa-
rati da spazi che rappresentano il tipo di oggetto e gli eventuali
argomenti dell’oggetto stesso2 .
random 250
Figura 2: un esempio di object box: l’oggetto metro con un argomento
I collegamenti fra oggetti, anzi fra tutte le object box avvengono
tramite cavi di connessione che si realizzano tenendo premuto il
tasto sinistro del mouse a partire dall’outlet mittente e rilascian-
dolo non appena si è raggiunto l’inlet di arrivo.
random
select 0 5 7
Figura 3: collegamenti fra object box
L’inlet di sinistra di ogni oggetto è detto caldo poiché alla ricezione
di un messaggio, di un dato o di un segnale, produce immediata-
mente un’uscita dall’oggetto stesso. Tutti gli altri inlets sono fred-
di, quindi nel momento in cui ricevono un dato, messaggio o seg-
nale, lo inseriscono temporaneamente all’interno dell’oggetto, fi-
no a che lo stesso non viene processato all’attivazione dell’inlet
caldo.
Come già detto, gli oggetti insistono su dati o segnali audio.
Graficamente gli oggetti-audio si distinguono da quelli per i dati
2 il concetto di atomo è mutuato dal Lisp, un linguaggio di programmazione
orientato all’elaborazione di espressioni simboliche rappresentate sotto forma di
liste e atomi. Una lista si ha in presenza di più espressioni Lisp, un atomo
invece è una lista con una sola espressione. Per approfondire: www.diee.unica.
it/~roli/IA/Materiale%20didattico/AA0910/Lisp.pdf
17
2.2 LE scatole DI PD
counter
pack 0 0
Figura 4: l’entrata fredda riceve un dato dall’oggetto counter, ma pack
non produce alcun dato in uscita finché l’inlet caldo non
riceverà qualcosa
perché il primo atomo (ovvero il nome) termina sempre con il seg-
no della tilde (∼) e gli inlet e outlet che processano segnale sono
scuri. I cavi che trasportano segnale sono più spessi di quelli che
trasportano dati.
random 1000
osc~
dac~
Figura 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 ri-
entrante. Possono contenere stringhe di caratteri, numeri, liste
o variabili e vengono attivati con un click del mouse quando si
è in run mode oppure alla ricezione di un altro messaggio o di
particolari azioni.
18
2.2 LE scatole DI PD
questo è un messaggio
print
Figura 6: un click con il mouse sul messaggio produce un output del
messaggio stesso nella Pd window
bang E number box
Un altro modo di attivare un messaggio è quello di utilizzare
un bang, uno dei più importanti oggetti di Pd. La sua funzione
è quella di innescare un’azione o una sequenza di azioni, può
mettere in funzione un algoritmo. Si avrà modo di incontrarne
praticamente in ogni patch.
questo è un messaggio
print
Figura 7: la stessa patch precedente, con la differenza che il messaggio
viene attivato da un click del mouse sul bang
Il bang ha una sua versione grafica (si ottiene premendo all’in-
terno della patch ctrl+shift+b e una doppia versione testuale,
che permette di evitare un eccessivo uso di elementi grafici che
appesantiscono l’esecuzione dei programmi.
Un altro oggetto molto comune nelle patch di Pd è la number
box che consente di inviare messaggi numerici con il vantaggio
di poter variare i numeri all’interno della box stessa con la pres-
sione e il trascinamento del mouse verso il basso per diminuire
e verso l’alto per aumentare il numero stesso. Per comodità è
possibile stabilire eventuali minimi e massimi della number box
premendo il destro del mouse e andando sulle proprietà del-
19
2.2 LE scatole DI PD
bang grafico
bang
oggetti bang
b
Figura 8: le varie versioni del bang
l’oggetto3 . Una number box può inviare o ricevere dati attraverso
i suoi inlet.
+ 5
12
Figura 9: l’oggetto ’+’ effettua in questo caso la somma fra il numero
che entra nell’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
configurare una serie di parametri come la veste grafica o i valori consentiti
20
Parte II
DAT I
3
B A S I D I P R O G R A M M A Z I O N E C O N P U R E DATA
3.1 VARIABILI E COSTANTI
Pure Data è un linguaggio di programmazione orientato all’au-
dio, quindi al tempo. Per tale ragione i valori e le quantità pas-
sate agli oggetti sono quasi sempre variabili, interattivamente
o meno. In fase di apertura di una patch ci potranno essere
delle quantità inizializzate, ma esse all’occorrenza potranno es-
sere variate durante l’esecuzione del programma. Ne sono es-
empio i parametri passati agli oggetti dall’interno dell’objet box,
cioè gli atomi che seguono il primo (il quale, ricordiamo, da il
nome all’oggetto stesso).
Per comprendere meglio questo concetto esaminiamo la patch
che abbiamo già incontrato nella figura 9 . L’inlet di sinistra
dell’oggetto ’+’ riceve una quantità variabile che viene sommata
alla costante ’5’ definita all’interno dell’object box. Così com’è la
patch non fa altro che operare una somma fra la quantità in entra-
ta e la costante definita nell’oggetto. L’inlet destro dell’oggetto
’+’ offre però l’opportunità di variare il secondo addendo della
somma.
Esaminiamo il comportamento della patch in figura 10: se cambi-
amo il primo elemento dell’addizione senza toccare il secondo,
l’output sarà lo stesso di prima: somma del primo elemento con
5. Ora proviamo a cambiare 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’ necessario quindi dire all’oggetto ’+’ di effettuare l’-
operazione fra i due nuovi addendi e di far uscire il risultato.
22
3.1 VARIABILI E COSTANTI
10 20
+ 5
30
Figura 10: è possibile cambiare a piacimento gli addendi della somma
Nel caso di questo oggetto è sufficiente inserire nell’inlet di sinis-
tra un bang, collegato all’uscita del secondo addendo, che ordina
all’object box di far uscire il risultato immediatamente1 .
14 3
+ 5
17
Figura 11: il bang collegato all’uscita del secondo addendo, in entrata
nell’inlet sinistro dell’oggetto ’+’ rende caldo l’inlet destro
dell’oggetto stesso
E’ buona norma stabilire dei valori in fase di inizializzazione del-
la patch in modo che essa sia immediatamente funzionante alla
sua apertura. Per fare questo è sufficiente scrivere i parametri
degli oggetti all’interno delle object box. Quando questo non è
1 L’oggetto ’+’ oltre ad accettare numeri in entrata, accetta anche bang nell’inlet
di sinistra. Il bang non fa altro che dire all’oggetto di far uscire ciò che ha in
memoria, cioè il risultato dell’addizione
23
3.1 VARIABILI E COSTANTI
possibile si può ricorrere al’oggetto loadbang che attiva un bang
all’apertura della patch (figura 12).
loadbang
+ 5
12
Figura 12: all’apertura della patch si avrà come output la somma fra 7
e 12
Vi sono circostanze in cui è necessario specificare delle variabili
all’interno delle object box. Questo è possibile attraverso il sim-
bolo $n, dove n è un numero identificativo. La variabile assume
di volta in volta il valore che la message box riceve nel suo inlet
(figura 13)2 .
12
scelgo il numero $1
print
Figura 13: variabile in una message box, osservare l’output nella Pd
window
2 I simboli identificativi delle variabili devono iniziare da $1 e seguire ordinata-
mente. Se una message box ha 3 variabili $1 $2 ed $3 e riceve una lista di 3
atomi, il primo andrà nella variabile $1, il secondo nella $2, etc. . .
24
3.1 VARIABILI E COSTANTI
3.1.1 pack E unpack
Nel caso in cui una messege box contenga più di una variabile è
necessario che 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 vari-
abili devono assumere. Per realizzare tali liste esiste un oggetto
apposito chiamato pack, che mette insieme diversi valori singoli
(atomi), combinandoli in liste. Gli argomenti di pack inizializzano
il valore del relativo inlet al valore segnato. Ad esempio pack 2
19 25 avrà 3 inlet rispettivamente inizializzati con i valori 2, 19,
25. Un bang in entrata nell’inlet sinistro produrrà l’output della
lista in memoria in quel momento (fig. 14).
0 0 0
pack 20 1 2010
la data di oggi: giorno $1 mese $2 anno $3
print
Figura 14: pack: un click sul bang senza cambiare i valori delle num-
ber box produce l’uscita dei valori inizializzati. Una vari-
azione delle number box produce un output nel momento in
cui viene cambiato il valore dell’inlet di sinistra. Osservare
il risultato nella Pd window
L’oggetto unpack fa il contrario rispetto a pack: prende una lista
e ne convoglia i singoli atomi attraverso i suoi inlet.
25
3.2 GESTIONE DEL TEMPO
20 1 2010
unpack 0 0 0
20 1 2010
Figura 15: unpack: un click sulla message box produce un output in
ognuno dei tre outlet
3.2 G ESTIONE DEL TEMPO
Come detto in precedenza, Pd è un linguaggio orientato al tem-
po, quindi ci sono molti oggetti deputati alla gestione di eventi
temporali. Esamineremo alcuni di questi senza dimenticare che
la presente trattazione non può trattare di molti altri oggetti che
il programmatore scoprirà nel suo cammino3 .
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 tem-
porale fra un bang e l’altro. Per funzionare ha bisogno che sia
attivato attraverso un messaggio diverso da zero o un bang. Un
messaggio uguale a zero oppure stop, spegne l’oggetto.
UN CONTATORE
Attraverso l’oggetto metro e un altro oggetto che esamineremo in
questo paragrafo, possiamo costruire un contatore4 . La patch non
fa altro che emettere a intervalli regolari (nel nostro caso 500 ms)
3 Premendo il destro del mouse su un oggetto si può accedere all’help dello
stesso. In molti casi la pagina dell’help rimanda anche ad oggetti simili a
quello esaminato. E’ sempre utilissimo pertanto navigare fra le pagine di help
che sono uno strumento di navigazione fondamentale fra gli oggetti di Pd.
4 In generale un contatore è un dispositivo che memorizza (e a volte visualizza)
il numero di volte che un particolare evento o processo si verifica. In una
caso molto semplice, un contatore può contare i bang che riceve ed emettere il
conteggio dal suo outlet.
26
3.2 GESTIONE DEL TEMPO
1 un numero diverso da 0 o un
"bang" attivano metro
bang
0
0 o "stop" fermano metro
stop
l'inlet di sinistra consente
0
di modificare la distanza
metro 500 temporale fra i "bang"
Figura 16: metro
un numero intero a partire da zero tale che il successivo sia mag-
giore del precedente di una unità. L’algoritmo necessita di un
oggetto che permetta di conservare in memoria un numero intero.
L’oggetto che fa al caso nostro è int. L’inlet destro di int riceve
un intero e lo memorizza finché un bang nell’inlet sinistro non lo
costringe a inviarlo dall’outlet. All’apertura della patch l’oggetto
int viene inizializzato con uno zero nella sua memoria (tramite
loadbang. All’attivazione di metro, int riceve un bang nella sua
entrata calda facendo uscire zero, che viene mandato all’uscita
della patch e contemporaneamente viene sommato a 1, tramite
l’oggetto ’+’. Quest’ultimo a sua volta spedisce il 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 raggiungere un determinato valore. line ha bisogno di al-
meno due argomenti, il valore-obiettivo, cioè la quantità da rag-
giungere, e il tempo in millisecondi necessario a raggiungerlo. In
presenza di un messaggio con una lista di due numeri, line rag-
giungerà il primo nel tempo in millisecondi indicato dal secondo
(figura 18).
27
3.2 GESTIONE DEL TEMPO
0 1
metro 500
loadbang
int
+ 1
23
Figura 17: click su 1 per avviare il contatore, su 0 per fermarlo
Un oggetto molto comune in Pd è line, che generara delle rampe
per raggiungere un determinato valore. Accetta due argomenti
via message box, ovvero il valore-obiettivo e il tempo in millisec-
ondi 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 nuovo output perché si direbbe a line di creare un
percorso da 1000 a 1000 in 5 secondi. Se volessimo reinizializzare
ogni volta l’oggetto line ad esempio 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 partenza, il
secondo con il valore-obiettivo, separato dal precedente da una
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 val-
ore e il successivo (default 20 ms)
28
3.2 GESTIONE DEL TEMPO
1000 5000
line
Figura 18: line al momento della creazione è inizializzato a zero, quin-
di in questo caso al momento del click sulla message box
inizierà un percorso da 0 a 1000, completandolo in 5
secondi
0, 1000 5000
line
Figura 19: si può ricominciare la rampa da 0 a 1000 ogni volta che si
preme sulla message box
Nella figura 20 il valore-obiettivo è 2000, da raggiungere in 5
secondi. La rampa 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).
3.2.4 line MULTIRAMPA CON delay
Con gli oggetti line e delay possiamo costruire rampe multiple
in modo molto semplice. E’ sufficiente preparare tante message
box quante saranno le rampe e metterle in azione in successione
29
3.3 ARITMETICA
2000 5000
line 1000 500
Figura 20: rampa da 1000 a 2000 in 5 secondi, con step di mezzo
secondo fra un valore e l’altro in uscita
metro 1000
delay 500
Figura 21: i bang saranno intermittenti
con delay. Nel caso della patch in figura 22 c’è un oggetto grafi-
co per rappresentare le rampe, una slider orizzontale, di cui ci
occuperemo in un apposito capitolo.
3.3 A RITMETICA
Pd dispone di una serie di oggetti che consentono di effettuare
le più comuni operazioni matematiche. Abbiamo già incontrato
l’oggetto ’+’ che permette l’operazione di somma. Nel prossi-
mo paragrafo esamineremo alcuni altri oggetti per operare sui
numeri.
30
3.3 ARITMETICA
delay 1000 delay 1600
0, 127 1000 50 600 100 1500
line
Figura 22: click sul bang più in alto della patch
3.3.1 OPERATORI ARITMETICI
Gli oggetti per le operazioni aritmetiche e matematiche funzio-
nano tutti allo stesso modo, per ora ci limitiamo a darne qui un
elenco. Successivamente avremo modo di usarli massicciamente.
Operazioni aritmetiche:
• +
• -
• *
• /
• pow
Operazioni trigonometriche:
• sin
• cos
• tan
31
3.4 GENERATORI DI NUMERI CASUALI
• atan
• atan2
Operazioni sulle frazioni
• mod
• div
e molti altri...
3.3.2 expr
expr è un versatile strumento che permette di raggruppare in un
unico oggetto una serie di operazioni. Con Pd può capitare spes-
so di dover effettuare una sequenza di operazioni matematiche,
attraverso expr si possono combinare insieme in modo da non
occupare spazio e da rendere più chiara per il programmatore
la sequenza delle operazioni stesse. Per poter funzionare con
dei dati in ingresso expr necessita di simboli per rappresentare
delle variabili, che, a differenza delle variabili delle message box
si scrivono in questa forma: $xn dove x è il tipo della variabile e
n è il numero ordinale che la rappresenta (fig. 23).
Le variabili possono essere di tipo intero, decimale, simbolo e rispet-
tivamente avranno la forma $in, $fn e $sn.
3.4 G ENERATORI DI NUMERI CASUALI
Dopo i più comuni operatori matematici è utile soffermarsi su
alcuni oggetti di Pd che generano numeri casuali. Qualunque
coder prima o poi si imbatte nell’esigenza di usare numeri ca-
suali e chi usa Pd non fa eccezione. Il primo strumento che
esaminiamo è random che genera un numero casuale ogni vol-
ta che riceve un bang. Questo numero viene scelto in un range
compreso fra 0 e il numero definito nel primo argomento del-
l’oggetto meno 1. Un secondo argomento, facoltativo, imposta
il seme della sequenza. Senza volersi soffermare troppo sulle im-
plicazioni tecniche della generazione di numeri casuali, c’è da
dire quantomeno che generalmente quando si parla di genera-
tori di numeri casuali si usa un termine improprio, perché in
realtà si tratta di generazione di numeri pseudo-casuali, poiché
questi vengono generati da algoritmi. Nel caso di Pd alla base
32
3.4 GENERATORI DI NUMERI CASUALI
+ 12 expr (($f1 + 12) * 24)/(($f1 + 12) - 7)
* 24 - 7
42.6667 42.6667
Figura 23: nella parte sinistra le operazioni si succedono dall’alto ver-
so il basso, nella parte destra le stesse vengono raggruppate
da expr. Valutare i due algoritmi in parallelo con un click
sul bang
della generazione di questi numeri c’è una complessa equazione
con una serie di variabili. Il seme della sequenza generata non è
altro che una variabile di questa equazione.
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è generata con una certa probabilità potremmo usare
l’oggetto moses che consente di convogliare 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 vengono con-
vogliati dall’outlet sinistro, quelli al di sopra da quello destro.
33
3.4 GENERATORI DI NUMERI CASUALI
1 0
metro 500
random 250
Figura 24: la patch genera un numero pseudo-casuale ogni mezzo
secondo
1 0
metro 500
random 1001
/ 1000
Figura 25: la patch genera un numero pseudo-casuale compreso fra 0
e 1, con 3 cifre decimali
L’oggetto decide produce pseudo-casualmente solo sequenze di
0 e 1, mentre drunk funziona come random ma sceglie il numero
effettuando un salto che lo distanzia dal precedente al massimo
quanto stabilito nel secondo argomento (stepsize).
In figura 28 si può osservare il diverso andamento di due se-
quenze casuali. La prima, generata con random, ha una dis-
tribuzione lineare, la seconda, frutto di drunk è molto più ordinata:
gli elementi della sequenza si spostano entro un range limitato
(definito dal secondo argomento di drunk).
34
3.5 CONNESSIONI SENZA CAVI
1 0
metro 500
random 100
moses 25
Figura 26: i numeri da 0 a 24 producono un bang dall’outlet sinistro,
quelli da 25 a 99 dal destro. Volendo parlare di percentuali,
l’outlet sinistro ha il 25% di possibilità di produrre un bang,
quello destro il 75%
1 0
metro 500
drunk 100 10
80
Figura 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
3.5 C ONNESSIONI SENZA CAVI
Al fine di evitare di riempire la patch window di cavi che possono
renderne meno chiara l’interpretazione, si possono usare i due
oggetti send e receive, che permettono di creare una connessione
senza fili fra le box. L’argomento di receive è un nome identifica-
tivo che deve essere identico a quello di send. E’ possibile avere
più oggetti receive con lo stesso identificativo: tutti riceveranno
35
3.6 subpatches E abstractions
random
drunk
Figura 28: in alto la sequenza generata da random, in basso quella
creata con drunk, con una stepsize di 25
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 ar-
ticolate. In questi casi Pd mette a disposizione degli strumenti
per annidare delle porzioni di patch in box apposite. Esistono due
modi per annidare contenuti dentro tali box, il primo è quello di
creare delle subpatch, l’altro quello di creare abstraction. Le sub-
patch appaiono come delle normali object box formate dal nome
36
3.6 subpatches E abstractions
4 r numero
send numero
4
r numero
receive numero
* 2
4
8
Figura 29: connessioni senza fili
pd seguito da un nome identificativo per la subpatch, esse pos-
sono essere utilizzate solo allinterno della patch dove sono state
create o all’interno di altre subpatch della stessa patch. Le abstrac-
tion invece, pur apparendo come delle normali object box, hanno
solo un nome identificativo, ma vengono salvate indipendente-
mente dalla patch in cui vengono usate e sono riutilizzabili in
altre patch.
3.6.1 subpatch
Per creare una subpatch è sufficiente scrivere all’interno di una
nuova object box pd nome, si aprirà una nuova finestra all’interno
della quale si inserirà il contenuto della subpatch. Questa nuova
finestra si può chiudere in qualsisasi momento senza bisogno di
salvarla e riaprirla con un semplice click sulla object box in run
mode. La patch in figura 30 realizza un algoritmo attraverso il
quale vengono emessi dei bang da quattro outlet diversi, il primo
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 è identico al precedente, con l’unica differenza che è
realizzato con una subpatch. Le subpatch funzionano esattamente
come le patch solo che devono contenere al loro interno le entrate
e le uscite necessarie perché siano, nella patch, collegabili alle box
da cui ricevono dati e a cui li inviano.
37
3.6 subpatches E abstractions
metro 500
random 500
+ 1
moses 250
moses 126 moses 376
Figura 30: un semplice algoritmo senza annidamenti
pd miasubpatch
Figura 31: l’algoritmo precedente realizzato con una subpatch
Come si può vedere dalla figura 32 l’interno della subpatch del
nostro algoritmo è 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 creano i rispettivi 4 outlet per i bang. Le
subpatch possono essere modificate in qualunque momento e, so-
prattutto, possono essere duplicate a piacimento. Rappresentano
uno strumento molto comodo per rendere più leggibile e chiaro
un algoritmo nella patch window, quindi il consiglio è di usarle il
più possibile.
38
3.6 subpatches E abstractions
inlet
metro 500
random 500
+ 1
moses 250
moses 126 moses 376
outlet outlet outlet outlet
Figura 32: l’interno della subpatch con gli inlet e gli outlet
3.6.2 abstraction
Un’abstraction non è altro che una patch che può essere richia-
mata dall’interno di una patch. Anch’essa, come la subpatch con-
tiene gli oggetti inlet e outlet per creare le varie entrate e uscite
dell’object box e, a differenza della subpatch, può essere utilizzata
in qualunque patch. L’importante è che il file dell’abstraction sia
salvato con l’estensione .pd e che si trovi nella stessa directory in
cui si sta lavorando o in una delle directory definite nel Path del
programma (cap. 2.1).
Per richiamare un’abstraction è sufficiente aprire un’object box e
inserire il nome dell’abstraction senza l’estensione .pd. L’abstraction
potrà essere aperta e chiusa in qualunque momento e anche
modificata, a patto che sia salvata, ma il consiglio è di stare atten-
ti a modificare un’abstraction dall’interno di una patch: l’abstraction
risulterà modificata in tutti gli altri progetti in cui viene utilizza-
ta!
Un’abstraction può anche essere inizializzata con un argomento,
questo è possibile scrivendo l’argomento stesso (o gli argomen-
39
3.6 subpatches E abstractions
ti) dopo il nome. Il primo argomento determina il valore del-
la variabile $1, il secondo quello della variabile $2 e così via.
Queste variabili possono essere create all’interno degli oggetti
dell’abstraction, ma non dentro le message box.
myabstraction 100 1000
Figura 33: un’abstraction con due argomenti
Osserviamo la figura 33: l’oggetto myabstraction viene inizializ-
zato con due argomenti: 100 per la variabile $1, 1000 per la vari-
abile $2. Un bang mette in azione l’abstraction. Ma vediamo cosa
accade al suo interno (figura 34). I due argomenti inviati tramite
inlet
pack $1 $2
line
outlet
Figura 34: l’interno dell’abstraction
l’object box myabstraction si sostituiscono 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 millisecondi del-
l’oggetto line. Un bang ricevuto dall’inlet dell’abstraction mette in
azione line restituendo la rampa all’outlet.
40
3.6 subpatches E abstractions
3.6.3 GRAPH ON PARENT
subpatch e abstraction possono anche essere pilotate dalla patch
senza bisogno di essere aperte ogni volta ci fosse il bisogno
di cambiare un valore. In sostanza subpatch e abstraction pos-
sono diventare oggetti interattivi. Per fare questo una delle
soluzioni potrebbe essere quella di creare degli inlet aggiuntivi
nella subpatch oppure utilizzare un’altro metodo che Pd mette a
disposizione. Se nelle proprietà della subpatch (o dell’abstraction,
questo sistema funziona su entrambe), cui si accede premendo il
sinistro del mouse su un punto qualunque della subpatch window,
selezioniamo l’opzione graph on parent, comprarirà all’interno
della subpatch stessa un riquadro all’interno del quale possiamo
mettere ciò che vogliamo sia visibile dalla patch genitrice. Gli
oggetti consentiti sono essenzialmente GUI’s, quindi number box,
sliders, radio button etc. . .
1 0
pd submetro
regola_metro
301
Figura 35: Una subpatch con una number box in graph on parent
Nel caso della figura 35 la subpatch submetro contiene un oggetto
metro con una 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.
41
3.6 subpatches E abstractions
inlet
regola_metro
301
metro 500
outlet
Figura 36: l’interno della subpatch. Per creare il riquadro di visibil-
ità basta andare sulle proprietà della subpatch e selezionare
l’opzione graph on parent
42
4
V E T TO R I , G R A F I C I E TA B E L L E
4.1 V ETTORI
Un vettore (in inglese array) è un oggetto che permette di con-
servare e manipolare comodamente una grande quantità di dati.
Può essere pensato come un contenitore di locazioni di memoria,
identificate da un indice, attraverso il quale è possibile accedere
alla locazione desiderata. I vettori in Pd sono rappresentati da
grafici bidimensionali che hanno sull’ascissa l’indice e sull’ordi-
nata il valore corrispondente. Si tratta sempre di vettori monodi-
mensionali che gestiscono collezioni di numeri interi, decimali o
di segnale (ma di questi ultimi ci occuperemo in seguito) quin-
di l’indice è un intero che identifica una e una sola posizione
in memoria. Nel linguaggio C i vettori monodimensionali ven-
gono definiti, come le variabili, in questo modo:
int i[4] = {5, 2, 7, 3}
che crea il vettore i di tipo intero di 4 elementi. Immediatamente
dopo riempie il vettore con i valori interi 5, 2, 7, 3. In Pd questo
vettore viene rappresentato come in figura 37.
Ricordiamo che l’indice di un vettore inizia da 0, quindi un vet-
tore di 4 elementi avrà un indice che va da 0 a 3. Un array in
Pd si crea dal menu Put/Array. Se premiamo col destro del
mouse sul grafico possiamo accedere alle proprietà dell’array,
dove possiamo impostare la dimensione del grafico e del vettore.
Osserviamo dalla figura 37 le seguenti cose:
1. all’interno del grafico ci sono delle barrette orizzontali che
rappresentano le coordinate (x, y) degli elementi
43
4.1 VETTORI
i
10
0
0 1 2 3
Figura 37: vettori: sull’asse delle ascisse c’è l’indice, sull’ordinata il
valore
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 range dell’ordinata, quindi dei valori che può assumere
ogni elemento dell’array
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 di una message box per un vettore è la seguente:
;
nome_vettore (comando) argomenti
Si possono scrivere esplicitamente i singoli valori inserendo
nella message box l’indice del primo elemento da scrivere
seguito da tutti i valori da inserire nel vettore. Si possono
44
4.1 VETTORI
possono produrre i valori del vettore attraverso una fun-
zione trigonometrica come sinesum (somma di seni), segui-
ta dal numero degli elementi del vettore e dal valore di og-
ni curva sinusoidale (compreso fra 0 e 1), oppure cosinesum,
uguale alla precedente, ma che genera una cosinusoide o
una somma di cosinusoidi. Si possono inoltre leggere i
dati richiamandoli da un file di testo con il comando read
seguito dal nome del file che contiene di dati (figura 38).
- con oggetti speciali che scrivono i dati all’interno dei vet-
tori. L’oggetto tabwrite scrive valori all’interno di un vet-
tore. Nell’inlet di sinistra entrano i valori, in quello di de-
stra i relativi indici. Il messaggio set in entrata a sinistra de-
termina il nome dell’array sul quale operare, nome che può
anche essere inserito nell’oggetto come argomento, subito
dopo il nome (figura 39).
Nella patch della figura 39 until provoca l’uscita di una sequenza
di 32 bang che vengono numerati da un contatore, che a sua vol-
ta li spedisce all’inlet destro di tabwrite (l’indice dell’array). Con-
temporaneamente i bang producono 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 un range com-
preso fra -1 e 1, che rappresentano i valori minimi e massimi del
grafico del vettore.
Punti 2-4. L’interfaccia del vettore, il grafico, può presentare an-
che elementi come un etichetta che rappresenta l’ordinata e uno
che rappresenta l’ascissa. Questi elementi si possono aggiungere
tramite message box secondo le seguenti sintassi:
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 co-
mando. Per verificare il funzionamento di questi comandi si
copi il codice della figura 40, che mostra un vettore di 100 punti,
con range da -1 a 1.
45
4.1 VETTORI
;
i resize 4
i 0 0.5 0.75 -0.6 0.1
;
i sinesum 32 0.5
;
i cosinesum 32 0.25 0.5 0.25
Figura 38: attivare le tre message box con un click e verificarne il risul-
tato sul grafico. Il comando resize ridimensiona il vettore
secondo quanto indicato dal suo argomento, in questo caso
32
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 interpolati (polygon) cioè singoli punti uniti da una
linea che traccia il percorso più breve fra punti adiacenti, infine
come curva di bézier (bezier) che addolcisce gli spigoli (figura 41).
4.1.1 LEGGERE UN VETTORE
Un vettore può essere letto e utilizzato per processare altri dati.
Uno degli oggetti che permettere di leggere i dati di un vettore
è tabread che ha un unico inlet che riceve l’indice del valore da
46
4.1 VETTORI
i
1
-1
32
until
int 1 + 1
randomF 2
- 1
tabwrite i
Figura 39: click sulla message box in alto e verificare il risultato sul
grafico
restituire. Nella figura 42 tabread legge 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 tabread mod-
ifica la dimensione di un bang e il movimento dell’indicatore di
una slider verticale.
47
4.1 VETTORI
i
1
-1
0 100
; ;
i xlabel -1.2 0 100 i xlabel hide
; ;
i ylabel -5.5 -1 0 1 i ylabel hide
; ;
i xticks 0 2 10 i xticks hide
; ;
i yticks 0 0.1 5 i yticks hide
Figura 40: click sulle message box per aggiungere o rimuovere le
etichette
4.1.2 L’ OGGETTO table
L’oggetto table è simile ad un normale oggetto array con l’unica
differenza che crea il grafico in una subpatch invece che nella
patch window dove viene creato l’oggetto. Il primo argomento
è il nome dell’array, il secondo, opzionale è la sua dimensione.
E’ inoltre possibile mandare messaggi al vettore, con i consueti
metodi visti nei paragrafi precedenti.
48
4.1 VETTORI
i punti i polygon
i bezier
Figura 41: le tre diverse rappresentazioni di un vettore di 16 punti
i reset
16
s reset until
0
0
int + 1
1 0 tabwrite new
new
metro 1000
r reset
int 0 + 1
mod 16
t i i sel 15
tabread i $1 950
0, $1 950 line
line size $1
tabwrite new
Figura 42: click sulle message box per aggiungere o rimuovere le
etichette
49
5
P R O G R A M M A Z I O N E AVA N Z ATA
5.1 I STRUZIONI CONDIZIONALI
Nella logica della programmazione le istruzioni condizionali sono
gli strumenti che permettono di verificare se una data condizione
sia vera o falsa1 . In Pd, come nella maggior parte degli altri lin-
guaggi di programmazione, esistono degli oggetti e dei costrutti
sintattici che permettono di verificare una condizione e di es-
eguire delle operazioni al verificarsi di determinate situazioni.
Tutti queste istruzioni possono essere raccolte e combinate in
algoritmi di selezione.
5.1.1 OPERATORI RELAZIONALI
Gli operatori relazionali consentono di confrontare due valori fra
loro, quindi sono binari. Come nel linguaggio C producono un
output uguale a 1 se la condizione richiesta dall’operatore re-
lazionale è soddisfatta, uguale a 0 in caso 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 mon-
do dell’informatica i suoi modelli. La primitiva fondamentale dell’informatica,
il bit, può infatti assumere il valore di 1 o 0, acceso o spento, vero o falso.
50
5.1 ISTRUZIONI CONDIZIONALI
> 10
Figura 43: L’output di ’>’ restituisce 0 finché il numero in entrata è
minore o uguale a 10, 1 quando diventa maggiore di 10
5.1.2 select
select (forma abbreviata: sel) opera una selezione sugli atomi in
entrata confrontandoli con i suoi argomenti. Se la condizione
è soddisfatta select emette un bang dall’outlet corrispondente, in
caso contrario spedisce fuori l’atomo in entrata dall’ultimo outlet
a destra.
5 123 10
sel 10
Figura 44: select
select può selezionare più atomi, in tal caso avrà tanti outlet quan-
ti saranno gli atomi da valutare, più uno, da cui farà uscire gli
atomi che non soddisfano la selezione (figura 45).
Con gli operatori relazionali e select realizziamo un algoritmo
che opera una selezione su dei numeri. Quando la selezione
è soddisfatta e select emette 1, verrà attivata una rampa con
l’oggetto line (figura 46).
51
5.1 ISTRUZIONI CONDIZIONALI
123
10
sel 10 4
Figura 45: select con più selezioni
20 32 69
> 50
sel 1
0, 127 2000
line
Figura 46: valutare l’algoritmo con un click sulle 3 message box in alto
Se volessimo modificare questo algoritmo in modo da operare
una verifica su una rampa invece che su valori singoli, avremmo
bisogno di uno strumento che individui il superamento di una
soglia. L’oggetto che fa al caso in questione è change, che filtra le
ridondanze in un flusso in entrata. Ad esempio se in change entra
per 10 volte consecutive il numero 1, emetterà 1 solo alla prima
52
5.1 ISTRUZIONI CONDIZIONALI
entrata. Combinando così ’>’ e change possiamo soddisfare la
nostra richiesta.
0, 100 2000
line
100
> 50
change
sel 1
0, 127 2000
line
Figura 47: click sulla message box in alto
Esaminiamo la patch in figura 47: all’attivazione della rampa, in-
izia il cammino 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 ripetizioni successive, consentendo l’usci-
ta solo del primo 1, attivando così il selettore sel 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 ver-
ità dell’algebra booleana2 . In Pd ci sono operatori che operano
2 Le tavole di verità sono tabelle usate nella logica per determinare se, attribuiti
i valori di verità alle proposizioni che la compongono, una determinata
proposizione è vera o falsa.
53
5.1 ISTRUZIONI CONDIZIONALI
al livello di bit e altri che operano sui numeri decimali. Nel
primo caso i numeri interi decimali ricevuti dagli operatori logi-
ci vengono trasformati nella loro forma binaria e ogni 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 regole della tavola di verità illustrate nella tabella 1.
a b a∧b
0 0 0
0 1 0
1 0 0
1 1 1
Tabella 1: tavola di verità per l’operatore AND
Se volessimo realizzare un AND sugli interi 21 e 6, ’& ’ oper-
erebbe nel modo illustrato nella tabella 2.
21 = 1 0 1 0 1 ∧
6 = 0 0 1 1 0 =
4 = 0 0 1 0 0
Tabella 2: operazione AND su gli interi 21 e 6
L’operatore OR (in Pd ’|’) agisce allo stesso modo ma seguendo
le regole della tavola di verità dell’OR booleano (tabella 3).
a b a∨b
0 0 0
0 1 1
1 0 1
1 1 1
Tabella 3: tavola di verità per l’operatore OR
In relazione a questi due operatori ci sono due oggetti (’&& ’ e
’||’) che confrontano due valori (interi o decimali) producendo
come risultato lo stesso delle tavole di verità su citato. Ad esem-
pio ’&& ’ restituisce 1 se e solo se entrambi i valori sono diversi
54
5.1 ISTRUZIONI CONDIZIONALI
t b b
21 6
&
Figura 48: l’operatore AND in azione in una patch di Pd
t b b
41 22
63
Figura 49: l’operatore OR
da zero, mentre restituisce 0 se uno dei due valori o entrambi
sono uguali a zero (tabella 1).
Altri due operatori che lavorano a livello di bit sono ’«’ e ’»’, che
potremmo chiamare rispettivamente scivola a sinistra e scivola a
destra. Il primo, ad esempio, converte l’intero che riceve nel suo
inlet sinistro nella sua forma binaria e aggiunge a destra tanti bit
uguali zero quanti sono richiesti dall’inlet di destra. Nella tabella
4 c’è un esempio con il numero 113 da spostare a sinistra di due
posizioni.
55
5.1 ISTRUZIONI CONDIZIONALI
10 10
&&
Figura 50: l’operatore ’&& ’ confronta due valori in base alla tavolà di
verità per AND
113 = 1 1 1 0 0 0 1 <<
2 =
452 = 1 1 1 0 0 0 1 0 0
Tabella 4: scivola a sinistra di due posizioni
t b b
113 2
<<
452
Figura 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 affrontare il costrutto if. Pd non dispone di un oggetto if, ma
consente di usare questo comando all’interno dell’oggetto expr
che abbiamo già incontrato (sezione 3.3.2). Nei comuni linguag-
56
5.2 loops E ITERAZIONI
gi di programmazione l’istruzione if valuta un’espressione, se
vera restituisce un certo risultato, se falsa ne restituisce un altro.
Nel linguaggio C la sintassi del costrutto if è la seguente:
i f ( espressione )
f a i una c e r t a cosa ;
else
fanne un ’ a l t r a ;
che significa: Se l’espressione è vera fai una certa cosa, altrimen-
ti fanne un’altra. In Pd invece la sintassi è:
if (espressione, a se vera, b se falsa)
expr if ($f1 < 10, $f1 * 5, 10)
Figura 52: se il numero in entrata è minore di 10 espr restituisce il
numero stesso moltiplicato per 5, altrimenti restituisce 10
5.2 loops E ITERAZIONI
Le iterazioni in Pd si possono gestire in molti modi. General-
mente un’iterazione nei linguaggi di programmazione è la ripe-
tizione di un evento fino all’uscita dall’evento stesso, determi-
nata dal verificarsi di una certa condizione. In Pd un’iterazione
può essere l’emissione di un bang ogni mezzo secondo per un nu-
mero definito di volte. Come sappiamo metro genera bang a ripe-
tizione, finché non viene spento. E’ semplice quindi inserire un
contatore che si occupa di contare i bang usciti e appena raggiun-
go il valore desiderato si occupa di spegnere metro. Osserviamo
la patch in figura 53.
Pd implementa anche l’oggetto until che emette un numero di
bang definito da un numero in entrata nel suo inlet sinistro. A
57
5.2 loops E ITERAZIONI
1 0
metro 500
loadbang
float + 1
0 sel 9
Figura 53: la patch produce 10 bang attraverso un oggetto metro
controllato da un contatore e da un selettore
differenza della patch in figura 53 until non è orientato al tempo
ma opera quasi istantaneamente come nei tradizionali linguaggi
di programmazione. In effetti until funziona secondo lo schema
classico di un ciclo for del C:
f o r ( i = 0 ; i < 1 0 0 ; i ++)
espressione ;
che significa: finché il contatore, partito da 0 non arriva a 99, va-
luta l’espressione. Se l’espressione fosse un ordine di stampare
il valore della variabile-contatore avremmo:
f o r ( i = 0 ; i < 1 0 0 ; i ++)
p r i n t f ("%d " , i ) ;
Nella figura 54 si vede la patch di Pd che fa la stessa cosa.
58
5.2 loops E ITERAZIONI
100
until
loadbang
int + 1
print
Figura 54: ciclo until: valutare l’algoritmo con un click sulla message
box in alto e osservare il risultato nella Pd window
59
6
OGGETTI GUI
Nel corso dei nostri primi esperimenti abbiamo già avuto modo
di incontrare alcuni oggetti grafici, che nell’ambito del mondo
informatico sono dette GUI (graphical user interfaces). Pd mette a
disposizione un certo numero di GUI’s, alcuni nativi, cioè facen-
ti parte del pacchetto standard del programma, altri derivati da
librerie esterne, la maggior parte delle quali sono caricate nel-
la versione extended. Genericamente possiamo dire che tutte le
GUI di Pd possono essere configurate tramite le properties, acces-
sibili 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à
moltissime volte. toggle invece è un oggetto molto utile che
permette di restituire 1 quando è attivo, 0 quando è disattivo.
Praticamente è una variabile binaria che si attiva con un click
del mouse. Quando è attivato mostra una croce all’interno del
quadrato che la costituisce (figura 55).
60
OGGETTI GUI
Pd offre due tipi di slider, che sono delle leve attivabili con il
mouse o da altri oggetti. Fra le due non c’è alcuna differenza
se non nel fatto che un tipo è verticale, l’altro orizzontale. Dalle
proprietà si può impostare la dimensione, ma soprattutto il range
dell’output.
1 0
metro 500
int 1 + 1
mod 2
sel 0
Figura 55: l’oggetto toggle
Nella figura 55 il toggle più grande attiva un oggetto metro che a
sua volta manda dei bang a un contatore che attraverso l’oggetto
mod conta solo da 0 a 1, quando è 0, il bang (grazie all’oggetto sel)
esce da sinistra, quando è 1 esce a destra. Nella figura successiva
invece (fig. 56) lo slider verticale di sinistra pilota gli altri due:
quello di destra attraverso expr effettua il movimento contrario,
mentre quello di sotto si muove in parallelo, ma sommato a un
movimento continuo generato dall’algoritmo a sinistra. metro at-
tiva un contatore da 0 a 1. Il valore in uscita viene moltiplicato
per un altro valore che va da 0 a 20, gestito dallo slider princi-
pale. Il prodotto di questi due fattori diventa il valore-obiettivo
dell’oggetto line che crea il movimento dello slider in basso. C’è
da notare che ci sono due oggetti ’r’, cioè receive, ma non c’è
61
OGGETTI GUI
r slide
metro 100
expr ($f1 / 127) * 20
int 1 + 1
mod 2
r slide
* 10 manovrare_da_qui expr (127 - $i1)
$1 90
line
Figura 56: lo slider verticale a sinistra pilota gli altri due
nessun send! Le GUI infatti possono mandare o ricevere messag-
gi senza bisogno di creare oggetti e supplementari. Possiedono
degli oggetti send e receive incorporati che possono essere impo-
stati dalle properties della GUI stessa.
I radio button sono oggetti formati da barrette orizzontali o ver-
ticali costituite da caselle ordinate. L’uscita è il numero della
casella a partire da quella più a sinistra nel caso di radio button
orizzontali, e da quella più in alto nel caso di verticali. Ricor-
diamo che il conteggio inizia dallo 0, quindi un radio button di
62
6.1 ALTRE GUI DALLE LIBRERIE DI PD
16 elementi, avrà un output che va da 0 a 15. In figura 57 due ra-
dio button disegnano un grafico. Unica annotazione, i valori del
radio button verticale vengono invertiti per consentire un migliore
adesione al grafico, così il primo valore in alto diventa 9 in luogo
di zero, il secondo 8 invece che 1, etc. . . .
Della GUI VU-meter avremo modo di scrivere nella parte che
riguarda l’audio, mentre possiamo ora accennare alle canvas che
sono oggetti semplici che servono a connotare graficamente le
nostre patch in modo da caratterizzare con i colori alcune zone
della finestra. Possono essere utili in patch molto articolate dove
c’è bisogno di rendere riconoscibili le varie parti dell’algoritmo.
Infine l’oggetto number2 è molto simile alla normale number box
con qualche possibilità in più di configurazione grafica.
6.1 A LTRE GUI DALLE LIBRERIE DI P D
Oltre alle GUI native che abbiamo appena discusso, diamo ora
una panoramica 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 emettono la posizione del mouse (x, y) dai due outlet alla
pressione di quest’ultimo. knob è la classica manopola tipo sin-
tetizzatore analogico. Ha un’unica uscita che emette l’output nel
range impostato nelle properties. Infine l’oggetto envgen è un en-
velope generator che emette dati in un formato compatibile con la
versione audio di line, cioè line∼ , del quale tratteremo appro-
fonditamente nella parte di questo manuale dedicata all’audio.
Prima di concludere questo capitolo, va ricordato che l’uso mas-
siccio di GUI nelle patch è sconsigliato. La grafica vettoriale che
sta alla base di tali oggetti può rallentare la capacità di calcolo
quindi quando è possibile evitarne l’uso, si eviti. Ad esempio
in luogo dei bang grafici si cerchi di usare l’oggetto relativo bang
63
6.1 ALTRE GUI DALLE LIBRERIE DI PD
array1
r ordinata
expr (9 - $i1) r ascissa
tabwrite array1
Figura 57: impostare prima l’indice (radio button) orizzontale, poi il
valore con quello verticale
o ’b’. Non è importante la bellezza estetica di una patch quanto
la sua chiarezza, quindi è meglio evitare troppi oggetti grafici e
64
6.1 ALTRE GUI DALLE LIBRERIE DI PD
abbondare, al contrario, di subpatches e annidamenti.
65
7
L I S TA D E G L I O G G E T T I P E R M A N I P O L A R E DAT I
66
Parte III
AUDIO
8
L ’A U D I O D I G I T A L E
8.1 L’ OSCILLATORE
Il suono più semplice che può essere prodotto sinteticamente è
quello generato da un oscillatore. Nel mondo analogico un oscil-
latore è un circuito che genera forme d’onda di vari tipi, anche
se generalmente se non si specifica altro si parla di oscillatore
intendendo un generatore di onde sinusoidali.
Un’ onda sinusoidale è un’onda generata da una funzione sinu-
soidale (vedi fig. 58), che si può esprimere tramite la formula:
y = A sin(2π f x + φ)
dove A è l’ampiezza dell’onda, tipicamente impostata ad 1, quin-
di i valori della funzione oscillano fra 1 e -1, 2π f = 2π τ è la
frequenza angolare che indica quanti periodi ci sono in un in-
tervallo di 2π, f = τ1 è la frequenza, che indica quante volte la
funzione si ripete nell’unità di tempo, φ è la fase, cioè lo scarta-
mento che la funzione subisce, ovvero il parametro che permette
di anticipare o ritardare i valori della funzione1 .
Per produrre una sinusoide con un calcolatore è necessario fare
uso di un oscillatore digitale, un algoritmo che produca i valori
della funzione sinusoidale, ossia delle ampiezze dell’onda. A dif-
ferenza di un segnale elettrico, che è continuo, il calcolatore può
solo produrre segnali discreti, quindi l’oscillatore digitale calcola i
valori della funzione il numero delle volte indicato dalla frequen-
za di campionamento. Ad esempio se la frequenza di campiona-
mento è 44100 hertz, l’oscillatore calcola i valori della funziona
44100 volte al secondo. Questa frequenza di campionamento
1 http://it.wikipedia.org/wiki/Sinusoide
68
8.1 L’OSCILLATORE
Parametri di una sinusoide
2
1
1
ampiezza
0
0
−1
−1
−2
−2
tempo
Figura 58: il grafico di una funzione sinusoidale
approssimerà la forma d’onda desiderata, pur non riuscendo a
costruirne una identica a quella analogica (fig. 59).
In Pd l’oscillatore digitale è implementato nell’oggetto osc∼.
Nella patch in figura 60 l’oscillatore produce una sinusoide di 440
hz che l’oggetto dac∼ converte in segnale analogico, in modo da
poter essere inviata agli altoparlanti.
In genere comunque oscillatori digitali non calcolano i valori del-
la funzione sinusoidale in tempo reale, ma usano un sistema che
rende le cose più veloci. Piuttosto che fare 44100 calcoli di fun-
zioni sinusoidali al secondo è preferibile leggere delle tabelle che
hanno i valori di una funzione sinuoidali già pronti. Piuttosto
che calcolare, leggere dei dati è un’operazione molto più rapida.
Nella wavetable quindi c’è l’elenco dei valori di ampiezza indiciz-
zati di un ciclo di forma d’onda, l’oscillatore non deve fare altro
che leggerli uno ad uno, iniziando dal primo (0) fino all’ultimo.
La tabella può avere dimensioni arbitrarie: più è alto il numero
dei punti più accurata è l’onda risultante. In figura 61 è mostra-
ta la rappresentazione grafica di una wavetable: sull’asse delle
ascisse c’è l’indice, su quella delle ordinate il valore di ampiez-
za. Nella memoria del vettore 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), . . .
69
8.1 L’OSCILLATORE
Sinusoide digitale
1.0
1.0
0.5
0.5
ampiezza
0.0
0.0
−0.5
−0.5
−1.0
−1.0
tempo
Figura 59: il grafico di una funzione sinusoidale prodotta da un
calcolatore
L’oggetto osc∼ legge una cosinusoide scritta in una wavetable
di 512 punti. La cosinusoide graficamente è identica ad una
sinusoide, con l’unica differenza che la sinusoide ha come primo
valore 0, mentre la cosinusoide 1, quindi è sfasata rispetto alla
prima di π2 (vedi fig. 62).
L’oggetto tabosc4∼ implementa un lettore di wavetable gener-
iche, dove è possibile disegnare una forma d’onda qualunque e
sceglierne la dimensione. Di tale oggetto si farà larghissimo uso
nelle sezioni successive del presente manuale.
8.1.1 FREQUENZA E AMPIEZZA DEL SEGNALE
L’onda sinusoidale è un’onda periodica perché la sua forma si
ripete identica ad intervalli di tempo regolari. Il periodo è quindi
il tempo necessario affinché l’onda compia un intero ciclo. Le
oscillazioni dell’onda si alternano fra il campo positivo e quello
negativo. Se prendiamo come punto di riferimento il picco positi-
vo dell’onda, la lunghezza d’onda sarà la distanza (λ) fra tale picco
e il successivo. Questo valore è inversamente proporzionale al-
la frequenza dell’onda, maggiore sarà λ, minore sarà la frequenza,
70
8.1 L’OSCILLATORE
osc~ 440
dac~
Figura 60: l’oscillatore di Pd
0 1 2 3 4
Wavetable
5 6 7 8 9 10
1.0
1.0
●
● ●
● ●
● ●
0.5
0.5
● ●
ampiezza
0.0
0.0
● ●
−0.5
−0.5
0 1 2 3 4 5 6 7 8 9 10
index
Figura 61: una cosinusoide
ovvero il numero di cicli completi dell’onda per secondo. Questo
valore si misura in hertz (vedi fig. 63).
Perché generi un segnale udibile dall’orecchio umano, l’onda
deve avere una frequenza compresa circa fra 20 e 20000 hertz.
Tale range costituisce la banda udibile.
Quando si parla genericamente dell’ampiezza del segnale si in-
tende invece il picco massimo di ampiezza raggiunto dall’onda,
cioè la distanza maggiore dal punto di quiete (ovvero zero). Più
specificamente si tratta dell’ampiezza di picco dell’onda, mentre
si parla di ampiezza istantanea quando si tratta di un campione
qualsiasi dell’onda. La massima ampiezza di un segnale è 1,
71
8.1 L’OSCILLATORE
Cosinusoide
1.0
1.0
0.5
0.5
ampiezza
0.0
0.0
−0.5
−0.5
−1.0
−1.0
tempo
Figura 62: una cosinusoide
Parametri di una sinusoide
2
2
τ ➤ λ
➤❘
➤❘
❘
➤
❘
1
1
➤ ❘
ampiezza
A
➤ ❘
0
0
−1
−1
−2
−2
tempo
Figura 63: parametri di una forma d’onda. A = ampiezza, τ = periodo,
λ = lunghezza d’onda
superato tale limite il segnale distorce.
La frequenza è responsabile della percezione dell’altezza, mentre
l’ampiezza dell’intensità del segnale.
72
8.1 L’OSCILLATORE
8.1.2 osc∼
L’object box osc∼ implementa un oscillatore digitale. Accetta
come argomento interno la frequenza (fig. 60) il cui valore può an-
che essere variato dall’inlet di sinistra (fig. 64). Come vedremo
successivamente oltre che dati, l’inlet di sinistra accetta anche
segnali per controllare la frequenza.
242
osc~ 200
dac~
Figura 64: l’oggetto osc∼ con frequenza controllata da una number box
Nella patch in figura 65 un oggetto line permette di realizzare
un glissando, cioè uno scivolamento da una frequenza ad un’altra,
facendo udire tutte le frequenze intermedie. In questo caso il
glissando parte da 20 hz e giunge a 1000 hz in 5 secondi.
20, 1000 5000
line
osc~ 20
dac~
Figura 65: la realizzazione di un glissando con l’oggetto line
Volendo invece intervenire sull’ampiezza del segnale, è neces-
sario utilizzare un moltiplicatore, come un oggetto *∼, per molti-
plicare l’ampiezza istantanea del segnale per un fattore costante
73
8.1 L’OSCILLATORE
(o variabile). In figura 66 l’oggetto *∼ moltiplica per 0.5 il seg-
nale in entrata, dimezzandone l’ampiezza. L’ampiezza di picco
del segnale in uscita sarà quindi di 0.5. In figura 67 è mostrata
un’onda con ampiezza di picco 1, e una con ampiezza di picco
0.5.
osc~ 440
*~ 0.5
dac~
Figura 66: la realizzazione di un glissando con l’oggetto line
Come per la frequenza, si può controllare l’ampiezza interattiva-
mente, con dati o segnali di controllo. Nel caso in figura 68 una
slider verticale emette valori compresi fra 0 e 1, i quali entrano in
line. line emette i valori in entrata scivolando con rampe di 20 mil-
lisecondi fra un valore e il precedente per evitare che l’ampiezza
cambi troppo repentinamente producendo un effetto scalino.
8.1.3 tabwrite∼
Un oggetto molto utile è tabwrite∼ che consente di scrivere i
valori di un segnale in una tabella. In questo caso lo utilizzi-
amo per mostrare la forma d’onda di un segnale al variare del-
l’ampiezza e della frequenza. In figura 69 l’oggetto tabwrite∼
scrive i valori ricevuti in una tabella (amp) ogni volta che riceve
un bang. metro emette un bang ogni 100 millisecondi producen-
do l’impressione dell’onda in movimento. Gli oggetti send∼
e receive∼ sono come send e receive per i dati, ma inviano e
ricevono segnale.
8.1.4 LA RAPPRESENTAZIONE DEL SUONO
Attraverso l’oggetto tabwrite∼ possiamo avere una rappresen-
tazione del segnale nel dominio del tempo, ovvero in ogni is-
tante di tempo viene disegnato un punto in corrispondenza del-
74
8.1 L’OSCILLATORE
1.0
1.0
0.5
0.5
a)
0.0
0.0
−0.5
−0.5
1.0 −1.0
1.0 −1.0
0.5
0.5
b)
0.0
0.0
−0.5
−0.5
−1.0
−1.0
Figura 67: la realizzazione di un glissando con l’oggetto line
amp
osc~ 440
*~ 0.5
dac~
$1 20
line
Figura 68: la realizzazione di un glissando con l’oggetto line
l’ampiezza del segnale. Il risultato di tale operazione permette
di visualizzare la forma d’onda.
In figura 70 è rappresentato un ciclo di un’onda periodica comp-
lessa, formata dalla somma di 3 sinusoidi. Come già detto ques-
75
8.1 L’OSCILLATORE
amp
883
r~ sig
metro 100
osc~ 440
tabwrite~ amp
*~ 0.5 amp
dac~
$1 20
send~ sig
line
Figura 69: la realizzazione di un glissando con l’oggetto line
ta rappresentazione mostra l’ampiezza in funzione del tempo,
ma non da alcuna informazione riguardo la frequenza del seg-
nale. Per ottenere informazioni su un suono complesso è neces-
sario scomporlo nelle sue componenti semplici e rappresentare
ogni singola frequenza. Attraverso algoritmi che operano tali
scomposizioni è possibile analizzare lo spettro di un suono, cioè
la sua rappresentazione nel dominio della frequenza. L’analisi
dello spettro può essere visualizzata in modi molto diversi, anche
se fondamentalmente ci sono 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. 71) si ha un grafico bidimensionale nel quale
vengono rappresentate la frequenza e l’ampiezza del suono in
un dato momento. Questa rappresentazione ha il limite di non
poter dare una visione del suono nella dimensione temporale,
ma si riferisce ha un istante di tempo oppure ad un suono che
non varia in funzione del tempo. L’invariabilità del suono in
funzione del tempo esiste solo nei segnali prodotti digitalmente
(probabilmente nemmeno un suono elettrico analogico resta sem-
pre identico a se stesso). Nel mondo reale i suoni variano contin-
uamente, quindi una rappreentazione che non tenga conto della
funzione tempo ha valore solo in determinate circostanze.
76
8.1 L’OSCILLATORE
Rappresentazione della forma d’onda
0.5
0.5
ampiezza
0.0
0.0
−0.5
−0.5
tempo
Figura 70: forma d’ondarisultante dalla somma di 3 sinusoidi
Spettrogramma ampiezza/frequenza
ampiezza
0 100 200 300 400 500 600 700 800 900 1000
frequenza
Figura 71: analizzatore di spettro bidimensionale, sull’asse delle as-
cisse c’è la frequenza, su quella delle ordinate l’ampiezza.
Il suono è costituito dalla somma di onde di frequenza pari
a 400, 700 e 800 hz
77
8.2 LE FORME D’ONDA
Gli analizzatori del secondo tipo permettono di dare una vi-
sione più dettagliata e pertinente del suono perché rappresen-
tano l’ampiezza e la frequenza in funzione del tempo. La ne-
cessità di rappresentare 3 parametri obbliga ad usare un grafi-
co tridimensionale oppure a gestire uno dei tre parametri in
modo diverso. Nel caso mostrato in figura 72 c’è il tempo sul-
l’asse delle ascisse e la frequenza su quella delle ordinate, men-
tre l’ampiezza è rappresentata dal colore delle linee: nero per
la massima ampiezza e varie tonalità di grigio per ampiezza
minore, fino al bianco, quando c’è assenza di suono.
Spettrogramma ampiezza/frequenza/tempo
1000
1000
800
800
frequenza
600
600
400
400
200
200
0
0
tempo
Figura 72: l’ampiezza delle sinusoidi è rappresentata dal-ìintensità del
colore delle linee
8.2 L E FORME D ’ ONDA
Oltre alla forma d’onda più semplice, quella sinusoidale, che ab-
biamo esaminato nella sezione precedente, esistono altre forme
d’onda periodiche. Il numero di esse è teoricamente infinito, an-
che se esistono alcune forme d’onda classiche che si possono ot-
tenere dalla somma di sinusoidi semplici in rapporto armonico
fra loro.
Forme d’onda classiche sono l’onda quadra, l’onda triangolare e
l’onda a dente di sega che esamineremo fra poco.
78
8.2 LE FORME D’ONDA
8.2.1 tabosc4∼
Nella sezione 8.1 abbiamo menzionato l’oggetto tabosc∼ che
legge la forma d’onda da una tabella-vettore. Questo oggetto ci
permette di trasformare in segnale dei vettori che contengono
forme d’onda diverse dalla sinusoide ordinaria. Per mettere in
funzione tabosc∼ è necessario:
- creare un vettore di 2n + 3 punti
- 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’oscil-
latore
Per i primi due punti si rimanda al capitolo 4. Per il resto si
esamini la patch in figura 73: l’oggetto tabosc∼ legge i dati dal
vettore chiamato sinead una frequenza di 400 hz e invia tutto
a dac∼, ma anche a tabwrite∼ che mostra la forma d’onda
ottenuta.
Nei prossimi paragrafi mostreremo l’uso di tabosc∼ per forme
d’onda diverse.
8.2.2 ONDA QUADRA
Quella quadra è una forma d’onda che alterna solo due valori,
generalmente 1 e -1, ma anche 1 e 0 se si usa come segnale di
controllo.
Secondo il Teorema di Fourier, un qualsiasi suono complesso pe-
riodico può essere ottenuto dalla somma di sinusoidi in rappor-
to armonico fra loro. Come abbiamo imparato dal capitolo sui
vettori (4 possiamo disegnare in un vettore una forma d’onda
ottenuta dalla somma di sinusoidi tramite il comando sinesum.
L’onda quadra si ottiene dalla somma degli armonici dispari
con ampiezza inversamente proporzionale al numero d’ordine
dell’armonico, schematizzando:
L’oggetto tabosc4∼ può essere usato per implementare un’onda
quadra scritta in un vettore tramite il comando sinesum. E’ suf-
ficiente usare una message box con il comando sinesum e scrivere
tutti i valori di ampiezza delle varie armoniche. In alternativa
79
8.2 LE FORME D’ONDA
frq sine
0
tabosc4~ sine
amp
$1 20
wave
line
*~
start
metro 100
dac~ tabwrite~ wave
Figura 73: l’uso di tabosc∼ per leggere un vettore con una forma
d’onda sinusoidale
arm 1 arm 2 arm 3 arm 4 arm 5 arm 6 arm 7
1 1 1
1 0 3 0 5 0 7
è possibile costruire un algoritmo per disegnare la forma d’on-
da nel vettore. In figura 75 ci sono 3 forme d’onda diverse, due
realizzate con il comando sinesum, una con un algoritmo. Il risul-
tato visivo sono 3 onde diverse, le prime sono due forme d’onda
quadra approssimativa, infatti nel caso del vettore quadra9 sono
stati usati 9 armonici, nel secondo caso 40: più aumenta il nu-
mero degli armonici, maggiore sarà la precisione della forma
dell’onda. Nel terzo caso l’onda è perfettamente quadrata.
Se si ascoltano le 3 onde (il messaggio set seguito dal nome di
un’array consente di cambiare il vettore da leggere con tabosc∼)
si noteranno delle differenze. Nel caso del vettore quadra9 il
suono sarà meno ricco di armonici di quello di quadra40, che a
sua volta è meno ricco di quello di quadralg.
80
8.2 LE FORME D’ONDA
Onda quadra
2
1
1
ampiezza
0
0
−1
−1
−2
−2
tempo
Figura 74: un’onda quadra che alterna i valori 1 e -1
0 quadra9 quadra40
set quadra40
set quadra9
set quadralg
tabosc4~ quadra9
;
quadra9 sinesum 512 1 0 0.33 0 0.2 0 0.1428 0 0.1111;
quadra9 normalize 1
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
515
reset
until 0
int 0 + 1
expr if (($f1 < 256), 1, -1)
tabwrite quadralg
Figura 75: tre tipi diversi di onda quadra
81
8.2 LE FORME D’ONDA
PULSE WIDTH MODULATION (PWM)
I due modi che abbiamo usato nella sezione precedente per gener-
are un’onda quadra non sono gli unici possibili. Un altro sistema
infatti è quello di intervenire direttamente su un segnale sinu-
soidale e modificarlo in tempo reale. Nella patch di figura 76 il
segnale di osc∼ entra in expr∼ che genera un’onda quadra con
un semplice ciclo if: se i valori sono positivi, esce 1, altrimenti
esce -1.
150 wave
osc~ 200
expr~ if (($v1 > 0), 1, -1)
metro 100
dac~
tabwrite~ wave
Figura 76: onda quadra generata mediante intervento diretto su un
segnale sinusoidale
L’oggetto expr∼ è l’omologo di expr per i segnali. Oltre a op-
erare sulle solite variabili numeriche ($fn o $in) può processare
direttamente segnale. Il simbolo per le variabili-segnale è $vn.
Questo modo di produrre un’onda quadra non è certo il più eco-
nomico dal punto di vista computazionale, ma consente di fare
qualcosa che con i sistemi precedenti era complicato, cioè inter-
venire in tempo reale sulla forma dell’onda. Un’onda quadra è
simmetrica, come del resto quella sinusoidale. Ai valori positivi
rispondono valori negativi, quindi la parte positiva dell’onda
quadra è controbilanciata da una parte negativa della stessa di-
mensione. Se si cambia il rapporto fra la parte positiva e quella
negativa si genera un cambiamento della forma dell’onda che
ha rupercussioni sul timbro dell’onda stessa. Questo rapporto è
chiamato duty cycle e si misura in genere con un valore compreso
fra 0 e 1. Un duty cycle di 0.5 rappresenta l’onda quadra mentre
un duty cycle di 0.75 significa che la parte positiva è in rapporto
82
8.2 LE FORME D’ONDA
di 3:1 rispetto a quella negativa.
In figura 77 l’oggetto expr∼ è modificato rispetto a quello della
figura 76. Se i valori superano il valore in entrata nell’inlet destro
emetti segnale 1, altrimenti emetti segnale di -1. Questo implica
che possiamo variare il valore-soglia. Mentre prima il valore
soglia era fissato a zero e quindi l’onda risultava simmetrica,
ora tale valore può essere cambiato: se avessimo ad esempio un
valore soglia pari a 0.75 (75 nella number box) expr trasformerebbe
questo valore in 0.5 e il il costrutto if risulterebbe essere: se il
valore è maggiore di -0.5 emetti 1, altrimenti 0. Ne risulterebbe
un’onda rettangolare con porzione positiva più lunga di quella
negativa.
duty cycle wave
frq (0 - 100)
200 75
osc~ 200
$1 40
line
expr ((1 - ($f1 / 100)) * 2) - 1
expr~ if (($v1 > $f2), 1, -1)
metro 100
dac~
tabwrite~ wave
Figura 77: duty cycle dell’onda quadra
Questa modificazione del duty cycle può essere gestita da un seg-
nale, generalmente un LFO, un Low Frequency Oscillator, di cui
parleremo più avanti. Basti per ora sapere che un LFO è un
normale oscillatore, specializzato nella generazione di frequenze
molto basse, al di sotto della banda audio (< 30 hz). Usare un
segnale di controllo per modificare il duty cycle realizza la cosid-
83
8.2 LE FORME D’ONDA
detta Pulse Width Modulation, utilizzata in molti sintetizzatori
analogici negli anni ’70.
In figura 78 un oscillatore con frequenza 0.25 controlla il duty
cycle dell’onda quadra. L’ampiezza viene moltiplicata per 0.99
in modo che non raggiunga mai 1, poiché con ampiezza 1 il seg-
nale è tutto positivo, quindi non c’è alternanza fra parte positiva
e negativa del segnale. Di conseguenza ci sarebbe assenza di
oscillazione, e di suono.
wave
frq
300
osc~ 200
osc~ 0.25
*~ 0.99
expr~ if (($v1 > $v2), 1, -1)
metro 100
dac~
tabwrite~ wave
Figura 78: variazione del duty cycle tramite un segnale di controllo
84
8.2 LE FORME D’ONDA
8.2.3 ONDA A DENTE DI SEGA
L’onda a dente di sega ha un periodo costituito da un segmento
che va da -1 a 1. Si ottiene sommando tutte le armoniche, con
ampiezza pari al reciproco del numero d’ordine dell’armonico e
moltiplicate per -1:
arm 1 arm 2 arm 3 arm 4 arm 5 arm 6 arm 7
-1 − 21 − 13 − 14 − 15 − 16 − 17
In figura 79 ci sono due forme d’onda a dente di sega ottenute
l’una con il comando sinesum l’altra con un algoritmo.
dentedisega dentedisega2
;
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
515
until
int 0 + 1
mod 515
expr (($f1 / 515) * 2) - 1
tabwrite dentedisega2
Figura 79: l’onda a dente di sega ottenuta in due modi diversi
85
8.2 LE FORME D’ONDA
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 positivo, ovvero con valori che si muovono lin-
earmente da 0 a 1. Tale oggetto è phasor∼, utile per moltissime
applicazioni.
saw
phasor~ 100
metro 120
tabwrite~ saw
Figura 80: l’onda a dente di sega come segnale di controllo, generata
con phasor∼
Uno degli usi di phasor∼ è quello di utilizzarlo come segnale
da modificare con l’oggetto expr∼ in modo molto versatile. Ad
esempio è possibile costruire una patch per la Pulse Width Mod-
ulation con un algoritmo più semplice di quello presentato in
8.2.2. La patch si può osservare in figura 81. Il ciclo if è legger-
mente diverso da quello precedente. La condizione deve verifi-
care semplicemente il rapporto fra il segnale di phasor∼ e quello
di osc∼.
8.2.4 ONDA TRIANGOLARE
Come per l’onda quadra, quella triangolare può essere generata
con diversi metodi. Qui riproponiamo gli stessi della sezione
precedente:
- vettore e comando sinesum
- vettore disegnato da algoritmo
- intervento diretto sul segnale
86
8.2 LE FORME D’ONDA
osc~ 0.125
phasor~ 400
expr~ ($v1 * 0.49) + 0.5
expr~ if (($v1 > $v2), 1, -1)
dac~
Figura 81: l’onda a dente di sega come segnale di controllo, generata
con phasor∼
Nel primo caso dobbiamo usare le armoniche dispari con ampiez-
za inversa rispetto al quadrato del numero d’ordine dell’armon-
ico e poi moltiplicare le ampiezze alternativamente per 1 e -1
arm 1 arm 2 arm 3 arm 4 arm 5 arm 6 arm 7
1 0 − 312 0 1
52
0 − 712
Nel secondo caso dobbiamo disegnare il grafico del vettore costru-
endo tre segmenti attraverso un algoritmo, il primo segmento va
da 0 a 1, il secondo da 1 a -1, il terzo da -1 a 0. In figura 82 ci sono
le due forme d’onda, la prima approssimata con il comando sine-
sum (somma dei primi 19 armonici), la seconda perfetta. Nella
figura successiva (83) è mostrato l’algoritmo per disegnarla.
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 deter-
mina la posizione del vertice alto del triangolo. Un duty cycle di
0.5 è un’onda triangolare isoscele mentre con un duty cycle ad es-
empio di 0.75 il vertice alto del triangolo è spostato verso destra
(fig. 85).
87
8.2 LE FORME D’ONDA
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
Figura 82: nel grafico triang l’onda triangolare è approssimata con la
somma di 19 armonici, mentre in triang2 l’onda è disegnata
in modo perfetto
loadbang
131
256 until
until int 384 + 1
128 int 128 + 1 mod 131
until mod 256 + 384
int 0 + 1 + 128 t f f
mod 128 t f f expr (-1 - (($f1 - 384) / -128))
t f f expr (1 - (($f1 - 128) / 128))
expr ($f1 / 128)
tabwrite triang2
Figura 83: l’algoritmo per produrre una forma d’onda triangolare, in
una tabella di 512 + 3 punti
88
8.2 LE FORME D’ONDA
phasor~ 200
expr~ if (($v1 < 0.5), (($v1 * 2) * 2) - 1, (1 - (($v1 *
2)-1)) * 2 - 1)
tri
metro 100
dac~ tabwrite~ tri
Figura 84
phasor~ 250 dutycycle
0.367
expr~ if ($v1 <= $f2, $v1 * (1 / $f2), (1 - $v1) * (1 /
(1-$f2))) * 2 - 1
tri
metro 100
dac~ tabwrite~ tri
Figura 85
89
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 in uscita all’oggetto dac∼ che ha il compito di convertire
il segnale digitale in analogico, in modo da poterlo ascoltare.
Come si può osservare l’oggetto suddetto ha due inlet. In effetti
abbiamo sempre inviato il segnale smistandolo in entrambi gli
inlet. dac∼ infatti consente di inviare il suono verso due canali,
uno sinistro e uno destro. Fino ad ora abbiamo sempre inviato
il segnale verso entrambi i canali ottenendo come risultato che il
suono sia identico in entrambi, ma potremmo decidere di inviare
il segnale verso uno solo dei due.
1 2
osc~ 120 osc~ 120
*~ 0.25
dac~ dac~
Figura 86: in (1) il segnale dell’oscillatore è inviato al solo canale sin-
istro, in (2) il segnale viene inviato con massima ampiezza
al canale sinistro, mentre con ampiezza ridotta del 75% al
canale destro
In figura 86(1) il segnale viene inviato solo al canale sinistro,
mentre in (2) il segnale avrà un peso maggiore sul canale sinistro
90
9.2 CONTROLLO DEL panning
poiché prima di essere collegato al canale destro viene ridotto in
ampiezza.
9.2 C ONTROLLO DEL panning
Nella prossima patch realizziamo un semplice algoritmo per con-
trollare la posizione del suono nel campo stereofonico.
sx dx
expr ($f1 / 100)
0.346
osc~ 440
expr sqrt($f1 / 100)
expr sqrt(1 - ($f1 / 100))
0.808 0.588
$1 20 $1 20
line~ line~
*~ *~
dac~
Figura 87
In figura 87 è mostrato l’algoritmo di Pd. Attraverso una slid-
er orizzontale possiamo posizionare il suono nel campo stereo,
se l’indicatore si trova al centro avremo un suono posizionato
esattamente a metà fra i due canali, in alternativa possiamo po-
91
9.2 CONTROLLO DEL panning
sizionare il suono verso destra o verso sinistra spostando l’indi-
catore.
La slider è impostata in modo da agire in un range compreso
fra 0 e 100, il valore in uscita viene diviso per 100 in modo da
produrre un range compreso fra 0.0 e 1.0. Nel caso del canale de-
stro questo valore decimale viene collegato con il moltiplicatore
per il canale destro impostando l’ampiezza del segnale lo stesso
canale. Per il canale sinistro invece il valore viene sottratto da
1.0 in modo da essere il complementare dell’altro. E’ necessario
inoltre calcolare la radice quadrata dei due valori, poiché l’inten-
sità del suono percepito è proporzionale al quadrato dell’ampiez-
za del segnale stesso. Entrambi i dati in uscita vengono infine
passati per l’oggetto line∼ che rende più graduale il passaggio
da un valore all’altro eliminando l’eventuale effetto a scalini che
si produrrebbe.
Invece di controllare direttamente la spazializzazione del seg-
nale tramite un oggetto grafico, possiamo ultilizzare un oscilla-
tore 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~
Figura 88
Nella figura 88 è mostrata questa situazione: il segnale dell’oscil-
latore di destra viene reso unipolare (vedi paragrafo successi-
vo) producendo così un’onda con ampiezza compresa fra 0 e
1. Subendo le stesse operazioni della figura precedente (fig.
92
9.2 CONTROLLO DEL panning
87) produce un’oscillazione del segnale fra il canale sinistro e
il canale destro. Analogamente possiamo controllare il panning
attraverso un’onda quadra che alterni valori di 0 e 1 (fig. 89)
osc~ 120 osc~ 1
expr~ if($v1 < 0.5, 1, 0)
expr~ sqrt(1 - $v1)
expr~ sqrt($v1)
*~ *~
dac~
Figura 89
9.2.1 S EGNALI BIPOLARI E UNIPOLARI
Nella patch in figura 88 abbiamo usato un particolare tipo di
segnale, detto unipolare. 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 disposizione dei
segnali unipolari, ovvero segnali con valori che oscillano solo fra
i valori positivi (fig. 90).
9.2.2 IL DC OFFSET
Per ottenere un’onda unipolare è necessario operare una vari-
azione su un’onda bipolare. Questa variazione si realizza ag-
giungendo al segnale bipolare un valore costante detto DC offset.
Se ad una sinusoide che oscilla fra -1 e 1 si aggiunge il valore
costante 1, si otterrà una nuova sinusoide oscillante fra 0 e 2,
questo perché la distanza fra l’ampiezza massima e quella mini-
ma della sinusoide equivale a e (1-(-1) = 2). In figura 102 si può
93
9.2 CONTROLLO DEL panning
Segnale bipolare e unipolare
a)
b)
Figura 90: L’ampiezza del segnale (a) oscilla fra valori positivi e
negativi, mentre (b) è polarizzato nel campo positivo
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 oltre all’aggiunta della costante, è necessario dividere il
segnale per 2 o, meglio, moltiplicarlo per 0.5 (le moltiplicazioni
per il calcolatore sono più veloci delle 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 103 è mostrato un segnale bipolare
trasformato in un segnale unipolare tramite l’oggetto expr∼.
94
9.2 CONTROLLO DEL panning
1.0
1.0
➤
0.5
0.5
a)
0.0
0.0
❘
❘
−0.5
−0.5
−1.0
−1.0
➤
1.0
1.0
➤
0.5
0.5
b)
0.0
0.0
❘
−0.5
−0.5
−1.0
−1.0
Figura 91: la distanza massima fra l’ampiezza positiva e quella nega-
tiva del segnale bipolare (a) è doppia rispetto a quella del
segnale (b)
95
9.2 CONTROLLO DEL panning
osc~ 200 bipolare
metro 100
tabwrite~ bipolare
expr~ ($v1 * 0.5) + 0.5
unipolare
tabwrite~ unipolare
dac~
Figura 92: l’oggetto expr∼ permette facilmente di effettuare le due
operazioni sul segnale per trasformarlo trasformano da
bipolare a unipolare
96
10
S I N T E S I A D D I T I VA , S I N T E S I TA B E L L A R E E
SINTESI VETTORIALE
10.1 O PERATORI DI SEGNALE
10.1.1 expr∼
10.2 S INTESI ADDITIVA
Definizione: Date n onde, si ha sintesi additiva quando si som-
mano tali onde.
Risultato: La somma di onde sinusoidali produce suoni comp-
lessi estremamente eterogenei.
10.2.1 SINTESI ADDITIVA A SPETTRO ARMONICO
10.2.2 SINTESI ADDITIVA A SPETTRO NON ARMONICO
10.2.3 SPETTRO FISSO
10.2.4 SPETTRO VARIABILE
10.3 S INTESI VETTORIALE
10.3.1 DISSOLVENZA INCROCIATA AUTOMATICA FRA DUE TABELLE
10.3.2 DISSOLVENZA INCROCIATA AUTOMATICA FRA PIÙ TABELLE
10.3.3 ALGORITMO DI SELEZIONE PER IL crossfading FRA TABELLE
10.3.4 CONTROLLO DEL crossfading ATTRAVERSO grid
97
11
S I N T E S I S OT T R AT T I VA
11.1 L A SINTESI SOTTRATTIVA
A differenza della sintesi additiva, che realizza la somma di sinu-
soidi per ottenere spettri complessi, la sintesi sottrattiva insiste
su spettri molto complessi per ottenere suoni più semplici. Per
sottrarre frequenze da un suono complesso si usano dei dispos-
itivi software detti filtri, che si applicano su suoni che hanno
uno spettro estremamente ricco, come i rumori. Schematizzando,
il suono sorgente prima di essere inviato agli altoparlanti passa
attraverso un filtro, che realizza certe condizioni richieste (fig.
93).
segnale in entrata
filtro
segnale in uscita
Figura 93: schema di un filtraggio di segnale semplice
11.1.1 IL RUMORE
In generale si intende per rumore un suono non desiderato che
disturba la percezione di un’informazione sonora. In musica
98
11.1 LA SINTESI SOTTRATTIVA
elettronica un rumore è una sequenza di oscillazioni casuali. Si
distinguono vari tipi di rumori. Il rumore bianco è quello costi-
tuito da frequenza uniformemente distribuite, prodotte alla ve-
locità della frequenza di campionamento. In altre parole, se ci si
opera alla frequenza di campionamento di 44100 hertz, il rumore
bianco è costituito da frequenze casuali (con ampiezza casuale)
1
emesse ogni 44100 di secondo. Lo spettro del rumore bianco si
presenta come in figura 94: le frequenze occupano tutta la banda
audio.
Rumore bianco
0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000
Figura 94: spettro del rumore bianco
Il rumore rosa ha una distribuzione spettrale diversa dal prece-
dente: via via che le frequenza sono più alte l’ampiezza media
del segnale si abbassa, per la precisione si abbassa di 3 db ogni
ottava (fig. 95).
In Pd questi due tipi di rumore sono implementati rispettiva-
mente dagli oggetti noise∼ e pink∼ che non accettano nessun
tipo di argomento. L’oggetto rand∼ invece genera un rumore
limitato in banda, questo significa che il generatore produce una
banda di rumore che va da 0 alla frequenza impostata, succes-
sivamente produce delle bande secondarie larghe quanto la fre-
quenza impostata ma di ampiezza sempre minore. L’esempio in
figura (96) mostra lo spettro prodotto da rand∼ con frequenza
2500 hz.
99
11.1 LA SINTESI SOTTRATTIVA
Rumore rosa
0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000
Figura 95: spettro del rumore rosa
Rumore band limited
0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000
Figura 96: spettro di rumore band-limited con frequenza di 2500 hz
Nella patch in figura 97 l’oggetto polygate∼ consente di scegliere
quale generatore inviare a dac∼. Accetta come argomento il nu-
mero dei segnali in entrata e il tempo con cui passare da uno
all’altro. Il messaggio choice consente di effettuare la scelta.
I rumori con il loro spettro ricchissimo sono ideali per poter
essere filtrati e costituiscono i segnali sorgenti privilegiati per la
sintesi sottrattiva.
100
11.2 I FILTRI
2500
0
choice $1 noise~ pink~ rand~
polygate~ 3 100
dac~
Figura 97: selezione del tipo di rumore tramite l’oggetto polygate∼
11.2 I FILTRI
I filtri sono algoritmi deputati a processare un segnale in entrata,
attenuando determinate frequenze o esaltandone altre. In base
al tipo di tagli sulle frequenze che effettuano se ne distinguono
quattro tipi:
- filtri passa-alto
- filtri passa-basso
- filtri passa-banda
- filtri escludi-banda
11.2.1 FILTRI PASSA - ALTO
Un filtro passa-alto attenua le frequenze al di sotto di un valore-
soglia, detto frequenza di taglio (cutoff frequency).
11.2.2 FILTRI PASSA - BASSO
11.2.3 FILTRI PASSA - BANDA
11.2.4 FILTRI ESCLUDI - BANDA
11.2.5 GLI ORDINI DEI FILTRI
101
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 E D ’A M P I E Z Z A ( A M )
12.1 L A MODULAZIONE AD ANELLO
Definizione: Dati due segnali, si ha la modulazione ad anello
(Ring Modulation, 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 frequenze ottenute dalla somma e dalla differenza dei
due segnali. Nel caso più semplice, con due sinusoidi, avremo
quindi:
RM = (α f + β f ), (α f − β f )
In termini matematici, la seconda regola di Werner esprime pro-
prio questa identità:
1
cos(α) ∗ cos( β) = [cos(α + β) + cos(α − β)] (12.1)
2
Quando i due segnali sono suoni complessi, il risultato della
modulazione ad anello sarà l’insieme delle somme e differenze
fra tutte le frequenze dei due suoni. Nella patch in figura 100
si ha una doppia modulazione ad anello, con le sinusoidi di
frequenza 2000, 500 e 650 hertz. Il risultato della prima RM da
frequenze di 2500 e 1500 hertz che vengono modulati con la terza
sinusoide (650 hz), producendo un suono finale formato dalla
somma di 4 onde: 3150, 1850, 2150, 850 hertz (vedi lo spettro in
figura 101. Schematizzando:
102
12.1 LA MODULAZIONE AD ANELLO
Modulazione ad anello
0 1000 2000 3000
Figura 98: lo spettro risultante di una modulazione ad anello. Le fre-
quenze delle sinusoidi sono di 2000 Hz e 500 hz. Il risultato
è un suono composto da frequenze di 2500 hz e 1500 hz
osc~ 2000 osc~ 500
*~
dac~
Figura 99: la patch di Pd che implementa la Modulazione ad anello
dello spettro in figura 98
Dati i segnali α(2000hz), β(500hz), γ(650hz), si applica la modu-
lazione ad anello ai primi due e il risultato si ring-modula con il
terzo:
- RM1 = (α f + β f ), (α f − β f )
103
12.1 LA MODULAZIONE AD ANELLO
- RM1 = (2000 + 500), (2000 − 500)
- RM1 = 2500, 500
- RM2 = RM1 f ∗ γ f
- RM2 = RM1 f ∗ 650
- RM2 = (2500 + 650), (2500 − 650), (1500 + 650), (1500 −
650)
- RM2 = 3150, 1850, 2150, 850
osc~ 2000 osc~ 500
*~
osc~ 650
*~
dac~
Figura 100: doppia modulazione ad anello: 2 segnali vengono ring-
modulati fra loro e successivamente con un terzo
Storicamente la Modulazione ad anello è stata utilizzata per
modificare il timbro degli strumenti tradizionali. In quel caso
un suono complesso viene ring-modulato con un suono di sintesi,
una sinusoide ad esempio. Tecnicamente non c’è alcuna differen-
za con la modulazione vista qui sopra, ma si preferisce in queste
circostanze parlare di suoni che vengono modificati con altri
suoni: il suono da modulare viene definito Portante (Carrier),
mentre il segnale che modula è detto Modulante (Modulator).
104
12.2 SEGNALI BIPOLARI E UNIPOLARI
Modulazione ad anello doppia
0 1000 2000 3000 4000
Figura 101: lo spettro risultante dalla doppia modulazione ad anello
12.2 S EGNALI BIPOLARI E UNIPOLARI
Per ottenere un’onda unipolare è necessario operare una vari-
azione su un’onda bipolare. Questa variazione si realizza ag-
giungendo al segnale bipolare un valore costante detto DC offset.
Se ad una sinusoide che oscilla fra -1 e 1 si aggiunge il valore
costante 1, si otterrà una nuova sinusoide oscillante fra 0 e 2,
questo perché la distanza fra l’ampiezza massima e quella mini-
ma della sinusoide equivale a e (1-(-1) = 2). In figura 102 si può
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 oltre all’aggiunta della costante, è necessario dividere il
segnale per 2 o, meglio, moltiplicarlo per 0.5 (le moltiplicazioni
per il calcolatore sono più veloci delle 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 103 è mostrato un segnale bipolare
trasformato in un segnale unipolare tramite l’oggetto expr∼.
105
12.3 SEGNALE DI CONTROLLO DELL’AMPIEZZA: IL TREMOLO
1.0
1.0
➤
0.5
0.5
a) 0.0
0.0
❘
❘
−0.5
−0.5
−1.0
−1.0
➤
1.0
1.0
➤
0.5
0.5
b)
0.0
0.0
❘
−0.5
−0.5
−1.0
−1.0
Figura 102: la distanza massima fra l’ampiezza positiva e quella nega-
tiva del segnale bipolare (a) è doppia rispetto a quella del
segnale (b)
12.3 S EGNALE DI CONTROLLO DELL’ AMPIEZZA : IL TREMOLO
Definizione: Dato un segnale bipolare e uno sinusoidale unipo-
lare, ha luogo un tremolo quando il segnale unipolare, a basse
frequenze, modula l’ampiezza di quello bipolare.
Risultato: il tremolo non è altro che una variazione dell’ampiez-
za di un segnale prodotta da un altro segnale. L’oscillatore che
modula l’ampiezza della Portante deve necessariamente emet-
tere basse frequenze, per non interferire con la frequenza del
suono modulato. Inoltre una frequenza troppo alta non perme-
tterebbe di percepire l’effetto tremolo desiderato. Tradizional-
106
12.3 SEGNALE DI CONTROLLO DELL’AMPIEZZA: IL TREMOLO
osc~ 200 bipolare
metro 100
tabwrite~ bipolare
expr~ ($v1 * 0.5) + 0.5
unipolare
tabwrite~ unipolare
dac~
Figura 103: l’oggetto expr∼ permette facilmente di effettuare le due
operazioni sul segnale per trasformarlo trasformano da
bipolare a unipolare
mente esistevano degli oscillatori specializzati nella generazione
di basse frequenza, sotto i 30 hertz circa, utilizzati proprio come
strumenti di controllo di altri oscillatori. Gli LFO (Low Frequency
Oscillator) in Pd possono essere sostituiti dai normali oscillatori,
che generano qualsivoglia frequenza.
La patch in figura ?? realizza un tremolo semplice. Si può control-
lare interattivamente la frequenza del tremolo con la number box
in alto e l’ampiezza del segnale in uscita con la slider orizzontale.
Come si intuisce l’oscillatore modulante determina la frequenza
della variazione d’ampiezza, ma non l’escursione dell’ampiezza
stessa, che oscilla sempre fra 0 e 1. La figura 105 mostra proprio
questa situazione, il segnale (a) viene modulato in ampiezza da
(b) e il risultato (c) è un’oscillazione percepibile dell’ampiezza
fra 0 e 1.
Con la prossima patch un algoritmo più articolato del prece-
dente realizza un tremolo controllabile in frequenza, ma anche
107
12.3 SEGNALE DI CONTROLLO DELL’AMPIEZZA: IL TREMOLO
controllo_tremolo
osc~ 800
2
osc~ 1
expr~ ($v1 * 0.5) + 0.5
*~
$1 20
line~
*~
dac~
Figura 104: con la number box si può aumentare o diminuire la
frequenza del tremolo
Tremolo
a)
b)
c)
Figura 105: il segnale (a) viene moltiplicato per il segnale (b)
generando il tremolo rappresentato in (c)
108
12.4 LA MODULAZIONE D’AMPIEZZA
Tremolo controllato in ampiezza
a)
b)
c)
Figura 106: il segnale (b) varia in ampiezza generando una variazione
dell’ampiezza di (c)
in ampiezza, in modo da poter decidere anche l’escursione del
tremolo. La figura 106 mostra proprio questa situazione. L’onda
(b) varia l’ampiezza producendo in (c) un cambiamento grad-
uale dell’entità del tremolo. In figura 107 la patch di Pd che
implementa l’algoritmo relativo. Le due number box consentono
di intervenire interattivamente sulla frequenza e sull’ampiezza
del tremolo. La frequenza agisce esattamente come in figura 104
mentre per l’ampiezza il numero in entrata dalla number box di
destra ha un range compreso fra 0 e 50 e in uscita viene diviso
per 100, in modo da emettere un range fra 0 e 0.5. Il segnale
viene moltiplicato per quel valore e il risultato viene sommato al
risultato di 1 meno il valore in entrata.
12.4 L A MODULAZIONE D ’ AMPIEZZA
Definizione: Dato un segnale bipolare, detto Portante, e uno
unipolare, detto Modulante, ha luogo una modulazione d’ampiez-
za (AM) quando il segnale unipolare modula l’ampiezza di quel-
109
12.4 LA MODULAZIONE D’AMPIEZZA
osc~ 1600
frequenza
ampiezza
1
37
osc~ 1
/ 100
expr~ ($v1 * $f2) + (1 - $f2)
wave
*~
$1 20
line~
*~
metro 25
dac~ tabwrite~ wave
Figura 107: con la number box a destra si può controllare l’ampiezza
del tremolo
lo bipolare.
Risultato: La modulazione d’ampiezza produce un suono con
uno spettro in cui è presente la frequenza Portante e tutte le
frequenza somma e differenza fra Portante e Modulante. Tecni-
camente la Modulazione d’ampiezza è molto simile al tremolo,
con la differenza che per il tremolo il segnale Modulante è costi-
tuito da un segnale di frequenza molto bassa. Nell’AM invece la
frequenza Modulante è compresa nella banda audio. Dal punto
di vista trigonometrico abbiamo:
sin(α) ∗ (1 + sin( β)) = sin(α) ∗ sin( β) + sin(α) =
1
2 ( cos ( α − β ) − cos ( α + β )) + sin ( α )
110
12.4 LA MODULAZIONE D’AMPIEZZA
Rispetto alla Modulazione ad anello, nello spettro è quindi pre-
sente anche il segnale Portante. In figura 108 viene mostrato lo
spettro di una modulazione d’ampiezza con Portante di 800 hz
e modulante 160 hz. Lo spettro sarà quindi:
( P f ), ( P f + M f ), ( P f − M f ) =
800, (800 + 160), (800 − 160) =
800, 960, 640
Modulazione d’ampiezza semplice
0 500 1000 1500 2000
Figura 108: Il segnale portante ha frequenza di 800 hz, mentre il
modulante ha frequenza di 160 hz
Come nel caso della modulazione ad anello, nella Modulazione
d’ampiezza i segnali possono essere costituiti da suoni comp-
lessi. Lo spettro risultante sarà sempre l’insieme delle somme
e differenze fra le frequenze della portante e della modulante e
in più le frequenze della portante. La patch in figura 111 mostra
una doppia modulazione d’ampiezza. La portante di 1500 hz
viene modulata con un segnale di 500 hz. Il risultato di tale
modulazione è 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 =
111
12.4 LA MODULAZIONE D’AMPIEZZA
osc~ 800 osc~ 160
expr~ ($v1 * 0.5) + 0.5
*~
$1 20
line~
*~
dac~
Figura 109: la patch che produce lo spettro della figura precedente
(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 111.
12.4.1 L’ INDICE DI MODULAZIONE
La patch in figura 109 genera una semplice modulazione d’ampiez-
za dove la Portante e le frequenze laterali hanno la stessa ampiez-
za. Oltretutto impostare a zero la frequenza o l’ampiezza della
Modulante porterebbe a zero anche l’ampiezza della Portante,
poiché il segnale Portante sarebbe moltiplicato per zero. At-
traverso un indice di modulazione è possibile controllare il rap-
porto fra l’ampiezza della Portante e quella della Modulante.
112
12.4 LA MODULAZIONE D’AMPIEZZA
osc~ 1500
osc~ 500
expr~ ($v1 * 0.5) + 0.5
osc~ 300
*~ expr~ ($v1 * 0.5) + 0.5
*~
$1 20
line~
*~
dac~
Figura 110: la patch realizza una modulazione d’ampiezza con due
modulanti
L’algoritmo per implementare l’indice di modulazione deve as-
sicurare che l’ampiezza in uscita dall’AM sia sempre pari a 1,
quindi al diminuire dell’ampiezza della modulante ci sarà un
aumento della costante che si somma all’ampiezza della Modu-
lante e che si moltiplica alla Portante. I figura 112 c’è lo spettro
di una modulazione con Portante a 800 hz e Modulante a 160 hz.
Nella figura 113 c’è la relativa patch di Pd.
113
12.4 LA MODULAZIONE D’AMPIEZZA
Modulazione di ampiezza con 2 modulanti
0 1000 2000 3000
Figura 111: la patch che produce lo spettro della figura precedente
Indice di modulazione 0.25
0 500 1000 1500
Figura 112: spettro di modulazione di ampiezza con indice di
modulazione pari a 0.25
114
12.4 LA MODULAZIONE D’AMPIEZZA
osc~ 800 osc~ 160
$1 20
expr~ ($v1 * 0.5) + 0.5
line~
expr~ ($v1 * $v2) + (1 - $v2)
*~
$1 20
line~
*~
dac~
Figura 113: la slider verticale a destra controlla l’indice di modu-
lazione, con range da 0 a 1
115
13
V I B R ATO E M O D U L A Z I O N E D I F R E Q U E N Z A ( F M )
13.1 S EGNALE DI CONTROLLO DELLA FREQUENZA : IL
VIBRATO
Prima di trattare della Modulazione d’ampiezza avevamo vis-
to che con un’oscillazione a basse frequenze è possibile mod-
ulare l’ampiezza di un onda producendo un effetto di tremo-
lo. Analogamente, agendo sulla frequenza del segnale con un
LFO possiamo modulare la frequenza dell’oscillatore producen-
do l’effetto del vibrato. Invece di utilizzare un segnale unipolare
possiamo usare un normale segnale bipolare.
vibrato
osc~ 1
80 40
sig~ *~
+~
osc~
metro 100
dac~ tabwrite~ vibrato
Figura 114
116
13.2 MODULAZIONE DI FREQUENZA
Nella patch in figura 114 il segnale bipolare dell’LFO sarà molti-
plicato per 40, producendo un’onda che varierà in ampiezza fra
-40 e 40 hz. Questo segnale modulerà la frequenza dell’oscilla-
tore di sinistra che ha una frequenza 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 M ODULAZIONE DI FREQUENZA
Definizione: Dato un segnale Portante e uno Modulante, ha luo-
go una modulazione di frequenza (FM) quando il segnale Mod-
ulante modula la frequenza di quello Portante.
Risultato: La FM produce uno spettro molto ricco costituito dal
segnale Portante e da un certo numero di parziali con frequenza
pari alla distanza fra la Portante e un multiplo intero della Mod-
ulante. 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 del-
la FM è simmetrico rispetto all’asse della frequenza Portante,
ma contiene un numero di bande laterali dipendendente dalla
deviazione di picco.
La deviazione di picco è ”il massimo mutamento di frequenza che
l’oscillatore portante subisce”1 . La deviazione di picco si stabilisce
attraverso un indice di modulazione secondo la formula:
D
I = Mf
Dove I è l’indice di modulazione e D è la deviazione di picco.
Ne consegue che:
D = I ∗ Mf
Più elevato è il valore dell’indice di modulazione, maggiore sarà
la deviazione di picco, più numerose le componenti della portante
modulata in frequenza. In figura 115 è mostrata una patch per la
1 R. Bianchini, A. Cipriani, Il Suono Virtuale, ed. Contempo, pag. 244
117
13.2 MODULAZIONE DI FREQUENZA
modulazione di frequenza semplice. Fa uso di tre subpatch che
esaminiamo una alla volta.
pd modulante
freq indice
200 1000
10
Deviazione
2000
pd portante
freq
4000
pd uscita
dac~
Figura 115: la patch per la modulazione di frequenza semplice
In figura 116 è raffigurata la subpatch per la portante. L’inlet
riceve il segnale prodotto dalla modulante, che viene sommato
alla frequenza della portante, che si può impostare con la number
box in alto.
In figura 117 si può osservare che la number box a sinistra impos-
ta la frequenza dell’oscillatore modulante. Tale frequenza viene
118
13.2 MODULAZIONE DI FREQUENZA
freq
0
inlet~
+~
osc~
outlet~
Figura 116: la subpatch per il segnale portante
anche moltiplicata per l’indice di modulazione. Il prodotto di tale
moltiplicazione determina la deviazione di picco, quindi l’ampiez-
za dell’oscillatore modulante. Il segnale in uscita dall’outlet entra
nell’inlet della Portante.
Sulla patch per l’uscita (fig. 118) non c’è molto da dire: una slider
verticale controlla l’ampiezza del segnale prodotto dalla FM.
Maggiore è la deviazione di picco, maggiore sarà il numero di com-
ponenti presenti nello spettro. In figura 119 l’indice di modu-
lazione pari a 0.1 determina una deviazione di picco di 20 hz (0.1
* M f , ovvero 0.1 * 200 = 20) quindi un numero esiguo di com-
ponenti spettrali. In figura 120 l’indice pari a 10 determina una
devizione di 2000 hz, quindi uno spettro molto più 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 al di 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 seg-
nali continui. Non ci siamo occupati di definire un evento nel
dominio del tempo, che fosse provvisto di un inizio e di una fine,
119
13.2 MODULAZIONE DI FREQUENZA
freq indice
200 1000
10
Deviazione
2000
t b f
/ 100 *
osc~ 200 $1 20 $1 20
line~ line~
*~
*~
outlet~
Figura 117: la subpatch per il segnale modulante
come invece accade per ogni suono reale. Con gli strumenti dig-
itali abbiamo la possibilità di creare suoni di durata indefinita,
ma anche di definire la loro durata nel tempo.
Per disegnare un suono definito nel dominio del tempo abbiamo
bisogno di un inviluppo, ovvero di un profilo che determini la
forma che il suono assume rispetto al tempo. In figura 121 si
può osservare la forma d’onda prodotta da un suono di tromba
della durata di circa 6 decimi di secondo. Approssimando molto
si può distinguere una fase (attacco in cui l’onda passa da uno
stato di quiete ad uno di massima ampiezza, una seconda fase in
cui c’è un calo dell’ampiezza (decadimento), una terza fase in cui
il suono si mantiene più o meno costante (sostegno) e un’ultima
fase (rilascio) in cui l’onda torna allo stato di quiete. Queste
120
13.2 MODULAZIONE DI FREQUENZA
$1 20
inlet~
line~
*~
outlet~
Figura 118: la subpatch per l’uscita
Spettro FM indice 0.1
0 1000 2000 3000 4000 5000 6000 7000 8000
Figura 119: FM con frequenza portante di 4000 hz, modulante di 200
hz e indice di modulazione 0.1
quattro fasi, a volte indicate con 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 quel-
la di decadimento, ad esempio alcuni suoni percussivi. Sicura-
mente però l’attacco e il rilascio del suono sono nei suoni reali
sempre presenti. Nella musica elettronica un esempio tipico di
121
13.2 MODULAZIONE DI FREQUENZA
Spettro FM indice 10
0 1000 2000 3000 4000 5000 6000 7000 8000
Figura 120: FM con frequenza portante di 4000 hz, modulante di 200
hz e indice di modulazione 10
Inviluppo di tromba
ampiezza
tempo
Figura 121
inviluppo è quello mostrato in figura 122(b), che viene applicato
al segnale (a), producendo la forma d’onda mostrata in (c).
Uno degli strumenti per generare inviluppi in Pd è l’oggetto en-
vgen che ci consente di disegnare inviluppi costituiti da segmenti.
L’output dell’oggetto è un messaggio leggibile con line (fig. 123).
Nella prossima sezione faremo uso di generatori di inviluppo
122
13.2 MODULAZIONE DI FREQUENZA
a)
b)
c)
Figura 122: l’inviluppo disegnato in (b) ha valori compresi fra 0 e 1.
L’onda (a) viene inviluppata da (b), ovvero istante per is-
tante le ampiezze istantanee di (a) vengono moltiplicate
per i relativi valori di (b), producendo (c)
nella modulazione di frequenza.
13.2.2 FM A SPETTRO VARIABILE
Un uso interessante della modulazione di frequenza è quello di
usare degli inviluppi per creare spettri variabili. Con la prossima
patch generiamo una sequenza di suoni brevi che simulano il
timbro di un woodblock, secondo un algoritmo proposto da John
Chowning2 .
L’algoritmo è semplice: una FM con portante di 80 hz e modu-
lante di 55 hz. Un indice di modulazione gestito da un inviluppo
2
123
13.3 PORTANTI MULTIPLE
Figura 123: l’oggetto envgen
con una punta massima di 25 e un altro inviluppo per l’ampiez-
za del suono. In figura 124 c’è l’intero algoritmo. La durata di
un evento è di 200 millisecondi. La subpatch pd indexenv serve
semplicemente a rescalare i valori in uscita dell’oggetto envgen
che emette solo valori di ampiezza compresi fra 0 e 1 (fig. 125.
La subpatch envamp invece memorizza i dati del’altro envgen e li
spedisce a line senza alcun riscalamento.
Infine in figura 127 c’è il sequencer per la generazione dei bang
per innescare gli eventi sonori. L’oggetto list-idx riceve una lista
di 0 e 1, 1 laddove l’evento deve essere on, 0 quando dev0essere
off. metro collegato a un contatore costringe list-idx ad emet-
tere uno ad uno i valori della lista, quando il valore è uguale
a uno la patch invia un bang agli inviluppi, creando la sequenza
desiderata.
13.2.3 ALGORITMO PER IL CONTROLLO random DEI PARAMETRI
13.3 P ORTANTI MULTIPLE
13.4 M ODULANTI MULTIPLE
124
13.4 MODULANTI MULTIPLE
r dur r trig
osc~ 55
duration $1 dump r envindex
*~ 55
*~
+~ 80
osc~
pd indexenv
loadbang
r dur r trig
200
duration $1 dump r envamp
200
*~ s dur
dac~
pd envamp
pd seqz
START SPEED
150
Figura 124: la patch per l’FM semplice di Chowning
125
13.4 MODULANTI MULTIPLE
inlet inlet
prepend set
unpack f f
* 25 loadbang
pack f f 1 16 0 184 0
line~ 0 5 s envindex
outlet~
Figura 125: La subpatch per il riscalamento dei valori di envgen. Le
ampiezze vengono scalate in un range fra 0 e 25. La parte
destra della patch serve a memorizzare i dati disegnati in
envgen. L’help dell’oggetto spiega come salvare i dati.
inlet
inlet
line~
prepend set
outlet~
loadbang
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
s envamp
Figura 126: la subpatch envamp
126
13.4 MODULANTI MULTIPLE
r trig
START SPEED
150
pack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
list-idx metro 250
sel 1 int 0 + 1
s trig mod 16
Figura 127: la subpatch seqz
127
14
SINTESI PER DISTORSIONE NON LINEARE
(DNL)
14.1 A NCORA SULLE TABELLE
14.2 T EORIA DELLA SINTESI PER DISTORSIONE NON LINEARE
14.3 S INTESI PER DISTORSIONE NON LINEARE
128
15
INTRODUZIONE ALLA SINTESI GRANULARE
15.1 T EORIA DELLA SINTESI GRANULARE
15.1.1 PANORAMICA DEI TIPI DI SINTESI GRANULARE
15.2 A LGORITMO PER LA SINTESI Pulsar
129
16
A LT R E A P P L I C A Z I O N I D I P U R E D ATA
16.1 GEM E IL VIDEO
16.1.1 UN ESEMPIO CON GEM
16.2 A RDUINO
16.2.1 pduino
16.3 I L PROTOCOLLO osc
16.3.1 netsend E netreceive
16.4 I L Live coding
16.4.1 SUONARE IN RETE : oggcast∼
130
CONCLUSIONE
131
INDICE ANALITICO
object box, 17
object box, 16, 17
print, 16
132