<< Chapter < Page | Chapter >> Page > |
Ogniqualvolta un messaggio è inviato ad un oggetto, questi
può diventare mittente a sua volta verso altri oggetti. Inaltri termini, si configura un albero di ricezioni di
messaggi. Secondo il
manuale di Pure Data l'ordine di esecuzione utilizzato è
depth-first ,
cioè ogni ramo è esplorato fino alle foglie prima diprocedere con gli altri rami. L'ordine di esecuzione tra
nodi allo stesso livello dell'albero sarebbe invece da considerarsiindeterminato. In realtà, provando ad eseguire l'
esempio di
[link] e ridisponendo le connessioni tra i nodi dell'albero con ordini diversi ci si accorge che non si può nemmeno contare sull'ordine depth-first, in quanto esso interferisce con l'ordine di immissione delle connessioni. In Max/MSP la situazione è ancora peggiore perché muovendo messaggi e bang in posti diversi della finestra, a parità di configurazione topologica, si ottengono sequenze di attivazione diverse.
L'elaborazione di tipo dataflow può dare luogo a loop noncomputabili, quale è quello riportato in
[link] . Pure Data, in questo caso, riporta
un messaggio di "stack overflow" sulla consolle. Per rendereil loop computabile è sufficiente inserire un elemento di
disaccoppiamento quale è un
pipe
(si veda
[link] ). Per quanto sia piccolo il parametro
ritardo di questo pipe (al limite anche nullo), essoterrà memoria del dato in ingresso per consumarlo al ciclo
successivo di calcolo.
Nella maggior parte degli oggetti, la inlet di sinistra è
hot , nel senso che messaggi che ad essa
arrivano scatenano messaggi in output.E' spesso desiderabile inviare messaggi a due o più inlet di
un oggetto, ma il risultato dell'operazione può dipenderedall'ordine con cui si sono fatte le connessioni. Ciò mina
l'efficacia semantica del programma visuale, in quantopotremmo avere due patch apparentemente identiche che però
si comportano diversamente perché costruite con un ordinediverso. Ad esempio, si provi a fare la somma di un numero
con sè stesso secondo la
[link] .
La sequenza di creazione delle connessioni determina la
correttezza o meno del risultato. Per imporre chiarezzasemantica al patch è opportuno inserire un oggetto
trigger
che forza l'ordine di attivazione delle
outlet da destra a sinistra, come indicato in
[link] .
In
[link] è illustrata l'utilizzazione di un
generatore periodico di
bang . Si noti il parametro di
metro
che
stabilisce l'intervallo (di 500 millisecondi) tra duebang. Il quadrato in alto è un elemento di GUI detto toggle
switch, in pratica un interruttore.
Un altro elemento di GUI, il vslider , è illustrato in [link] . In questo patch è anche visibile un oggetto number, il quale invia un numero in uscita( outlet ) ogni volta che ne viene cambiato il valore, per dragging con il mouse o per immissione dinumeri dal suo input.
In Pure Data, un array è un contenitore di numeri ed un
elemento di visualizzazione al tempo stesso. Infatti,l'oggetto
table
istanzia l'array e crea un
subpatch che ne visualizza la rappresentazionegrafica. Questa rappresentazione è anche uno strumento
di input, in quanto i valori dell'array possono essere"disegnati" con il mouse. Per leggere e scrivere i
singoli elementi dell'array si usano gli oggetti
tabread
e
tabwrite
. L'utilizzazione di
tabread
per
scandire un array è illustrata
in
[link] .
In
[link] sono illustrati
blocchi di confronto e
selezione . In particolare, il blocco
select
attiva l'uscita di sinistra se l'ingresso
(
inlet ) è uguale al suo parametro,
altrimenti attiva l'uscita di destra.
In
[link] sono illustrati tre
elementi di routing . Il blocco
spigot
trasmette messaggi dall'inlet di
sinistra all'outlet in dipendenza dallo statodell'ingresso (di controllo) di destra. In sostanza si
tratta di un
gate con controllo di
apertura e chiusura. Invece,
moses
consente
di smistare alle uscite sinistra e destra i valori diingresso che sono rispettivamente minori o maggiori (o
uguali) del valore di controllo passato dalla inlet didestra. Infine,
route
smista dei messaggi
ricevuti in ingresso sulla base del loro primo elemento,mettendolo a confronto con gli argomenti. Un
multiplexer si
può ottenere combinando la
route
con la
pack
.
Realizzare un multiplexer e un demultiplexer utilizzando
gli oggetti
pack
,
route
e
spigot
.
In
[link] è illustrata l'utilizzazione di
ritardi e code . La
delay
ritarda un bang in ingresso di un numero
di millisecondi pari al suo argomento. Se si vuole ritardareun flusso di dati bisogna usare la
pipe
, la
quale è realizzata come
coda a buffer circolare .
In
[link] si vedono alcuni oggetti che
consentono di
scandire, misurare, e
avanzare il tempo. Rispettivamente, ciò si ottiene
con
metro
,
timer
, e
line
. Quest'ultimo oggetto genera una rampa
lineare, da un valore iniziale a uno finale, in un certotempo.
Nel patch di
[link] , si provi a
rimuovere e ripristinare i collegamenti che arrivanoalla inlet di destra dell'oggetto
float
, e
si verifichi che il reset dell'indice una voltaraggiunto il limite di 128 può non avere luogo. Perché?
Come si può introdurre in maniera deterministica ilreset dell'indice?
E' sufficiente introdurre un elemento di
disaccoppiamento (ad esempio, una
pipe 0
)
che imponga un ordine tra l'immissione del numeroincrementato e l'immissione di 0 nella inlet di destra.
Il funzionamento dataflow di Pure Data avviene mediante
pipe che corrispondono alle connessionitra oggetti. E' anche possibile operare in regime di
message
passing , cioè ricevere (
receive ) e spedire (
send ) dati tra diverse parti di un
patch o tra patch diversi. Ciò è illustrato in
[link] . Invece, l'oggetto
value
realizza una sorta di variabile globale.
Nella programmazione visuale la modularità si ottiene con i meccanismi di subpatching che, in Pure Data, sono di due tipi:
Notification Switch
Would you like to follow the 'Programmazione di artefatti interattivi' conversation and receive update notifications?