Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
di riprodurre, distribuire, comunicare al pubblico, esporre in pubblico, rappresentare, eseguire e recitare questopera
di modificare questopera
alle seguenti condizioni:
Attribuzione. Devi attribuire la paternit dellopera nei modi indicati dallautore o da chi ti ha dato lopera in licenza e in modo tale
da non suggerire che essi avallino te o il modo in cui tu usi lopera.
Non commerciale. Non puoi usare questopera per fini commerciali.
Condividi allo stesso modo. Se alteri o trasformi questopera, o se
la usi per crearne unaltra, puoi distribuire lopera risultante solo con
una licenza identica o equivalente a questa.
CONTENTS
Introduzione
i lambiente
1 fondamenti
1.1 Cos Pure Data? . . . . . . . . . . . .
1.2 Pd-extended . . . . . . . . . . . . . . .
1.3 Installazione . . . . . . . . . . . . . . .
1.3.1 GNU/Linux . . . . . . . . . . .
1.3.2 Windows e Mac Os X . . . . .
2 panoramica dellambiente
2.1 Pd window e patch window . . . . . . .
2.1.1 il motore DSP . . . . . . . . . .
2.1.2 print . . . . . . . . . . . . . . .
2.2 Le scatole di Pd . . . . . . . . . . . . .
2.2.1 oggetti e connessioni . . . . . .
2.2.2 messaggi e liste . . . . . . . . .
bang e number box . . . . . . . .
3 basi di programmazione con pure data
3.1 Variabili e costanti . . . . . . . . . . .
3.1.1 pack e unpack . . . . . . . . . . .
3.2 Gestione del tempo . . . . . . . . . . .
3.2.1 metro . . . . . . . . . . . . . . .
un contatore . . . . . . . . . . .
3.2.2 line . . . . . . . . . . . . . . . .
3.2.3 delay . . . . . . . . . . . . . . .
3.2.4 line multirampa con delay . . .
3.3 Aritmetica . . . . . . . . . . . . . . . .
3.3.1 operatori aritmetici . . . . . . .
3.3.2 expr . . . . . . . . . . . . . . . .
3.4 Generatori di numeri casuali . . . . .
3.5 Connessioni senza cavi . . . . . . . . .
3.6 Subpatches e Abstractions . . . . . . . .
3.6.1 subpatch . . . . . . . . . . . . .
3.6.2 abstraction . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
11
11
12
12
12
13
14
14
15
15
16
16
18
19
21
21
23
24
25
26
26
27
29
29
29
31
32
34
34
35
38
. . . . . . . . . . . . 39
41
. . . . . . . . . . . . 41
. . . . . . . . . . . . 46
. . . . . . . . . . . . 46
48
. . . . . . . . . . . . 48
. . . . . . . . . . . . 48
. . . . . . . . . . . . 49
. . . . . . . . . . . . 51
. . . . . . . . . . . . 54
. . . . . . . . . . . . 55
58
. . . . . . . . . . . . 58
. . . . . . . . . . . . 59
. . . . . . . . . . . . 60
. . . . . . . . . . . . 61
. . . . . . . . . . . . 63
. . . . . . . . . . . . 64
71
. . . . . . . . . . . . 75
ii audio
8 laudio digitale
8.1 Loscillatore . . . . . . . . . . . . . . . . .
8.1.1 frequenza e ampiezza del segnale
8.1.2 osc . . . . . . . . . . . . . . . . .
8.1.3 tabwrite . . . . . . . . . . . . . .
8.1.4 la rappresentazione del suono . .
8.2 Le forme donda . . . . . . . . . . . . . . .
8.2.1 tabosc4 . . . . . . . . . . . . . .
8.2.2 onda quadra . . . . . . . . . . . . .
pulse width modulation (PWM) .
8.2.3 onda a dente di sega . . . . . . . .
phasor . . . . . . . . . . . . . . .
8.2.4 onda triangolare . . . . . . . . . .
9 il panning
9.1 loggetto dac . . . . . . . . . . . . . . . .
76
77
77
79
81
84
84
87
87
88
90
92
93
94
99
99
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . .
10
11
12
13
14
Implementazione in pd . . . . . . . . . . . . . .
Un esempio di Trainlet Synthesis . . . . . . . . .
La Pulsar Synthesis . . . . . . . . . . . . . . . .
Asyncronous Granular Synthesis . . . . . . . . .
14.5.1 vline . . . . . . . . . . . . . . . . . . .
14.5.2 rendere indipendente il parametro gdur
14.6 Granulazione con suoni campionati . . . . . .
15 lavorare con sorgenti audio esterne
15.1 Sintesi vs. campioni . . . . . . . . . . . . . . . .
15.2 Alcuni oggetti utili . . . . . . . . . . . . . . . .
15.3 Un semplice random slicer . . . . . . . . . . . .
15.3.1 controllare lo slicer via segnale . . . . .
15.4 Granulazione su files audio . . . . . . . . . . .
14.2
14.3
14.4
14.5
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
166
166
167
170
175
176
182
185
185
185
187
191
195
202
203
203
203
204
205
205
208
213
213
214
217
220
223
225
233
233
237
238
239
241
242
243
INTRODUZIONE
- Questi programmi costano molto, soprattutto i migliori. Se si volessero avere dei sintetizzatori per realizzare 3 o 4 tecniche di sintesi
del suono si dovrebbero acquistare 3 o 4 prodotti commerciali diversi, questo a scapito del portafogli e del fatto che probabilmente fra
qualche anno saranno obsoleti e diverranno quindi praticamente inutili. E molto meglio studiare le tecniche di sintesi e il funzionamento
dellaudio digitale per avere lopportunit di utilizzare programmi
forse pi complessi, ma che danno lopportunit di costruirsi da soli
i propri suoni.
- Inventare i propri suoni non una cosa da poco. I software commerciali sono corredati sempre da moltissimi suoni preconfezionati, detti
preset, molto utili, ma che affievoliscono inevitabilmente il desiderio
di cercarne di nuovi. Si inizia ad accontentarsi di quello che offre il
convento, che spesso gradevole e non richiede dispendio eccessivo
di energie. Ma quei suoni saranno sempre dei preset fatti da qualcun
altro, non apparterranno mai completamente a chi li usa. Quindi studiare e praticare la musica elettronica un modo per appropriarsi
del suono, per creare il proprio, che molte volte non sar il pi bello,
ma alcune volte sar sicuramente unico.
- Un ultimo argomento, ma non certo meno importante. Una volta
apprese le tecniche di sintesi si possono scegliere programmi a costo
zero, cio freeware, come Pure Data, oggetto di questo manuale. Scegliere
un programma gratuito implica molte cose, alcune meno scontate di
quanto si pensi:
Non solo una scelta di risparmio, ma una rivendicazione etica.
Sintetizzare il suono attraverso un software digitale implica la
progettazione e la realizzazione di algoritmi pi o meno complessi. Gli algoritmi non sono altro che rappresentazioni del
pensiero, e il pensiero non si paga, nessun prezzo.
Usare un software libero significa condividerne una filosofia
basata sulla condivisione dei saperi. I programmi liberi sono
tali in tutto e per tutto nella maggior parte dei casi. Si pu prelevare il sorgente, studiarlo, modificarlo e redistribuirlo. Non a
caso intorno a questi software ci sono delle vere e proprie comunit che si scambiano opinioni, idee e progetti, condividendo
liberamente il proprio pensiero con altri.
Part I
LA M B I E N T E
FONDAMENTI
11
studiati, modificati e redistribuiti da chiunque. Inoltre Pure Data multipiattaforma, quindi gira sui sistemi operativi pi comuni: GNU/Linux,
Microsoft Windows, Apple Mac OS X, FreeBSD.
Pd stato scritto nel 1996 da Miller Puckette, lo stesso che a met degli
anni 80 aveva sviluppato Max, in seguito divenuto un software commerciale3 . Pd riprende le idee e i concetti di questultimo, 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 standard, ma anche numerose librerie aggiuntive che estendono notevolmente
le sue funzionalit. Attualmente Pd-extended alla versione 0.41.45 .
1.3 I NSTALLAZIONE
1.3.1 GNU/L INUX
nel caso si stia operando in una distribuzione Ubuntu Hardy, in caso diverso sostituire la dicitura hardy con il mome della distribuzione di Ubuntu
installata.
3 Miller Puckett:
http://crca.ucsd.edu/~msp/
products/maxmspjitter/
4 http://crca.ucsd.edu/~msp/software.html
5 http://puredata.info/downloads
12
Max-Msp:
http://cycling74.com/
13
PA N O R A M I C A D E L LA M B I E N T E
14
dellambiente.
Generalmente allapertura del programma ci si trova di fronte soltanto la
Pd window. Per iniziare a scrivere gli algoritmi necessario aprire una
finestra di patch dal men File/new. Compare cos la patch window che
lambiente di programmazione vero e proprio. Il suo men molto simile a quello della Pd window ma ovviamente pi orientato allediting delle
patch.
La patch window pu trovarsi in due stati funzionali diversi: edit mode e
run mode. Il primo permette di inserire tutti gli elementi allinterno 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 allaltro si usa la combinazione di tasti ctrl-E.
2.1.1
IL MOTORE
DSP
Durante lesecuzione delle patch pu accadere che vengano automaticamente visualizzati dei messaggi nella Pd window, in particolare alla presenza di errori, ma c un oggetto che permette al programmatore di visualizzare nella Pd window il messaggio o dato che desidera. Si tratta di print,
15
Hello World!
print
Figure 1: un click del mouse sul messaggio produce un output nella Pd window
2.2 L E scatole DI P D
La finestra di patch il luogo che permette la realizzazione degli algoritmi
di Pd. Essendo un ambiente grafico la finestra si riempir di entit di varia
natura, dette scatole (box). Queste scatole sono di quattro tipi: oggetti, messaggi, GUI e commenti e si creano dal men Put oppure premendo ctrl+n
dove n 1 per gli oggetti, 2 per i messaggi, 5 per i commenti. I numeri
3 e 4 creano delle GUI particolari, simboli e number box che esamineremo
successivamente.
2.2.1
OGGETTI E CONNESSIONI
16
le object box
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 dalloutlet mittente e rilasciandolo non appena si raggiunto linlet di arrivo.
random
select 0 5 7
pack 0 0
Figure 4: lentrata fredda riceve un dato dalloggetto counter, ma pack non produce
alcun dato in uscita finch linlet caldo non ricever qualcosa
17
random 1000
osc~
dac~
2.2.2
MESSAGGI E LISTE
Le message box hanno forma rettangolare con il lato destro rientrante. Possono contenere stringhe di caratteri, numeri, liste o variabili e vengono attivati con un click del mouse quando si in run mode oppure alla ricezione
di un altro messaggio o di particolari azioni.
questo un messaggio
print
Figure 6: un click con il mouse sul messaggio produce un output del messaggio
stesso nella Pd window
18
bang
number box
questo un messaggio
print
Figure 7: la stessa patch precedente, con la differenza che il messaggio viene attivato da un click del mouse sul bang
Il bang ha una sua versione grafica (si ottiene premendo allinterno della
patch ctrl+shift+b e una doppia versione testuale, che permette di evitare
un eccessivo uso di elementi grafici che appesantiscono lesecuzione dei
programmi.
bang grafico
bang
b
oggetti bang
19
+ 5
12
Figure 9: loggetto + effettua in questo caso la somma fra il numero che entra
nellinlet di sinistra e 5, e manda loutput 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
20
+ 5
30
Figure 10: possibile cambiare a piacimento gli addendi della somma
21
14
+ 5
17
Figure 11: il bang collegato alluscita del secondo addendo, in entrata nellinlet
sinistro delloggetto + rende caldo linlet destro delloggetto stesso
1 Loggetto + oltre ad accettare numeri in entrata, accetta anche bang nellinlet di sinistra. Il
bang non fa altro che dire alloggetto di far uscire ci che ha in memoria, cio il risultato
delladdizione
22
loadbang
7
+ 5
12
Figure 12: allapertura della patch si avr come output la somma fra 7 e 12
scelgo il numero $1
print
Figure 13: variabile in una message box, osservare loutput nella Pd window
Nel caso in cui una messege box contenga pi di una variabile necessario
che ognuna abbia ununivoca denominazione. Cos la prima variabile sar
$1, la seconda $2 e cos via.
Linlet del messaggio riceve una lista con i valori che le variabili devono
assumere. Per realizzare tali liste esiste un oggetto apposito chiamato pack,
2 I simboli identificativi delle variabili devono iniziare da $1 e seguire ordinatamente. Se una
message box ha 3 variabili $1 $2 ed $3 e riceve una lista di 3 atomi, il primo andr nella
variabile $1, il secondo nella $2, etc. . .
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 nellinlet sinistro produrr loutput della lista
in memoria in quel momento (fig. 14).
pack 20 1 2010
print
Figure 14: pack: un click sul bang senza cambiare i valori delle number box produce
luscita dei valori inizializzati. Una variazione delle number box produce un output nel momento in cui viene cambiato il valore dellinlet
di sinistra. Osservare il risultato nella Pd window
Loggetto unpack fa il contrario rispetto a pack: prende una lista e ne convoglia i singoli atomi attraverso i suoi inlet.
3.2 G ESTIONE DEL TEMPO
Come detto in precedenza, Pd un linguaggio orientato al tempo, quindi
ci sono molti oggetti deputati alla gestione di eventi temporali. Esamineremo alcuni di questi senza dimenticare che la presente trattazione non pu
trattare di molti altri oggetti che il programmatore scoprir nel suo cammino3 .
3 Premendo il destro del mouse su un oggetto si pu accedere allhelp dello stesso. In molti
casi la pagina dellhelp rimanda anche ad oggetti simili a quello esaminato. E sempre
utilissimo pertanto navigare fra le pagine di help che sono uno strumento di navigazione
fondamentale fra gli oggetti di Pd.
24
20 1 2010
unpack 0 0 0
20
2010
Figure 15: unpack: un click sulla message box produce un output in ognuno dei tre
outlet
3.2.1 metro
un numero diverso da 0 o un
"bang" attivano metro
bang
0
0 o "stop" fermano metro
stop
0
metro 500
25
UN CONTATORE
Un oggetto molto comune in Pd line, che generara delle rampe per raggiungere un determinato valore. line ha bisogno di almeno due argomenti,
il valore-obiettivo, cio la quantit da raggiungere, e il tempo in millisecondi 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 raggiungere 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 valoreobiettivo, 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 loggetto line ad esempio chiedendogli di creare ogni volta il percorso da 0 a 1000 in 5 secondi,
baster creare una lista di tre atomi, con il primo che indica il valore di
4 In generale un contatore un dispositivo che memorizza (e a volte visualizza) il numero
di volte che un particolare evento o processo si verifica. In una caso molto semplice, un
contatore pu contare i bang che riceve ed emettere il conteggio dal suo outlet.
26
metro 500
loadbang
0
int
+ 1
23
Figure 17: click su 1 per avviare il contatore, su 0 per fermarlo
Loggetto delay emette un bang dopo aver ricevuto un bang a sua volta.
Lunico argomento che accetta (dallinlet destro) il ritardo con cui verr
emesso il bang stesso (figura 21).
27
1000 5000
line
0
Figure 18: line al momento della creazione inizializzato a zero, quindi in questo
caso al momento del click sulla message box inizier un percorso da 0 a
1000, completandolo in 5 secondi
0, 1000 5000
line
0
Figure 19: si pu ricominciare la rampa da 0 a 1000 ogni volta che si preme sulla
message box
2000 5000
line 1000 500
0
Figure 20: rampa da 1000 a 2000 in 5 secondi, con step di mezzo secondo fra un
valore e laltro in uscita
28
1
0
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
Pd dispone di una serie di oggetti che consentono di effettuare le pi comuni operazioni matematiche. Abbiamo gi incontrato loggetto + che
permette loperazione di somma. Nel prossimo paragrafo esamineremo
alcuni altri oggetti per operare sui numeri.
3.3.1
OPERATORI ARITMETICI
+
-
29
0, 127 1000
delay 1000
delay 1600
50 600
100 1500
line
0
*
/
pow
Operazioni trigonometriche:
sin
cos
tan
atan
atan2
Operazioni sulle frazioni
mod
div
e molti altri...
30
3.3.2 expr
+ 12
* 24
- 7
/
42.6667
42.6667
Figure 23: nella parte sinistra le operazioni si succedono dallalto verso il basso,
nella parte destra le stesse vengono raggruppate da expr. Valutare i
due algoritmi in parallelo con un click sul bang
31
metro 500
random 250
0
Figure 24: la patch genera un numero pseudo-casuale ogni mezzo secondo
random produce solo interi, ma se volessimo generare dei numeri pseudocasuali decimali potremmo semplicemente dividere loutput (figura 25).
Loggetto randomF fa la stessa cosa, ma con una precisione molto maggiore.
Se invece volessimo creare una sequenza di numeri pesata, cio generata
con una certa probabilit potremmo usare loggetto moses che consente di
convogliare un flusso di numeri in due outlet diversi in base a un valoresoglia definito come argomento. I numeri al di sotto del valore-soglia vengono convogliati dalloutlet sinistro, quelli al di sopra da quello destro.
32
metro 500
random 1001
/ 1000
0
Figure 25: la patch genera un numero pseudo-casuale compreso fra 0 e 1, con 3
cifre decimali
metro 500
random 100
moses 25
Loggetto decide produce pseudo-casualmente solo sequenze di 0 e 1, mentre drunk funziona come random ma sceglie il numero effettuando un salto
che lo distanzia dal precedente al massimo quanto stabilito nel secondo
argomento (stepsize).
In figura 28 si pu osservare il diverso andamento di due sequenze casuali.
La prima, generata con random, ha una distribuzione lineare, la seconda,
33
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
34
random
drunk
Figure 28: in alto la sequenza generata da random, in basso quella creata con drunk,
con una stepsize di 25
Per creare una subpatch sufficiente scrivere allinterno di una nuova object
box pd nome, si aprir una nuova finestra allinterno della quale si inserir
il contenuto della subpatch. Questa nuova finestra si pu chiudere in qualsisasi momento senza bisogno di salvarla e riaprirla con un semplice click
sulla object box in run mode. La patch in figura 30 realizza un algoritmo attraverso il quale vengono emessi dei bang da quattro outlet diversi, il primo
35
r numero
send numero
4
receive numero
r numero
* 2
4
8
Figure 29: connessioni senza fili
metro 500
random 500
+ 1
moses 250
moses 126
moses 376
36
pd miasubpatch
inlet
metro 500
random 500
+ 1
moses 250
moses 126
moses 376
outlet
outlet
outlet
outlet
Figure 32: linterno della subpatch con gli inlet e gli outlet
37
Unabstraction non altro che una patch che pu essere richiamata dallinterno
di una patch. Anchessa, come la subpatch contiene gli oggetti inlet e outlet
per creare le varie entrate e uscite dellobject box e, a differenza della subpatch, pu essere utilizzata in qualunque patch. Limportante che il file
dellabstraction sia salvato con lestensione .pd e che si trovi nella stessa
directory in cui si sta lavorando o in una delle directory definite nel Path del
programma (cap. 2.1).
Per richiamare unabstraction sufficiente aprire unobject box e inserire
il nome dellabstraction senza lestensione .pd. Labstraction potr essere
aperta e chiusa in qualunque momento e anche modificata, a patto che
sia salvata, ma il consiglio di stare attenti a modificare unabstraction
dallinterno di una patch: labstraction risulter modificata in tutti gli altri
progetti in cui viene utilizzata!
Unabstraction pu anche essere inizializzata con un argomento, questo
possibile scrivendo largomento stesso (o gli argomenti) dopo il nome. Il
primo argomento determina il valore della variabile $1, il secondo quello
della variabile $2 e cos via. Queste variabili possono essere create allinterno
degli oggetti dellabstraction, ma non dentro le message box.
38
inlet
pack $1 $2
line
outlet
Figure 34: linterno dellabstraction
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
delloggetto line. Un bang ricevuto dallinlet dellabstraction mette in azione
line restituendo la rampa alloutlet.
3.6.3
GRAPH ON PARENT
subpatch e abstraction possono anche essere pilotate dalla patch senza bisogno
di essere aperte ogni volta ci fosse il bisogno di cambiare un valore. In
sostanza subpatch e abstraction possono diventare oggetti interattivi. Per
fare questo una delle soluzioni potrebbe essere quella di creare degli inlet
aggiuntivi nella subpatch oppure utilizzare unaltro metodo che Pd mette a
disposizione. Se nelle propriet della subpatch (o dellabstraction, questo sistema funziona su entrambe), cui si accede premendo il sinistro del mouse
su un punto qualunque della subpatch window, selezioniamo lopzione graph
on parent, comparir allinterno della subpatch stessa un riquadro allinterno
del quale possiamo mettere ci che vogliamo sia visibile dalla patch genitrice. Gli oggetti consentiti sono essenzialmente GUIs, 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 dellalgoritmo.
39
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: linterno della subpatch. Per creare il riquadro di visibilit basta andare
sulle propriet della subpatch e selezionare lopzione graph on parent
40
V E T TO R I , G R A F I C I E TA B E L L E
4.1 V ETTORI
Un vettore (in inglese array) un oggetto che permette di conservare e manipolare comodamente una grande quantit di dati. Pu essere pensato
come un contenitore di locazioni di memoria, identificate da un indice, attraverso il quale possibile accedere alla locazione desiderata. I vettori
in Pd sono rappresentati da grafici bidimensionali che hanno sullascissa
lindice e sullordinata il valore corrispondente. Si tratta sempre di vettori
monodimensionali che gestiscono collezioni di numeri interi, decimali o di
segnale (ma di questi ultimi ci occuperemo in seguito) quindi lindice un
intero che identifica una e una sola posizione in memoria. Nel linguaggio
C i vettori monodimensionali vengono definiti, come le variabili, in questo
modo:
int i[4] = {5, 2, 7, 3}
41
i
10
0
0
Si possono scrivere esplicitamente i singoli valori inserendo nella message box lindice del primo elemento da scrivere seguito da tutti i valori da inserire nel vettore. Si possono possono produrre i valori del
vettore attraverso una funzione trigonometrica come sinesum (somma
di seni), seguita dal numero degli elementi del vettore e dal valore di
ogni curva sinusoidale (compreso fra 0 e 1), oppure cosinesum, uguale
alla precedente, ma che genera una cosinusoide o una somma di cosinusoidi. Si possono inoltre leggere i dati richiamandoli da un file di
testo con il comando read seguito dal nome del file che contiene di
dati (figura 38).
42
- con oggetti speciali che scrivono i dati allinterno dei vettori. Loggetto
tabwrite scrive valori allinterno di un vettore. Nellinlet di sinistra entrano i valori, in quello di destra i relativi indici. Il messaggio set
in entrata a sinistra determina il nome dellarray sul quale operare,
nome che pu anche essere inserito nelloggetto 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 indicato dal suo argomento, in questo caso 32
43
i
1
-1
32
until
1
int 1 + 1
randomF 2
- 1
tabwrite i
Figure 39: click sulla message box in alto e verificare il risultato sul grafico
44
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 interpolati (polygon) cio singoli punti uniti da una linea che traccia il percorso
pi breve fra punti adiacenti, infine come curva di bzier (bzier) che smussa
gli spigoli (figura 41).
i
punti
bezier
polygon
4.1.1
LEGGERE UN VETTORE
Un vettore pu essere letto e utilizzato per processare altri dati. Uno degli
oggetti che permettere di leggere i dati di un vettore tabread che ha un
unico inlet che riceve lindice 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 dellindicatore di una
slider verticale.
4.1.2
L OGGETTO
table
46
reset
16
s reset until
0
0
int
1
+ 1
tabwrite new
new
metro 1000
r reset
0
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
P R O G R A M M A Z I O N E AVA N Z ATA
OPERATORI RELAZIONALI
Gli operatori relazionali consentono di confrontare due valori fra loro, quindi
sono binari. Come nel linguaggio C producono un output uguale a 1 se la
condizione richiesta dalloperatore relazionale soddisfatta, uguale a 0 in
caso contrario. I principali operatori relazionali sono sei:
1 Il concetto di vero o falso mutuato dalla logica classica che ha prestato al mondo
dellinformatica i suoi modelli. La primitiva fondamentale dellinformatica, il bit, pu infatti
assumere il valore di 1 o 0, acceso o spento, vero o falso.
48
> 10
0
Figure 43: Loutput di > restituisce 0 finch il numero in entrata minore o
uguale a 10, 1 quando diventa maggiore di 10
5.1.2 select
select (forma abbreviata: sel) opera una selezione sugli atomi in entrata
confrontandoli con i suoi argomenti. Se la condizione soddisfatta select
emette un bang dalloutlet corrispondente, in caso contrario spedisce fuori
latomo in entrata dallultimo outlet a destra.
123
10
sel 10
0
Figure 44: select
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 soddisfano la selezione (figura 45).
Con gli operatori relazionali e select realizziamo un algoritmo che opera
una selezione su dei numeri. Quando la selezione soddisfatta e select
emette 1, verr attivata una rampa con loggetto line (figura 46).
49
5
4
123
10
sel 10 4
0
Figure 45: select con pi selezioni
20
32
69
> 50
sel 1
0, 127 2000
line
Figure 46: valutare lalgoritmo 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
Esaminiamo la patch in figura 47: allattivazione della rampa, inizia il cammino da 0 a 100 effettuato da line. Appena superato il valore-soglia di 50,
loperatore > emette 1 a ripetizione, ma change elimina tutte le ripetizioni
successive, consentendo luscita solo del primo 1, attivando cos il selettore
sel ununica volta. Si attiva in quel momento la rampa in basso.
5.1.3
OPERATORI LOGICI
51
bit viene valutato con il bit dellaltro numero che si trova nella stessa posizione. Ad esempio loperatore AND (oggetto & in Pd) segue le regole
della tavola di verit illustrate nella tabella 1.
a
ab
0
0
1
1
0
1
0
1
0
0
0
1
=
=
1
0
0
0
1
1
0
1
1
0
t b b
21
&
4
Figure 48: loperatore AND in azione in una patch di Pd
52
ab
0
0
1
1
0
1
0
1
0
1
1
1
t b b
41
22
|
63
Figure 49: loperatore OR
In relazione a questi due operatori ci sono due oggetti (&& e ||) che
confrontano due valori (interi o decimali) producendo come risultato lo
stesso delle tavole di verit su citato. Ad 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 esempio, converte lintero che riceve nel suo inlet sinistro nella sua forma binaria e aggiunge a destra tanti bit uguali zero quanti sono richiesti dallinlet
di destra. Nella tabella 4 c un esempio con il numero 113 da spostare a
sinistra di due posizioni.
53
10
10
&&
1
Figure 50: loperatore && confronta due valori in base alla tavol di verit per
AND
113
452
1
2
<<
=
t b b
113 2
<<
452
Figure 51: La relativa patch di Pd che realizza lo scivolamento a sinistra
5.1.4 If
Per terminare il capitolo sulle istruzioni condizionali non resta che affrontare il costrutto if. Pd non dispone di un oggetto if, ma consente di
usare questo comando allinterno delloggetto expr che abbiamo gi incontrato (sezione 3.3.2). Nei comuni linguaggi di programmazione listruzione
54
che significa: "Se lespressione vera fai una certa cosa, altrimenti fanne
unaltra". In Pd invece la sintassi :
if (espressione, a se vera, b se falsa)
0
expr if ($f1 < 10, $f1 * 5, 10)
0
Figure 52: se il numero in entrata minore di 10 espr restituisce il numero stesso
moltiplicato per 5, altrimenti restituisce 10
55
metro 500
loadbang
0
float + 1
sel 9
come nei tradizionali linguaggi di programmazione. In effetti until funziona secondo lo schema classico di un ciclo for del C:
for (i=0; i<100; i++)
espressione;
56
100
until
loadbang
0
int + 1
print
Figure 54: ciclo until: valutare lalgoritmo con un click sulla message box in alto e
osservare il risultato nella Pd window
57
IL MIDI
58
6.1.1
ANATOMIA DI UN MESSAGGIO
MIDI
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.
Un messaggio Note ON indica lesecuzione di una nota, con un suo pitch,
cio una sua altezza e una sua velocity cio il suo volume (velocity rimanda
allidea che la velocit con cui un tasto viene premuto proporzionale al
volume che si ottiene)
Uno STATUS BYTE di Note On quindi sar sempre seguito da due DATA
BYTE, ognuno dei quali pu assumere un valore compreso fra 0 e 127.
Infatti il DATA BYTE, ha 7 bit a disposizione per informare (il primo bit
indica che il DATA BYTE tale).
Riprendendo lesempio precedente:
10010000 (STATUS BYTE Note ON sul canale 0)
00111100 (DATA BYTE Pitch 60)
01000000 (DATA BYTE Velocity 64)
Come gi detto, uno STATUS BYTE pu essere seguito da uno o due 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 unottima 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
Loggetto che ci consente di far entrare in Pd messaggi MIDI puri, cio ancora non codoficati in base al tipo midiin che manda fuori dalloutlet 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.
Ora proviamo a implementare un oggetto, midianalyze che analizza i dati
ricevuti da midiin convogliandoli a vari inlet in base al loro significato.
Tale oggetto esiste gi in una forma quasi uguale nella libreria che emula
gli oggetti di Max/MSP e prende il nome di midiparse.
midianalyze (fig. 55) non ha inlet in quanto contiene al suo interno loggetto
midiin che riceve messaggi midi dallesterno di Pd. Ha invece 6 outlets,
il primo dei quali restituisce messaggi di noteON, il secondo di Channel
Pressure, il terzo di Control Change, il quarto di Program Change, il quinto
di Channel Pressure e lultimo di Pitch Bend. Sono esclusi i messaggi di
note OFF perch sono ormai inutilizzati dal protocollo. Per chiudere una
nota infatti si usa un normale messaggio di Note ON con velocity pari a
zero. Ogni outlet formatta i messaggi restituendo una lista composta da i
dati e dal numero del canale.
midianalyze
prepend set
prepend set
prepend set
prepend set
prepend set
45 0 0
10 74 0
16 40 0
NoteON
keypressure controlchange
42 0
programchange
51 9
channelpressure
prepend set
0 53 0
pitchbend
Linterno dellabstraction (fig. 56) semplice, loggetto midiin invia i messaggi alloggetto moses che li divide fra i suoi due outlet: se un messaggo
(che, ricordiamo non altro che un byte in forma decimale) inferiore a
128 (0-127) sar inviato al primo outlet in quanto si tratter di un DATA
BYTE, al contrario sar uno STATUS BYTE e sar inviato allaltro outlet
moses smista i messaggi inviandoli a sei subpatches, ognuna delle quali
costruir la lista appropriata. I messaggi di Program Change e di Channel pressure saranno formati da una lista di due interi: il dato e il canale,
61
midiin
moses 128
pd noteon
pd keypressure
pd cc
pd pgmchange
pd chnpressure
pd pitchbend
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.
In figura (fig. 57) mostrata la subpatch che interpreta e resistuisce la lista
dei messaggi di Program Change. Se lo STATUS BYTE compreso fra
192 e 207, lalgoritmo fa un AND restituendo 1 se entrambe le condizioni
sono soddisfatte e zero in ogni altro caso. In caso positivo loggetto spigot,
ricevendo 1, permette al DATA BYTE ricevuto di uscire dal suo outlet e di
entrare in list append, dove verr unito al numero di canale.
inlet data
inlet status
t f f f
>= 192
<= 207
- 192
&&
spigot
list append
outlet pgmchange
Figure 57: La subpatch che formatta la lista dei messaggi Program Change
62
nellinlet 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.
inlet data
inlet status
t f f f
>= 144
<= 159
- 144
&&
t f b
spigot
list prepend
t l
t l l
list length
sel 2
list append
list append
outlet noteon
ALTRI OGGETTI
MIDI
Una volta capito il funzionamendo dei messaggi MIDI ed aver implementato loggetto midianalyze non ci sar bisogno di soffermarsi troppo sugli
63
oggetti che in Pd si occupano del MIDI. Nella maggioranza dei casi gli
oggetti avranno una versione per linput dei dati e una per loutput. Ne
diamo di seguito un elenco (parziale):
oggetti
descrizione
midiin/midiout
notein/noteout
pgmin/pgmout
bendin/bendout
ctlin/ctlout
touchin/touchout
polytouchin/polytouchout
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.
Loggetto stripnote riceve coppie di valori (pitch,velocity) e lascia passare
sltanto quelle coppie che hanno velocity diversa da zero. Pu essere utile
quando necessario processare soltanto le altezze, evitando cos la ripetizione del pitch. Infatti ogni volta che un messaggio note ON ricevuto,
seguito sempre da un altro messaggio, con lo stesso pitch, ma con velocity
uguale a zero. Piuttosto che fare un esempio di uso di stripnote, proviamo
ad implementare un oggetto che faccia la stessa cosa (fig. 59).
Loggetto makenote riceve coppie di valori (pitch,velocity), li fa uscire e aggiunge un messaggio con lo stesso pitch, ma con velocity uguale a zero.
In pratica chiude un evento Note ON. Pu avere due argomenti: velocity
iniziale e durata della nota.
Un esempio di makenote sar spiegato nella prossima sezione, dove verr
implementata una versione del brano di Steve Reich Piano Phase.
6.3 U N ESEMPIO DI EDITING ALGORITMICO MIDI
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 allunisono 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
print pitch
print vel
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
allunisono. A quel punto il primo pianista viene lasciato solo per un po e
inizia la seconda parte del brano, della quale non ci occuperemo.
Per implementare tale algoritmo necessario formalizzare il problema. La
questione principale da risolvere data dal fatto che, mentre uno dei pianisti suona a velocit costante (avremo, intuitivamente, un oggetto metro
che non cambia mai, il secondo pianista suona alla stessa velocit del primo
per un po, poi accelera per sfasare i pattern poi torna alla velocit iniziale
non appena i pattern non sono sovrapposti esattamente a una nota di distanza.
Bisogna quindi stabilire:
65
66
t f b
metro 144
0
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
t f b
t f b
metro 144
metro 144
0
f 0
143
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
makenote 64 120
makenote 64 120
noteout 1
noteout 2
68
reset counter
t f b
0
sel 0
metro 144
f 0
0
f 0
+ 1
% 16
+ 1
sel 0 4
% 12
144
143
t f b
t b f
metro 144
64 66 71 73 74 66 64 73 71 66 74 73
list-nth
makenote 64 120
f 0
noteout 1
% 12
+ 1
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
t f b
0
sel 0
metro 144
f 0
0
f 0
+ 1
% 16
+ 1
sel 0 4
% 12
144
t f b
t b f b
metro 144
64 66 71 73 74 66 64 73 71 66 74 73
list-nth
143
random 32
f 0
+ 48
+ 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
OGGETTI GUI
Nel corso dei nostri primi esperimenti abbiamo gi avuto modo di incontrare alcuni oggetti grafici, che nellambito del mondo informatico sono
dette GUI (graphical user interfaces). Pd mette a disposizione un certo numero di GUIs, 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, accessibili col tasto destro del mouse sulla GUI stessa.
Le GUI native di Pd sono:
- bang
- toggle
- slider orizzontali e verticali
- radio button orizzontali e verticali
- VU-meter
- canvas
- number2
Sul bang non c molto altro da dire, lo abbiamo incontrato gi moltissime
volte. toggle invece un oggetto molto utile che permette di restituire 1
quando attivo, 0 quando disattivo. Praticamente una variabile binaria
che si attiva con un click del mouse. Quando attivato mostra una croce
allinterno 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
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 loggetto mod conta solo da
0 a 1, quando 0, il bang (grazie alloggetto 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 sommato a un movimento continuo generato dallalgoritmo 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 delloggetto 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 ricevere 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
int 1
+ 1
mod 2
* 10
r slide
manovrare_da_qui
$1 90
line
73
array1
r ordinata
expr (9 - $i1) r ascissa
tabwrite array1
Figure 66: impostare prima lindice (radio button) orizzontale, poi il valore con
quello verticale
74
Della GUI VU-meter avremo modo di scrivere nella parte che riguarda
laudio, mentre possiamo ora accennare alle canvas che sono oggetti semplici che servono a connotare graficamente le nostre patch in modo da
caratterizzare con i colori alcune zone della finestra. Possono essere utili
in patch molto articolate dove c bisogno di rendere riconoscibili le varie
parti dellalgoritmo. Infine loggetto number2 molto simile alla normale
number box con qualche possibilit in pi di configurazione grafica.
7.1 A LTRE GUI DALLE LIBRERIE DI P D
Oltre alle GUI native che abbiamo appena discusso, diamo ora una panoramica veloce di alcune altre GUI introdotte con le nuove librerie:
- grid
- gcanvas
- knob
- envgen
grid e gcanvas sono molto simili, sono due griglie bidimensionali che emettono la posizione del mouse (x, y) dai due outlet alla pressione di questultimo.
knob la classica manopola tipo sintetizzatore analogico. Ha ununica uscita che emette loutput nel range impostato nelle properties. Infine loggetto
envgen un envelope generator che emette dati in un formato compatibile
con la versione audio di line, cio line , del quale tratteremo approfonditamente nella parte di questo manuale dedicata allaudio.
Prima di concludere questo capitolo, va ricordato che luso massiccio di
GUI nelle patch sconsigliato. La grafica vettoriale che sta alla base di
tali oggetti pu rallentare la capacit di calcolo quindi quando possibile
evitarne luso, si eviti. Ad esempio in luogo dei bang grafici si cerchi di
usare loggetto relativo bang o b. Non importante la bellezza estetica di
una patch quanto la sua chiarezza, quindi meglio evitare troppi oggetti
grafici e abbondare, al contrario, di subpatches e annidamenti.
75
Part II
AUDIO
LA U D I O D I G I T A L E
8.1 L OSCILLATORE
Il suono pi semplice che pu essere prodotto sinteticamente quello generato da un oscillatore. Nel mondo analogico un oscillatore un circuito che
genera forme donda di vari tipi, anche se generalmente se non si specifica
altro si parla di oscillatore intendendo un generatore di onde sinusoidali.
Un onda sinusoidale unonda generata da una funzione sinusoidale (vedi
fig. 67), che si pu esprimere tramite la formula:
y = A sin(2 f x + )
dove A lampiezza dellonda, tipicamente impostata ad 1, quindi i valori
della funzione oscillano fra 1 e -1, 2 f = 2
la frequenza angolare che
indica quanti periodi ci sono in un intervallo di 2, f = 1 la frequenza,
che indica quante volte la funzione si ripete nellunit di tempo, la fase,
cio lo scartamento che la funzione subisce, ovvero il parametro che permette di anticipare o ritardare i valori della funzione1 .
Per produrre una sinusoide con un calcolatore necessario fare uso di un
oscillatore digitale, un algoritmo che produca i valori della funzione sinusoidale, ossia delle ampiezze dellonda. A differenza di un segnale elettrico,
che continuo, il calcolatore pu solo produrre segnali discreti, quindi
loscillatore digitale calcola i valori della funzione il numero delle volte indicato dalla frequenza di campionamento. Ad esempio se la frequenza di
campionamento 44100 hertz, loscillatore calcola i valori della funziona
44100 volte al secondo. Questa frequenza di campionamento approssimer
la forma donda desiderata, pur non riuscendo a costruirne una identica a
quella analogica (fig. 68).
1 http://it.wikipedia.org/wiki/Sinusoide
77
1
2
0
2
ampiezza
tempo
Figure 67: il grafico di una funzione sinusoidale
78
0.5
1.0
0.5
0.0
0.0
1.0
0.5
ampiezza
0.5
1.0
1.0
Sinusoide digitale
tempo
Figure 68: il grafico di una funzione sinusoidale prodotta da un calcolatore
osc~ 440
dac~
Figure 69: loscillatore di Pd
Londa sinusoidale unonda periodica perch la sua forma si ripete identica ad intervalli di tempo regolari. Il periodo quindi il tempo neces-
79
Wavetable
5
6
10
0.5
0.5
0.0
0.5
ampiezza
1.0
0.5
0.0
1.0
10
index
Figure 70: una cosinusoide
80
0.5
1.0
0.5
0.0
0.0
1.0
0.5
ampiezza
0.5
1.0
1.0
Cosinusoide
tempo
Figure 71: una cosinusoide
A
0
2
ampiezza
tempo
Figure 72: parametri di una forma donda. A = ampiezza, = periodo, =
lunghezza donda
8.1.2 osc
Lobject box osc implementa un oscillatore digitale. Accetta come argomento interno la frequenza (fig. 69) il cui valore pu anche essere variato
81
242
osc~ 200
dac~
Figure 73: loggetto osc con frequenza controllata da una number box
dac~
Figure 74: la realizzazione di un glissando con loggetto line
Volendo invece intervenire sullampiezza del segnale, necessario utilizzare un moltiplicatore, come un oggetto *, per moltiplicare lampiezza
istantanea del segnale per un fattore costante (o variabile). In figura 75
loggetto * moltiplica per 0.5 il segnale in entrata, dimezzandone lampiezza.
Lampiezza di picco del segnale in uscita sar quindi di 0.5. In figura 76
mostrata unonda con ampiezza di picco 1, e una con ampiezza di picco
0.5.
82
osc~ 440
*~ 0.5
dac~
0.5
0.0
0.5
0.0
1.0
1.0
0.5
b)
0.0
0.5
0.5
1.0 1.0
1.0 1.0
0.5
a)
0.0
0.5
0.5
1.0
1.0
83
osc~ 440
*~ 0.5
dac~
$1 20
line
8.1.3 tabwrite
84
883
amp
r~ sig
osc~ 440
amp
*~ 0.5
metro 100
tabwrite~ amp
dac~
$1 20
send~ sig
line
85
0.5
0.5
0.0
0.0
0.5
ampiezza
0.5
tempo
Figure 79: forma dondarisultante dalla somma di 3 sinusoidi
ampiezza
Spettrogramma ampiezza/frequenza
100
200
300
400
500
600
700
800
900
1000
frequenza
Figure 80: analizzatore di spettro bidimensionale, sullasse delle ascisse c la frequenza, su quella delle ordinate lampiezza. 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
800
400
600
600
400
200
200
frequenza
1000
Spettrogramma ampiezza/frequenza/tempo
800
1000
tempo
Figure 81: lampiezza delle sinusoidi rappresentata dal-lintensit del colore
delle linee
87
sine
tabosc4~ sine
amp
$1 20
wave
line
*~
start
metro 100
dac~
tabwrite~ wave
Figure 82: luso di tabosc per leggere un vettore con una forma donda sinusoidale
ONDA QUADRA
Quella quadra una forma donda che alterna solo due valori, generalmente 1 e -1, ma anche 1 e 0 se si usa come segnale di controllo.
88
1
2
0
2
ampiezza
Onda quadra
tempo
Figure 83: unonda quadra che alterna i valori 1 e -1
arm 2
0
arm 3
1
3
arm 4
0
arm 5
1
5
arm 6
0
arm 7
1
7
89
monici, maggiore sar la precisione della forma dellonda. Nel terzo caso
londa perfettamente quadrata.
Se si ascoltano le 3 onde (il messaggio set seguito dal nome di unarray
consente di cambiare il vettore da leggere con tabosc) si noteranno delle
differenze. Nel caso del vettore quadra9 il suono sar meno ricco di armonici di quello di quadra40, che a sua volta meno ricco di quello di
quadralg.
quadra9
quadra40
set quadra40
set quadra9
set quadralg
tabosc4~ quadra9
dac~
;
quadra9 sinesum 512 1 0 0.33 0 0.2 0 0.1428 0 0.1111;
quadra9 normalize 1
;
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
int 0
+ 1
(PWM)
I due modi che abbiamo usato nella sezione precedente per generare unonda
quadra non sono gli unici possibili. Un altro sistema infatti quello di intervenire direttamente su un segnale sinusoidale e modificarlo in tempo
reale. Nella patch di figura 85 il segnale di osc entra in expr che genera
unonda quadra con un semplice ciclo if: se i valori sono positivi, esce 1,
altrimenti esce -1.
Loggetto expr lomologo di expr per i segnali. Oltre a operare sulle
solite variabili numeriche ($fn o $in) pu processare direttamente segnale.
90
wave
150
osc~ 200
expr~ if (($v1 > 0), 1, -1)
metro 100
dac~
tabwrite~ wave
Figure 85: onda quadra generata mediante intervento diretto su un segnale sinusoidale
91
duty cycle
(0 - 100)
frq
200
wave
75
osc~ 200
$1 40
line
expr ((1 - ($f1 / 100)) * 2) - 1
expr~ if (($v1 > $f2), 1, -1)
metro 100
dac~
tabwrite~ wave
Questa modificazione del duty cycle pu essere gestita da un segnale, generalmente un LFO, un Low Frequency Oscillator, di cui parleremo pi avanti.
Basti per ora sapere che un LFO un normale oscillatore, specializzato nella
generazione di frequenze molto basse, al di sotto della banda audio (<
30 hz). Usare un segnale di controllo per modificare il duty cycle realizza
la cosiddetta Pulse Width Modulation, utilizzata in molti sintetizzatori analogici negli anni 70.
In figura 87 un oscillatore con frequenza 0.25 controlla il duty cycle dellonda
quadra. Lampiezza 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.
8.2.3
92
wave
frq
300
osc~ 200
osc~ 0.25
*~ 0.99
expr~ if (($v1 > $v2), 1, -1)
metro 100
dac~
tabwrite~ wave
Figure 87: variazione del duty cycle tramite un segnale di controllo
arm 1
-1
arm 2
12
arm 3
13
arm 4
14
arm 5
15
arm 6
16
arm 7
17
In figura 88 ci sono due forme donda a dente di sega ottenute luna con il
comando sinesum laltra 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
expr (($f1 / 515) * 2) - 1
tabwrite dentedisega2
ONDA TRIANGOLARE
Come per londa 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: londa a dente di sega come segnale di controllo, generata con phasor
osc~ 0.125
phasor~ 400
expr~ ($v1 * 0.49) + 0.5
expr~ if (($v1 > $v2), 1, -1)
dac~
Figure 90: londa a dente di sega come segnale di controllo, generata con phasor
arm 2
0
arm 3
312
arm 4
0
arm 5
1
52
arm 6
0
arm 7
712
95
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 londa triangolare approssimata con la somma di
19 armonici, mentre in triang2 londa disegnata in modo perfetto
96
loadbang
131
256
until
until
int 384 + 1
128
until
mod 256
+ 384
int 0 + 1
+ 128
t f f
mod 128
t f f
t f f
tabwrite triang2
Figure 92: lalgoritmo per produrre una forma donda triangolare, in una tabella
di 512 + 3 punti
phasor~ 200
expr~ if (($v1 < 0.5), (($v1 * 2) * 2) - 1, (1 - (($v1 *
2)-1)) * 2 - 1)
tri
metro 100
dac~
tabwrite~ tri
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
dac~
tabwrite~ tri
Figure 94
98
I L PA N N I N G
osc~ 120
osc~ 120
*~ 0.25
dac~
dac~
Figure 95: in (1) il segnale delloscillatore 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
dx
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 lampiezza
del segnale lo stesso canale. Per il canale sinistro invece il valore viene
sottratto da 1.0 in modo da essere il complementare dellaltro. E necessario inoltre calcolare la radice quadrata dei due valori, poich lintensit
del suono percepito proporzionale al quadrato dellampiezza del segnale stesso. Entrambi i dati in uscita vengono infine passati per loggetto
line che rende pi graduale il passaggio da un valore allaltro eliminando leventuale 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.
osc~ 120
osc~ 1
expr~ ($v1 * 0.5) + 0.5
expr~ sqrt(1 - $v1)
expr~ sqrt($v1)
*~
*~
dac~
Figure 97
101
osc~ 120
osc~ 1
expr~ if($v1 < 0.5, 1, 0)
expr~ sqrt(1 - $v1)
expr~ sqrt($v1)
*~
*~
dac~
Figure 98
IL
DC
OFFSET
102
a)
b)
Figure 99: Lampiezza del segnale (a) oscilla fra valori positivi e negativi, mentre
(b) polarizzato nel campo positivo
103
1.0
0.5
1.0
1.0
0.5
0.0
0.5
0.0
1.0
0.5
0.0
0.5
1.0
1.0
0.5
b)
0.0
0.5
1.0
1.0
0.5
a)
Figure 100: la distanza massima fra lampiezza positiva e quella negativa del segnale bipolare (a) doppia rispetto a quella del segnale (b)
104
bipolare
osc~ 200
metro 100
tabwrite~ bipolare
expr~ ($v1 * 0.5) + 0.5
unipolare
tabwrite~ unipolare
dac~
105
10
La sintesi additiva a spettro non armonico non pu fare uso delle tabelle
poich le sinusoidi che compongono la forma donda non sono in rapporto
armonico fra loro una tabella comune non consentirebbe ai vari periodi
delle onde di essere completi.
106
Frequenza
waveform
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 dalloutlet di sinistra consentendoci
di sottrarre da questo il valore delloutlet di destra.
A________________B
swap 1
0.242 0.757
Figure 104: Implementazione del crossfading
10.2.1
Nella patch di questa sezione mostriamo un algoritmo per la dissolvenza incrociata (traduzione italiana di crossfading) fra due tabelle contenenti forme
donda semi-casuali. prima esaminiamo labstraction che genera tali onde
(fig. 105
Grazie al contatore viene disegnata nella tabella, il cui nome dato dal
primo argomento passato alloggetto randomwave, unonda sunosoidale ad
ogni punto della quale aggiunto un valore casuale determinato dal secondo argomento passato alloggetto. Ad esempio se tale valore impostato
a 0.5, i valori random prodotti saranno compresi fra -0.25 e +0.25.
La patch della figura successiva (106) invece mostra lalgoritmo per la dissolvenza vera e propria. Lalgoritmo non necessita di spiegazioni particolari. La parte in altro a destra mostra la parte che si occupa del crossfading
mentre in basso c uno slider per impostare lampiezza dellonda risultante.
109
512
t b f
until
t b b
randomF $2
normalize 1
float 0
expr $2 * 0.5
+ 1
expr ($f1 - $f2)
send $1
10.2.2
110
A________________B
randomwave wf1 2
randomwave wf2 1.5
swap 1
-
8000
tabosc4~ wf1
tabosc4~ wf2
*~
*~
pack 0 15
pack 0 15
line~
line~
Amp
+~
*~
dac~
pack 0 15
line~
111
r grid
loadbang
color 200 200 200
send grid
Frequenza
60
pd grid_eval
tabosc4~ wave1
*~
*~
*~
+~
+~
+~
112
inlet
inlet
/ 100
/ 100
expr (1 - $f1)
expr (1 - $f1)
$1 25
$1 25
$1 25
$1 25
line~
line~
line~
line~
outlet~
outlet~
outlet~
outlet~
113
11
S I N T E S I S OT T R AT T I VA
segnale in entrata
filtro
segnale in uscita
Figure 109: schema di un filtraggio di segnale semplice
11.1.1
IL RUMORE
114
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 lampiezza media del segnale si abbassa, per
la precisione si abbassa di 3 db ogni ottava (fig. 111).
Rumore rosa
2000
4000
6000
8000
10000
12000
14000
16000
18000
115
20000
2000
4000
6000
8000
10000
12000
14000
16000
18000
20000
116
2500
0
choice $1
noise~ pink~
rand~
polygate~ 3 100
dac~
Figure 113: selezione del tipo di rumore tramite loggetto polygate
(a)
delay
Input
Output
(b)
delay
Input
Output
117
0.5
delay
*
0.5
Input
Output
118
pena descritto.
noise~
z~ 1
*~ 0.5
*~ 0.5
+~
dac~
amp
freq
22050
Se invece si sommare i due campioni, si sottraggono, si otter un filtraggio delle basse frequenze, lesatta inversione del precedente. Tale filtro
detto passa-alto poich lascia passare le alte frequenze fino alla met della
119
amp
freq
22050
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.
I filtri IIR invece sommano il segnale in entrata con i campioni ritardati
rientranti nel sistema. Lequazione generale per un filtro IIR del primo ordine la seguente:
passa-basso
passa-alto
passa-banda
escludi-banda
11.3 I PARAMETRI DEI FILTRI
I filtri passa-basso e passa-alto devono avere almeno un parametro per
poter funzionare, cio la frequenza di taglio (cutoff frequency). Nel primo
121
caso tale quantit indica la frequenza al di sopra della quale vengono attenuate le altre frequenze, nel secondo, al contrario, indica la frequenza sotto
la quale inizia lattenuazione.
Per essere precisi la frequenza di taglio , convenzionalmente, il punto in
cui il filtro riduce il segnale allo 0.707 del suo massimo valore, il che, con
apiezza pari a 1, corrisponde a una riduzione di 3 decibel. Per questo a
volte la frequenza di cutoff viene definita 3dB point.
Le frequenze attenuate al di sopra (o al di sotto nel caso di un passa-alto)
della frequenza di cutoff costituiscono la banda bloccata del filtro stopband, le
frequenze passanti costituiscono invece la banda passante (passband).
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. Limmagine 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 rappresenta la zona eliminata dallo spettro.
I valori necessari per tali filtri sono due frequenze di cutoff, una per il passabasso, laltra per il passa-alto.
I filtri passa-banda (ed escludi-banda, che il suo inverso) sono comunque
ormai algoritmi indipendenti dagli altri filtri e usano parametri diversi
per funzionare. Il primo valore sempre una freuqneza centrale (center frequency) e una larghezza di banda bandwidth, che corrisponde alla frequenza
di taglio superiore meno quella inferiore. Tale valore spesso sostituito
dal fattore Q, che corrisponde al rapporto fra la frequenza centrale e la
larghezza di banda:
Q=
fc
B
122
fc
Q
ss
h ig
pa
hp
lo w
as
bandpass filter
bandreject filter
h
h ig
pa
ss
lo w
pa
ss
123
I ord.
-6 dB
II ord.
-12 dB
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 introdotti da librerie esterne nella versione extended. Per brevit analizzeremo luso di alcuni oggetti della versione nativa.
I due oggetti lop e hip implementano rispettivamente un filtro passabasso e uno passa-alto del primo ordine, mentre bp e vcf sono dei
passabanda. I primi due accettano come unico argomento la frequenza di
cutoff, mentre gli altri la frequenza centrale e il fattore Q. Con questi oggetti
anche possibile realizzare un filtro escludi-banda, sia usando una coppia
di passa-basso/passa-alto che usando un passabanda (basta sottrarre il seg-
124
noise~
hp
bp
194
lop~ 40
hip~ 10000
choice $1
bp_cutoff
bp~ 200 10
polygate~ 3 80
sig~
lop~ 5
*~
dac~
125
phasor~ 80
8
phasor~ 2
*~ 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 attraverso sig il segnale che controller lampiezza a un filtro passa-basso
con frequenza 5. lop smusser le spigolature del segnale consentendo
il passaggio da un valore allaltro in modo graduale. Diminuendo la frequenza del filtro linterpolazione sar pi lenta, al contrario, sar pi rapida allaumentare della stessa.
126
phasor~ 4
samphold~
abs~
*~ 800
interp_time
+~ 100
osc~
*~
dac~
127
12
- RM1 = ( f + f ), ( f f )
128
Modulazione ad anello
1000
2000
3000
x
Figure 125: lo spettro risultante di una modulazione ad anello. Le frequenze delle
sinusoidi sono di 2000 Hz e 500 hz. Il risultato un suono composto
da frequenze di 2500 hz e 1500 hz
*~
dac~
Figure 126: la patch di Pd che implementa la Modulazione ad anello dello spettro
in figura 125
129
*~
osc~ 650
*~
dac~
Figure 127: doppia modulazione ad anello: 2 segnali vengono ring-modulati fra
loro e successivamente con un terzo
130
1000
2000
3000
4000
x
Figure 128: lo spettro risultante dalla doppia modulazione ad anello
131
1.0
0.5
1.0
1.0
1.0
0.5
0.0
1.0
1.0
0.5
0.5
b)
0.0
0.5
1.0
1.0
0.5
0.5
0.0
0.5
0.0
a)
Figure 129: la distanza massima fra lampiezza positiva e quella negativa del segnale bipolare (a) doppia rispetto a quella del segnale (b)
132
bipolare
osc~ 200
metro 100
tabwrite~ bipolare
expr~ ($v1 * 0.5) + 0.5
unipolare
tabwrite~ unipolare
dac~
133
osc~ 800
controllo_tremolo
2
osc~ 1
expr~ ($v1 * 0.5) + 0.5
*~
$1 20
line~
*~
dac~
Tremolo
a)
b)
c)
Figure 132: il segnale (a) viene moltiplicato per il segnale (b) generando il tremolo
rappresentato in (c)
134
a)
b)
c)
135
osc~ 1600
frequenza
ampiezza
37
osc~ 1
/ 100
*~
$1 20
line~
*~
metro 25
dac~
tabwrite~ wave
Figure 134: con la number box a destra si pu controllare lampiezza 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 dampiezza
i segnali possono essere costituiti da suoni complessi. Lo spettro risultante
sar sempre linsieme delle somme e differenze fra le frequenze della portante e della modulante e in pi le frequenze della portante. La patch in
figura 138 mostra una doppia modulazione dampiezza. La portante di
1500 hz viene modulata con un segnale di 500 hz. Il risultato di tale modu-
136
500
1000
1500
2000
x
Figure 135: Il segnale portante ha frequenza di 800 hz, mentre il modulante ha
frequenza di 160 hz
( Pf M1 ) M2 =
[1500, (1500 + 500), (1500 500)] M2 =
(1500, 2000, 1000) M2 =
(1500, 2000, 1000) 300 =
[1500, (1500 + 300), (1500 300)], [2000, (2000 + 300), (2000 300)],
[1000, (1000 + 300), (1000 300)] =
1500, 1800, 1200, 2000, 2300, 1700, 1000, 1300, 700
Lo spettro risultato mostrato in figura 138.
12.4.1
L INDICE DI MODULAZIONE
137
osc~ 800
osc~ 160
expr~ ($v1 * 0.5) + 0.5
*~
$1 20
line~
*~
dac~
Figure 136: la patch che produce lo spettro della figura precedente
138
osc~ 1500
osc~ 500
expr~ ($v1 * 0.5) + 0.5
osc~ 300
*~
*~
$1 20
line~
*~
dac~
Figure 137: la patch realizza una modulazione dampiezza con due modulanti
139
1000
2000
3000
x
Figure 138: la patch che produce lo spettro della figura precedente
500
1000
1500
x
Figure 139: spettro di modulazione di ampiezza con indice di modulazione pari
a 0.25
140
$1 20
line~
*~
$1 20
line~
*~
dac~
Figure 140: la slider verticale a destra controlla lindice 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)
40
*~
+~
osc~
metro 100
dac~
tabwrite~ vibrato
Figure 141
142
Nella patch in figura 141 il segnale bipolare dellLFO sar moltiplicato per
40, producendo unonda che varier in ampiezza fra -40 e 40 hz. Questo
segnale moduler la frequenza delloscillatore di sinistra che ha una frequenza base di 2000. Leffetto sar di avere un segnale di frequenza 2000
che oscilla fra 1660 e 2040 hz alla velocit di un ciclo al secondo.
13.2 M ODULAZIONE DI FREQUENZA
Definizione: Dato un segnale Portante e uno Modulante, ha luogo una
modulazione di frequenza (FM) quando il segnale Modulante modula la
frequenza di quello Portante.
Risultato: La FM produce uno spettro molto ricco costituito dal segnale
Portante e da un certo numero di parziali con frequenza pari alla distanza
fra la Portante e un multiplo intero della Modulante. Schematizzando:
FM f = Pf , ( Pf + M f ), ( Pf M f ), ( Pf + 2M f ), ( Pf 2M f ), ( Pf + 3M f ), ( Pf
3M f ), . . .
Come per la modulazione ad anello e dampiezza, lo spettro della FM
simmetrico rispetto allasse della frequenza Portante, ma contiene un
numero di bande laterali dipendendente dalla deviazione di picco.
La deviazione di picco il massimo mutamento di frequenza che loscillatore
portante subisce1 . La deviazione di picco si stabilisce attraverso un indice di
modulazione secondo la formula:
I =
D
Mf
143
pd modulante
freq
indice
200
1000
10
Deviazione
2000
pd portante
freq
4000
pd uscita
dac~
Figure 142: la patch per la modulazione di frequenza semplice
In figura 143 raffigurata la subpatch per la portante. Linlet riceve il segnale prodotto dalla modulante, che viene sommato alla frequenza della
portante, che si puimpostare con la number box in alto.
In figura 144 si puosservare che la number box a sinistra imposta la frequenza delloscillatore modulante. Tale frequenza viene anche moltiplicata
per lindice di modulazione. Il prodotto di tale moltiplicazione determina la
deviazione di picco, quindi lampiezza delloscillatore modulante. Il segnale
144
freq
0
inlet~
+~
osc~
outlet~
Figure 143: la subpatch per il segnale portante
L INVILUPPO
Fino ad ora il risultato delle operazioni ha sempre prodotto segnali continui. Non ci siamo occupati di definire un evento nel dominio del tempo,
che fosse provvisto di un inizio e di una fine, come invece accade per ogni
suono reale. Con gli strumenti digitali abbiamo la possibilit di creare
suoni di durata indefinita, ma anche di definire la loro durata nel tempo.
Per disegnare un suono definito nel dominio del tempo abbiamo bisogno
di un inviluppo, ovvero di un profilo che determini la forma che il suono
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~
1000
2000
3000
4000
5000
6000
7000
8000
Figure 146: FM con frequenza portante di 4000 hz, modulante di 200 hz e indice
di modulazione 0.1
147
Spettro FM indice 10
1000
2000
3000
4000
5000
6000
7000
8000
Figure 147: FM con frequenza portante di 4000 hz, modulante di 200 hz e indice
di modulazione 10
ampiezza
Inviluppo di tromba
tempo
Figure 148
148
a)
b)
c)
Figure 149: linviluppo disegnato in (b) ha valori compresi fra 0 e 1. Londa (a)
viene inviluppata da (b), ovvero istante per istante le ampiezze istantanee di (a) vengono moltiplicate per i relativi valori di (b), producendo (c)
149
Infine in figura 154 c il sequencer per la generazione dei bang per innescare gli eventi sonori. Loggetto list-idx riceve una lista di 0 e 1, 1 laddove
levento deve essere on, 0 quando dev0essere off. metro collegato a un contatore 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.
13.3 P ORTANTI MULTIPLE
Fino ad ora abbiamo implementato la Modulazione di Frequenza facendo
uso di un oscillatore portante e di uno modulante. Questo modello, facendo
uso appropriato di inviluppi e del controllo dei rapporti di frequenza e di
indice di modulazione pu produrre timrbi molto complessi e interessanti,
ma la FM pu anche essere realizzata ampliando il campo degli attori in
gioco. Ad esempio se con un ununica onda modulante si modulano pi
portanti lo spettro risultante sar ancora pi complesso.
Nella figura 155 ununica modulante agisce su tre portanti delle quali si
pu impostare la frequenza ma che hanno un unico controllo dellampiezza.
Il modello della FM a portanti multiple diventa estremamente complesso
se si controllano le singole ampiezze delle portanti con inviluppi diversi.
In figura 156 quattro envgen controllano rispettivamente le tre ampiezze
150
r dur r trig
osc~ 55
duration $1 dump
r envindex
*~ 55
*~
+~ 80
osc~
pd indexenv
loadbang
200
r dur r trig
duration $1 dump
r envamp
200
*~
s dur
dac~
pd envamp
pd seqz
START
SPEED
150
151
inlet
inlet
prepend set
unpack f f
loadbang
* 25
pack f f
1 16 0 184 0
line~ 0 5
s envindex
outlet~
inlet
inlet
line~
prepend set
outlet~
loadbang
152
r trig
START
SPEED
150
b
pack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
list-idx
metro 250
sel 1
int 0 + 1
s trig
mod 16
153
frq
frq
frq
frq
index
250
500
750
50
90
pd mod
pd carrier
pd carrier
pd carrier
$1 20
line~
*~
dac~
154
bang
duration 1000
index
line~
line~
line~
line
* 200
frq
250
frq
500
frq
750
frq
50
pd mod
pd carrier
pd carrier
pd carrier
*~
*~
*~
*~ 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
freq
indice
freq
indice
freq
indice
40
500
160
230
320
400
2.3
Deviazione
200
Deviazione
Deviazione
368
+~
+~
pd portante
freq
80
pd uscita
dac~
156
1280
14
Densit dei grani e durata del grano sono due parametri che possono essere o meno dipendenti luno dallaltro. Quando allaumentare della densit 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
!"#$%&'(
gpg
upg
)(##
gpg
*+",(-.&/"#
gpg
upg
upg
upg
*+&"'01#"+
gpg
21"&z0"1%%&"'
upg
,1#%(
gpg
gpg
158
sine wave
1,0
0,0
-1,0
bell envelope
trap envelope
1,0
1,0
0,0
0,0
-1,0
-1,0
resulting grain
resulting grain
1,0
1,0
0,0
0,0
-1,0
-1,0
14.1.2
OVERLAPPING
159
diversa. Nel caso dellimmagine 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.
Il numero dei treni necessari per realizzare loverlapping un numero intero
detto overlapping factor e si calcola dividendo innanzitutto 1000 (i millisecondi in un secondo) per la densit, operazione che ci d loffset, poi dividendo la durata del grano per loffset appena ottenuto ed eventualmente
approssimando allintero superiore. In C scriveremmo la seguente funzione:
int overfactor (gdur, gdens) {
float offset, factor;
int overlapfactor;
offset = 1000.0 / gdens;
factor = gdur / offset;
160
161
pdur: 60ms
gdur: 50ms
gdens: 50hz
offset1: 20ms
offset2: 40ms
14.1.3
162
163
Nellimplementare la sintesi granulare necessario fare delle scelte in merito al tipo di sintesi che si vuole realizzare. Prima di tutto bisogna decidere se gdens e gdur saranno parametri dipendenti o indipendenti fra loro.
Nel primo caso sar necessario realizzare un algoritmo per loverlapping, e
questo vale per la maggiorparte dei tipi di sintesi granulare, nel secondo
caso no, perch allaumentare della frequenza, diminuir la durata del
grano. Questo secondo caso implementato grazie alla cosiddetta Grainlet
Synthesis.
La seconda scelta iniziale da fare consiste nelloptare per una densit costante
nel dominio del microtempo o per una densit variabile.
Il microtempo quella dimensione nellambito della quale non c una
percezione dei cambiamenti temporali, ma timbrici. Se si sceglie di variare
la durata del periodo nellambito di 10 ms, cio se si applica una variazione
alla densit comprsa fra [-5,+5]ms rispetto alla frequenza stabilita, non si
avr percezione di tale cambiamento se non nel dominio del timbro.
Timbro e tempo sono due parametri strettamente connessi. Come sappiamo la frequenza direttamente proporzionale al tempo, la sua unit di
misura (lhertz) indica la velocit con cui unonda compie il suo ciclo. Naturalmente a frequenza alta non abbiamo nessuna percezione temporale,
ma una totale percezione timbrica. C per una zona confusa, quella compresa fra i 20 e i 40 hz circa, dove la percezione si divide fra timbro e
tempo, perch gli eventi sono vissuti come ritmici e dove allaumento della
frequenza corrisponde la sensazione di una precipitazione ritmica, fino a
superare una certa soglia, oltre la quale il ritmo non viene pi percepito.
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.
Quando si realizza una sintesi granulare in cui nel microtempo la densit
dimane costante, si ha la sintesi granulare sincrona (Syncronous Granular
Synthesis), mentre in presenza di densit variabile nel microtempo si ha la
sintesi granulare asincrona Asyncronous Granular Synthesis. Nel primo caso
164
tempo
microscopico
tempo
macroscopico
tempo
formale
Syncronous (Quasi-Syncronous)
Granular Synthesis
Trainlet Synthesis
Pulsar Synthesis
Grainlet Synthesis
Sampled Sounds
Granulation
Glisson Synthesis
FOF Synthesis
165
14.2 I MPLEMENTAZIONE IN PD
La prima cosa da fare creare un algoritmo che generi le tabelle per
linviluppo del grano. Usando come di consueto gli oggetti tabread (fig. ??).
In questo esempio la patch genera quattro diverse forme per linviluppo:
una campana, una forma trapezoidale, una mezza sinusoide e una curva
esponenziale.
166
pd frequenza
pd envelope
phasor~ 4
r frq
inviluppo
set bell
*~ 512
set trap
set halfsine
r princfrq
osc~ 440
set expdec
tabread4~ bell
frequenza
467
*~
r amp
densit
30
$1 50
line~
graindur
amp
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 moltiplichiamo 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 allultimo 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 moltiplicato 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 lultimo indice.
Nellalgoritmo di fondamentale importanza implementare il calcolo del
Duty Cycle. Poniamo di poter impostare il Duty Cycle con uno slider che
agisce nel range [0,1], dove 0.5 rappresenta il rapporto di 1:1, 0.25 il rapporto di 1:3, 0.75 il rapporto 3:1 e cos via. Basta dividere la dimensione
della tabella per la quantit impostata con lo slider per ottenere la giusta
misura per cui moltiplicare luscita di phasor. In linguaggio di pd, costruendo una piccola subpatch ci troveremo di fronte allimmagine di figura 168.
inlet ratio
expr 512 / $f1
$1 50
line~
outlet~ ratio
169
frequenza
0
0
phasor~ 4 pd ratio
osc~ 880 *~
set halfsine
tabread4~ trap
*~
set expdec
$1 50
line~
*~
dac~
Figure 169: Implementazione della Pulsar Synthesis
170
171
Frequency (Hz)
7500
0
0
11.42
Time (s)
noish~
sig~
inlet %
*~ 0
+~
phasor~
*~ 512
outlet~ gdens
La patch contiene due grandi subpatch, una per la gestione di tutti i parametri
dei grani, laltra per la gestione dellampiezza e la distribuzione sul fronte
172
ampenv
gdens
pd envelope
bell
trap
34
halfsine
expdec
amp_(0-1)
gdensvar_(0-100)
waves
30.30
sine
rect
frq
%_ampvar_(0-100)
tri
saw
475
48.48
frqvar_(0-100)
stereospread
20.20
0.505
*~
*~
*~
pd reverb
1
throw~ rev1
throw~ rev2
dac~
173
ampenv
gdens
bell
trap
34
halfsine
expdec
gdensvar_(0-100)
waves
30.30
sine
rect
frq
tri
saw
475
frqvar_(0-100)
20.20
noish~
sig~
*~ 0
r waveform
noise~
+~
sel 0 1 2 3
phasor~
set bell
set trap
set halfsine
*~ 512
tabread4~ bell
samphold~
set expdec
sig~
*~ 0
r waves
sel 0 1 2 3
set osc
+~
set rect
pd waves
set tri
*~
set saw
Laltra subpatch riceve con chatch il segnale di phasor dellaltra subpatch. Due oggetti samphold servono luno a produrre la variazione di
ampiezza, laltro la distribuzione stereo (fig. 176). Questultima parte
dellalgoritmo, in basso a destra, funziona in modo tale da produrre ad
ogni campionamento di samphold un valore casuale compreso fra [-1,1].
Tale valore, in uscita, viene moltiplicato per lindice del fronte stereo (com-
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
0.0123457 0 -0.00826446 0 0.00591716 0 -0.00444444;
tri normalize 1
outlet~
;
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 osc 515
;
osc sinesum 515 1
175
catch~ phas
amp_(0-1)
noise~
samphold~
%_ampvar_(0-100)
abs~
48.48
stereospread
0.505
/ 100
*~ 0
$1 20
expr~ 1 - $v1
line~
*~
noise~
samphold~
outlet~ amp
*~ 0
outlet~ dx
gdur
176
vline~
177
phasor~
grain density
(gdens)
amplitude
variation
(samphold~)
grain triggering
(edge~)
stereo spreading
(samphold~)
grain duration
(vline~/tabread~)
Figure 179: Schema generale dellalgoritmo per la gestione indipendente dei
parametri
178
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 implementare un algoritmo per loverlapping. 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.
La figura 181 mostra un esempio di questo procedimento, con tre treni.
Sopra loverlapping factor non produce sovrapposizione di grani, in basso
il fattore 2 provoca sovrapposizione di due grani. In entrambi i casi i tre
treni sono attivi a turno.
In pd lalgoritmo per implementare tre treni come nella figura precedente
mostrato in figura 182. Un contatore invia il suo conteggio alloggetto %
che calcola il modulo in modo da restituire il conto da 0 a 2, sel indirizza i
bang ai tre treni, zero attiva il primo treno, 1 il secondo, 2 il terzo.
179
overlapping factor: 1
train 0
train 1
train 2
overlapping factor: 2
train 0
train 1
train 2
Naturalmente questo procedimento pu essere realizzato anche per attivare molti pi treni. I limiti sono determinati dalla capacit di calcolo del
computer e dal fatto che in pd i dati di controllo sono meno affidabili dei
segnali, che hanno sempre la precedenza.
A questo punto la patch per la sintesi granulare asincrona con parametri indipendenti pu essere implementata. La figura 183 mostra linterfaccia 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.
Linterno 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 linterno della subpatch envgen dove
180
phasor~
expr~ $v1 < 0.5
edge~
f
+ 1
gdur
% 3
sel 0 1 2
f 20
f 20
f 20
0, 1 $1
0, 1 $1
0, 1 $1
vline~
vline~
vline~
*~ 512
*~ 512
*~ 512
gdensvar_(0-100)
waveform
gdensvar_(0-100)
osc
rect
0
frq
0
tri
saw
gdur
envform
bell
trap
halfsine
expdec
0
amp_(0-1)
Reverb
ampvar_(0-100)
gain
amp_(0-1)
feedback
181
r gdens
r gdensvar
t f f f
sig~
r eform
sel 0 1 2 3
noish~
*~ 0
set bell
+~
set trap
set halfsine
r frq
phasor~
r frqvar
sig~
+~
set expdec
s envform
throw~ phas
r waves
edge~
sel 0 1 2 3
set osc
% 8
set rect
sel 0 1 2 3 4 5 6 7
+ 1
noise~
samphold~
abs~
set tri
pd waves
set saw
r amp
pd envgen
pd envgen
pd envgen
pd envgen
pd envgen
r ampvar $1 20
pd envgen
pd envgen
/ 100
pd envgen
line~
*~ 0
noise~
expr~ 1 - $v1
pd envelope
samphold~
*~
*~
*~
*~
*~
*~
*~
*~
catch~ rev2
*~
r stereospread
*~ 0
catch~ rev1
*~ 0.25
r gain
r feedback
*~
*~
sqrt~
182
inlet bang
r gdur
f 20
0, 1 $1
vline~
*~ 512 r envform
tabread4~ bell
outlet~ env
adc~
audio file
normal
playback
manipulated
playback
forward
backward
variable
speed
random
Figure 186: Tipi di utilizzo di audio campionato
La sintesi granulare sui campioni permette non solo di generare timbri interessanti, ma anche di processare i campioni stessi per il time stretching
e il pitch shifting. Largomento richiederebbe uno spazio ben pi ampio
183
184
15
185
Una volta dentro il segnale pu essere trattato come un qualunque segnale numerico. Dopo essere stato processato, elaborato, manipolato o
quantaltro pu essere riconvertito tramite dac e rimandato alla scheda
audio.
Loggetto accetta anche degli argomenti numerici, che definiscono lindice
delle eventuali entrate. Ad esempio adc 1 2 3 4 5 6 7 8 istanzia un
adc con otto canali in entrata. La stessa cosa pu essere fatta con dac.
Ovviamente la scheda deve permettere lentrata e luscita del numero di
canali desiderato. Se la scheda permette solo quattro canali, gli altri quattro resteranno inattivi.
La figura 187 mostra una situazione in cui il suono entra in pd con adc
ed esce con dac (una patch assolutamente inutile, ma esplicativa).
adc~
adc~ 1 2 3 4 5 6 7 8
dac~
dac~ 1 2 3 4 5 6 7 8
Il secondo oggetto in questione openpanel, che insieme a soundfiler consente di aprire un file audio e inserirlo in una tabella per essere utilizzato
in vari modi. openpanel alla ricezione di un bang apre una finestra di dialogo da cui possibile scegliere un file situato nellhardisk del computer.
soundfiler, tramite il messagio read, consente di convertire un file binario in
una lista di numeri in virgola mobile e inserirli in una tabella. Al contrario,
tramite il messaggio write fa esattamente il contrario: converte in binario
il contenuto di una tabella. La figura 188 mostra una patch in cui un file
audio viene messo in unarray. Tramite openpanel si sceglie il file da aprire e
soundfiler lo inseriamo nellarray. Largomento -resize adatta la dimensione
della tabella tab-file a quella del file stesso. Oltretutto soundfiler emette dal
suo outlet la dimensione in campioni del file importato.
186
openpanel
read -resize $1 tab-file
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.
Gli ultimi due oggetti di questa sezione sono readsf e writesf. Il
primo consente di aprire un file audio e di eseguirlo, il secondo consente
di registrare il flusso audio di pd in un file audio. La figura 189 esemplifica
luso di entrambi. Al contrario di openpanel, savepanel consente di creare un
file su cui si andr a scrivere. Per utilizzare writesf necessario ine ffetti
prima creare il file vuoto su cui si scriver il segnale, poi si pu avviare la
registrazione tramite il messaggio start (oppure 1, in alternativa. stop interromper la scrittura (zero in alternativa). Analogamente readsf avvia
il playback del file con start (1), lo interrompe con stop (zero). Entrambi
gli oggetti accettano alcuni argomenti, il primo dei quali il numero dei
canali.
15.3 U N SEMPLICE random slicer
Gi con la conoscenza di questi pochi oggetti possibile fare cose interessanti 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
open $1
readsf~ 2
start
stop
writesf~ 2
188
oni viene divisa per il numero delle fette per avere la dimensione in campioni di ogni fetta. I due valori ottenuti saranno gli unici necessari per
limplementazione dellalgoritmo.
inlet bang
openpanel
read -resize $1 drumfile
soundfiler
inlet div
t b
t b b f
f
/ 44.1
pow 4
s slicenum
/ 16
/ 16
s msdur
s sampdur
189
choose_division
1
1/2
1/4
open a file
1/8
1/16
bang
1/32
start
r msdur
metro
t b b
f
+ 1
r slicenum
f
% 16
pd slicersettings
0, 1 $1
vline~
drumfile
r sampdur
*~
*
+~
s cursor
tabread4~ drumfile
$1 20
line~
*~
dac~
190
start
r msdur
metro
sezione da
sostituire
t b b
f
+ 1
f
------>
random 16
% 16
r slicenum
+ 1
r slicenum
------>
% 16
0, 1 $1
vline~
r sampdur
*~
*
+~
s cursor
tabread4~ drumfile
$1 20
line~
*~
dac~
15.3.1
CONTROLLARE LO
Implementando il random slicer abbiamo usato un oggetto metro per controllare il timing dellemissione delle slices. Naturalmente la stessa cosa pu
essere realizzata controllando il tutto via segnale. Per la verit lo stesso
algoritmo della patch della sezione precedente pu essere realizzato con
controllo via segnale. Invece di usare metro come trigger principale pu
essere usato phasor.
191
choose_division
1
1/2
open a file
bang
1/4
1/8
1/16
1/32
start r msdur
freeze! 5
metro
prob_reversing
expr 1 - $i1
t b b
spigot 1
pd slicersettings
+ 1
r slicenum
% 16
expr if($f1 < 4 || ($f1 > 7 && $f1 < 12), $f1, random(0, 8))
1 0
unpack 0 0
pack 0 0 0
$2, $3 $1
vline~
drumfile
r sampdur
*~
*
+~
s cursor
tabread4~ drumfile
$1 20
line~
*~
dac~
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. Loggetto samphold campiona il segnale che arriva nellinlet 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 seconda 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.
Con questo principio possibile costruire un random slicer controllato via
segnale. Attraverso expr si possono anche compiere varie operazioni sul
segnale in modo da manipolare la scelta delle fette come nellalgoritmo
della sezione precedente.
Le prossime immagini mostrano un algoritmo simile a quello, con possibit
di freezing, reversing e rolling cio ripetizione rapidissima di una slice. Per
questultimo caso basta raddoppiare (o quadruplicare) la velocit di lettura
194
choose a file
bang
r phasordur
phasor~
pd roll
pd slicersettings
sig~ 16
r slicenum
*~
expr~ random(0, 100)
expr 1 - $i1
*~
samphold~
rev_prob 10
freeze!
rep_prob 0
r sampdur
*~
drumfile
edge~
*~
random 100
pd freezerep
snapshot~
+~
s cursor
tabread4~ drumfile
AMPLITUDE
$1 20
line~
*~
dac~
195
inlet bang
openpanel
read -resize $1 drumfile
soundfiler
inlet div
t b
t b b f
f
2
pow 4
/ 44.1
s slicenum
/ 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
r origdur
4.7
soundfiler
t b f
phasor~ 1
*~
expr 1000 / ($f1 / 44.1)
tabread~ audiofile
s origdur
AMPLITUDE
sig~
audiofile
lop~ 1
*~
dac~
197
Certamente la cosa pi interessante cercare di svincolare i due comportamenti, 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.
Il principio semplice: si divide il file in grani, si stabilisce un fattore di
trasposizione e uno di time stretching. Nel caso si voglia allungare la durata
di un file audio i grani verranno eseguiti non proprio uno dietro laltro, ma
con una certa distanza luno dallaltro. Se, in questo caso, si decide di non
trasportare il campione, la frequenza delle altezze rimarr la stessa, mentre
aumenter la durata del file. Viceversa si pu lasciare invariata la durata
del campione e di trasportare il grano aumentando o diminuendone la velocit di esecuzione. In entrambi i casi per si produrr un intervallo di
silenzio fra un grano e laltro.
Quando un grano viene trasposto verso lacuto si accorcia inevitabilmente
e nel momento in cui la durata totale resta la stessa, al termine del grano
ci sar una certa quantit di silenzio. Quando invece il grano non viene
traposto, rimane identico alloriginale, ma se si rallenta lesecuzione si produrr lo stesso fenomeno.
La fig. 201 mostra questo comportamento. La prima immagine mostra
il frammento di file suddiviso in grani di uguale durata ed equidistanti.
Nella seconda immagine i grani, di identica durata rispetto allimmagine
precedente, vengono rarefatti in modo da allargare il tempo di esecuzione
(in questo caso la met del tempo) mentre nella terza immagine il tempo
rimane uguale alloriginale, ma i grani vengono trasposti di unottava (frequenza doppia).
Lalgoritmo che descriveremo stato implementato e proposto come tutorial di pd da Miller Pusckette stesso 2 .
La figura 202 mostra lalgoritmo nella sua interezza.
Per semplicit abbiamo diviso la patch in regioni etichettate con lettere
maiuscole per facilitare i riferimenti. La regione A permette di impostare
2 Si tratta della patch-tutorial che si chiama B14.rockafella.sampler.pd che si pu trovare nella
cartella doc/3.audio.examples dentro la cartella principale di pd
198
original file
200
400
samples
600
800
1000
time stretching
200
400
samples
600
800
1000
pitch transposing
200
400
samples
600
800
1000
Figure 201: Principio di granulazione di un file audio per time stretching e pitch
shifting indipendenti
la dimensione del grano (chunk size), scelta in millisecondi, ma poi trasformata in secondi moltiplicando il valore per 0.001. La regione B imposta
la velocit in percentuale del campione da manipolare e la sua lunghezza
(in millisecondi, trasformati in secondi). La regione C invece permette la
trasposizione del campione, in decimi di mezzitoni. Le regioni D1 e D2
infine processano il tutto. Sono due frammenti di codice identici perch
c anche un fattore di overlapping di due grani, quindi ci saranno due
treni di grani sovrapposti, al fine di evitare quella frammentazione di cui
si parlato prima.
199
A
40
* 0.001
chunk size
s chunk-size in seconds
B
<-- precession, percent
50
* 0.01
s precession
r precession
t b f
t b f
loadbang
12.5
900
phasor~
*~
t b f
r chunk-size
phasor~
+~ 0.5
s~ phase
wrap~
s~ phase2
s~ read-pt
D1
D2
r chunk-size
samphold~
r~ phase
*~
r~ phase
+~
r~ read-pt
*~ 44100
+~ 1
samphold~
r~ phase
-~ 0.5
*~ 0.5
tabread4~ table23
r chunk-size
cos~
r~ phase2
*~
r~ phase2
+~
r~ read-pt
*~ 44100
+~ 1
r~ phase2
-~ 0.5
*~ 0.5
*~
*~
+~
hip~ 5
output~
volume
dsp
choose_a_file
pd table
200
201
Part III
APPLICAZIONI VARIE
16
E S T E N D I B I L I T D I P D
203
ALCUNE LIBRERIE
204
17
GEM E IL VIDEO
create
destroy
gemwin
Figure 203: Gestione della finstra grafica di GEM
uns volta abilitato il rendering nella finestra grafica, possibile creare delle
forme allinterno di essa. Loggetto gemhead abilita il rendering di ogni
tipo di forma e deve essere presente allinizio di una catena di creazione
della forma. Loggetto 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
create
gemhead
destroy
color 1 1 1
gemwin
square
square
circle
triangle
cube
sphere
cone
206
create
gemhead
destroy
color 1 1 1
metro 250
t b b
gemwin
random 800
random 800
/ 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 validissimo ausilio per la comprensione del loro comportamento. Il sito internet http://gem.iem.at/documentation/manual/manual presenta invece
un manuale abbastanza esaustivo sulla libraria GEM.
207
create
destroy
activate
gemwin
metro 500
delay 50
gemhead
100 25
0 150
osc~ 80 1 25
line~
line
* 0.01
0 150
*~
$1 0 0
dac~
color 0 0 0
square 0.25
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 subpatch di sinistra (quadsx) invia il segnale a sinistra nel campo stereo
e in minor quantit a destra, viceversa quella di destra. Il segnale della
subpatch centrale in posizione centrale.
La patch di sinistra e quella di destra possono anche ricevere frequenza diverse e in base a quelle il quadrato si sposter sullasse verticale (y) mentre
loscillatore centrale suoner sempre la stessa frequenza, lasciando il suo
quadrato nella stessa posizione.
la figura 208 mostra linterno della subpatch quadsx. Il bang ricevuto dallinlet
attiva linviluppo di ampiezza del generatore dellonda (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 sullasse delle y e la frequenza del
generatore audio, che varier fra i valori 500, 1000 e 1500.
La subpatch quaddx identica, con lunica differenza che loggetto translateXYZ ha come argomento 2 invece di -2, quindi sar traslata un a destra
rispetto al centro.
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
gemwin
metro 250
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
random 3
delay 100
+ 1
gemhead
* 500
100 5
0 10
phasor~ 1000 1 5
0 10
line
* 0.01
- 1
$1 $1 $1
* 2
line~
*~
color 0 0 0
outlet~
translateXYZ -2 0 0
square 0.25
211
inlet
delay 100
gemhead
100 5
0 10
osc~ 100
line
* 0.01
1 5
0 10
line~
*~
$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.
Per semplificare: gli oggetti audio dovranno necessariamente risiedere
nella canvas vicina al server. Tutte le altre macchine remote potranno solo
inviare messaggi alla patch principale, che per semplificare chiameremo
proxy patch, che si occupera di far funzionare tutto. le macchine remote
per potranno costruire e distruggere oggetti dalla loro postazione.
In figura 210 viene mostrato il modello di comunicazione attraverso cui pd
funziona.
client patch
client patch
proxy patch
pd engine
214
client patch
proxy patch
netsend
netreceive
; pd
pd engine
Realizzando il tutto in pd ci toroviamo di fronte alla client patch rappresentata in figura 212 e alla proxy patch in figura 213.
Loggetto netsend necessita di una message box per la connessione (in questo
caso si connette a localhost sulla porta 5555). Una volta stabilita la connessione invier qualunque tipo di messaggio compatibile con pd, precedendolo dalla parola chiave send. In questo caso potr inviare due tipi di
messaggio: un numero per la frequenza di un oscillatore e un altro numero (che sar zero o 1) per attivare o disattivare laudio.
215
active_audio_engine
send active $1
netsend
active audio
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 loggetto netreceive. Loggetto
route smista i messaggi. Nel caso riceva un messaggio preceduto dalla
parola-selettore active invier il numero ricevuto alla message box che si occupa di spedire il comando di accensione dellaudio al pd engine, comando
che deve essere preceduto dal punto e virgola.
2 http://supercollider.sourceforge.net/
217
Figure 214: una patch per linvio di internal messages allinterno della stessa patch
Loggetto send invia i messaggi alla patch in cui si trova, in questo caso
internalmessage01.pd. Il nome della patch di destinazione deve essere preceduta 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 allinterno
della stessa message box, separati da una virgola, connettono gli oggetti fra
loro.
Cosa significano i numeri che seguono i messaggi di connect? Si tratta di
quadruple di valori che identificano il numero delloggetto e linlet o loutlet
da connettere. Il numero delloggetto viene attribuito allo stesso nel momento in cui viene creato, secondo lordine di creazione. Questo significa
che, visto che nella patch prima della creazione dei tre oggetti ci sono gi
altri sei oggetti, che vengono numerati virtualmente da zero a 5, i nuovi
oggetti saranno numerati a partire da 6, secondo il loro ordine. osc sar
loggetto numero 6, dac il 7, infine la number box l8.
Il secondo e il quarto numero della quadrupla rappresentano, rispettivamente loutlet e linlet da connettere. Ad esempio il messaggio:
connect 8 0 6 0
218
connette il primo outlet delloggetto 8, cio la number box con il primo inlet
di osc, che loggetto numero 6. La figura 215 chiarifica il tutto.
obj 100 200 osc~ 200
obj 100 250 dac~
floatatom 100 150 5
connect 6 0 7 0, connect 6 0 7 1
connect 8 0 6 0
send pd-internalmessage01.pd
0
---> 8
out 0
in 0
osc~ 200 ---> 6
out 0
in 0
in 1
---> 7
dac~
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 netreceive e con opportuno routing di tali messaggi (tramite route). Le figure
216 e 217 illustrano questo procedimento alla fine del quale la subpatch objecthost si configurer come nella figura 218.
219
active_audio_engine
send active $1
netsend
Figure 216: la client patch per linvio dei messaggi che creano gli oggetti
18.1.3 pdsend
pd dispone di due programmi standalone per la gestione di ci che abbiamo appena esaminato. Si tratta di pdsend e pdreceive che possono essere
eseguiti da linea di comando e fanno le veci di netsend e netreceive.
Questi due programmi consentono di creare delle interfacce con altri linguaggi 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.
Senza entrare troppo nel dettaglio, proviamo a illustrare un esempio di
uso di pd send. in questo caso faremo un uso ibrido dei comandi, ossia
utilizzeremo pdsend per inviare i messaggi e netreceive dentro una proxy
220
;
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 loggetto netreceive in
ascolto sulla porta 3001 e con largomento zero, che significa che ricever
messaggi TCP (che sono pi affidabili degli UDP, indicati con largomento
1). Lulteriore 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
oppure
pdsend.exe 3001 localhost
se si su windows. Poi eseguiamo i seguenti comandi, uno alla volta terminandoli ognuno con il punto e virgola:
pd filename n ./;
#N canvas;
//crea la canvas
#X pop 1;
//la apre
frequenza 200
pd-n obj 100 150 dac~;
//crea unuscita
pd-n connect 0 0 1 0;
pd dsp 1;
//attiva laudio
Si potrebbe anche aprire pd da terminale senza la GUI, con la linea di comando (supponiamo di aver salvato la patch con netreceive nel file proxy.pd):
./pd -nogui proxy.pd
a questo punto pd un programma senza interfaccia grafica, completamente gestito da linea di comando. Naturalmente scrivere i messaggi uno
alla volta e con la dicitura completa non molto comodo, ma ci sono gi alcune implementazioni reperibili in rete che rendono il tutto estremamente
intuitivo e immediato. La maggior parte fanno uso di Python, ma non mancano applicazioni in Perl, Lisp, Scheme, e altri, e c da scommettere che
nellimmediato futuro luso di pd come motore audio pilotato da interfacce
diverse sar allordine del giorno!
222
223
import mrpeach
udpreceive 3001
unpackOSC
send /test $1
route /test
packOSC
udpsend
sender
receiver
opportunamente.
Il meccanismo di indirizzamento tramite le slash pu essere molto elaborato, si tratta semplicemente di organizzare lindirizzamento per route in
modo da instradare i messaggi in modo coerente.
La figura 220 mostra un esempio di istradamento pi elaborato.
Naturalmente nulla impedisce di creare connessioni duplex, dove una macchina
invia e riceve messaggi allo stesso tempo. sufficiente creare due oggetti
udpsend e udpreceive, ovviamente su porte diverse. in pratica si creano
due connessioni OSC diverse, una per ricevere, laltra per inviare dati.
Nellesempio di figura 221 la macchina A invia dati sulla porta 3001 e
riceve sulla porta 3002, la macchina B, viceversa, invia sulla 3002 e riceve
sulla 3001.
Tutte le comunicazioni che abbiamo realizzato nei precedenti esemi fanno
uso del protocollo UDP per trasportare i dati, ma nulla vieta di utilizzare il
protocollo TCP, che pi affidabile anche se a volte meno veloce. Se si usa
una connessione internet per comunicare con pd probabilmente potrebbe
essere meglio usare il TCP, ma in una LAN locale preferibile in generale
224
import mrpeach
udpreceive 3001
unpackOSC
0
route /data /audio
0
route /sliderA /sliderB
receiver
225
import mrpeach
30
send /data $1
send /audio $1
packOSC
packOSC
udpsend
udpsend
udpreceive 3002
udpreceive 3001
unpackOSC
unpackOSC
route /audio
route /data
0
B
226
streamin~ 3001
osc~ 200
dac~
streamout~
client
server
227
streamin~ 3001
streamin~ 3002
streamout~
streamin~ 3003
client A
*~ 0.25
*~ 0.25
streamin~ 3004
connect localhost 3002
*~ 0.25
osc~ 300
dac~
streamout~
server
client B
osc~ 600
osc~ 1200
streamout~
streamout~
client C (stereo)
228
passwd mypass
connect shoutcast.host.com 8000
mountpoint mymusic.mp3
shoutcast
osc~ 200
mp3cast~
bang_to_connect!
mysound
playlist
Carrier
choose_a_file_to_play
109
Modulating
start/stop
70
mic
mysound
playlist
229
bang_to_connect!
t b b b b
passwd mypass
connect shoutcast.host.com 8000
mountpoint mymusic.mp3
shoutcast
outlet
mysound
playlist
Carrier
choose_a_file_to_play
109
Modulating
70
start/stop
osc~ 100
osc~ 400
*~ 0.5
+~ 0.5
r mic
adc~
*~
sel 1 0
$1 20
r mysound
line~
$1 20
start
openpanel
stop
prepend open
loadbang
open astronomydomine.wav l
line~
*~
*~
*~
sfplay 2
r playlist
$1 20
line~
inlet messages
*~
*~
mp3cast~
230
mic
mysound
playlist
ctlin 1
ctlin 2
ctlin 3
/ 128
/ 128
/ 128
send sld1
send sld2
send sld3
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
route /A /B /C /D
CLIENT 3
Data control part C
part A
netsend 3001 /C
part B
part C
part D
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 dorchestra che dice ad ogni client quello che deve fare. In questo caso
laudio decentralizzato, ogni client ha il proprio motore, incluso il server
(fig. 232).
UNICAST Architecture
(Audio decentralized)
CLIENT 1
netreceive 3000
AUDIO ENGINE
SERVER
Event Generator
CLIENT 2
netreceive 3001
AUDIO ENGINE
CLIENT 3
netreceive 3002
localhost
AUDIO ENGINE
AUDIO ENGINE
CLIENT 4
netreceive 3003
AUDIO ENGINE
Figure 232: Architettura UNICAST, il server genera gli eventi-partitura che vengono selettivamente inviati ai client
Un ultimo tipo di proposta quella che si pu definire BROADCAST Architecture con audio centralizzato. Un server invia un messaggio comune
(BROADCAST) a tutta la rete, tipo un messaggio di sincronizzazione (clock)
e riceve a sua volta da tutti i client i dati per il controllo del motore audio
(fig. 233). larchitettura pi complessa, poich richiede una connessione
full-duplex, cio con doppia direzionalit. la trasmissione viaggia dal client
al server e viceversa.
Naturalmente queste architetture proposte sono legate alle condizioni in
cui si opera, ma sono anche funzionali al concetto di localizzazione della
sorgente sonora. Unarchitettura audio centralized accentra laudio su una
postazione specifica, di conseguenza non permette realmente di associare
il gesto di chi suona a ci che si ascolta. Daltro canto pi semplice
da gestire dal punto di vista dellhardware, sufficiente un impianto di
amplificazione con stereofonia. Molto pi complessa la condizione di
235
netsend
3000
(audio control data)
netreceive
3000
(audio control data)
CLIENT 3
netsend
3001(broadcast)
(clock)
netreceive
3001
(clock)
AUDIO ENGINE
netsend
3000
(audio control data)
CLIENT 4
netreceive
3001
(clock)
netsend
3000
(audio control data)
audio decentralized, dove ogni laptop produce il suo segnale. ipotizzabile unuscita su canali multipli anche in termini di amplificazione. La
soluzione della PLork (Princeton laptop Orchestra 3 ) degna di citazione:
si tratta di unarchitettura audio decentralized dove ogni componente esce
con il proprio segnale e lo diffonde con uno speaker a irradiamento circolare.
le soluzioni possibili sono tante quante le problematiche, ma le prospettive
di questo modo di suonare sono interessanti e in un futuro molto prossimo
3 http://plork.cs.princeton.edu/
236
4 http://chuck.cs.princeton.edu/
5 http://impromptu.moso.com.au/
237
19.3 A RDUINO
238
CONCLUSIONE
239
BIBLIOGRAFIA
AA.VV. [2000], The CSound Book, ed. by R. Boulanger, The MIT Press, Cambridge.
[2010b], The Audio programming Book, ed. by R. Boulanger and V. Lazzarini, 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, ConTempoNet.
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, Cambridge.
[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, London.
Temperley, David [2010], Music and Probability, The MIT Press, Cambridge.
240
Winkler, Todd [2001], Composing Interactive Music. Techniques and Ideas Using 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 scaricare 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 libro di Miller Puckette, creatore di Max e di Pure Data, scaricabile liberamente dal suo sito, http://crca.ucsd.edu/~msp/.
Valle, Andrea [2008], the SuperCollider Italian Manual, un manuale in italiano 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 allaudio in
tempo reale. Da qui possibile scaricare il software dellambiente, il
manuale e la documentazione varia, http://chuck.cs.princeton.edu/.
242
242
INDEX
bang, 19
object box, 16
if, 54
print, 15
243
243
INDEX
bang, 19
object box, 16
if, 54
print, 15
244
244