Manuale Pd - Versione italiana

Progetto di traduzione e riorganizzazione del materiale di help di Pd

 
 

 

Introduzione a Pd

Traduzione dal cap. 2 della PD Documentation di Miller Puckette

 

Sommario

 

1. Cos'è Pd 2. La finestra principale, canvas e terminale
3. Box e oggetti 4. Box di messaggi e GUI
5. Modo Edit e modo Run 6. Anatomia di un messaggio
7. Box di messaggio 8. Segnali audio
9. Frequenza di campionamento e formato 10. Oggetti tilde e connessioni audio
11. Convertire audio da e verso messaggi 12. Oggetti switch~ e block~
13. Connessioni di segnale non locali 14. Scheduling
15. Creazione di oggetti 16. Invio di messaggi
17. Ingressi ed uscite 18. Segno del dollaro ($)
19. Subpatches 20. Astrazioni
21. Le subpatches Graph-on-parent (a vista) 22. Array numerici

 

 

1. Cos’è PD

 

PD è un ambiente di programmazione grafico real-time per il processamento dell’audio e della grafica. Ricorda Max/MSP ma è più semplice e più portabile; inoltre PD ha 2 proprietà non (ancora) presenti in Max/MSP:

• PD, tramite il pacchetto GEM di Mark Dank, può essere usato per applicazioni simultanee di audio e animazioni grafiche.

• PD permette un approccio sperimentale alla definizione e all’accesso delle strutture di dati.

 

torna su

 

 

2. La finestra principale, canvas e terminale

 

Quando PD sta correndo si vedrà una finestra principale “Pd” e probabilmente una o più patches (o canvases). La finestra principale di PD è come questa:

Vi si trovano indicatori di livello di picco e di clip per l’ingresso e l’uscita audio; questi livelli si riferiscono a tutti i canali di ingresso e uscita (…).

In basso a destra vi è un controllo che accende o spegne l’audio in modo generale. Spegnendo l’audio si blocca la computazione e PD abbandona ogni dispositivo audio usato. Vi è anche un Menù “Media” con gli acceleratori “Control-.“ per interrompere la computazione audio e “Control-/” per accenderlo. Quando l’audio è acceso, PD computa campioni audio in real time in base a quale patch è aperta (indipendentemente se sono visibili o meno).

L’indicatore di errore DIO (I/O Digitale) lampeggia se vi è un errore di sincronizzazione per l’ingresso o l’uscita audio. (Ma si noti che su alcune piattaforme PD non li trova. Se non si vede mai rosso, probabilmente non funziona). Cliccando sul bottone “DIO errors” si può vedere una lista di errori recenti. Questo indicatore dovrebbe risultare rosso ogni qualvolta la computazione è in ritardo o l’ingresso e l’uscita audio non stanno funzionando alla medesima velocità.

Un documento PD è chiamato patch o canvas. Ogni documento aperto ha una finestra principale e un certo numero di sotto-finestre. Le sotto-finestre possono essere aperte e chiuse ma sono sempre attive sia che si vedano sia che non si vedano. Questa è una semplice patch di PD:

Ci sono 4 box di testo in questa patch:

• 1 box numerico (che mostra uno 0),

• 1 box oggetto che mostra “print”, e

• 2 commenti.

Il box numerico e il box oggetto sono connessi, l’uscita del primo entra nell’ingresso del secondo. I box possono avere 0 o più ingressi e/o uscite, con l’ingresso in alto e le uscite in basso.

L’uscita di PD appare sul terminale standard. Di norma si esegue PD in una finestra di shell o di terminale che viene tenuta aperta per vedere anche eventuali messaggi di errore.

 

torna su

 

 

3. Box oggetti

 

Le patches di PD possono avere quattro tipi di box:

1. oggetti

2. messaggi

3. GUI

4. commenti

Si creano degli oggetti digitando del testo nei box oggetto. Il testo si divide in atomi separati da spazi bianchi. Il primo atomo specifica quale tipo di oggetto PD dovrà costruire; gli altri, chiamati argomenti, dicono a PD come inizializzare l’oggetto.

Se si digita per esempio:

il “+” specifica la classe dell’oggetto. In questo caso l’oggetto sarà del tipo che produce un’addizione e il “13” inizializza il valore da aggiungere.

Gli atomi sono sia numeri che simboli come “+”. Qualunque cosa non sia un numero valido viene considerato un simbolo. Numeri validi possono avere una parte decimale o no, per esempio 12, 15.6, .456, o possono essere scritti in notazione esponenziale (come “4.5e6”, che significa “4.5 moltiplicato per 10 sei volte, ossia, 45000000). Esponenziali negativi dividono per 10 (così 1.23e-5 sarà 0.0000123).

Tra i numeri non validi, che sono dunque letti come simboli, vi sono ad esempio “+5” e “0..6” così come parole come “Zack” o “gatto”. I simboli sono sensibili alle maiuscole o minuscole: “gore”, “Gore” e “GORE” sono da intendersi tutti diversi.

Il testo che si digita in un box oggetto determina quante e quali specie di entrate ed uscite l’oggetto stesso avrà. Alcune classi (come “+”) hanno sempre una impostazione fissa di ingressi e uscite; nel caso di altre classi, gli ingressi e le uscite dipenderanno dagli argomenti.

Ecco, per esempio, un semplice sintetizzatore MIDI:

Questa patch combina oggetti di controllo (notein, stripnote e ftom) con oggetti tilde (osc~, *~ e dac~). Gli oggetti di controllo compiono le loro funzioni sporadicamente, come conseguenza di uno o più tipi di evento. Nel nostro esempio, i messaggi di nota MIDI in arrivo danno il via alla computazione. Il risultato, quando si tratta di un note on (e non un note off), è calcolare la frequenza in cicli per secondo e passare il risultato all’oscillatore (osc~).

La seconda metà della patch, con gli oggetti osc~, *~ e dac~, calcola i campioni audio, esattamente come fa un sintetizzatore audio. L’oggetto osc~ si comporta come un interfaccia tra i due regimi (di controllo e di segnale). Prende i messaggi di controllo per impostare la sua frequenza, ma esce verso “*~” usando un segnale audio.

I segnali audio sono flussi di numeri non sporadici ma continui. Ne consegue che gli oggetti tilde agiscono secondo regole molto differenti dagli oggetti di controllo. La parte audio della patch è sempre attiva, indipendentemente che i messaggi MIDI arrivino o meno. D’altra parte, la funzione delle operazioni di controllo è modificare i parametri della computazione audio, ad esempio la frequenza dell’oscillatore.

Anche le connessioni nella patch (le linee tra i box) sono di 2 tipi:

• di controllo

• di segnale

Il tipo di connessione dipende dall’uscita da cui proviene. Le connessioni di segnale sono rappresentate da linee più spesse di quelle relative ai controlli; nella patch sopra le due connessioni inferiori sono segnali, le altre sono controlli.

In generale:

• una connessione di controllo può essere mandata su un ingresso di segnale; i numeri inviati sono automaticamente convertiti in segnali

 

• le connessioni di segnale, invece, non possono essere mandate su ingressi di controllo; deve essere specificata una esplicita conversione

 

torna su

 

 

4. Box di messaggi e GUI

 

Il bordo di un box ci dice come verrà interpretato il suo testo e come esso funziona. I box oggetto (come nell’esempio precedente) usano il testo per creare oggetti quando si carica una patch o si digita del testo in un nuovo box. Se si ridigita il testo in un box oggetto, quello vecchio è scartato e se ne crea uno nuovo, usando i nuovi argomenti. I contenuti di un box oggetto descrivono un messaggio che viene mandato a PD per creare l’oggetto.

 

4.1. Messaggi

 

Interpretano il testo come un messaggio da inviare ogni qualvolta il box viene attivato (da un messaggio in entrata o tramite mouse). Il messaggio può essere inviato quante volte si vuole quando la patch è attiva (in ciò si differenzia dai box oggetto il cui messaggio è usato una volta sola per creare l’oggetto stesso). Invece di andare direttamente a PD, il o i messaggi del box messaggio vanno sia all’uscita del box che agli altri oggetti specificati a riceverlo/i. Nell’esempio sottostante, il box messaggio, una volta cliccato, invia il messaggio “21” ad un box oggetto che gli aggiunge 13 (si noti il differente bordo dei 3 box sulla sinistra).

 

4.2. GUI

 

Il terzo box mostrato è un GUI (1). Vi sono molti tipi di GUI tra cui:

• box numerici (come, nell’esempio, il “+”)

toggles

sliders e altri

Mentre i box oggetto o messaggio rimangono statici quando la patch è attiva, il contenuto di un box numerico (il testo che vi appare) cambia in relazione al suo valore corrente. Si può anche usare il contenuto di un box numerico come controllo cliccando e trascinando in su o in giù, oppure digitandovi dei valori. Tener presente che si possono usare anche l’alt-click e lo shift-click; si veda l’help relativo per altre informazioni.

Si può anche creare un box simbolo che è come un box numerico ma gestisce simboli, come “gatto”. E’ possibile inserirvi una qualunque stringa (seguita da un “enter”) o usarlo per mostrare stringhe che arrivano al suo ingresso come messaggi.

 

torna su

 

 

5. Modo Edit e modo Run

 

Una patch può essere in modo edit o in modo run; ciò influenza soltanto le caratteristiche d’azione del mouse. Nel modo edit, cliccando e dragando, il mouse seleziona e muove box oppure crea o taglia connessioni; in modo run cliccando sui box si mandano loro messaggi che daranno risposte di vario tipo. Nel modo run box numerici o di messaggi possono essere usati come controlli. Normalmente, nel corso di una performance si è in modo run; per modificare la patch, invece, in modo edit.

 

torna su

 

 

6. Anatomia di un messaggio

 

I messaggi contengono un selettore seguito da un certo numero di argomenti. Il selettore è un simbolo che appare nella patch come una stringa non numerica con nessuno spazio bianco, punto e virgola o virgola. L’argomento può essere costituito da simboli o da numeri. I numeri in PD sono a 32 bit a virgola mobile così che possono rappresentare interi esattamente tra -8388608 e 8388608. (In Max vi sono 2 tipologie separate di numeri, interi e a virgola mobile; PD usa solo quest’ultimi).

Quando un messaggio viene passato (spesso è un ingresso di un box ma potrebbe essere qualunque altra cosa che può ricevere un messaggio), il selettore del messaggio viene controllato dal ricevente. Se il ricevente riconosce il messaggio di quel selettore, risponde con un’azione corrispondente. Per esempio qui abbiamo un oggetto “float”:

I due rettangolini in alto sono chiamati normalmente “ingressi” (inlet), ma quello di sinistra indirizza i messaggi in arrivo all’oggetto “float” stesso, mentre quello di destra indirizza i messaggi verso un oggetto ingresso ausiliario. L’oggetto float proprio (rappresentato dall’ingresso sinistro) accetta messaggi con selettore “float” e “bang”. L’ingresso destro invece accetta solo messaggi “float”. Questi 2 selettori, insieme con “symbol” e “list”, sono normalmente usati per denotare l’azione principale dell’oggetto, qualunque possa essere, così che gli oggetti possono essere interconnessi con la massima flessibilità.

E’ possibile digitare messaggi che iniziano con un numero, che non può essere usato come selettore. Ad un singolo numero è sempre assegnato automaticamente un selettore “float”, mentre ad un messaggio di un numero seguito da un altro argomento è sempre assegnato il selettore “list”.

 

torna su

 

 

7. Box di messaggio

 

I box di messaggio sono contenitori di testo in cui si digita un messaggio. Quando il box è attivato, cliccandovi sopra o inviando al suo ingresso qualcosa, il messaggio è mandato alla sua uscita e in altra destinazione specificata.

Nell’esempio sopra il primo box contiene il numero 1.5; questo messaggio ha un implicito selettore impostato a “float”. Il secondo è una lista di 3 numeri; nel terzo il selettore è “my” e i due argomenti sono il numero 5 e il simbolo “toes”.

 

7.1. Virgola

 

Messaggi multipli possono essere separati da virgole, come mostrato qui sotto:

Qui i tre messaggi sono i numeri 1, 2 e 3. Essi sono inviati in sequenza (senza che intervenga alcun intervallo temporale fra loro, come con l’oggetto “trigger”, e generando una gerarchia di ‘profondità’ tale per cui qualunque catena di azioni dipenda da “1” avrà la precedenza su ciò che dipende da “2” e così via).

 

7.2. Punti e virgola

 

Anche i punti e virgola possono separare i messaggi. Un messaggio che segue ad un punto e virgola deve specificare un simbolo che costituisce la destinazione (ossia, i punti e virgola sono come virgole tranne che essi cancellano la “destinazione corrente” così che il successivo messaggio ne specifica una nuova). La “destinazione corrente” è, in prima istanza, l’uscita del box stesso. Nell’esempio qui sotto, il punto e virgola iniziale redirige i messaggi dall’uscita verso un oggetto chiamato “fred” (che qui è un oggetto receive, ossia un oggetto che riceve “a distanza”, senza una specifica connessione). Analogamente per il successivo messaggio viene inviato a “sue”.

Alcuni altri oggetti (le finestre di PD, per esempio, e le tabelle) hanno nomi specifici verso i quali è possibile inviare messaggi. Inoltre, è definito lo speciale oggetto “pd” al quale si possono mandare messaggi per attivare o spegnere il DSP.

E’ possibile mettere delle variabili nei box di messaggio, come mostrato nell’esempio:

Qui, “$1”, ecc., si riferisce agli argomenti del messaggio in arrivo (che non sono definiti se si invia un messaggio “bang” o se si clicca sul box per attivarlo). Le variabili con segno di dollaro possono essere sia numeri che simboli a seconda del messaggio in arrivo; se sono simboli, si possono usare anche per specificare selettori o destinazioni di messaggio variabili.

 

torna su

 

 

8. Segnali audio

 

Con PD si possono creare patches audio in grado di sintetizzare suoni musicali, analizzare suoni in ingresso, processare suoni per trasformarli o integrare il processamento audio con altri media. Questa sezione descrive come PD tratta i segnali audio.

 

torna su

 

 

9. Frequenza di campionamento e formato

 

In PD i segnali audio sono rappresentati internamente da numeri a virgola mobile e a 32 bit, così da avere un’ottima gamma dinamica. Tuttavia, in funzione dell’hardware che si possiede, l’I/O audio è di norma limitato a 16 o 24 bits. Tutti gli ingressi risultano tra i valori di -1 e 1; i valori di uscita saranno forzati entro quell’ambito. PD assume una frequenza di campionamento di 44100 Hz salvo impostato diversamente (sia nella linea di comando di PD che nel dialogo di menu “audio setup”).

Pd può leggere o scrivere campioni su files sia mediante numeri a virgola fissa di 16 o 24 bit che a virgola mobile (2) a 32 bit, in formato WAV, AIFF o AU, tramite gli oggetti soundfiler, readsf e writesf.

 

torna su

 

 

10. Oggetti tilde e connessioni audio

 

La computazione dell’audio è trasmessa tramite gli oggetti tilde (come "osc~") i cui nomi terminano convenzionalmente con un carattere tilde proprio per ricordare cosa fanno. Gli oggetti tilde possono comunicare tramite connessioni audio. Quando la computazione audio è attiva, o quando si cambia il canale mentre l’audio è attivo, PD ordina tutti gli oggetti tilde in una sequenza lineare; quindi questa lista lineare viene smistata in blocchi di 64 campioni l’una; a 44100 Hz ciò significa che un canale audio trasmette ogni 1.45 millisecondi. Le entrate e le uscite in PD sono configurate sia per messaggi che per l’audio; è un errore connettere un’uscita audio ad un ingresso non-audio e viceversa; di solito questi errori sono rilevati (sort time) quando si attiva l’audio o quando si cambia canale con l’audio acceso. Un ingresso sinistro di un oggetto può accettare sia audio che messaggi; ogni altro ingresso invece o l’uno o l’altro.

Una rete audio, ossia degli oggetti tilde con le loro connessioni, deve essere aciclica. Se vi sono loops, si vedrà un messaggio di errore. Quando gli errori vengono riportati “sort time” non è facile risalire alla loro causa. Si possono costruire algoritmi con feedback tramite connessioni di segnale non locali.

Le subpatches possono avere entrate e uscite audio per mezzo degli oggetti inlet~ e outlet~.

 

torna su

 

 

11. Convertire audio da e verso messaggi

 

E’ possibile usare un valore di controllo come segnale, ma in tal caso è necessario usare l’oggetto sig~ per la conversione. Gli oggetti +~, -~, *~, /~, osc~, e phasor~ possono essere configurati per ricevere sia ingressi di controllo che di segnale. La direzione opposta, da segnale a controllo, richiede che venga specificato in quale momento si vuole che il segnale sia campionato. A ciò è preposto l’oggetto snapshot~, ma si può anche campionare un segnale con tabwrite~ e poi accedervi per mezzo di tabread o tabread4 (si noti la mancanza della tilde!). Vi sono anche oggetti di analisi, il più semplice dei quali è "env~", il controllo di inviluppo.

 

torna su

 

 

12. Oggetti switch~ e block~

 

Si possono usare gli oggetti switch~ o block~ rispettivamente per aprire/chiudere porzioni della computazione audio e per controllare l’ampiezza del blocco di calcolo. In ogni finestra può esservi soltanto un oggetto switch~ o block~; tale oggetto agisce sull’intera finestra e le sue sottofinestre, che a loro volta possono avere annidati altri switch~ o block~. Questi due oggetti prendono, come argomento, l’ampiezza di un blocco e un fattore di overlap; per esempio:

block~ 1024 4

specifica blocchi di 1024 campioni, con sovrapposizione (overlap) di un fattore 4, relativamente alla finestra madre.

Switch~ comporta un piccolo aggravio di computazione in aggiunta a quello già associato al cambio di ampiezza di blocco (di campioni). Dimensioni più grandi di 64 campioni dovrebbero comportare piccoli incrementi di efficienza in runtime. Inoltre, la fft~ e gli oggetti relativi operano su blocchi la cui ampiezza è più piccola di 64 campioni per ottenere una maggiore risoluzione nell’interazione messaggi/audio, o per ridurre un “block delay” negli algoritmi di feedback. In casi estremi (non testati), impostare l’ampiezza di blocco ad 1 permette di scrivere propri filtri ricorsivi.

Si può usare switch~ per impostare preventivamente i calcoli del DSP; per esempio si potrebbe voler passare da un algoritmo di sintesi ad un altro. Per fare questo, mettere ciascun algoritmo nella sua proprio subpatch (che può avere, a sua volta, altre sub-patch, ad esempio per un banco di voci) e passare dall’uno all’altro, disattivandone uno quando si attiva l’altro. Fare attenzione ai clicks; inserendo un controllo line~ per l’uscita, si dia il tempo necessario per scalare a zero prima dello switch altrimenti l’algoritmo, una volta riattivato, ripartirà da un valore non zero, dove era rimasto bloccato.

Quando una subpatch è stata spenta l’uscita audio genera degli zero; questo comporta un piccolo onere di calcolo; un modo più economico è usare throw~ dentro il modulo da cui si è fatto lo switch e catch~ fuori.

 

torna su

 

 

13. Connessioni di segnale non locali

 

E’ possibile trasmettere segnali in modo non locale, sia da una finestra a un’altra, sia reindirizzando il segnale all’ingresso dell’algoritmo. Questo può essere fatto usando le coppie throw~/catch~, send~/receive~, oppure delwrite~/delread~.

Throw~ e catch~ implementano un canale di somma; throw~ aggiunge nel bus e catch~ legge il segnale che si è accumulato per poi azzerare il bus per il prossimo giro.

Possono esservi molti oggetti throw~ associati con un singolo catch~, ma un oggetto throw~ non può rivolgersi a più di un catch~. E’ possibile resettare la destinazione di un throw~, se si vuole.

Send~ salva un segnale che può quindi essere ricevuto quanto volte si vuole; ma un receive~ può solo raccogliere un send~ alla volta (ma si può sempre switchare tra vari send~).

Evitare l’uso di throw~ e catch~ oppure di send~ e receive~ tra finestre con differenti ampiezze di blocco. Le uniche procedure di re-blocking che sono state testate sono inlet~ e outlet~.

Quando si invia un segnale ad un punto che è precedente nella lista ordinata degli oggetti tilde, il segnale non sarà disponibile fino al successivo ciclo di calcolo del DSP, un blocco più avanti; in tal modo il segnale risulterà ritardato di 1 blocco (1.45 msec. di default).

Delread~ e delwrite~ hanno questa medesima restrizione, ma qui il tempo di 1.45 msec. rappresenta il minimo ritardo conseguibile. Per algoritmi non ricorsivi (un semplice flanger per esempio) vale la pena di assicurarsi che delread~ sia disposto nell’ordine dopo il delwrite~. L’unico modo per esserne sicuri è creare delread~ dopo delwrite~; se le cose non funzionano conviene cancellare e ricreare l’oggetto delread~.

 

torna su

 

 

14. Scheduling (3)

 

Pd usa numeri a virgola mobile a 64 bit per rappresentare il tempo, procurando accuratezza nel campionamento e fondamentalmente senza mai incorrere nell’overflowing (4). Il tempo per l’utente è in millisecondi.

 

14.1. Audio e messaggi

 

Il processamento dell’audio e dei messaggi in PD è interlacciato. Il processamento dell’audio è schedulato ogni 64 campioni alla frequenza di campionamento di PD; a 44100 Hz si ottiene un periodo di 1.45 millisecondi. Si può attivare il DSP o spegnerlo inviando all’oggetto “pd” il messaggio, rispettivamente, di “dsp 1” e “dsp 0”.

 

torna su

 

 

15. Creazione di oggetti

 

 Il testo in un box ha differenti funzioni a seconda che sia un box messaggio, un box atomo (numero o simbolo) o un box oggetto:

• Nel caso dei messaggi il testo specifica il messaggio o i messaggi che esso invierà come uscita

• Nei box atomi il testo cambia in tempo reale per mostrare lo stato del box che può essere un numero o un simbolo

• In un box oggetto, come nei messaggi, il testo specifica un messaggio; ma qui esso viene passato a PD stesso e l’effetto è di creare l’oggetto in questione

Quando si apre un file, tutti gli oggetti stabiliti vengono creati usando il loro testo come “messaggi di creazione”. Se si digita un nuovo messaggio in un box oggetto (o lo si cambia), il vecchio oggetto viene distrutto e il messaggio è usato per crearne uno nuovo.

Il selettore di messaggio (la prima parola di un messaggio) è un selettore che PD interpreta per capire quale tipo di oggetto deve creare. Eventuali argomenti che il messaggio può avere sono usati per fornire dei parametri agli oggetti da creare.

Ad esempio in:

makenote 64 250

il selettore “makenote” determina la classe dell’oggetto da creare e gli argomenti 64 e 250 diventano la velocity iniziale e la durata.

 

torna su

 

 

16. Invio di messaggi

 

In PD i messaggi consistono di un selettore (un simbolo) e zero o più argomenti (che possono essere simboli o numeri). Per passare un messaggio ad un oggetto, PD prima controlla il selettore in relazione alla classe dell’oggetto.

Tutti i box messaggiappartengono ad una classe e tutti accettano i medesimi messaggi in arrivo e li dispensano in funzione del loro stato, ossia, del testo digitato nel box.

Analogamente avviene per i box atomi(numeri o simboli) tranne che per il fatto che il loro stato può cambiare (mostrando, cioè, numeri o simboli).

I box oggettiinvece possono avere differenti classi. La classe è determinata dal selettore del messaggio con cui vengono creati, ad es., il primo atomo del messaggio che di solito è un simbolo. Ogni classe dispone di un insieme fisso di messaggi che possono essere inviati. Per esempio, l’oggetto “float” o “f” prende “bang” o “float”. Questi messaggi sono inviati ad oggetti “float” (oggetti la cui classe è float) tramite l’ingresso più a sinistra, detto ingresso hot (caldo). L’ingresso di destra è un oggetto separato e ausiliario. Gli oggetti di classe “float” rispondo al messaggio “bang” mandando in uscita il loro valore corrente, ossia, mandando un messaggio “float” alla loro uscita. Essi rispondono ai messaggi “float” impostando il loro valore e quindi mettendolo in uscita.

Ogni altra classe (come “float”) in PD ha il suo proprio protocollo per rispondere ai messaggi che le vengono inviati e può ricevere sia messaggi “bang” che “float” o altri ancora, in aggiunta o alternativamente.

 

torna su

 

 

17. Ingressi ed uscite

 

Il punto di connessione più a sinistra, in alto all’oggetto, rappresenta l’oggetto stesso. Ogni altro rettangolino nero è un oggetto separato chiamato “ingresso” sebbene in PD vi siano 4 classi di ingressi separate. La classe dell’ingresso determina quale messaggio assumerà: simboli, numeri (float) o altro; l’ingresso inoltra il messaggio sia a se stesso che ad un qualche proxy, di solito uno che l’oggetto crea per l’occasione.

A meno che non dispongano diversamente definendo un metodo “di lista”, gli oggetti rispondono al messaggio “di lista” distribuendo gli argomenti del messaggio ai loro ingressi, tranne che per il primo argomento che è passato a se stesso come messaggio “float” o “simbolo”.

 

torna su

 

 

18. Segno del dollaro ($)

 

Nei box messaggio o oggetto, gli argomenti del messaggio che iniziano con un segno di dollaro e un numero (come “$1” o “$3-bazoo”) sono variabili che verranno sostituite con i valori che sono parte dell’ambiente in cui il messaggio è passato. Nel caso di box messaggi, l’ambiente consiste degli argomenti della lista (ad esempio da “bang”, “float” o altro) a cui il messaggio sta rispondendo. Così, se il messaggio ricevuto è “23 skidoo” e il box contiene il testo “$2 fino a $1”, vi sarà in uscita il messaggio “skidoo fino a 23”.

I box oggettocontengono testo che forma un messaggio da inviare a PD per creare e inizializzare l’oggetto. Qui, $1 ecc., sono presi dal contesto in cui la patch è stata caricata. Quando la patch è un documento nuovo, o aperto da un file, le variabili “$” sono indefinite. Ma se la patch è un’astrazione (vedi la sezione successiva) gli argomenti vengono presi dell’astrazione stessa. Costrutti come “$1-x” sono espansi dalla stringhe di concatenazione. Questo è il modo per costruire delle variabili locali. In particolare, $0 in un’astrazione è un contatore che è garantito essere l’unico per quella astrazione, in tal modo si possono usare, come coppie di oggetti send/receive locali, vari oggetti send e receive con un nome come “$0-bear”.

Si noti che il meccanismo di sostituzione delle variabili, come $0 e $1, funziona soltanto se il segno del dollaro si trova all’inizio del simbolo; ad esempio, “rats-$1” non funzionerà. Occasionalmente si potrà volere una doppia o tripla sostituzione; ciò si può ottenere un passo alla volta tramite l’annidamento delle astrazioni (ogni subpatch aggiunge la sua propria variabile $ all’inizio di un simbolo per poi passarlo come argomento alla successiva astrazione).

Per esempio, se si vuole ottenere cane-cibo, cane-orecchie, gatto-cibo, si prenda un’astrazione “a1” che invochi due volte un’astrazione “a2”, come “a2 $1-cibo” e “a2 $1-orecchie”, quindi in una terza patch si chiami a1 due volte, come “a1 gatto” e “a1 cane”. Dentro le quattro copie di “a2”, $1 valuterà “cane-cibo”, “gatto-cibo”, “cane-orecchie” e “gattoorecchie”.

 

torna su

 

 

19. Subpatches

 

PD offre due meccanismi per creare subpatches, chiamate

• “subpatch on-off”

• ”astrazioni”

In entrambi i casi, la subpatch appare come un box oggetto in una patch. Se si digita “pd” o “pd-mio-nome” in un box oggetto, si crea una subpatch one-off. Per esempio, in questo frammento:

il box nel mezzo, se cliccato, apre la sub-patch, come si vede qui sotto:

I contenuti della sub-patch sono salvati come parti della patch madre, in un file. Se si fanno parecchie copie di una subpatch si possono poi cambiare singolarmente.

Gli oggetti, "inlet,", "inlet~," "outlet," e "outlet~”, messi in una sub-patch, creano ingressi ed uscite per il box oggetto che contiene la subpatch. Ciò vale sia per le subpatch on-off che per le astrazioni. Le versioni inlet~ e outlet~ creano ingressi e uscite per i segnali audio.

Negli ingressi e uscite di una subpatch non si possono mescolare segnali di messaggi e di audio; o gli uni o gli altri. Gli ingressi e le uscite appaiono sul box chiamante nel medesimo ordine sinistro/destra come risultano nella subpatch.

 

torna su

 

 

20. Astrazioni

 

Per fare un’astrazione, si salvi la patch con un nome come “astrazione1.pd” e quindi chiamarla con “astrazione1” in un box oggetto:

Qui stiamo chiamando un file separato, “abstraction1.pd” che contiene la patch mostrata qui sotto (il bordo è analogo alla subpatch sopra):

Si possono creare molte istanze di “abstraction1” o chiamare da differenti patches; se si modifica il contenuto di "abstraction1" ciò avrà effetto su tutte le chiamate che se ne faranno da quando è stata creata. Per fare un’analogia con il linguaggio C diremo che le subpatches one-offsono come blocchi di codici delimitati da graffe, mentre le astrazioni sono delle subroutines.

Le astrazioni sono istanziate digitando il nome di una patch (senza l’estensione “.pd”) in un box oggetto. Si possono aggiungere anche degli argomenti; ad esempio, se si ha un file "my-abstraction.pd", si può digitare "my-abstraction 5" per impostare la variabile $1 a 5. Ciò è definito solo per i box oggetto (non per i messaggi) nell’astrazione. (Per i box messaggio, “$1”, ecc., ha un significato differente, come descritto sopra). Se si vuole mandare un messaggio con un $1 come argomento di un’astrazione, occorre generarlo con un box oggetto come "float $1", "symbol $1" o, anche, "pack $1 $2" che possono essere inviati ad un box messaggio.

La proprietà corrispondente in MAX (da Opcode e Ircam) è il costrutto “#1”. In un’astrazione MAX, “#1”, ecc., sono rimpiazzati dagli argomenti. Ciò ha però lo svantaggio che non si può editare l’astrazione così come è istanziata nella patch perché le variabili “#” sono sostituite. In PD le variabili “$” contenute nei box oggetto sono valutate in modo letterale come variabili “$” così che è possibile editarle all’interno della loro patch chiamante. Per altri versi, in PD c’è lo svantaggio che è fonte di confusione avere un “$” valutato in tempi differenti in un box oggetto piuttosto che in un box messaggio. Nel primo caso l’argomento “$” è sostituito nel momento della creazione, in un box messaggio, invece, nel momento del messaggio.

 

torna su

 

 

21. Le subpatches Graph-on-parent (a vista)

 

Aprendo il dialogo “proprietà” in una subpatch o in un’astrazione, si può fare in modo che il box “graph-on-parent” mostri i controlli della subpatch (astrazione) sulla patch madre.

Ad esempio, qui vediamo la chiamata di “abstraction2”:

dove la patch "abstraction2.pd" contiene:

Qui il box numerico nell’astrazione è visibile sul box che ha chiamato l’astrazione. Il flag "graph on parent" è impostato nell’astrazione stessa (e salvato come parte dell’astrazione). Per impostarlo, aprire il dialogo “proprietà” dell’astrazione “abstraction2” cliccando col pulsante destro in un qualsiasi spazio bianco della patch. Per aprire la subpatch, cliccare col pulsante destro sull’oggetto e selezionare “open”. (Su Macintosh, dove non c’è il secondo bottone, si può fare un doppio click in modalità edit). Il click sull’oggetto non funziona se si è in modo run poiché in tal caso i clicks sono trasmessi ai controlli visibili o alle tabelle. Quando la sub-patch è chiusa, tutti i controlli che contiene appaiono sull’oggetto; così che il box numerico nella subpatch dell’esempio sopra è lo stesso che si vede nel box. Con questo procedimento sono resi visibili solo i controlli.

 

torna su

 

 

22. Array numerici

 

Array lineari di numeri ricorrono spesso nella borsa degli attrezzi del musicista informatico, a cominciare dall’oscillatore wavetable. L’oscillatore wavetable è stato ultimamente ricreato come campionatore. Inoltre, la lettura di tabelle è usata per la distorsione non lineare di segnali audio. Per quanto attiene ai controlli, array di numeri possono specificare mappature di controllo, densità di probabilità, dati di voci e molto altro ancora.

In PD occorrerebbe allocare memoria per gli Array (e possibilmente letti da un file) prima di iniziare a produrre suono, poiché la memoria di allocazione e le operazioni su disco possono richiedere tempi tali da causare l’overrun o l’underun del buffer audio (5). PD ha 2 modi per definire nuovi array, graphe table. In entrambi i casi l’array ha nome e ampiezza predefiniti (per es. il numero di punti). Gli elementi dell’array sono memorizzati come numeri a virgola mobile di 4 byte ciascuno.

Usando un array per memorizzare un suono di 1 secondo a 44.1 kHz occorrono 178 kilobyte, per 1 minuto di suono occorrono 10.6 megabytes. Per memorizzare un suono con 2 o più canali, usare un array separato per ogni canale. Gli array sono utili anche per trasferire funzioni, per esempio per la distorsione non lineare di un segnale audio o per mappare un controllo relativamente ad un parametro di sintesi. In situazioni come questa normalmente si usano array più piccoli, di non più che poche centinaia di elementi. Essi sono utili anche per memorizzare spettri misurati derivanti da oggetti fft~ e sicuramente per molti altri usi.

Gli array di solito si trovano in subpatches create proprio per loro, sia nella forma di “graph on parent” sia come subpatch regolari (che si vedono come box di testo).

Nella forma “graph on parent”, un array appare così:

Gli array sono indicizzati da 0 a N-1, dove N è il numero dei punti nell’array. Si può leggere un valore di un array usando l’oggetto tabread:

Qui si vede che il terzo punto dell’array (indice 2, partendo da 0) ha il valore 0.4. Per scrivere in un array si può usare l’oggetto tabwrite:

In questo esempio, inviando il messaggio si imposta il terzo elemento a 0.5. (Si possono anche mandare i 2 numeri ai due ingressi separatamente).

I due esempi precedenti hanno mostrato operazioni di controllo per leggere e scrivere da e verso arrays. Analogamente può avvenire per segnali audio. Per esempio, la patch qui sotto crea un suono di 440 Hz usando, come forma d’onda, un array di nome “array1”:

Nell’esempio l’oggetto phasor~ manda in uscita un’onda a dente di sega che si ripete 440 volte al secondo, entro un range da 0 ad 1. Gli oggetti “moltiplicazione” e “somma” aggiustano il range da 1 ad 11, quindi tali valori sono usati come indice per tabread4~ che è un modulo di lettura di tabella a 4 punti di interpolazione. (Maggiori dettagli sono disponibili nelle patch di esempi audio nella documentazione di PD).

Per creare un nuovo array, selezionare “array” dal menu “put”. Apparirà una finestra di dialogo per impostare le proprietà iniziali. Di default viene creato un nuovo grafico tuttavia la tabella può anche essere ospitata nel grafico creato più di recente. Nella medesima finestra si possono specificare altre proprietà che possono poi essere cambiate in un secondo tempo con il dialogo “proprietà” (su PC tramite pulsante destro del mouse sopra l’oggetto).

Selezionando “proprietà” relativamente ad un array in un grafico vengono visualizzati due dialoghi, uno per l’array e uno per il grafico.

Il dialogo dell’arrayè come questo:

Si può usare questa finestra per cambiare il nome e la dimensione dell’array oltre ad un’altra proprietà che è “save contents”. Se “save contents” è selezionata, i valori dell’array sono memorizzati con la patch madre; altrimenti verranno inizializzati a 0 ogni volta che la patch sarà caricata. Se si desidera usare l’array per memorizzare suoni, probabilmente non si vorrà memorizzarli nella patch, ma in un file audio separato. Ciò, oltre ad essere più efficiente, può consentire di importare il file in un editor di suoni per eventuali modifiche al di fuori di PD.

Selezionando “delete me” e quindi “OK”, l’array verrà distrutto. Si tratta di un sistema un po’ bizzarro per cancellare un oggetto, ed è fornito perchè PD non dispone di un meccanismo per selezionare gli array (come potrebbe essere “cut”).

Il dialogo graphè mostrato qui in basso:

I confini della X hanno inizialmente un ambito da 0 al numero dei punti della tabella meno 1 (si tratta di un’ottima scelta per gli array, per quanto grafici che ospitano altre specie di oggetti potrebbero richiedere altri limiti di X).

Le Y dovrebbero invece riflettere il range naturale della tabella, così che i suoni memorizzati dovrebbero andare da -1 a +1, ma i valori di frequenza potrebbero variare da 0 a 20.000.

Infine, si può impostare la dimensione di visualizzazione del grafico, ampiezza ed altezza, espressa in pixel.

Vi sono molti altri operatori per gli array; si vedano le patches relative nel tutorial per ulteriori possibilità (in 2.control/15.array.pd).

 

torna su

 

 

 

1. GUI sta per Graphic User Iterface a allude ad un’interfaccia non testuale, basata su icone grafiche.

2. In un computer la rappresentazione a virgola fissasignifica che viene stabilita a priori una quantità di bit per la parte intera e una per quella frazionaria. Ciò può creare però dei problemi nel senso che vi è un uso non efficiente di bit per numeri o molto grandi o molto piccoli a causa della presenza di molti zeri. Nella rappresentazione a virgola mobile, invece, si ottimizzano le risorse: con numeri molto grandi si usano più bit per la parte intera, per quelli molto piccoli si usano più bit per la parte frazionaria.

3. Lo Scheduling è il procedimento che assegna alla CPU un certo particolare quanto di tempo per ciascun processo.

4. Errore in cui si incorre quando è richiesto un numero superiore al massimo numero rappresentabile.

5. L’overrun o l’underun si verificano quando un buffer, rispettivamente, riceve più dati di quanti possa contenerne o, invece, si aspetta dati che non arrivano. In entrambi i casi vi è un errore. Nel primo caso il sistema si blocca oppure alcuni dati vengono sovrascritti, nel secondo caso il dispositivo si interrompe in quanto il buffer si è svuotato.

 

torna su