Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
InventareIlSuono043 (Bianchi 2013) PDF
InventareIlSuono043 (Bianchi 2013) PDF
PURE DATA
Manuale introduttivo di musica elettronica
vers. 0.4.3
Francesco Bianchi
elettrochuck@gmail.com
2013
a Mina,
per il suo amore e il suo sostegno
N OTA SUL C OPYRIGHT
• di modificare quest’opera
2
CONTENTS
Introduzione 9
i l’ambiente 10
1 fondamenti 11
1.1 Cos’è Pure Data? . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2 Pd-extended . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3 Installazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3.1 GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3.2 Windows e Mac Os X . . . . . . . . . . . . . . . . . . . 13
2 panoramica dell’ambiente 14
2.1 Pd window e patch window . . . . . . . . . . . . . . . . . . . . . 14
2.1.1 il motore DSP . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.2 print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2 Le scatole di Pd . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2.1 oggetti e connessioni . . . . . . . . . . . . . . . . . . . . 16
2.2.2 messaggi e liste . . . . . . . . . . . . . . . . . . . . . . . 18
bang e number box . . . . . . . . . . . . . . . . . . . . . . 19
3 basi di programmazione con pure data 21
3.1 Variabili e costanti . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1.1 pack e unpack . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2 Gestione del tempo . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.2.1 metro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
un contatore . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.2 line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.3 delay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.4 line multirampa con delay . . . . . . . . . . . . . . . . . 29
3.3 Aritmetica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3.1 operatori aritmetici . . . . . . . . . . . . . . . . . . . . . 29
3.3.2 expr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4 Generatori di numeri casuali . . . . . . . . . . . . . . . . . . . 32
3.5 Connessioni senza cavi . . . . . . . . . . . . . . . . . . . . . . . 34
3.6 Subpatches e Abstractions . . . . . . . . . . . . . . . . . . . . . . 34
3.6.1 subpatch . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.6.2 abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3
3.6.3 graph on parent . . . . . . . . . . . . . . . . . . . . . . . 39
4 vettori, grafici e tabelle 41
4.1 Vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1.1 leggere un vettore . . . . . . . . . . . . . . . . . . . . . 46
4.1.2 l’oggetto table . . . . . . . . . . . . . . . . . . . . . . . . 46
5 programmazione avanzata 48
5.1 Istruzioni condizionali . . . . . . . . . . . . . . . . . . . . . . . 48
5.1.1 operatori relazionali . . . . . . . . . . . . . . . . . . . . 48
5.1.2 select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.1.3 operatori logici . . . . . . . . . . . . . . . . . . . . . . . 51
5.1.4 If . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.2 loops e iterazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6 il midi 58
6.1 Panoramica sul protocollo MIDI . . . . . . . . . . . . . . . . . 58
6.1.1 anatomia di un messaggio MIDI . . . . . . . . . . . . . 59
6.2 Pd e il MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.2.1 midiin e midianalyze . . . . . . . . . . . . . . . . . . . . 61
6.2.2 altri oggetti MIDI . . . . . . . . . . . . . . . . . . . . . . 63
6.3 Un esempio di editing algoritmico MIDI . . . . . . . . . . . . 64
7 oggetti gui 71
7.1 Altre GUI dalle librerie di Pd . . . . . . . . . . . . . . . . . . . 75
ii audio 76
8 l’audio digitale 77
8.1 L’oscillatore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
8.1.1 frequenza e ampiezza del segnale . . . . . . . . . . . . 79
8.1.2 osc∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
8.1.3 tabwrite∼ . . . . . . . . . . . . . . . . . . . . . . . . . . 84
8.1.4 la rappresentazione del suono . . . . . . . . . . . . . . 84
8.2 Le forme d’onda . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.2.1 tabosc4∼ . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.2.2 onda quadra . . . . . . . . . . . . . . . . . . . . . . . . . 88
pulse width modulation (PWM) . . . . . . . . . . . . . 90
8.2.3 onda a dente di sega . . . . . . . . . . . . . . . . . . . . 92
phasor∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
8.2.4 onda triangolare . . . . . . . . . . . . . . . . . . . . . . 94
9 il panning 99
9.1 l’oggetto dac∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4
9.2 Controllo del panning . . . . . . . . . . . . . . . . . . . . . . . . 100
9.2.1 Segnali bipolari e unipolari . . . . . . . . . . . . . . . . 102
9.2.2 il DC offset . . . . . . . . . . . . . . . . . . . . . . . . . 102
10 sintesi additiva e sintesi vettoriale 106
10.1 Sintesi additiva . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
10.1.1 sintesi additiva a spettro armonico . . . . . . . . . . . . 106
10.1.2 sintesi additiva a spettro non armonico . . . . . . . . . 106
10.2 Sintesi vettoriale . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
10.2.1 dissolvenza incrociata fra due tabelle . . . . . . . . . . 109
10.2.2 dissolvenza incrociata fra quattro tabelle . . . . . . . . 110
11 sintesi sottrattiva 114
11.1 La sintesi sottrattiva . . . . . . . . . . . . . . . . . . . . . . . . 114
11.1.1 il rumore . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
11.2 I filtri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
11.3 I parametri dei filtri . . . . . . . . . . . . . . . . . . . . . . . . . 121
11.4 I filtri in pd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
11.5 Il filtro vcf∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
11.6 Un sequencer con vcf∼ e samphold∼ . . . . . . . . . . . . . . . 126
12 moulazione ad anello (rm), tremolo, modulazione d’ampiezza
(am) 128
12.1 La modulazione ad anello . . . . . . . . . . . . . . . . . . . . . 128
12.2 Segnali bipolari e unipolari . . . . . . . . . . . . . . . . . . . . 130
12.3 Segnale di controllo dell’ampiezza: il tremolo . . . . . . . . . 131
12.4 La modulazione d’ampiezza . . . . . . . . . . . . . . . . . . . . 135
12.4.1 l’indice di modulazione . . . . . . . . . . . . . . . . . . 137
13 vibrato e modulazione di frequenza (fm) 142
13.1 Segnale di controllo della frequenza: il vibrato . . . . . . . . . 142
13.2 Modulazione di frequenza . . . . . . . . . . . . . . . . . . . . . 143
13.2.1 l’inviluppo . . . . . . . . . . . . . . . . . . . . . . . . . . 145
13.2.2 FM a spettro variabile . . . . . . . . . . . . . . . . . . . 148
13.3 Portanti multiple . . . . . . . . . . . . . . . . . . . . . . . . . . 150
13.4 Modulanti multiple . . . . . . . . . . . . . . . . . . . . . . . . . 152
14 introduzione alla sintesi granulare 157
14.1 Teoria della sintesi granulare . . . . . . . . . . . . . . . . . . . 157
14.1.1 dipendenza vs. indipendenza dei parametri . . . . . . 157
14.1.2 overlapping . . . . . . . . . . . . . . . . . . . . . . . . . 159
14.1.3 parametri e spettri risultanti . . . . . . . . . . . . . . . 162
14.1.4 Il dominio del tempo e la sintesi granulare . . . . . . . 164
5
14.2 Implementazione in pd . . . . . . . . . . . . . . . . . . . . . . . 166
14.3 Un esempio di Trainlet Synthesis . . . . . . . . . . . . . . . . . . 166
14.4 La Pulsar Synthesis . . . . . . . . . . . . . . . . . . . . . . . . . 167
14.5 Asyncronous Granular Synthesis . . . . . . . . . . . . . . . . . . 170
14.5.1 vline∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
14.5.2 rendere indipendente il parametro gdur . . . . . . . . . 176
14.6 Granulazione con suoni campionati . . . . . . . . . . . . . . . 182
15 lavorare con sorgenti audio esterne 185
15.1 Sintesi vs. campioni . . . . . . . . . . . . . . . . . . . . . . . . . 185
15.2 Alcuni oggetti utili . . . . . . . . . . . . . . . . . . . . . . . . . 185
15.3 Un semplice random slicer . . . . . . . . . . . . . . . . . . . . . 187
15.3.1 controllare lo slicer via segnale . . . . . . . . . . . . . . 191
15.4 Granulazione su files audio . . . . . . . . . . . . . . . . . . . . 195
6
INTRODUZIONE
7
- Questi programmi costano molto, soprattutto i migliori. Se si vo-
lessero avere dei sintetizzatori per realizzare 3 o 4 tecniche di sintesi
del suono si dovrebbero acquistare 3 o 4 prodotti commerciali di-
versi, questo a scapito del portafogli e del fatto che probabilmente fra
qualche anno saranno obsoleti e diverranno quindi praticamente inu-
tili. E’ molto meglio studiare le tecniche di sintesi e il funzionamento
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.
8
– Il software libero è soggetto a mutamento continuo, a un divenire
costante che lo pone nella condizione di migliorare molto più
velocemente del software commerciale e di non invecchiare mai.
Buon divertimento!
9
Part I
L’A M B I E N T E
1 FONDAMENTI
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
studiati, modificati e redistribuiti da chiunque. Inoltre Pure Data è mul-
tipiattaforma, quindi gira sui sistemi operativi più comuni: GNU/Linux,
Microsoft Windows, Apple Mac OS X, FreeBSD.
Pd è stato scritto nel 1996 da Miller Puckette, lo stesso che a metà degli
anni ’80 aveva sviluppato Max, in seguito divenuto un software commer-
ciale3 . 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, detta 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 stan-
dard, ma anche numerose librerie aggiuntive che estendono notevolmente
le sue funzionalità. Attualmente Pd-extended è alla versione 0.41.45 .
1.3 I NSTALLAZIONE
12
Successivamente si può eseguire l’installazione dal package manager 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 sem-
plicemente:
pd
1.3.2 W INDOWS E M AC O S X
13
2 PA N O R A M I C A D E L L’A M B I E N T E
Nella versione extended il Path e lo Startup sono già impostati per caricare
la maggior parte delle librerie necessarie per una completa funzionalità
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
dell’ambiente.
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 gestire la patch quando questa
è in azione. Tutti gli oggetti interattivi 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.2 print
15
che può solo ricevere dati o messaggi e stamparli a video nella Pd window.
In alcune circostanze è utile per verificare il corretto funzionamento degli
algoritmi.
Hello World!
Figure 1: un click del mouse sul messaggio produce un output nella Pd window
2.2 L E scatole DI P D
Gli elementi fondamentali della programmazione in Pure Data sono gli le object box
oggetti, rappresentati dalle object box, caratterizzate dalla forma rettango-
lare e dalla presenza di entrate (inlets), nella parte superiore, e di uscite
(outlets), nella parte inferiore.
16
random 250
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 rilasciandolo non appena si è rag-
giunto l’inlet di arrivo.
random
select 0 5 7
counter
pack 0 0
Figure 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
17
Come già detto, gli oggetti insistono su dati o segnali audio. Graficamente
gli oggetti-audio si distinguono da quelli per i dati perché il primo atomo
(ovvero il nome) termina sempre con il segno della tilde (∼) e gli inlet e
outlet che processano segnale sono scuri. I cavi che trasportano segnale
sono più spessi di quelli che trasportano dati.
random 1000
osc~
dac~
Le message box hanno forma rettangolare con il lato destro rientrante. Pos-
sono contenere stringhe di caratteri, numeri, liste o variabili e vengono at-
tivati con un click del mouse quando si è in run mode oppure alla ricezione
di un altro messaggio o di particolari azioni.
questo è un messaggio
Figure 6: un click con il mouse sul messaggio produce un output del messaggio
stesso nella Pd window
18
bang E number box
questo è un messaggio
Figure 7: la stessa patch precedente, con la differenza che il messaggio viene atti-
vato da un click del mouse sul bang
Il bang ha una sua versione grafica (si ottiene premendo all’interno 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.
bang grafico
bang
oggetti bang
b
19
dell’oggetto3 . Una number box può inviare o ricevere dati attraverso i suoi
inlet.
+ 5
12
Figure 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
3 BASI DI PROGRAMMAZIONE CON
P U R E DATA
10 20
+ 5
30
21
Esaminiamo il comportamento della patch in figura 10: se cambiamo 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 cam-
biare il secondo addendo. Non avremo alcun output!
Non va dimenticato che gli inlet successivi al primo di sinistra sono freddi:
immagazzìnano il dato in entrata senza produrre uscita. E’ necessario
quindi dire all’oggetto ’+’ di effettuare l’operazione fra i due nuovi ad-
dendi e di far uscire il risultato. Nel caso di questo oggetto è sufficiente
inserire nell’inlet di sinistra un bang, collegato all’uscita del secondo ad-
dendo, che ordina all’object box di far uscire il risultato immediatamente1 .
14 3
+ 5
17
Figure 11: il bang collegato all’uscita del secondo addendo, in entrata nell’inlet
sinistro dell’oggetto ’+’ rende caldo l’inlet destro dell’oggetto stesso
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
22
loadbang
+ 5
12
Figure 12: all’apertura della patch si avrà come output la somma fra 7 e 12
12
scelgo il numero $1
Figure 13: variabile in una message box, osservare l’output nella Pd window
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 variabili devono
assumere. Per realizzare tali liste esiste un oggetto apposito chiamato pack,
23
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
Figure 14: pack: un click sul bang senza cambiare i valori delle number box produce
l’uscita dei valori inizializzati. Una variazione delle number box pro-
duce un output nel momento in cui viene cambiato il valore dell’inlet
di sinistra. Osservare il risultato nella Pd window
24
20 1 2010
unpack 0 0 0
20 1 2010
Figure 15: unpack: un click sulla message box produce un output in ognuno dei tre
outlet
3.2.1 metro
1 un numero diverso da 0 o un
"bang" attivano metro
bang
0
0 o "stop" fermano metro
stop
25
UN CONTATORE
3.2.2 line
Un oggetto molto comune in Pd è line, che generara delle rampe per rag-
giungere un determinato valore. line ha bisogno di almeno due argomenti,
il valore-obiettivo, cioè la quantità da raggiungere, e il tempo in millisec-
ondi necessario a raggiungerlo. In presenza di un messaggio con una lista
di due numeri, line raggiungerà il primo nel tempo in millisecondi indicato
dal secondo (figura 18).
Un oggetto molto comune in Pd è line, che generara delle rampe per rag-
giungere un determinato valore. Accetta due argomenti via message box,
ovvero il valore-obiettivo e il tempo in millisecondi per raggiungerlo (fig.
18).
Una volta terminato il suo percorso line mantiene in memoria il valore-
obiettivo, quindi un secondo click sulla message box non produrrà un 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 esem-
pio chiedendogli di creare ogni volta il percorso da 0 a 1000 in 5 secondi,
basterà creare una lista di tre atomi, con il primo che indica il valore di
26
0 1
metro 500
loadbang
int
+ 1
23
3.2.3 delay
L’oggetto delay emette un bang dopo aver ricevuto un bang a sua volta.
L’unico argomento che accetta (dall’inlet destro) è il ritardo con cui verrà
emesso il bang stesso (figura 21).
27
1000 5000
line
Figure 18: line al momento della creazione è inizializzato a zero, quindi 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
Figure 19: si può ricominciare la rampa da 0 a 1000 ogni volta che si preme sulla
message box
2000 5000
Figure 20: rampa da 1000 a 2000 in 5 secondi, con step di mezzo secondo fra un
valore e l’altro in uscita
28
1
metro 1000
delay 500
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 con delay. Nel caso della patch
in figura 22 c’è un oggetto grafico per rappresentare le rampe, una slider
orizzontale, di cui ci occuperemo in un apposito capitolo.
3.3 A RITMETICA
Operazioni aritmetiche:
• +
• -
29
delay 1000 delay 1600
line
• *
• /
• pow
Operazioni trigonometriche:
• sin
• cos
• tan
• atan
• atan2
• mod
• div
e molti altri...
30
3.3.2 expr
* 24 - 7
42.6667 42.6667
Figure 23: nella parte sinistra le operazioni si succedono dall’alto verso il basso,
nella parte destra le stesse vengono raggruppate da expr. Valutare i
due algoritmi in parallelo con un click sul bang
31
3.4 G ENERATORI DI NUMERI CASUALI
1 0
metro 500
random 250
32
1 0
metro 500
random 1001
/ 1000
1 0
metro 500
random 100
moses 25
33
1 0
metro 500
drunk 100 10
80
Figure 27: ogni mezzo secondo viene generato un numero compreso fra 0 e 99,
dove ogni numero é a una distanza minore o uguale 10 dal precedente
frutto di drunk é molto più ordinata: gli elementi della sequenza si spostano
entro un range limitato (definito dal secondo argomento di drunk).
34
random
drunk
Figure 28: in alto la sequenza generata da random, in basso quella creata con drunk,
con una stepsize di 25
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 qual-
sisasi 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 at-
traverso il quale vengono emessi dei bang da quattro outlet diversi, il primo
35
4 r numero
send numero
4
r numero
receive numero
* 2
4
8
metro 500
random 500
+ 1
moses 250
36
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.
pd miasubpatch
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
inlet
metro 500
random 500
+ 1
moses 250
Figure 32: l’interno della subpatch con gli inlet e gli outlet
37
chiaro un algoritmo nella patch window, quindi il consiglio é di usarle il più
possibile.
3.6.2 abstraction
Un’abstraction non è altro che una patch che può essere richiamata dall’interno
di una patch. Anch’essa, come la subpatch contiene gli oggetti inlet e outlet
per creare le varie entrate e uscite dell’object box e, a differenza della sub-
patch, può essere utilizzata in qualunque patch. L’importante è che il 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).
38
inlet
pack $1 $2
line
outlet
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
dell’oggetto line. Un bang ricevuto dall’inlet dell’abstraction mette in azione
line restituendo la rampa all’outlet.
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 possono 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 sis-
tema funziona su entrambe), cui si accede premendo il sinistro del mouse
su un punto qualunque della subpatch window, selezioniamo l’opzione graph
on parent, comparirà all’interno della subpatch stessa un riquadro all’interno
del quale possiamo mettere ciò che vogliamo sia visibile dalla patch geni-
trice. Gli oggetti consentiti sono essenzialmente GUI’s, quindi number box,
sliders, radio button etc. . .
Nel caso della figura 35 la subpatch submetro contiene un oggetto metro 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.
39
1 0
pd submetro
regola_metro
301
Figure 35: Una subpatch con una number box in graph on parent
inlet
regola_metro
301
metro 500
outlet
Figure 36: l’interno della subpatch. Per creare il riquadro di visibilità basta andare
sulle proprietà della subpatch e selezionare l’opzione graph on parent
40
4 V E T TO R I , G R A F I C I E TA B E L L E
4.1 V ETTORI
2. in alto a sinistra del grafico c’è il nome del vettore (in questo caso i)
41
i
10
0
0 1 2 3
Figure 37: vettori: sull’asse delle ascisse c’è l’indice, sull’ordinata il valore
- 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
42
- con oggetti speciali che scrivono i dati all’interno dei vettori. L’oggetto
tabwrite scrive valori all’interno di un vettore. Nell’inlet di sinistra en-
trano i valori, in quello di destra i relativi indici. Il messaggio set
in entrata a sinistra determina il nome dell’array sul quale operare,
nome che può anche essere inserito nell’oggetto come argomento,
subito dopo il nome (figura 39).
;
i 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
Figure 38: attivare le tre message box con un click e verificarne il risultato sul
grafico. Il comando resize ridimensiona il vettore secondo quanto indi-
cato dal suo argomento, in questo caso 32
43
i
1
-1
32
until
int 1 + 1
randomF 2
- 1
tabwrite i
Figure 39: click sulla message box in alto e verificare il risultato sul grafico
Punti 2-4. L’interfaccia del vettore, il grafico, può presentare anche ele-
menti come un etichetta che rappresenta l’ordinata e uno che rappresenta
l’ascissa. Questi elementi si possono aggiungere tramite message box sec-
ondo le seguenti sintassi:
44
nome_vettore xlabel posizione valori_ascissa_da_mostrare
nome_vettore ylabel posizione valori_ordinata_da_mostrare
nome_vettore xticks posizione intervallo intervallo_tick_grande
nome_vettore yticks posizione intervallo intervallo_tick_grande
Gli stessi comandi seguiti da hide rimuovono i risultati del comando. 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.
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
Figure 40: click sulle message box per aggiungere o rimuovere le etichette
45
Fra le proprietà del grafico si può anche impostare il modo con cui verrà
disegnato il grafico: come punti discreti (draw as points), come punti inter-
polati (polygon) cioè singoli punti uniti da una linea che traccia il percorso
pi˘ breve fra punti adiacenti, infine come curva di bézier (bézier) che smussa
gli spigoli (figura 41).
i punti i polygon
i bezier
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 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
modifica la dimensione di un bang e il movimento dell’indicatore di una
slider verticale.
46
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
Figure 42: click sulle message box per aggiungere o rimuovere le etichette
47
5 P R O G R A M M A Z I O N E AVA N Z ATA
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 relazionale è soddisfatta, uguale a 0 in
caso contrario. I principali operatori relazionali sono sei:
• == (uguale a)
• != (diverso da)
1 Il concetto di vero o falso è mutuato dalla logica classica che ha prestato al mondo
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.
48
0
> 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
select può selezionare più atomi, in tal caso avrà tanti outlet quanti saranno
gli atomi da valutare, più uno, da cui farà uscire gli atomi che non soddis-
fano la selezione (figura 45).
Con gli operatori relazionali e select realizziamo un algoritmo che opera
una selezione su dei numeri. Quando la selezione è soddisfatta e select
emette 1, verrà attivata una rampa con l’oggetto line (figura 46).
49
5
123
10
sel 10 4
20 32 69
> 50
sel 1
0, 127 2000
line
Figure 46: valutare l’algoritmo con un click sulle 3 message box in alto
50
solo alla prima entrata. Combinando così ’>’ e change possiamo soddisfare
la nostra richiesta.
0, 100 2000
line
100
> 50
change
sel 1
0, 127 2000
line
51
bit viene valutato con il bit dell’altro numero che si trova nella stessa po-
sizione. Ad esempio l’operatore AND (oggetto ’& ’ in Pd) segue le 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
21 = 1 0 1 0 1 ∧
6 = 0 0 1 1 0 =
4 = 0 0 1 0 0
t b b
21 6
&
52
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
t b b
41 22
63
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 esempio ’&& ’ restituisce 1 se e
solo se entrambi i valori sono diversi 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 es-
empio, converte l’intero che riceve nel suo inlet sinistro nella sua forma bi-
naria e aggiunge a destra tanti bit uguali zero quanti sono richiesti dall’inlet
di destra. Nella tabella 4 c’è un esempio con il numero 113 da spostare a
sinistra di due posizioni.
53
10 10
&&
Figure 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
t b b
113 2
<<
452
5.1.4 If
Per terminare il capitolo sulle istruzioni condizionali non resta che af-
frontare il costrutto if. Pd non dispone di un oggetto if, ma consente di
usare questo comando all’interno dell’oggetto expr che abbiamo già incon-
trato (sezione 3.3.2). Nei comuni linguaggi di programmazione l’istruzione
54
if valuta un’espressione, se vera restituisce un certo risultato, se falsa ne
restituisce un altro. Nel linguaggio C la sintassi del costrutto if è la seguente:
if (espressione)
fai una certa cosa;
else
fanne un’altra;
che significa: "Se l’espressione è vera fai una certa cosa, altrimenti fanne
un’altra". In Pd invece la sintassi è:
55
1 0
metro 500
loadbang
float + 1
0 sel 9
56
100
until
loadbang
int + 1
Figure 54: ciclo until: valutare l’algoritmo con un click sulla message box in alto e
osservare il risultato nella Pd window
57
6 IL MIDI
58
6.1.1 ANATOMIA DI UN MESSAGGIO MIDI
10010000
59
si tratta di uno STATUS BYTE (il bit più a sinistra è 1) che sta per inviari un
DATA BYTE di tipo Note ON (001) sul primo canale (0000). Abbreviando,
potremmo anche pensare a questo come lo STATUS BYTE 144, che è il byte
in question e convertito in decimale.
Come già detto, uno STATUS BYTE può essere seguito da uno o due DATA
BYTE. Ad esempio, un messaggio di Program Change (100), che serve ad
impostare o cambiare il timbro per una determinata sequenza di eventi
MIDI, il DATA BYTE è soltanto uno.
Nel caso di un un System Message, codice 111, i 4 bit a destra dello STATUS
BYTE non rappresentano il canale, ma, appunto, il codice di un particolare
messaggio detto messaggio di sistema, inviato a tutto il sistema per dare
informazioni generali. Gli altri sono detti Channel Voice Messages.
La struttura quindi della comunicazione MIDI è quindi molto semplice.
Uno STATUS BYTE indica il tipo di messaggio inviato, uno o due DATA
BYTE portano i dati del tipo di messaggio. Per maggiori informazioni sui
tipi di messaggio la rete è un’ottima fonte di informazioni.
6.2 P D E IL MIDI
Pd può ricevere e inviare messaggi MIDI. Dal menu MIDI settings (che si
apre da Media o da preferences, in base al sistema operativo utilizzato) è
possibile impostare le porte di entrata e di uscita dei messaggi MIDI.
60
6.2.1 MIDIIN E MIDIANALYZE
L’oggetto che ci consente di far entrare in Pd messaggi MIDI puri, cioè an-
cora non codoficati in base al tipo è midiin che manda fuori dall’outlet di
sinistra messaggi Channel Voice in forma decimale. In sostanza restituisce
sequenze di numeri interi compresi fra 0 e 239 poiché gli STATUS BYTE di
tipo SYSYTEM MESSAGE, che sono compresi fra 240 e 255 non vengono
catturati.
prepend set prepend set prepend set prepend set prepend set prepend set
45 0 0 10 74 0 16 40 0 42 0 51 9 0 53 0
NoteON keypressure controlchange programchange channelpressure pitchbend
61
midiin
moses 128
outlet noteon outlet keypressure outlet cc outlet pgmchange outlet chnpressure outlet pitchbend
tutti gli altri messaggi saranno formati da una lista di tre interi, due per i
dati, uno per il canale.
t f f f
&&
spigot
list append
outlet pgmchange
Figure 57: La subpatch che formatta la lista dei messaggi Program Change
62
nell’inlet destro di list append. Non appena la lista raggiunge i due elementi
(list length si occupa di contare gli elementi di una lista) tramite sel 2 viene
emesso un bang che fa uscire la lista e permette che questa venga unita al
terzo elemento, cioè il numero del canale.
t f f f
&&
t f b
spigot
list prepend t l
t l l
list length
sel 2
list append
list append
outlet noteon
63
oggetti che in Pd si occupano del MIDI. Nella maggioranza dei casi gli
oggetti avranno una versione per l’input dei dati e una per l’output. Ne
diamo di seguito un elenco (parziale):
oggetti descrizione
midiin/midiout dati MIDI grezzi
notein/noteout Note ON
pgmin/pgmout Program Change
bendin/bendout Pitch Bend
ctlin/ctlout Control Change
touchin/touchout Channel Pressure
polytouchin/polytouchout Polyphonic Key Pressure
Oltre a tali oggetti, ce ne sono altri legati alla gestione di eventi MIDI.
Esaminiamo due oggetti, uno per la manipolazione di eventi Note ON in
entrata, un altro per gli stessi tipi di eventi in uscita.
Nel 1967 il compositore americano Steve Reich compose un brano per due
pianoforti intitolato Piano Phase che esplorava la tecnica del dephasing.
Un pattern di 12 semicrome viene eseguito all’unisono e in ostinato dai due
pianisti. Dopo un certo numero di ripetizioni il secondo pianista aumenta
leggermente la velocitù in modo da produrre una sfasatura fra le due frasi,
64
60 64
60 0
70 25
unpack 0 0
t f f
!= 0
t f f
moses 1
spigot
sfasatura che si allarga fino a far si che i due pattern non si ritorvano di
nuovo sovrapposti esattamente, ma ad una nota di distanza. I due pianisti
a questo punto suonano per un po’ allo stesso tempo per poi ricominciare il
processo, fino a che, completato il giro di tutte e 12 le note, non si ritrovano
all’unisono. A quel punto il primo pianista viene lasciato solo per un po’ e
inizia la seconda parte del brano, della quale non ci occuperemo.
65
• quanti pattern i pianisti suonano allo stesso tempo;
66
t f b
metro 144
f 0 + 1
% 12
t b f
64 66 71 73 74 66 64 73 71 66 74 73
list-nth
makenote 64 120
noteout 1
67
144 143
t f b t f b
0 0
f 0 + 1 f 0 + 1
% 12 % 12
t b f t b f
64 66 71 73 74 66 64 73 71 66 74 73 64 66 71 73 74 66 64 73 71 66 74 73
list-nth list-nth
noteout 1 noteout 2
68
reset counter
0
t f b sel 0
metro 144
f 0 + 1
0
% 16
f 0 + 1 sel 0 4
% 12 144 143
t b f t f b
metro 144
64 66 71 73 74 66 64 73 71 66 74 73
list-nth 0
makenote 64 120 f 0 + 1
noteout 1 % 12
t b f
64 66 71 73 74 66 64 73 71 66 74 73
list-nth
makenote 64 120
noteout 2
69
reset counter
0
t f b sel 0
metro 144
f 0 + 1
0
% 16
f 0 + 1 sel 0 4
% 12 144 143
t b f b t f b
metro 144
64 66 71 73 74 66 64 73 71 66 74 73
list-nth random 32 0
+ 48 f 0 + 1
% 12
makenote 64 120
t b f b
noteout 1
64 66 71 73 74 66 64 73 71 66 74 73
list-nth random 32
+ 48
makenote 64 120
noteout 2
70
7 OGGETTI GUI
Nel corso dei nostri primi esperimenti abbiamo già avuto modo di incon-
trare alcuni oggetti grafici, che nell’ambito del mondo informatico sono
dette GUI (graphical user interfaces). Pd mette a disposizione un certo nu-
mero di GUI’s, alcuni nativi, cioè facenti parte del pacchetto standard del
programma, altri derivati da librerie esterne, la maggior parte delle quali
sono caricate nella versione extended. Genericamente possiamo dire che
tutte le GUI di Pd possono essere configurate tramite le properties, accessi-
bili col tasto destro del mouse sulla GUI stessa.
- bang
- toggle
- 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 64).
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
71
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
Nella figura 64 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. 65) 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 som-
mato a un movimento continuo generato dall’algoritmo a sinistra. metro
attiva 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 principale. 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’è nessun send! Le GUI infatti possono mandare o rice-
vere messaggi senza bisogno di creare oggetti e supplementari. Possiedono
degli oggetti send e receive incorporati che possono essere impostati dalle
72
r slide
metro 100
expr ($f1 / 127) * 20
int 1 + 1
mod 2
r slide
$1 90
line
73
al grafico, così il primo valore in alto diventa 9 in luogo di zero, il secondo
8 invece che 1, etc. . . .
array1
r ordinata
tabwrite array1
Figure 66: impostare prima l’indice (radio button) orizzontale, poi il valore con
quello verticale
74
Della GUI VU-meter avremo modo di scrivere nella parte che riguarda
l’audio, mentre possiamo ora accennare alle canvas che sono oggetti sem-
plici 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.
Oltre alle GUI native che abbiamo appena discusso, diamo ora una panoram-
ica veloce di alcune altre GUI introdotte con le nuove librerie:
- grid
- gcanvas
- knob
- envgen
grid e gcanvas sono molto simili, sono due griglie bidimensionali che emet-
tono la posizione del mouse (x, y) dai due outlet alla pressione di quest’ultimo.
knob è la classica manopola tipo sintetizzatore analogico. Ha un’unica us-
cita che emette l’output nel range impostato nelle properties. Infine l’oggetto
envgen è un envelope generator che emette dati in un formato compatibile
con la versione audio di line, cioè line∼ , del quale tratteremo approfondi-
tamente nella parte di questo manuale dedicata all’audio.
75
Part II
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 gen-
erato da un oscillatore. Nel mondo analogico un oscillatore è 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 sinusoidale (vedi
fig. 67), che si può esprimere tramite la formula:
y = A sin(2π f x + φ)
1 http://it.wikipedia.org/wiki/Sinusoide
77
Parametri di una sinusoide
2
1
1
ampiezza
0
0
−1
−1
−2
−2
tempo
78
Sinusoide digitale
1.0
1.0
0.5
0.5
ampiezza
0.0
0.0
−0.5
−0.5
−1.0
−1.0
tempo
osc~ 440
dac~
79
0 1 2 3
Wavetable
4 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
80
Cosinusoide
1.0
1.0
0.5
0.5
ampiezza
0.0
0.0
−0.5
−0.5
−1.0
−1.0
tempo
2
τ ➤ λ
➤❘
➤❘
❘
➤
❘
1
1
➤ ❘
ampiezza
A
➤ ❘
0
0
−1
−1
−2
−2
tempo
8.1.2 osc∼
81
dall’inlet di sinistra (fig. 73). Come vedremo successivamente oltre che
dati, l’inlet di sinistra accetta anche segnali per controllare la frequenza.
242
osc~ 200
dac~
Figure 73: l’oggetto osc∼ con frequenza controllata da una number box
line
osc~ 20
dac~
82
osc~ 440
*~ 0.5
dac~
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
83
per evitare che l’ampiezza cambi troppo repentinamente producendo un
effetto scalino.
amp
osc~ 440
*~ 0.5
dac~
$1 20
line
8.1.3 tabwrite∼
84
amp
883
r~ sig
metro 100
osc~ 440
tabwrite~ amp
*~ 0.5 amp
dac~
$1 20
send~ sig
line
Nel primo caso (fig. 80) 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 digital-
mente (probabilmente nemmeno un suono elettrico analogico resta sem-
pre identico a se stesso). Nel mondo reale i suoni variano continuamente,
quindi una rappreentazione che non tenga conto della funzione tempo ha
valore solo in determinate circostanze.
Gli analizzatori del secondo tipo permettono di dare una visione più det-
tagliata e pertinente del suono perché rappresentano l’ampiezza e la fre-
quenza in funzione del tempo. La necessità di rappresentare 3 parametri
obbliga ad usare un grafico tridimensionale oppure a gestire uno dei tre
parametri in modo diverso. Nel caso mostrato in figura 81 c’è il tempo
sull’asse delle ascisse e la frequenza su quella delle ordinate, mentre l’ampiezza
85
Rappresentazione della forma d’onda
0.5
0.5
ampiezza
0.0
0.0
−0.5
−0.5
tempo
Spettrogramma ampiezza/frequenza
ampiezza
0 100 200 300 400 500 600 700 800 900 1000
frequenza
Figure 80: analizzatore di spettro bidimensionale, sull’asse delle ascisse c’è la fre-
quenza, su quella delle ordinate l’ampiezza. Il suono è costituito dalla
somma di onde di frequenza pari a 400, 700 e 800 hz
è rappresentata dal colore delle linee: nero per la massima ampiezza e varie
86
tonalità di grigio per ampiezza minore, fino al bianco, quando c’è assenza
di suono.
Spettrogramma ampiezza/frequenza/tempo
1000
1000
800
800
frequenza
600
600
400
400
200
200
0
0
tempo
Oltre alla forma d’onda più semplice, quella sinusoidale, che abbiamo esam-
inato nella sezione precedente, esistono altre forme d’onda periodiche. Il
loro numero è teoricamente infinito, anche se esistono alcune forme d’onda
classiche che si possono ottenere dalla somma di sinusoidi semplici in rap-
porto armonico fra loro.
Forme d’onda classiche sono l’onda quadra, l’onda triangolare e l’onda a
dente di sega che esamineremo fra poco.
8.2.1 tabosc4∼
87
- riempire il vettore con i valori desiderati
tabosc4~ sine
amp
$1 20
wave
line
*~
start
metro 100
Figure 82: l’uso di tabosc∼ per leggere un vettore con una forma d’onda sinu-
soidale
Quella quadra é una forma d’onda che alterna solo due valori, general-
mente 1 e -1, ma anche 1 e 0 se si usa come segnale di controllo.
88
Onda quadra
2
1
1
ampiezza
0
0
−1
−1
−2
−2
tempo
89
monici, 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 ar-
monici di quello di quadra40, che a sua volta é meno ricco di quello di
quadralg.
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
tabwrite quadralg
I due modi che abbiamo usato nella sezione precedente per generare un’onda
quadra non sono gli unici possibili. Un altro sistema infatti è quello di in-
tervenire direttamente su un segnale sinusoidale e modificarlo in tempo
reale. Nella patch di figura 85 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.
L’oggetto expr∼ è l’omologo di expr per i segnali. Oltre a operare sulle
solite variabili numeriche ($fn o $in) può processare direttamente segnale.
90
150 wave
osc~ 200
metro 100
dac~
tabwrite~ wave
Figure 85: onda quadra generata mediante intervento diretto su un segnale sinu-
soidale
91
duty cycle wave
frq (0 - 100)
200 75
osc~ 200
$1 40
line
metro 100
dac~
tabwrite~ wave
Questa modificazione del duty cycle può essere gestita da un segnale, gen-
eralmente un LFO, un Low Frequency Oscillator, di cui parleremo più avanti.
Basti per ora sapere che un LFO è un normale oscillatore, specializzato 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 cosiddetta Pulse Width Modulation, utilizzata in molti sintetizzatori ana-
logici negli anni ’70.
In figura 87 un oscillatore con frequenza 0.25 controlla il duty cycle dell’onda
quadra. L’ampiezza viene moltiplicata per 0.99 in modo che non raggiunga
mai 1, poiché con ampiezza 1 il segnale è tutto positivo, quindi non c’è
alternanza fra parte positiva e negativa del segnale. Di conseguenza ci
sarebbe assenza di oscillazione, e di suono.
92
wave
frq
300
osc~ 200
osc~ 0.25
*~ 0.99
metro 100
dac~
tabwrite~ wave
In figura 88 ci sono due forme d’onda a dente di sega ottenute l’una con il
comando sinesum l’altra con un algoritmo.
phasor∼
93
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
tabwrite dentedisega2
Come per l’onda quadra, quella triangolare può essere generata con diversi
metodi. Qui riproponiamo gli stessi della sezione precedente:
94
saw
phasor~ 100
metro 120
tabwrite~ saw
Figure 89: l’onda a dente di sega come segnale di controllo, generata con phasor∼
osc~ 0.125
phasor~ 400
expr~ ($v1 * 0.49) + 0.5
dac~
Figure 90: l’onda a dente di sega come segnale di controllo, generata con phasor∼
Nel primo caso dobbiamo usare le armoniche dispari con ampiezza inversa
rispetto al quadrato del numero d’ordine dell’armonico e poi moltiplicare
le ampiezze alternativamente per 1 e -1
95
secondo da 1 a -1, il terzo da -1 a 0. In figura 91 ci sono le due forme
d’onda, la prima approssimata con il comando sinesum (somma dei primi
19 armonici), la seconda perfetta. Nella figura successiva (92) è mostrato
l’algoritmo per disegnarla.
triang triang2
;
triang sinesum 515 1 0 -0.111111 0 0.04 0 -0.020408 0
0.012345 0 -0.008264 0 0.005917 0 -0.044444 0 0.00346 0
-0.00277;
triang normalize 1
pd triang2
Figure 91: nel grafico triang l’onda triangolare è approssimata con la somma di
19 armonici, mentre in triang2 l’onda è disegnata in modo perfetto
96
loadbang
131
256 until
int 0 + 1 + 128 t f f
tabwrite triang2
Figure 92: l’algoritmo per produrre una forma d’onda triangolare, in una tabella
di 512 + 3 punti
phasor~ 200
metro 100
Figure 93
97
phasor~ 250 dutycycle
0.367
expr~ if ($v1 <= $f2, $v1 * (1 / $f2), (1 - $v1) * (1 /
(1-$f2))) * 2 - 1
tri
metro 100
Figure 94
98
9 I L PA N N I N G
1 2
*~ 0.25
dac~ dac~
Figure 95: in (1) il segnale dell’oscillatore è inviato al solo canale sinistro, in (2) il
segnale viene inviato con massima ampiezza al canale sinistro, mentre
con ampiezza ridotta del 75% al canale destro
In figura 95(1) il segnale viene inviato solo al canale sinistro, mentre in (2)
il segnale avrà un peso maggiore sul canale sinistro poiché prima di essere
collegato al canale destro viene ridotto in ampiezza.
99
9.2 C ONTROLLO DEL panning
sx dx
0.346
osc~ 440
expr sqrt($f1 / 100)
0.808 0.588
$1 20 $1 20
line~ line~
*~ *~
dac~
Figure 96
100
preso fra 0.0 e 1.0. Nel caso del canale destro 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’ neces-
sario inoltre calcolare la radice quadrata dei due valori, poiché l’intensità
del suono percepito è proporzionale al quadrato dell’ampiezza del seg-
nale stesso. Entrambi i dati in uscita vengono infine passati per l’oggetto
line∼ che rende più graduale il passaggio da un valore all’altro elimi-
nando l’eventuale effetto a scalini che si produrrebbe.
Invece di controllare direttamente la spazializzazione del segnale tramite
un oggetto grafico, possiamo ultilizzare un oscillatore a basse frequenze
(LFO) per far muovere il suono fra i due canali in uscita.
expr~ sqrt($v1)
*~ *~
dac~
Figure 97
101
osc~ 120 osc~ 1
expr~ sqrt($v1)
*~ *~
dac~
Figure 98
9.2.2 IL DC OFFSET
102
Segnale bipolare e unipolare
a)
b)
Figure 99: L’ampiezza del segnale (a) oscilla fra valori positivi e negativi, mentre
(b) è polarizzato nel campo positivo
103
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
Figure 100: la distanza massima fra l’ampiezza positiva e quella negativa del seg-
nale bipolare (a) é doppia rispetto a quella del segnale (b)
104
osc~ 200 bipolare
metro 100
tabwrite~ bipolare
unipolare
tabwrite~ unipolare
dac~
105
10 SINTESI ADDITIVA E SINTESI
VETTORIALE
La sintesi additiva a spettro non armonico non può fare uso delle tabelle
poiché le sinusoidi che compongono la forma d’onda non sono in rapporto
armonico fra loro una tabella comune non consentirebbe ai vari periodi
delle onde di essere completi.
106
Frequenza waveform
0
tabosc4~ waveform
dac~
;
waveform sinesum 512 1 0.5 0.25 0.125 0.0625 0.03125
0.015625 0.078125;
waveform normalize 1
107
pd ampiezze
80 712
150 890
320 1780
500 2615
*~ *~ *~ *~ *~ *~ *~ *~
(0-1000)
/ 1000 wf
*~
$1 20
line~
dac~ tabwrite~ wf
Figure 103: una patch per la sintesi additiva a spettro non armonico
108
due valori che entrano dagli inlet, ma, come in questo caso, se swap ha un
argomento, lo stesso sarà mandato fuori dall’outlet di sinistra consentendoci
di sottrarre da questo il valore dell’outlet di destra.
A________________B
swap 1
0.242 0.757
La patch della figura successiva (106) invece mostra l’algoritmo per la dis-
solvenza vera e propria. L’algoritmo non necessita di spiegazioni partico-
lari. La parte in altro a destra mostra la parte che si occupa del crossfading
mentre in basso c’è uno slider per impostare l’ampiezza dell’onda risul-
tante.
109
Generatore di onde casuali
loadbang
t b f
0 until
t b b
normalize 1 float 0 + 1
expr ($f1 - $f2) 1
send $1
tabwrite $1
110
A________________B
randomwave wf1 2
randomwave wf2 1.5
swap 1
1 0
8000
pack 0 15 pack 0 15
*~ *~
Amp
+~
*~
pack 0 15
dac~ line~
111
r grid
loadbang
send grid
Frequenza
60
pd grid_eval
*~ *~ *~
*~
+~
dac~
112
inlet inlet
/ 100 / 100
* * *
*
$1 25 $1 25 $1 25 $1 25
113
11 S I N T E S I S OT T R AT T I VA
segnale in entrata
filtro
segnale in uscita
11.1.1 IL RUMORE
114
prodotte alla velocità 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) emesse
1
ogni 44100 di secondo. Lo spettro del rumore bianco si presenta come in
figura 110: le frequenze occupano tutta la banda audio.
Rumore bianco
0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000
Il rumore rosa ha una distribuzione spettrale diversa dal precedente: 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. 111).
Rumore rosa
0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000
115
In Pd questi due tipi di rumore sono implementati rispettivamente 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 im-
postata, successivamente produce delle bande secondarie larghe quanto la
frequenza impostata ma di ampiezza sempre minore. L’esempio in figura
(112) mostra lo spettro prodotto da rand∼ con frequenza 2500 hz.
0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000
I rumori con il loro spettro ricchissimo sono ideali per poter essere filtrati
e costituiscono i segnali sorgenti privilegiati per la sintesi sottrattiva.
11.2 I FILTRI
116
2500
0
polygate~ 3 100
dac~
(a)
delay
Input + Output
(b)
delay
Input + Output
Figure 114: I due più comuni schemi di implementazione per i filtri digitali
117
plementazione descrive i filtri a risposta finita all’impulso (Finite Impulse
response, FIR) perché il segnale elaborato è solo quello in entrata. In (b)
una copia del segnale in uscita viene ritardato e combinato con il segnale
in entrata, in questo caso si parla di un filtro a risposta infinita all’impulso
(Infinite Impulse Response, o IIR), poiché il segnale in uscita rientra nel filtro
per essere rielaborato. Per tale ragione si parla in questo caso anche di
Filtri Ricorsivi.
0.5
delay
*
0.5
Input
* + Output
118
pena descritto.
noise~
z~ 1
*~ 0.5
*~ 0.5
+~
dac~
1
amp
0
freq 22050
119
frequenza di camipnamento. L’equazione diventa quindi:
1
amp
0
freq 22050
Come abbiamo visto tali filtri sono detti FIR, perché non creano ricorsioni
fra il segnale di entrata e il segnale di uscita e fino al secondo ordine sono
120
molto stabili, infatti per creare filtri di ordine superiore si è solito usare
filtri del primo e del secondo ordine in scascata piuttosto che implementare
un unico filtro di ordine superiore.
Non ci addentreremo oltre nella descrizione tecnica dei filtri digitali, che
esulerebbe dagli scopi di questo testo, ma diremo che attualmente i filtri
più usati sono raggrupabili in 4 tipi:
• passa-basso
• passa-alto
• passa-banda
• escludi-banda
121
caso tale quantità indica la frequenza al di sopra della quale vengono atten-
uate le altre frequenze, nel secondo, al contrario, indica la frequenza sotto
la quale inizia l’attenuazione.
Gli altri due filtri (passa-banda e escludi-banda) sono una derivazione dei
primi. infatti se si filtra un segnale con una coppia passa-basso/passa-alto
si realizzarà un filtro passa-banda o escludi-banda. L’immagine 119 mostra
questa situazione. Nella figura in alto la zona quadrettata rappresenta la
regione dello non filtrata, in quella in basso la zona quadrettata in alto rap-
presenta la zona eliminata dallo spettro.
I valori necessari per tali filtri sono due frequenze di cutoff, una per il passa-
basso, l’altra per il passa-alto.
fc
Q= B
fc
B= Q
122
bandpass filter
s
as
lo w
hp
pa
h ig
ss
bandreject filter
ss lo w
h pa pa
h ig ss
123
I ord.
-6 dB
II ord.
-12 dB
x 2x 4x
Figure 120: Curva della risposta in frequenza di filtri del primo e secondo ordine,
x è la frequenza di cutoff
-3 db
Q=2
Q=8
Fc
11.4 I FILTRI IN PD
Pd possiede una vasta collezione di filtri, la maggior parte dei quali in-
trodotti da librerie esterne nella versione extended. Per brevità analizzer-
emo l’uso di alcuni oggetti della versione nativa.
124
nale del passabanda dal segnale originale).
La figura 122 mostra lop∼, hip∼ e bp∼ in azione sulla stessa sorgente.
L’oggetto polygate∼ permette di lasciar passare il segnale indicato dal
messaggio choice seguito dal numero dell’inlet scelto. Un messaggio pari a
zero chiude l’uscita per qualunque segnale. I due argomenti dell’oggetto
sono il numero degli inlet e il tempo in millisecondi in cui avviene la tran-
sizione fra un segnale e l’altro.
off
lp noise~
hp
bp lop~ 40 194 bp_cutoff
hip~ 10000
choice $1 bp~ 200 10
polygate~ 3 80
sig~
lop~ 5
*~
dac~
Il filtro vcf∼ è uguale a bp∼ eccetto per il fatto di poter controllare il cutoff
via segnale. Questo consente dei realizzare dei controlli della frequenza di
taglio molto dinamici.
Nella patch in figura 123 un phasor∼ controlla il cutoff di un vcf∼ che filtra
il segnale di un altro phasor∼.
Il phasor∼ di destra crea 2 volte al secondo una rampa che viene molti-
plicata per 720 e sommata a 80, quindi va da 80 a 800. Questo rampa
va nell’inlet del cutoff del vcf∼. L’argomento dell’oggetto è il fattore Q,
che nella patch può essere variato attraverso la number box. La frequenza
principale del suono sorgente è generata da un altro phasor∼ a frequenza
125
phasor~ 80 phasor~ 2
8 *~ 720
+~ 80
vcf~ 5
sig~
lop~ 5
*~
dac~
Figure 123: Un filtro vcf∼ con controllo del cutoff attraverso un phasor∼
costante.
Nella patch c’è una particolarità: lo slider (con valori da 0 a 1) invia at-
traverso sig∼ il segnale che controllerà l’ampiezza a un filtro passa-basso
con frequenza 5. lop∼ smusserà le spigolature del segnale consentendo
il passaggio da un valore all’altro in modo graduale. Diminuendo la fre-
quenza del filtro l’interpolazione sarà più lenta, al contrario, sarà più rap-
ida all’aumentare della stessa.
Gli oggetti principali della patch li conosciamo quasi tutti, un phasor∼ per
la lettura delle tabelle e il timing del sequencer, un vcf∼ per filtrare via
segnale la sorgente sonora e infine samphold∼, oggetto utilissimo per nu-
merose implementazioni.
126
samphold∼ è la forma contratta di sample and hold, campiona e trattieni ed
è, a modo suo, una forma di filtro. Generalmente un algoritmo sample and
hold prevede due parametri: un segnale da campionare e un segnale per
scandire il campionamento secondo certi criteri. Nel caso di samphold∼,
l’inlet di sinistra è deputato ad accettare il segnale che verrà campionato,
mentre quello di destra accetta il segnale di trigger. Ma come e quando
avviene il campionamento del segnale? esattamente quando il segnale di
destra passa da un valore non-zero a zero. Tipicamente si usa un phasor∼:
ogni volta che termina la rampa arrivando a uno, torna a zero, innescando
il processo di campionamento. Il segnale da campionare può essere invece
di qualunque tipo.
noise~ phasor~ 4
samphold~
abs~
*~ 800
interp_time
+~ 100
5
osc~
*~
dac~
127
12 MOULAZIONE AD ANELLO (RM),
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 )
RM = sigα ∗ sigβ
RM = (α f + β f ), (α f − β f )
1
cos(α) ∗ cos( β) = [cos(α + β) + cos(α − β)] (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 127 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 128.
Schematizzando:
Dati i segnali α(2000hz), β(500hz), γ(650hz), si applica la modulazione ad
anello ai primi due e il risultato si ring-modula con il terzo:
- RM1 = (α f + β f ), (α f − β f )
128
Modulazione ad anello
*~
dac~
- RM2 = RM1 f ∗ γ f
129
- RM2 = RM1 f ∗ 650
*~
osc~ 650
*~
dac~
130
Modulazione ad anello doppia
131
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
Figure 129: la distanza massima fra l’ampiezza positiva e quella negativa del seg-
nale bipolare (a) é doppia rispetto a quella del segnale (b)
132
osc~ 200 bipolare
metro 100
tabwrite~ bipolare
unipolare
tabwrite~ unipolare
dac~
133
controllo_tremolo
osc~ 800
2
osc~ 1
*~
$1 20
line~
*~
dac~
Figure 131: con la number box si può aumentare o diminuire la frequenza del
tremolo
Tremolo
a)
b)
c)
Figure 132: il segnale (a) viene moltiplicato per il segnale (b) generando il tremolo
rappresentato in (c)
134
Tremolo controllato in ampiezza
a)
b)
c)
135
osc~ 1600
frequenza
ampiezza
1
37
osc~ 1
/ 100
wave
*~
$1 20
line~
*~
metro 25
dac~ tabwrite~ wave
Figure 134: con la number box a destra si può controllare l’ampiezza del tremolo
( P f ), ( P f + M f ), ( P f − M f ) =
800, (800 + 160), (800 − 160) =
800, 960, 640
Come nel caso della modulazione ad anello, nella Modulazione d’ampiezza
i segnali possono essere costituiti da suoni complessi. Lo spettro risultante
sarà sempre l’insieme delle somme e differenze fra le frequenze della por-
tante e della modulante e in più le frequenze della portante. La patch in
figura 138 mostra una doppia modulazione d’ampiezza. La portante di
1500 hz viene modulata con un segnale di 500 hz. Il risultato di tale modu-
136
Modulazione d’ampiezza semplice
( Pf ∗ M1 ) ∗ M2 =
[1500, (1500 + 500), (1500 − 500)] ∗ M2 =
(1500, 2000, 1000) ∗ M2 =
(1500, 2000, 1000) ∗ 300 =
[1500, (1500 + 300), (1500 − 300)], [2000, (2000 + 300), (2000 − 300)],
[1000, (1000 + 300), (1000 − 300)] =
1500, 1800, 1200, 2000, 2300, 1700, 1000, 1300, 700
137
osc~ 800 osc~ 160
*~
$1 20
line~
*~
dac~
138
osc~ 1500
osc~ 500
osc~ 300
*~
$1 20
line~
*~
dac~
Figure 137: la patch realizza una modulazione d’ampiezza con due modulanti
139
Modulazione di ampiezza con 2 modulanti
140
osc~ 800 osc~ 160
$1 20
expr~ ($v1 * 0.5) + 0.5
line~
*~
$1 20
line~
*~
dac~
Figure 140: la slider verticale a destra controlla l’indice di modulazione, con range
da 0 a 1
141
13 V I B R ATO E M O D U L A Z I O N E D I
FREQUENZA (FM)
vibrato
osc~ 1
80 40
sig~ *~
+~
osc~
metro 100
dac~ tabwrite~ vibrato
Figure 141
142
Nella patch in figura 141 il segnale bipolare dell’LFO sarà moltiplicato per
40, producendo un’onda che varierà in ampiezza fra -40 e 40 hz. Questo
segnale modulerà la frequenza dell’oscillatore di sinistra che ha una fre-
quenza base di 2000. L’effetto sarà di avere un segnale di frequenza 2000
che oscilla fra 1660 e 2040 hz alla velocità di un ciclo al secondo.
FM f = Pf , ( Pf + M f ), ( Pf − M f ), ( Pf + 2M f ), ( Pf − 2M f ), ( Pf + 3M f ), ( Pf −
3M f ), . . .
D
I = Mf
D = I ∗ Mf
143
pd modulante
freq indice
200 1000
10
Deviazione
2000
pd portante
freq
4000
pd uscita
dac~
144
freq
0
inlet~
+~
osc~
outlet~
Sulla patch per l’uscita (fig. 145) 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 componenti
presenti nello spettro. In figura 146 l’indice di modulazione 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 componenti spettrali. In figura 147 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
145
freq indice
200 1000
10
Deviazione
2000
t b f
/ 100 *
osc~ 200 $1 20 $1 20
line~ line~
*~
*~
outlet~
146
$1 20
inlet~
line~
*~
outlet~
Figure 146: FM con frequenza portante di 4000 hz, modulante di 200 hz e indice
di modulazione 0.1
147
Spettro FM indice 10
Figure 147: FM con frequenza portante di 4000 hz, modulante di 200 hz e indice
di modulazione 10
Inviluppo di tromba
ampiezza
tempo
Figure 148
148
a)
b)
c)
Figure 149: l’inviluppo disegnato in (b) ha valori compresi fra 0 e 1. L’onda (a)
viene inviluppata da (b), ovvero istante per istante le ampiezze is-
tantanee di (a) vengono moltiplicate per i relativi valori di (b), pro-
ducendo (c)
149
Figure 150: l’oggetto envgen
Infine in figura 154 c’è il sequencer per la generazione dei bang per in-
nescare gli eventi sonori. L’oggetto list-idx riceve una lista di 0 e 1, 1 laddove
l’evento deve essere on, 0 quando dev0essere off. metro collegato a un con-
tatore costringe list-idx ad emettere uno ad uno i valori della lista, quando
il valore è uguale a uno la patch invia un bang agli inviluppi, creando la
sequenza desiderata.
Nella figura 155 un’unica modulante agisce su tre portanti delle quali si
può impostare la frequenza ma che hanno un unico controllo dell’ampiezza.
150
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
151
inlet inlet
prepend set
unpack f f
* 25 loadbang
pack f f 1 16 0 184 0
line~ 0 5 s envindex
outlet~
inlet
inlet
line~
prepend set
outlet~
loadbang
s envamp
Allo stesso modo si può aumentare il numero delle modulanti che agiscono
su un’unica portante. Nella figura 157 tre oscillatori modulanti agiscono
su un’unica portante.
152
r trig
START SPEED
150
pack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sel 1 int 0 + 1
s trig mod 16
153
frq frq frq frq index
250 500 750 50 90
pd mod
$1 20
line~
*~
dac~
154
bang duration 1000
index
* 200
pd mod
*~ *~ *~
*~ 0.3
dac~
Figure 156: FM con portanti multiple con controllo di singole ampiezze e indice
di modulazione tramite envgen
155
pd modulante pd modulante pd modulante
5 2.3 4
+~
+~
pd portante
freq
80
pd uscita
dac~
156
14 INTRODUZIONE ALLA SINTESI
GRANULARE
La sintesi granulare muove dal concetto che eventi sonori molto brevi,
emessi in rapidissima successione, perdono la loro singolarità e costitu-
iscono un continuum sonoro unitario.
Tali brevi segmenti sonori sono detti grani, o quanta sonori. Un flusso
continuo di grani costituisce un treno, mentre più treni contemporanei for-
mano nuvole.
Densità dei grani e durata del grano sono due parametri che possono es-
sere o meno dipendenti l’uno dall’altro. Quando all’aumentare della den-
sità dei grani diminuisce la durata del singolo grano densita e durata del
grano sono parametri dipendenti. In questo caso il rapporto di inversa
proporzionalità rimane costante. Nel caso di indipendenza dei parametri
157
!"#$%&'( )(##
upg upg
gpg gpg
*+",(-.&/"# *+&"'01#"+
upg upg
gpg gpg
21"&z0"1%%&"' ,1#%(
upg upg
gpg
gpg
In figura 161(a) con densità pari a 25 hz e durata del grano (gdur) di 20 mil-
lisecondi, si ha un periodo di 40 millisecondi. Quando la densità aumenta
a 50 hz, come in (b), periodo e gdur coincidono, quindi è il limite entro il
quale i grani ancora non si toccano. Quando la densità supera quella soglia,
come nell’esempio (c), dove è di 70 hz, il periodo diventa minore di gdur e
si realizza il troncamento: il grando inizia prima che il precedente sia ter-
minato. Nell’ultima situazione, la (d), si applica un overlapping per evitare
158
sine wave
1,0
0,0
-1,0
0,0 0,0
-1,0 -1,0
0,0 0,0
-1,0 -1,0
14.1.2 OVERLAPPING
159
Figure 160: Periodo e densità del grano
diversa. Nel caso dell’immagine in figura 162 il primo treno avrà offset
zero, il secondo 20 ms, il terzo 40 ms. per ogni treno il periodo avrà durata
di 60 ms.
160
Figure 161: Troncamento e Overlapping
161
pdur: 60ms
gdur: 50ms gdens: 50hz
offset1: 20ms
offset2: 40ms
overlapfactor = int(factor)+1;
}
}
}
162
Figure 163: Overlapping con overlapping factor pari a 3
superiore alla soglia udibile (oltre i 20hz circa) si produrrebbe già un suono
ben distinguibile.
• rapporto gdens/gdur
163
14.1.4 I L DOMINIO DEL TEMPO E LA SINTESI GRANULARE
Possiamo distinguere, generalizzando molto, tre tipi di tempo (fig. 164), dal
più indistinguibile, il tempo microscopico, fino al tempo formale, che dal punto
di vista percettivo ha una dimensione fenomenica piuttosto che temporale,
attiene quindi alla capacità del percettore di ricostruire soggettivamente la
sequenza degli eventi.
164
tempo
dominio del timbro
microscopico
tempo
dominio del tempo musicale
macroscopico
tempo
dominio del tempo culturale
formale
Syncronous (Quasi-Syncronous)
Asyncronous Granular Synthesis
Granular Synthesis
Sampled Sounds
Trainlet Synthesis Grainlet Synthesis Glisson Synthesis
Granulation
165
capi le famiglie tipiche e le relative derivazioni.
14.2 I MPLEMENTAZIONE IN PD
• forma dell’inviluppo
Cerchiamo di capire cosa accade all’interno della patch (fig. 166). L’oggetto
tabread4∼ legge la tabella dell’inviluppo del grano. phasor∼ alla fre-
quenza scelta moltiplica la sua uscita per 512, in modo da leggere i 512
indici della tabella. L’inviluppo viene moltiplicato per il segnale generato
da osc∼.
Se si realizza questa semplice patch la cosa più interessante è verificare la
differenza di timbro a parità di frquenza e densità, al variare della forma
dell’inviluppo.
166
pd frequenza
pd envelope
phasor~ 4 r frq
inviluppo
expr 1000 / $f1
set bell
s graindur
*~ 512 set trap
set halfsine
r princfrq
set expdec
frequenza
467
*~ densità
r amp
30
$1 50
line~
amp graindur
33.33
*~
dac~
167
segnale a tabread4∼ tale che ci sia dopo il grano una porzione di silenzio.
Cerchiamo di spiegare meglio questo concetto. In presenza di una tabella
di 512 punti un phasor∼ con frequenza 1 con moltiplicazione del segnale
per 512 leggerà tutta la tabella in un secondo. Cosa accade se moltiplichi-
amo il segnale in uscita da phasor∼ per 1024? In un secondo il suo segnale
creerà una rampa da 0 a 1023. Fino a quando il valore sarà minore di 512
leggerà i valori della tabella, oltre 512 leggerà valori pari all’ultimo indice
letto nella tabella (che andrà SEMPRE impostato a zero). Raddoppiando
quindi il valore dei punti da far leggere a phasor∼ si genera un Duty Cycle
di 1:1, una parte di grano e una uguale di silenzio.
168
In figura 167 viene mostrato un Duty Cycle di 1:3. phasor∼ viene molti-
plicato per 2048, il quadruplo della tabella da leggere, quando il valore in
uscita è minore di 0.25 leggerà tutti i valori della tabella, oltre 0.25 non
leggerà più nulla e tabread4∼ emetterà l’ultimo indice.
inlet ratio
$1 50
line~
outlet~ ratio
169
frequenza
0 0
phasor~ 4 pd ratio 0
set bell
set halfsine
set expdec
tabread4~ trap
*~ $1 50
line~
*~
dac~
170
Figure 170: Lo spettro risultante della Pulsar Synthesis
• ampiezza
171
7500
Frequency (Hz)
0
0 11.42
Time (s)
sig~ *~ 0
+~
phasor~
*~ 512
outlet~ gdens
La patch contiene due grandi subpatch, una per la gestione di tutti i parametri
dei grani, l’altra per la gestione dell’ampiezza e la distribuzione sul fronte
172
ampenv
gdens bell pd envelope
trap
34
halfsine
expdec
gdensvar_(0-100) amp_(0-1)
waves
30.30 1
sine
%_ampvar_(0-100)
rect
frq
tri
475 saw
48.48
frqvar_(0-100)
stereospread
20.20
0.505
*~
*~ *~ pd reverb
1 1
throw~ rev1
throw~ rev2
dac~
173
ampenv
gdens bell
trap
34
halfsine
expdec
gdensvar_(0-100)
waves
30.30
sine
rect
frq
tri
475 saw
frqvar_(0-100)
sig~ *~ 0
r waveform
+~ noise~
sel 0 1 2 3
phasor~
expr ($f1 * $f2) / 200
set bell
*~ 512
set trap
set halfsine tabread4~ bell
samphold~ r waves
set expdec
sel 0 1 2 3
sig~ *~ 0
set osc
+~ set rect
*~ set saw
174
loadbang
inlet~ inlet ;
saw sinesum 515 -1 -0.5 -0.33 -0.25 -0.2 -0.16 -0.142
-0.125 -0.111 -0.1 -0.09 -0.083 -0.076 -0.071 -0.066
-0.0625;
saw normalize 1
tabosc4~ osc ;
tri sinesum 515 1 0 -0.111111 0 0.04 0 -0.0204082 0
outlet~ 0.0123457 0 -0.00826446 0 0.00591716 0 -0.00444444;
tri normalize 1
;
table osc 515
rect sinesum 515 1 0 0.333333 0 0.2 0 0.142857 0 0.111111 0
table rect 515 0.0909091 0 0.0769231 0 0.0666667 0;
table tri 515 rect normalize 1;
table saw 515 ;
osc sinesum 515 1
14.5.1 vline∼
175
catch~ phas
amp_(0-1)
noise~
1 samphold~
%_ampvar_(0-100)
abs~ / 100
*~ 0 $1 20
48.48
0.505
*~ noise~
samphold~
outlet~ amp
*~ 0
sqrt~
outlet~ sx outlet~ dx
176
Figure 177: Un inviluppo da generare con vline∼
vline~
Il limite di questa implementazione risiede nel fatto che vline∼ viene at-
tivato tramite un bang e non tramite segnale, quindi a velocità molto alte
potrebbe peccare in precisione. Per quello che è stato fatto fino ad ora,
sappiamo che l’oggetto che produce bang a intervalli prestabiliti è metro,
che potrebbe rappresentare una buona soluzione, ma non ottimale perché
quello che ci occorre veramente è la possibilità di emettere un bang alla
frequenza del phasor∼ che controlla la densità dei grani, che, come sappi-
177
amo, è variabile nell’ambito del microtempo.
Per implementare tale sistema si può usare l’oggetto edge∼, della libreria
cyclone, che clona gli oggetti di MaxMSP. Questo oggetto emette un bang
dall’outlet sinistro ogni volta che il segnale in entrata passa da zero a non-
zero e un bang dal destro quando il segnale passa da non-zero a zero. L’help
dell’oggetto mostra un esempio di utilizzo.
phasor~
amplitude
grain density grain triggering stereo spreading
variation
(gdens) (edge~) (samphold~)
(samphold~)
grain duration
(vline~/tabread~)
178
cambiare a piacimento la durata del grano.
phasor~ 8
edge~ 0
f 20
0, 1 $1
vline~
*~ 512
tabread4~ bell
Una volta resi indipendenti densità e durata dei grani c’è il rischio che a
densità alta avvenga un troncamento fra i grani, quindi è necessario im-
plementare un algoritmo per l’overlapping. La soluzione per questa patch è
semplice, anche se computazionalmente dispendiosa: invece di attivare un
nuovo treno di grani quando il fattore do overlapping lo richieda, creiamo
più treni a prescindere e tramite un contatore inneschiamo un grano alla
volta per ogni treno.
179
overlapping factor: 1
train 0
train 1
train 2
overlapping factor: 2
train 0
train 1
train 2
A questo punto la patch per la sintesi granulare asincrona con parametri in-
dipendenti può essere implementata. La figura 183 mostra l’interfaccia per
il controllo dei parametri. Nelle properties di ogni GUI e di ogni number box
sono impostati, tramite send-symbol, i nomi degli oggetti che riceveranno i
relativi dati.
L’interno della patch è mostrato in figura 184. I treni attivi sono otto, per il
resto la patch è uguale a quella implementata per la sintesi asincrona con
parametri dipendenti (sez. 14.5) quindi lasciamo al lettore il compito di
analizzarla. In figura 185 è mostrato l’interno della subpatch envgen dove
180
phasor~
edge~
f + 1
% 3 gdur
0
sel 0 1 2
f 20 f 20 f 20
0, 1 $1 0, 1 $1 0, 1 $1
amp_(0-1) Reverb
ampvar_(0-100) gain
amp_(0-1) feedback
181
r gdens r gdensvar
t f f f r eform
*~ 0
set bell
+~
set trap
set halfsine
phasor~ set expdec
r frq r frqvar
sel 0 1 2 3 f + 1 noise~
sig~ *~ 0
set osc % 8
pd envgen r ampvar $1 20
pd envgen pd envgen pd envgen
*~ 0
noise~
pd envelope expr~ 1 - $v1
samphold~
*~ *~ *~
*~ *~ *~ *~ *~ *~ r stereospread
catch~ rev2 *~ 0
catch~ rev1
*~ 0.25 expr~ ($v1 * 0.5) + 0.5
r gain r feedback
*~
182
inlet bang
r gdur
f 20
0, 1 $1
vline~
*~ 512 r envform
tabread4~ bell
outlet~ env
audio source
normal manipulated
playback playback
forward
variable
backward
speed
random
La sintesi granulare sui campioni permette non solo di generare timbri in-
teressanti, ma anche di processare i campioni stessi per il time stretching
e il pitch shifting. L’argomento richiederebbe uno spazio ben più ampio
183
rispetto a quello che possiamo dedicargli in questo testo, ma nel prossimo
capitolo proporremo alcuni esempi di granulazione applicati a suoni cam-
pionati.
184
15 LAVORARE CON SORGENTI
AUDIO ESTERNE
185
Una volta dentro il segnale può essere trattato come un qualunque seg-
nale numerico. Dopo essere stato processato, elaborato, manipolato o
quant’altro può essere riconvertito tramite dac∼ e rimandato alla scheda
audio.
La figura 187 mostra una situazione in cui il suono entra in pd con adc∼
ed esce con dac∼ (una patch assolutamente inutile, ma esplicativa).
adc~ adc~ 1 2 3 4 5 6 7 8
dac~ dac~ 1 2 3 4 5 6 7 8
186
openpanel
soundfiler
60480
tab-file
Come sempre i file di help dei due oggetti sono utili per una conoscenza
completa di tutti i messaggi che gli oggetti accettano.
Già con la conoscenza di questi pochi oggetti è possibile fare cose interes-
santi con i file audio. In questa sezione implementiamo un random slicer,
cioè un algoritmo che prende un file audio, tipicamente un pattern di batte-
187
openpanel
open $1
start
stop
savepanel
readsf~ 2 open $1
start
stop
writesf~ 2
Tipicamente uno slicer divide il pattern per una potenza di due perché il
sistema ritmico della tradizione occidentale tendenzialmente tende ad es-
sere binario, soprattutto in circostanze di questo tipo. Quindi prima di
tutto implementeremo un sistema per scegliere in quante slices dividere il
pattern.
188
oni viene divisa per il numero delle fette per avere la dimensione in cam-
pioni di ogni fetta. I due valori ottenuti saranno gli unici necessari per
l’implementazione dell’algoritmo.
inlet bang
openpanel
soundfiler
inlet div
t b
t b b f
f
2
/ 44.1 pow 4
s slicenum
/ 16 / 16
s msdur s sampdur
Una volta costruito il motore che gestisce l’esecuzione delle slices al giusto
tempo si può aggiungere la parte di algoritmo che si occupa della scelta
delle fette da eseguire. Nell’esempio precedente infatti la scelta è quella di
eseguire tutte le slice nell’ordine, il che ha poco senso perché si ha una ripe-
tizione pedissequa del pattern sempre uguale. L’intervento più semplice da
fare è quello di sostituire al contatore un oggetto random che scelga casual-
189
choose_division start
r msdur
1
metro
1/2
1/4 t b b
1/8 f + 1
open a file
1/16
bang 1/32 r slicenum
f
% 16
pd slicersettings
0, 1 $1
vline~
r sampdur
*~
drumfile
*
+~ s cursor
tabread4~ drumfile
$1 20
line~
*~
dac~
190
start
r msdur
metro
sezione da
sostituire f + 1
t b b
f + 1 ------> r slicenum
------> random 16
% 16
r slicenum
f
% 16 expr if($f1 < 8, $f1, random(8, 16))
0, 1 $1
vline~
r sampdur
*~
*
+~ s cursor
tabread4~ drumfile
$1 20
line~
*~
dac~
191
choose_division start r msdur
1 prob_reversing
metro freeze! 5
1/2
expr 1 - $i1
1/4 t b b
1/8 spigot 1
open a file
1/16
bang 1/32
random 100 r probrev f + 1
pd slicersettings
expr 100 - $i1 r slicenum
< 90 % 16
sel 1 0
f expr if($f1 < 4 || ($f1 > 7 && $f1 < 12), $f1, random(0, 8))
0 1 1 0
unpack 0 0
pack 0 0 0
$2, $3 $1
vline~
r sampdur
*~
drumfile *
+~ s cursor
tabread4~ drumfile
$1 20
line~
*~
dac~
La prossima figura (195) mostra come si possa leggere una tabella a fram-
menti tramite phasor∼, wrap∼ e samphold∼.
192
phasor~(x)
4,0
3,0
2,0
1,0
0,0
*~ 4
4,0
3,0
2,0
1,0
0,0
wrap~
4,0
3,0
2,0
1,0
0,0
193
phasor~ 1
*~ 4
wrap~
samphold~
*~ 11025
*~ 11025
+~
tabread4~ drum
La parte destra della patch invece permette di proseguire nella lettura della
tabella oltre i primi 11025 campioni. L’oggetto samphold∼ campiona il seg-
nale che arriva nell’inlet di sinistra ogni volta che il segnale di destra torna
a zero. Nel nostro caso ogni volta che la rampa generata da wrap∼ torna a
zero il segnale in uscita dal moltiplicatore viene fatto uscire da samphold∼.
In pratica quando wrap∼ genera la prima delle 4 rampe samphold∼ farà
uscire il primo campione della rampa moltiplicata, cioè zero, con la sec-
onda rampa di wrap∼ uscirà 1, con la terza 2 e così via. Usciranno così
in ordine il numero delle slices, che vengono immediatamente moltiplicate
per la durata in campioni. Rappresentano un offset che viene sommato al
primo segnale.
194
ed eseguire per un po’ la stessa fetta. Le immagini seguenti mostrano
l’algoritmo generale (fig. 196), e la varie subpatches (figg. 197,198 e 199).
choose_division
1
1/2
1/4
1/8
choose a file
1/16 r phasordur
bang 1/32
phasor~
pd slicersettings pd roll
sig~ 16
r slicenum
*~
expr~ random(0, 100) expr~ if($v1 < (($f2 / 2) - 1), $v1, random($f2 / 2, $f2))
r freeze
freeze!
expr~ if($v1 < $f2, -1, 1)
*~ rep_prob 0
r sampdur
*~ expr~ $v1 < 0.5
samphold~
r sampdur edge~
*~ random 100 pd freezerep
drumfile
+~ snapshot~
$1 20
line~
*~
dac~
Una volta che un file audio è stato caricato in una tabella può essere ma-
nipolato, come abbiamo visto, in modi diversi. Uno dei comportamenti più
visibili è determinato dal cambiamento della velocità di lettura dei campi-
oni. Aumentare la velocità di lettura comporta un aumento della frequenza
del file e una diminuzione del tempo di esecuzione, viceversa, diminuire la
195
inlet bang
openpanel
soundfiler
inlet div
t b
t b b f
f
2
pow 4
/ 44.1
s slicenum
expr 1000 / $f1 / 16
s phasordur s sampdur
Figure 197: la subpatch che gestisce la scelta del file e il numero delle slices in cui
suddividerlo
r freeze
== 1
r sampdur
+ 1
expr $f2 / $f1
r slicenum
* 16
outlet
196
inlet freeztog inlet repprob
t b
t f f b
f
spigot
* 100
outlet rep
SPEED(-5/5)
open_file
expr $f1 / 10 - 5
openpanel
t b f
phasor~ 1
f
*~
expr 1000 / ($f1 / 44.1)
AMPLITUDE
audiofile
sig~
lop~ 1
*~
dac~
197
Certamente la cosa più interessante è cercare di svincolare i due compor-
tamenti, cioè rendere indipendente la durata dalla trasposizione. Questo è
possibile farlo, realizzando un algoritmo di tipo granulare, che segmenta il
file audio in piccoli segmenti e su quelli opera una trasposizione, ma allo
stesso tempo lascia invariata la durata del file stesso.
2 Si tratta della patch-tutorial che si chiama B14.rockafella.sampler.pd che si può trovare nella
cartella doc/3.audio.examples dentro la cartella principale di pd
198
original file
Figure 201: Principio di granulazione di un file audio per time stretching e pitch
shifting indipendenti
199
A
*~ t b f wrap~
s~ read-pt s~ phase2
D1
D2
r chunk-size
samphold~ r chunk-size
r~ phase
*~ r~ phase samphold~ r~ phase2
+~ r~ read-pt *~ r~ phase2
r~ phase
*~ 44100 +~ r~ read-pt
r~ phase2
-~ 0.5
*~ 44100
+~ 1 -~ 0.5
*~ 0.5
tabread4~ table23 +~ 1 *~ 0.5
cos~
tabread4~ table23 cos~
*~
*~
+~
hip~ 5
output~ choose_a_file
dsp
volume pd table
200
la durata del file da eseguire. In sostanza phasor∼ restituisce una rampa
che va da 0 alla lunghezza del campione da processare con una frequenza
che corrisponde alla velocità a cui vogliamo sia eseguito.
Oltretutto vengono create due rampe, una con differenza di fase di 0.5, in
modo da creare un overlapping per riempire i vuoti generati soprattutto in
fase di riduzione della velocità.
201
Part III
APPLICAZIONI VARIE
16 E S T E N D I B I L I TÀ D I P D
203
Gli externals a volte vengono organizzate in librerie che possono essere
caricate per intero all’apertura del programma. Il menu Startup serve a
localizzare la posizione di tutte le librerie che bisogna caricare all’avvio
del programma.
Pd nella sua versione extended include già numerose librerie, che rendono
il programma funzionale a un utilizzo molto esteso. la libreria GEM, che
esamineremo più dettagliatamente nel capitolo successivo, offre una serie
di oggetti per manipolare immagini e video. cyclone mette a disposizione
degli utenti di pd una serie di oggetti-cloni de Mas/Msp, di cui fra l’altro
abbiamo già fatto uso più volte(Uzi, counter, drunk, etc. . . ). La libreria zexy
estende genericamente sia il parco degli oggetti audio che quelli dati. pmpd
è una libreria di oggetti per simulare comportamenti fisici del mondo reale.
per una lista completa delle librerie e delle loro funzionalità rimandiamo
al portale di pure data (http://puredata.info/).
204
17 GEM E IL VIDEO
La libreria GEM è una libreria per la gestione del video e delle immagini
in pd.
create
destroy
gemwin
uns volta abilitato il rendering nella finestra grafica, è possibile creare delle
forme all’interno di essa. L’oggetto gemhead abilita il rendering di ogni
tipo di forma e deve essere presente all’inizio di una catena di creazione
della forma. L’oggetto che identifica una forma, ad esempio square per un
quadrato, deve trovarsi alla fine di questa catena. Fra questi due estremi
della catena possono essere presenti molti atri oggetti che gestiscono la
forma: colore, dimensioni, posizione, etc.
Nella figura 204 creiamo prima la finestra di GEM con create, poi attiviamo
205
il rendering con toggle e quindi vedremo apparire un quadrato di colore
bianco (l’argomento dell’oggetto color 1 1 1 scala fra 0 e 1 i valori di RGB,
cioè rosso, verde e blu, tutti impostati al massimo per dare il bianco).
create gemhead
destroy
color 1 1 1
gemwin square
Le coordinate variano da -4 a 4 sia per l’asse delle x che per quella della y,
quindi il punto [0,0] rappresenta il centro del piano.
• square
• circle
• triangle
• cube
• sphere
• cone
206
create gemhead
destroy
color 1 1 1 metro 250
gemwin t b b
/ 100 / 100
- 4 - 4
translateXYZ
square 0.25
• color
• colorRGB
• rotate
• rotateXYZ
• scale
• scaleXYZ
• translate
• translateXYZ
Come sempre gli help di ognuno di tali oggetti possono essere un va-
lidissimo ausilio per la comprensione del loro comportamento. Il sito in-
ternet http://gem.iem.at/documentation/manual/manual presenta invece
un manuale abbastanza esaustivo sulla libraria GEM.
207
17.2 INTERAZIONE AUDIO E GEM
Già con queste poche nozioni possiamo creare un algoritmo in cui audio
e video interagiscono. Nella patch in figura 206 metro invia un bang ad un
inviluppo d’ampiezza controllato da line∼ per l’oscillatore, ma allo stesso
tempo controlla il colore del quadrato con un inviluppo identico, che va
a modificare il primo dei tre colori dell’oggetto color, che varia dal rosso
(quando è 1) al nero quando è zero.
create
destroy
activate
gemwin
metro 500
delay 50
gemhead
line line~
* 0.01
*~
$1 0 0
dac~
color 0 0 0
square 0.25
Volendo usare più oscillatori e più quadrati no dovremmo fare altro che
copiare la aprte di patch che ci interessa e aggiungere un oggetti transla-
teXYZ per sistemare opportunamente i quadrati nello spazio.
la prossima patch è un po’ più elaborata (fig. 207. Un oggetto metro emette
bang ogni 125 o 250 millisecondi. random genera un numero compreso fra
208
0 e 6 inviandolo a sel che smista i bang di uscita fra varie combinazioni: gli
oscillatori possono suonare tutti insieme, due alla volta oppure uno alla
volta, in base al numero generato da random.
la figura 208 mostra l’interno della subpatch quadsx. Il bang ricevuto dall’inlet
attiva l’inviluppo di ampiezza del generatore dell’onda (in questo caso un
phasor∼) e la produzione del colore. Allo stesso tempo mette in azione
un oggetto random che genera numeri compreso fra 0 e 2, che andranno
a modificare la posizione del quadrato sull’asse delle y e la frequenza del
generatore audio, che varierà fra i valori 500, 1000 e 1500.
la subpatch quadc, del quadrato centrale (fig. 209), è più semplice. manca
infatti tutta la gestione della frequenza di osc∼, che ha frequenza fissa (100
hz).
209
create activate
destroy
random 7
sel 0 1 2 3 4 5 6
$1 5
line~
pd quadsx pd quadc pd quaddx
*~ *~ *~
*~ 0.25
*~ 0.25
dac~
Figure 207: interazione audio video con tre oscillatori e tre quadrati
210
inlet
+ 1
gemhead
* 500
100 5 0 10
phasor~ 1000 1 5 0 10
line
* 0.01 - 1 line~
$1 $1 $1 * 2
color 0 0 0 *~
outlet~
translateXYZ -2 0 0
square 0.25
211
inlet
delay 100
gemhead
line line~
* 0.01
*~
$1 0 0
outlet~
color 0 0 0
translateXYZ 0 0 0
square 0.25
212
18 NETWORKING
1 http://jeraman.info/2009/03/22/how-to-use-pure-data-as-a-api/
213
saggi al motore.
proxy patch
pd engine
214
Nella client patch avremo un oggetto che si occuperà di connettersi alla
proxy patch per inviarle dei messaggi. Tale oggetto è netsend. D’altra parte,
la proxy patch conterrà l’oggetto netreceive che aprirà la porta di una connes-
sione socket e si metterà ina ttesa dei messaggi. A sua volta la proxy patch
potrà inviare messaggi al pd engine tramite normali messaggi preceduti dal
punto e virgola e dalla dicitura pd. In figura 211 abbiamo schematizzato
questo comportamento.
netreceive
proxy patch
; pd
pd engine
215
connect to port 5555
connect localhost 5555
send_osc_frquency
440
send frq $1
active_audio_engine
send active $1
netsend
osc~ 200
active audio
*~ 0.5 to pd engine
;
dac~ pd dsp $1
Figure 213: la proxy patch che si occupa di ricevere messaggi dalla client patch e di
inviare comandi al pd engine
216
La proxy patch è in ascolto sulla porta 5555 con l’oggetto netreceive. L’oggetto
route smista i messaggi. Nel caso riceva un messaggio preceduto dalla
parola-selettore active invierà il numero ricevuto alla message box che si oc-
cupa di spedire il comando di accensione dell’audio al pd engine, comando
che deve essere preceduto dal punto e virgola.
Negli ultimi tempi la pratica del Live Coding sta prendendo sempre più
piede nell’ambiente dei programmatori dell’audio e anche nella comunità
di pd stanno anscendo applicazioni che rendono possibile il Live Coding
condiviso, cioè la creazione di un’unica patch da postazioni diverse.
Ogni internal patch message è costituito da una parola chiave che rappre-
senta l’oggetto da creare o l’azione da compiere, seguita da altri argomenti.
Ad esempio il messaggio:
2 http://supercollider.sourceforge.net/
217
crea un oggetto osc∼ in posizione [100,100] della canvas con argomento
200 per la frequenza. Nella figura 214 mostriamo un esempio di questa
procedura.
connect 6 0 7 0, connect 6 0 7 1
connect 8 0 6 0
send pd-internalmessage01.pd
Figure 214: una patch per l’invio di internal messages all’interno della stessa patch
L’oggetto send invia i messaggi alla patch in cui si trova, in questo caso
internalmessage01.pd. Il nome della patch di destinazione deve essere pre-
ceduta dal prefisso pd-. I due messaggi con parola chiave obj creano gli
oggetti osc∼ e dac∼ alle coordinate indicate. Il messaggio floatnum crea
una number box e i tre messaggi connect (i primi due si trovano all’interno
della stessa message box, separati da una virgola, connettono gli oggetti fra
loro.
connect 8 0 6 0
218
connette il primo outlet dell’oggetto 8, cioè la number box con il primo inlet
di osc∼, che è l’oggetto numero 6. La figura 215 chiarifica il tutto.
connect 6 0 7 0, connect 6 0 7 1
connect 8 0 6 0
send pd-internalmessage01.pd
0 ---> 8
out 0
in 0
osc~ 200 ---> 6
out 0
in 0 in 1
dac~ ---> 7
Per far si che la numerazione degli oggetti creati inizi da zero è sufficiente
creare nella patch principale una subpatch vuota in cui risiederanno i nuovi
oggetti.
Con lo stesso principio possiamo inviare dei messaggi per creare degli
oggetti da una postazione remota facendo uso degli oggetti netsend e ne-
treceive e con opportuno routing di tali messaggi (tramite route). Le figure
216 e 217 illustrano questo procedimento alla fine del quale la subpatch ob-
jecthost si configurerà come nella figura 218.
219
connect to port 5555
connect localhost 5555
active_audio_engine
send active $1
netsend
Figure 216: la client patch per l’invio dei messaggi che creano gli oggetti
18.1.3 pdsend
Questi due programmi consentono di creare delle interfacce con altri lin-
guaggi di programmazione, il che potrebbe essere utilissimo se si riesce
a creare un codice in grado di gestire la creazione di messaggi da una
postazione remota.
220
netreceive 5555 receive message from
client
active audio
to pd engine
send pd-objecthost ;
pd dsp $1
pd objecthost
Figure 217: La proxy patch che contiene la subpatch objecthost in cui compariranno
i nuovi oggetti
osc~ 200
*~ 0.5
dac~
patch per ricevere ed eseguire i comandi. La fig. ??) mostra la proxy patch.
Si tratta semplicemente di una canvas che contiene l’oggetto netreceive in
ascolto sulla porta 3001 e con l’argomento zero, che significa che riceverà
messaggi TCP (che sono più affidabili degli UDP, indicati con l’argomento
1). L’ulteriore argomento old è necessario per ricevere qualunque tipo di
messaggio da pdsend.
Prima di tutto è necessario aprire pd, poi la proxy patch, infine aprire una
finestra di terminale. Da lì è necessario navigare fino alla posizione del
221
programma pdsend ed eseguirlo in questo modo:
oppure
222
18.2 IL PROTOCOLLO OSC
223
import mrpeach
0 unpackOSC
send /test $1
route /test
packOSC
0
udpsend
sender receiver
opportunamente.
224
import mrpeach
unpackOSC
0
route /data /audio
send /data /sliderA $1
packOSC
udpsend
sender receiver
Per realizzare connessioni che facciano uso di TCP è sufficiente usare gli
oggetti tcpsend e tcpreceive al posto di udpsend e udpreceive.
I protocolli che abbiamo esaminato fino ad ora (MIDI, OSC, FUDI) trasportano
fondamentalmente dati numerici, simboli, liste, ma non consentono di in-
viare e ricevere campioni audio. Per fare questo occorre utilizzare proto-
colli diversi, implementati in pd da oggetti specifici.
225
import mrpeach
30 0
packOSC packOSC
udpsend udpsend
unpackOSC unpackOSC
0 0
A B
226
connect localhost 3001 streamin~ 3001
osc~ 200
dac~
streamout~
client server
227
connect localhost 3001 streamin~ 3001
osc~ 200
streamin~ 3002
streamout~
streamin~ 3003
client A
*~ 0.25
*~ 0.25
streamin~ 3004
connect localhost 3002
*~ 0.25
osc~ 300
dac~
streamout~
client B server
streamout~ streamout~
client C (stereo)
228
passwd mypass
mountpoint mymusic.mp3
mp3cast~
bang_to_connect!
mysound playlist
Carrier
109
choose_a_file_to_play
Modulating
70 start/stop
229
bang_to_connect!
t b b b b
passwd mypass
mountpoint mymusic.mp3
shoutcast
outlet
mysound playlist
Carrier
109
choose_a_file_to_play
Modulating
70 start/stop
osc~ 100
osc~ 400
*~ 0.5
+~ 0.5
adc~ r mic *~
sel 1 0 openpanel
open astronomydomine.wav l
line~
*~ *~
*~
sfplay 2 r playlist
$1 20
line~
inlet messages
*~ *~
mp3cast~
230
mic mysound playlist
231
Figure 229: la finestra delle properties della vertical slider dove impostare send e
receive
232
19 A P P L I C A Z I O N I S PA R S E
1 http://music.concordia.ca/news-and-events/events/dance-music-laptop-orchestra.
php
2 http://l2ork.music.vt.edu/main/
233
PUNCTUAL Architecture
LAPTOP 1 LAPTOP 4
AUDIO ENGINE AUDIO ENGINE
LAPTOP 2 LAPTOP 5
AUDIO ENGINE AUDIO ENGINE
LAPTOP 3 LAPTOP 6
AUDIO ENGINE AUDIO ENGINE
Audio centralized
CLIENT 1
Data control part A
netsend 3001 /A
CLIENT 2
Data control part B
netsend 3001 /B
SERVER
netreceive 3001
CLIENT 3
route /A /B /C /D
Data control part C
part A part B part C part D
netsend 3001 /C
AUDIO ENGINE
CLIENT 4
Data control part D
netsend 3001 /D
Figure 231: Architettura con un server che riceve dati di controllo per il motore
audio
234
tore d’orchestra che dice ad ogni client quello che deve fare. In questo caso
l’audio è decentralizzato, ogni client ha il proprio motore, incluso il server
(fig. 232).
UNICAST Architecture
(Audio decentralized)
CLIENT 1
netreceive 3000
AUDIO ENGINE
SERVER CLIENT 2
Event Generator
netreceive 3001
netsend 192.168.0.2 3000
AUDIO ENGINE
netsend 192.168.0.3 3001
netsend 192.168.0.4 3002
CLIENT 3
netsend 192.168.0.5 3003
netreceive 3002
localhost
AUDIO ENGINE
AUDIO ENGINE
CLIENT 4
netreceive 3003
AUDIO ENGINE
Figure 232: Architettura UNICAST, il server genera gli eventi-partitura che ven-
gono selettivamente inviati ai client
235
BROADCAST FULL-DUPLEX Architecture
(Audio centralized)
CLIENT 1
netreceive
3001
(clock)
netsend
3000
(audio control data)
CLIENT 2
netreceive
3001
(clock)
netsend SERVER
3000
netreceive
(audio control data)
3000
(audio control data)
CLIENT 3 netsend
netreceive 3001(broadcast)
3001 (clock)
(clock) AUDIO ENGINE
netsend
3000
(audio control data)
CLIENT 4
netreceive
3001
(clock)
netsend
3000
(audio control data)
236
le Laptop Orchestra si moltiplicheranno a dismisura.
Una delle direzioni più recenti intraprese nell’ambito della musica elettron-
ica è quella del Live coding, o della programmazione in tempo reale (On the
fly programming o Just in time Programming).
Il principio su cui si basa il Live coding è quello per cui lo strumento (quindi
il suono) e la composizione vengono creati contemporaneamente in tempo
reale dal musicista, che si occupa di scrivere il codice pensandolo nel mo-
mento stesso della messa in atto. Il processo di creazione/composizione
diventa trasparente e accessibile a chi ascolta. Per agevolare questa com-
prensibilità spesso i Live coders si servono di proiettori per divulgare le
immagini del codice creato, commentandolo opportunamente durante il
processo.
4 http://chuck.cs.princeton.edu/
5 http://impromptu.moso.com.au/
237
Pd può essere annoverato fra i software più adatti per il Live coding per
alcune ragioni:
Pd per adesso non ha librerie specifiche per il Live coding, anche perché
non ne ha bisogno. Di fatto usare pd significa programmare sempre in
tempo reale! Naturalmente questo non significa che tutti i programmatori
di pd siano dei buoni live coders. Si tratta infatti di acquisire una certa
dimestichezza con l’immaginare algoritmi in tempi rapidi e di realizzarli
senza troppi errori.
19.3 A RDUINO
238
CONCLUSIONE
239
BIBLIOGRAFIA
AA.VV. [2000], The CSound Book, ed. by R. Boulanger, The MIT Press, Cam-
bridge.
– [2010b], The Audio programming Book, ed. by R. Boulanger and V. Laz-
zarini, The MIT Press, Cambridge.
– [2011], The SuperCollider Book, ed. by S. Wilson, D. Cottle, and Collins N.,
The MIT Press, Cambridge.
Bianchini, Riccardo and Alessandro Cipriani [1998], Il suono virtuale. Sintesi
ed elaborazione del suono. Teoria e pratica con Csound. Con CD-ROM, Con-
TempoNet.
Blum, Frank [2007], Digital Interactive Installations: Programming interactive
installations using the software package Max/MSP/Jitter, VDM Verlag Dr.
Mueller e.K., Cambridge.
Collins, Nick [2010], Introduction to Computer Music, Wiley, Chichester.
Cope, David [2004], Virtual Music, The MIT Press, Cambridge.
Dodge, Charles and Thomas A. Jerse [1997], Computer Music, Schirmer.
Farnell, Andy [2010], Designing Sound, The MIT Press, Cambridge.
Giri, Maurizio and Alessandro Cipriani [2009], Musica Elettronica e Sound
Design, ConTempoNet.
Manning, Peter [2004], Electronic and Computer Music, Oxford University
Press, Oxford.
Manzo, V.J. [2011], Max/MSP/Jitter for Music: A Practical Guide to Developing
Interactive Music Systems for Education and More, Oxford University Press,
Oxford.
Puckette, Miller [2007a], The Theory and Technique of Electronic Music, World
Scientific Publishing Company.
Roads, Curtis [1996], The Computer Music Tutorial, The MIT Press, Cam-
bridge.
– [2004], Microsound, The MIT Press, Cambridge.
Rowe, Robert [2004], Machine Musicianship, The MIT Press, Cambridge.
Taube, Heinrich K. [2004], Notes from the Metalevel, Taylor & Francis, Lon-
don.
Temperley, David [2010], Music and Probability, The MIT Press, Cambridge.
240
Winkler, Todd [2001], Composing Interactive Music. Techniques and Ideas Us-
ing Max, The MIT Press, Cambridge.
241
SITOGRAFIA
AA.VV. [2009], Pure Data Floss Manual, un buon manuale di Pure Data in
inglese, http://flossmanuals.net/puredata/.
– [2010a], Pure Data, il sito ufficiale di pd-extended, dove si possono scari-
care tutte le versioni del software e la relativa documentazione, http:
//www.puredata.info/.
Kreidler, Johannes [2011], Programming Electronic Music in Pd, un ottimo
manuale di Pure Data, disponibile in varie lingua, ma non in italiano,
http://www.pd-tutorial.com/.
Puckette, Miller [2007b], The Theory and Technique of Electronic Music, il li-
bro di Miller Puckette, creatore di Max e di Pure Data, scaricabile libera-
mente dal suo sito, http://crca.ucsd.edu/~msp/.
Valle, Andrea [2008], the SuperCollider Italian Manual, un manuale in ital-
iano di SuperCollider, scritto da Andrea Valle e distribuito sotto licenza
Creative Commons, http://www.fonurgia.unito.it/andrea/wikka.php?
wakka=SuperCollider.
Wang, Ge, Cook amd Perry R., et al. [2007], Chuck Manual, il sito dedicato
a Chuck, un altro linguaggio di programmazione dedicato all’audio in
tempo reale. Da qui è possibile scaricare il software dell’ambiente, il
manuale e la documentazione varia, http://chuck.cs.princeton.edu/.
242 242
INDEX
if, 54 print, 15
243 243
INDEX
if, 54 print, 15
244 244