InventareIlSuono043(Bianchi 2013)

download InventareIlSuono043(Bianchi 2013)

of 245

description

ew

Transcript of InventareIlSuono043(Bianchi 2013)

  • Inventare il suono conPURE DATA

    Manuale introduttivo di musica elettronicavers. 0.4.3

    Francesco [email protected]

    2013

  • a Mina,per il suo amore e il suo sostegno

  • NOTA SUL COPYRIGHT

    Questo documento e il suo contenuto sono rilasciati sotto licenza CreativeCommons 2.5 di tipo Attribuzione-Non commerciale-Condividi allo stessomodo 2.5 Generico.

    Sei quindi libero:

    di riprodurre, distribuire, comunicare al pubblico, esporre in pub-blico, rappresentare, eseguire e recitare questopera

    di modificare questoperaalle seguenti condizioni:

    Attribuzione. Devi attribuire la paternit dellopera nei modi indi-cati dallautore o da chi ti ha dato lopera in licenza e in modo taleda 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 conuna licenza identica o equivalente a questa.

    2

  • CONTENTSIntroduzione 9

    i lambiente 101 fondamenti 11

    1.1 Cos Pure Data? . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2 Pd-extended . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.3 Installazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    1.3.1 GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . 121.3.2 Windows e Mac Os X . . . . . . . . . . . . . . . . . . . 13

    2 panoramica dellambiente 142.1 Pd window e patch window . . . . . . . . . . . . . . . . . . . . . 14

    2.1.1 il motore DSP . . . . . . . . . . . . . . . . . . . . . . . . 152.1.2 print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    2.2 Le scatole di Pd . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.2.1 oggetti e connessioni . . . . . . . . . . . . . . . . . . . . 162.2.2 messaggi e liste . . . . . . . . . . . . . . . . . . . . . . . 18

    bang e number box . . . . . . . . . . . . . . . . . . . . . . 193 basi di programmazione con pure data 21

    3.1 Variabili e costanti . . . . . . . . . . . . . . . . . . . . . . . . . 213.1.1 pack e unpack . . . . . . . . . . . . . . . . . . . . . . . . . 23

    3.2 Gestione del tempo . . . . . . . . . . . . . . . . . . . . . . . . . 243.2.1 metro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    un contatore . . . . . . . . . . . . . . . . . . . . . . . . . 263.2.2 line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.2.3 delay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.2.4 line multirampa con delay . . . . . . . . . . . . . . . . . 29

    3.3 Aritmetica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.3.1 operatori aritmetici . . . . . . . . . . . . . . . . . . . . . 293.3.2 expr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    3.4 Generatori di numeri casuali . . . . . . . . . . . . . . . . . . . 323.5 Connessioni senza cavi . . . . . . . . . . . . . . . . . . . . . . . 343.6 Subpatches e Abstractions . . . . . . . . . . . . . . . . . . . . . . 34

    3.6.1 subpatch . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.6.2 abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    3

  • 3.6.3 graph on parent . . . . . . . . . . . . . . . . . . . . . . . 394 vettori, grafici e tabelle 41

    4.1 Vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.1.1 leggere un vettore . . . . . . . . . . . . . . . . . . . . . 464.1.2 loggetto table . . . . . . . . . . . . . . . . . . . . . . . . 46

    5 programmazione avanzata 485.1 Istruzioni condizionali . . . . . . . . . . . . . . . . . . . . . . . 48

    5.1.1 operatori relazionali . . . . . . . . . . . . . . . . . . . . 485.1.2 select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.1.3 operatori logici . . . . . . . . . . . . . . . . . . . . . . . 515.1.4 If . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    5.2 loops e iterazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 il midi 58

    6.1 Panoramica sul protocollo MIDI . . . . . . . . . . . . . . . . . 586.1.1 anatomia di un messaggio MIDI . . . . . . . . . . . . . 59

    6.2 Pd e il MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606.2.1 midiin e midianalyze . . . . . . . . . . . . . . . . . . . . 616.2.2 altri oggetti MIDI . . . . . . . . . . . . . . . . . . . . . . 63

    6.3 Un esempio di editing algoritmico MIDI . . . . . . . . . . . . 647 oggetti gui 71

    7.1 Altre GUI dalle librerie di Pd . . . . . . . . . . . . . . . . . . . 75

    ii audio 768 laudio digitale 77

    8.1 Loscillatore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778.1.1 frequenza e ampiezza del segnale . . . . . . . . . . . . 798.1.2 osc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818.1.3 tabwrite . . . . . . . . . . . . . . . . . . . . . . . . . . 848.1.4 la rappresentazione del suono . . . . . . . . . . . . . . 84

    8.2 Le forme donda . . . . . . . . . . . . . . . . . . . . . . . . . . . 878.2.1 tabosc4 . . . . . . . . . . . . . . . . . . . . . . . . . . 878.2.2 onda quadra . . . . . . . . . . . . . . . . . . . . . . . . . 88

    pulse width modulation (PWM) . . . . . . . . . . . . . 908.2.3 onda a dente di sega . . . . . . . . . . . . . . . . . . . . 92

    phasor . . . . . . . . . . . . . . . . . . . . . . . . . . . 938.2.4 onda triangolare . . . . . . . . . . . . . . . . . . . . . . 94

    9 il panning 999.1 loggetto dac . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

    4

  • 9.2 Controllo del panning . . . . . . . . . . . . . . . . . . . . . . . . 1009.2.1 Segnali bipolari e unipolari . . . . . . . . . . . . . . . . 1029.2.2 il DC offset . . . . . . . . . . . . . . . . . . . . . . . . . 102

    10 sintesi additiva e sintesi vettoriale 10610.1 Sintesi additiva . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

    10.1.1 sintesi additiva a spettro armonico . . . . . . . . . . . . 10610.1.2 sintesi additiva a spettro non armonico . . . . . . . . . 106

    10.2 Sintesi vettoriale . . . . . . . . . . . . . . . . . . . . . . . . . . . 10710.2.1 dissolvenza incrociata fra due tabelle . . . . . . . . . . 10910.2.2 dissolvenza incrociata fra quattro tabelle . . . . . . . . 110

    11 sintesi sottrattiva 11411.1 La sintesi sottrattiva . . . . . . . . . . . . . . . . . . . . . . . . 114

    11.1.1 il rumore . . . . . . . . . . . . . . . . . . . . . . . . . . . 11411.2 I filtri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11611.3 I parametri dei filtri . . . . . . . . . . . . . . . . . . . . . . . . . 12111.4 I filtri in pd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12411.5 Il filtro vcf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12511.6 Un sequencer con vcf e samphold . . . . . . . . . . . . . . . 126

    12 moulazione ad anello (rm), tremolo, modulazione dampiezza(am) 12812.1 La modulazione ad anello . . . . . . . . . . . . . . . . . . . . . 12812.2 Segnali bipolari e unipolari . . . . . . . . . . . . . . . . . . . . 13012.3 Segnale di controllo dellampiezza: il tremolo . . . . . . . . . 13112.4 La modulazione dampiezza . . . . . . . . . . . . . . . . . . . . 135

    12.4.1 lindice di modulazione . . . . . . . . . . . . . . . . . . 13713 vibrato e modulazione di frequenza (fm) 142

    13.1 Segnale di controllo della frequenza: il vibrato . . . . . . . . . 14213.2 Modulazione di frequenza . . . . . . . . . . . . . . . . . . . . . 143

    13.2.1 linviluppo . . . . . . . . . . . . . . . . . . . . . . . . . . 14513.2.2 FM a spettro variabile . . . . . . . . . . . . . . . . . . . 148

    13.3 Portanti multiple . . . . . . . . . . . . . . . . . . . . . . . . . . 15013.4 Modulanti multiple . . . . . . . . . . . . . . . . . . . . . . . . . 152

    14 introduzione alla sintesi granulare 15714.1 Teoria della sintesi granulare . . . . . . . . . . . . . . . . . . . 157

    14.1.1 dipendenza vs. indipendenza dei parametri . . . . . . 15714.1.2 overlapping . . . . . . . . . . . . . . . . . . . . . . . . . 15914.1.3 parametri e spettri risultanti . . . . . . . . . . . . . . . 16214.1.4 Il dominio del tempo e la sintesi granulare . . . . . . . 164

    5

  • 14.2 Implementazione in pd . . . . . . . . . . . . . . . . . . . . . . . 16614.3 Un esempio di Trainlet Synthesis . . . . . . . . . . . . . . . . . . 16614.4 La Pulsar Synthesis . . . . . . . . . . . . . . . . . . . . . . . . . 16714.5 Asyncronous Granular Synthesis . . . . . . . . . . . . . . . . . . 170

    14.5.1 vline . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17514.5.2 rendere indipendente il parametro gdur . . . . . . . . . 176

    14.6 Granulazione con suoni campionati . . . . . . . . . . . . . . . 18215 lavorare con sorgenti audio esterne 185

    15.1 Sintesi vs. campioni . . . . . . . . . . . . . . . . . . . . . . . . . 18515.2 Alcuni oggetti utili . . . . . . . . . . . . . . . . . . . . . . . . . 18515.3 Un semplice random slicer . . . . . . . . . . . . . . . . . . . . . 187

    15.3.1 controllare lo slicer via segnale . . . . . . . . . . . . . . 19115.4 Granulazione su files audio . . . . . . . . . . . . . . . . . . . . 195

    iii applicazioni varie 20216 estendibilit di pd 203

    16.1 pd come linguaggio di programmazione . . . . . . . . . . . . 20316.1.1 externals e librerie . . . . . . . . . . . . . . . . . . . . . . 20316.1.2 alcune librerie . . . . . . . . . . . . . . . . . . . . . . . . 204

    17 gem e il video 20517.1 la libreria GEM . . . . . . . . . . . . . . . . . . . . . . . . . . . 20517.2 interazione audio e GEM . . . . . . . . . . . . . . . . . . . . . . 208

    18 networking 21318.1 Architettura di rete in Pd . . . . . . . . . . . . . . . . . . . . . 213

    18.1.1 netsend e netreceive . . . . . . . . . . . . . . . . . . . . . 21418.1.2 Dynamic patching . . . . . . . . . . . . . . . . . . . . . . 21718.1.3 pdsend . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

    18.2 il protocollo OSC . . . . . . . . . . . . . . . . . . . . . . . . . . 22318.3 Laudio in streaming . . . . . . . . . . . . . . . . . . . . . . . . . 225

    19 applicazioni sparse 23319.1 Laptop Orchestra . . . . . . . . . . . . . . . . . . . . . . . . . 23319.2 Il Live Coding . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23719.3 Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

    Conclusione 239Bibliografia 241Sitografia 242Indice analitico 243

    6

  • INTRODUZ IONELa diffusione massiccia che i moderni calcolatori hanno avuto negli ultimi30 anni ha prodotto unonda durto dirompente nel mondo della musicaelettronica che fino agli anni 70 era appannaggio di quei pochi fortunatiche potevano accedere ai rari centri europei e americani che disponevanodelle apparecchiature per realizzarla. In pochi anni, a partire dallavventodei primi home computers si sono moltiplicati a dismisura i software di ma-nipolazione dellaudio e oggi chiunque pu trovare in rete o in commer-cio programmi per produrre il proprio brano o il proprio disco di musicaelettronica, spesso senza il bisogno di conoscere a fondo i principi, il fun-zionamento e le tecniche che stanno alla base dellaudio digitale. Con unsemplice click possibile proiettarsi nel mondo dei suoni pi strani senzadover necessariamente conoscere una tecnica di sintesi o, quantomeno, unoscillatore.

    Stando cos le cose, qualcuno a questo punto potrebbe chiedersi, leggitti-mamente, perch dovrebbe leggere un manuale di musica elettronica. Ilpanorama del software talmente vasto che chiunque pu trovare il pro-gramma adatto alle sue esigenze, in linea con le proprie conoscenze infor-matiche e musicali. Eppure ci sono varie ragioni perch si potrebbe leggereun manuale del genere e imparare almeno le basi della programmazione edella sintesi dellaudio. Proviamo ad elencarne qualcuna:

    - Studiare la musica elettronica aiuta a capire meglio quello che si facon i programmi, soprattutto aiuta a capire quali sono i limiti deiprogrammi stessi. Ad esempio i sintetizzatori software attualmentein commercio sono per lo pi monofunzionali, cio svolgono un com-pito e solo quello. Naturalmente in molti casi lo svolgono benissimo,ma non sanno fare altro. Ci sono sintetizzatori per la Modulazionedi Frequenza, sintetizzatori per la Sintesi Granulare o Additiva. Se sivuole possedere un sintetizzatore per una di queste tecniche bisognaacquistarlo o bisogna accontentarsi di prodotti che non danno ottimirisultati.

    7

  • - Questi programmi costano molto, soprattutto i migliori. Se si vo-lessero avere dei sintetizzatori per realizzare 3 o 4 tecniche di sintesidel suono si dovrebbero acquistare 3 o 4 prodotti commerciali di-versi, questo a scapito del portafogli e del fatto che probabilmente fraqualche anno saranno obsoleti e diverranno quindi praticamente inu-tili. E molto meglio studiare le tecniche di sintesi e il funzionamentodellaudio digitale per avere lopportunit di utilizzare programmiforse pi complessi, ma che danno lopportunit di costruirsi da solii propri suoni.

    - Inventare i propri suoni non una cosa da poco. I software commer-ciali sono corredati sempre da moltissimi suoni preconfezionati, dettipreset, molto utili, ma che affievoliscono inevitabilmente il desideriodi cercarne di nuovi. Si inizia ad accontentarsi di quello che offre ilconvento, che spesso gradevole e non richiede dispendio eccessivodi energie. Ma quei suoni saranno sempre dei preset fatti da qualcunaltro, non apparterranno mai completamente a chi li usa. Quindi stu-diare e praticare la musica elettronica un modo per appropriarsidel 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 voltaapprese le tecniche di sintesi si possono scegliere programmi a costozero, cio freeware, come Pure Data, oggetto di questo manuale. Scegliereun programma gratuito implica molte cose, alcune meno scontate diquanto si pensi:

    Non solo una scelta di risparmio, ma una rivendicazione etica.Sintetizzare il suono attraverso un software digitale implica laprogettazione e la realizzazione di algoritmi pi o meno com-plessi. Gli algoritmi non sono altro che rappresentazioni delpensiero, e il pensiero non si paga, nessun prezzo.

    Usare un software libero significa condividerne una filosofiabasata sulla condivisione dei saperi. I programmi liberi sonotali in tutto e per tutto nella maggior parte dei casi. Si pu prel-evare il sorgente, studiarlo, modificarlo e redistribuirlo. Non acaso intorno a questi software ci sono delle vere e proprie comu-nit che si scambiano opinioni, idee e progetti, condividendoliberamente il proprio pensiero con altri.

    8

  • Il software libero soggetto a mutamento continuo, a un divenirecostante che lo pone nella condizione di migliorare molto pivelocemente del software commerciale e di non invecchiare mai.

    Studiate quindi la musica elettronica e praticatela, possibilmente con soft-ware libero.

    Buon divertimento!

    9

  • Part I

    LAMB IENTE

  • 1 FONDAMENT I1.1 COS PURE DATA?

    Traducendo dal sito ufficiale, apprendiamo che Pure Data un ambiente diprogrammazione grafica in tempo reale per processare audio e video1. Cer-chiamo di entrare nel dettaglio di questa descrizione. Pure Data primadi tutto un linguaggio di programmazione perch consente di realizzare al-goritmi pi o meno complessi come tutti gli altri linguaggi2. Linterfacciacon cui il musicista-programmatore parla con Pd grafica, quindi non cla necessit di scrivere il codice in un editor di testo, ma si realizzano dellepatch combinando fra loro vari tipi di oggetti grafici. Nel gergo dei sinte-tizzatori analogici una patch rappresentava linsieme dei collegamenti fra isuoi moduli. Pd mutua questo concetto: attraverso una patch si definiscegraficamente lordine con cui i vari oggetti sono collegati fra loro. Gli al-goritmi vengono creati selezionando una serie di entit grafiche allinternodi una finestra, detta patch window.

    Pd funziona in tempo reale, quindi gli algoritmi sono interattivi e i parametripossono essere modificati durante lesecuzione. E anche possibile cam-biare la struttura stessa di tali algoritmi mentre sono attivi, aggiungendo orimuovendo moduli in modo semplice e intuitivo.

    Pd nasce con la funzione di creare applicazioni audio e, da qualche tempo,video. Una foltissima comunit di sviluppatori, musicisti, hackers e appas-sionati sforna ogni giorno nuove applicazioni e librerie che potenziano eaumentano le funzionalit di questo ambiente versatile e libero. Si, perchPure Data un software libero, e i suoi sorgenti possono essere scaricati,

    1 http://puredata.info/2 Un algoritmo si pu definire come un procedimento che consente di ottenere un risultato

    atteso eseguendo, in un determinato ordine, un insieme di passi semplici corrispondenti adazioni scelte solitamente da un insieme finito http://it.wikipedia.org/wiki/Algoritmo

    11

  • studiati, modificati e redistribuiti da chiunque. Inoltre Pure Data mul-tipiattaforma, quindi gira sui sistemi operativi pi comuni: GNU/Linux,Microsoft Windows, Apple Mac OS X, FreeBSD.

    Pd stato scritto nel 1996 da Miller Puckette, lo stesso che a met deglianni 80 aveva sviluppato Max, in seguito divenuto un software commer-ciale3. Pd riprende le idee e i concetti di questultimo, pur basandosi suuna filosofia pi libera e aperta che ne fa un sistema pi dinamico e dalleprospettive future pi interessanti.

    1.2 PD-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 quellodi scaricare la versione extended, che contiene non solo il programma stan-dard, ma anche numerose librerie aggiuntive che estendono notevolmentele sue funzionalit. Attualmente Pd-extended alla versione 0.41.45.

    1.3 INSTALLAZIONE

    1.3.1 GNU/LINUX

    Prendiamo in esame solo linstallazione su Ubuntu GNU/Linux, sistemaoperativo sul quale stato scritto in gran parte il presente manuale e alquale ci riferiamo citando le combinazioni di comandi da tastiera su Pd.Come gi scritto in precedenza, il consiglio quello di scaricare e installarelultima versione di Pd-extended. Per fare questo sufficiente aggiungerela seguente riga al file /etc/apt/sources.list:

    deb http://apt.puredata.info/releases hardy main

    nel caso si stia operando in una distribuzione Ubuntu Hardy, in caso di-verso sostituire la dicitura hardy con il mome della distribuzione di Ubuntuinstallata.

    3 Miller Puckett: http://crca.ucsd.edu/~msp/ Max-Msp: http://cycling74.com/products/maxmspjitter/

    4 http://crca.ucsd.edu/~msp/software.html5 http://puredata.info/downloads

    12

  • Successivamente si pu eseguire linstallazione dal package manager diUbuntu, Synaptic. Aprirlo, aggiornare larchivio dei pacchetti, cercare Pd-extended e dopo averlo marcato far partire il processo di installazione, allafine del quale Pd potr essere richiamato da un terminale digitando sem-plicemente:

    pd

    Oppure dal men Applicazioni/Audio e Video/Pd-extended

    1.3.2 WINDOWS E MAC OS X

    Dopo aver scaricato la versione di Pd-extended per Windows o per Mac OSX, eseguire il file scaricato e seguire le semplici istruzioni di installazione.

    13

  • 2 PANORAM ICA DELLAMB IENTE2.1 PD window E patch window

    Allapertura di Pd compare la finestra principale del programma (Pd win-dow) che ha due funzioni principali:

    - mostrare dei messaggi

    - consentire la configurazione dellaudio e del MIDI e definire i per-corsi in cui Pd cerca le librerie da caricare

    Alcuni messaggi vengono visualizzati in fase di avvio del programma,riguardano le librerie esterne caricate e gli eventuali errori nella configu-razione dellaudio o del MIDI. Altri messaggi possono essere mostrati nellaPd window durante la normale esecuzione del programmano e il pi dellevolte riguardano errori di procedura o comunicazioni prodotte dallutentetramite loggetto print che sar esaminato successivamente (vedi 2.1.2).

    La configurazione dellaudio avviene tramite la voce di men Media checonsente di impostare il MIDI (MIDI settings), laudio (Audio settings), diavviare il motore DSP (Audio on/off) e di testarne il funzionamento (testAudio and MIDI).

    La voce di men File permette di aprire, chiudere, salvare le patch e diconfigurare il percorso che Pd compie per trovare le librerie esterne (Path)e quali di esse caricare allavvio (Startup)1.

    Nella versione extended il Path e lo Startup sono gi impostati per caricarela maggior parte delle librerie necessarie per una completa funzionalit

    1 Esistono numerose librerie, generalmente scritte in C o in Pd stesso, molte delle quali sonogi incluse nel pacchetto Pd-extended, altre scaricabili dal sito ufficiale o da altri siti (vedisitografia)

    14

  • dellambiente.

    Generalmente allapertura del programma ci si trova di fronte soltanto laPd window. Per iniziare a scrivere gli algoritmi necessario aprire unafinestra di patch dal men File/new. Compare cos la patch window che lambiente di programmazione vero e proprio. Il suo men molto sim-ile a quello della Pd window ma ovviamente pi orientato allediting dellepatch.

    La patch window pu trovarsi in due stati funzionali diversi: edit mode erun mode. Il primo permette di inserire tutti gli elementi allinterno dellafinestra, mentre il secondo necessario per gestire la patch quando questa in azione. Tutti gli oggetti interattivi cio quelli che contengono parametrimodificabili via mouse o tastiera, funzionano soltanto in run mode, mentrein edit mode possono solo essere aggiunti o rimossi. Per passare da unostato allaltro si usa la combinazione di tasti ctrl-E.

    2.1.1 IL MOTORE DSP

    Quando gli algoritmi di Pd processano esclusivamente dati, il programma completamente attivo sin dalla sua apertura. Nel caso in cui invece sidevono processare segnali audio, necessario attivare il motore DSP perascoltare il risultato delle operazioni sui segnali. Il motore DSP, acronimodi Digital Signal Processor, si occupa di elaborare il segnale in tempi ra-pidissimi e di permettere la sua trasformazione da digitale ad analogico eviceversa.Nel momento in cui il coder vuole suonare una patch deve quindi attivareil motore DSP, mediante lapposita voce di menu Media/audio on. Inalternativa pu premere la combinazione di tasti ctrl-/. Vedremo suc-cessivamente le altre possibilit di intervenire sullattivazione e la disatti-vazione del motore DSP, quando si tratter dellaudio nella seconda partedel presente manuale.

    2.1.2 print

    Durante lesecuzione delle patch pu accadere che vengano automatica-mente visualizzati dei messaggi nella Pd window, in particolare alla pre-senza di errori, ma c un oggetto che permette al programmatore di visu-alizzare nella Pd window il messaggio o dato che desidera. Si tratta di print,

    15

  • che pu solo ricevere dati o messaggi e stamparli a video nella Pd window.In alcune circostanze utile per verificare il corretto funzionamento deglialgoritmi.

    Hello World!

    print

    Figure 1: un click del mouse sul messaggio produce un output nella Pd window

    2.2 LE scatole DI PD

    La finestra di patch il luogo che permette la realizzazione degli algoritmidi Pd. Essendo un ambiente grafico la finestra si riempir di entit di varianatura, dette scatole (box). Queste scatole sono di quattro tipi: oggetti, mes-saggi, GUI e commenti e si creano dal men Put oppure premendo ctrl+ndove n 1 per gli oggetti, 2 per i messaggi, 5 per i commenti. I numeri3 e 4 creano delle GUI particolari, simboli e number box che esamineremosuccessivamente.

    2.2.1 OGGETTI E CONNESSIONI

    Gli elementi fondamentali della programmazione in Pure Data sono gli le object boxoggetti, rappresentati dalle object box, caratterizzate dalla forma rettango-lare e dalla presenza di entrate (inlets), nella parte superiore, e di uscite(outlets), nella parte inferiore.

    Un oggetto pu creare o processare dati oppure segnale audio e riceveattraverso gli inlets messaggi, liste o uscite di altri oggetti. Pu inviare datio segnali ad altri oggetti. Allinterno dellobject box si situano gli atomi, ciostringhe di caratteri o simboli separati da spazi che rappresentano il tipodi oggetto e gli eventuali argomenti delloggetto stesso2.

    2 il concetto di atomo mutuato dal Lisp, un linguaggio di programmazione orientatoallelaborazione di espressioni simboliche rappresentate sotto forma di liste e atomi. Una listasi ha in presenza di pi espressioni Lisp, un atomo invece una lista con una sola espres-sione. Per approfondire: www.diee.unica.it/~roli/IA/Materiale%20didattico/AA0910/Lisp.pdf

    16

  • random 250

    Figure 2: un esempio di object box: loggetto metro con un argomentoI collegamenti fra oggetti, anzi fra tutte le object box avvengono tramitecavi di connessione che si realizzano tenendo premuto il tasto sinistro delmouse a partire dalloutlet mittente e rilasciandolo non appena si rag-giunto linlet di arrivo.

    +

    random

    select 0 5 7

    Figure 3: collegamenti fra object boxLinlet di sinistra di ogni oggetto detto caldo poich alla ricezione di unmessaggio, di un dato o di un segnale, produce immediatamente unuscitadalloggetto stesso. Tutti gli altri inlets sono freddi, quindi nel momentoin cui ricevono un dato, messaggio o segnale, lo inseriscono temporanea-mente allinterno delloggetto, fino a che lo stesso non viene processatoallattivazione dellinlet caldo.

    pack 0 0

    counter

    Figure 4: lentrata fredda riceve un dato dalloggetto counter, ma pack non producealcun dato in uscita finch linlet caldo non ricever qualcosa

    17

  • Come gi detto, gli oggetti insistono su dati o segnali audio. Graficamentegli oggetti-audio si distinguono da quelli per i dati perch il primo atomo(ovvero il nome) termina sempre con il segno della tilde () e gli inlet eoutlet che processano segnale sono scuri. I cavi che trasportano segnalesono pi spessi di quelli che trasportano dati.

    random 1000

    osc~

    dac~

    Figure 5: confronto visivo fra oggetti-dato e oggetti-audio

    2.2.2 MESSAGGI E LISTE

    Le message box hanno forma rettangolare con il lato destro rientrante. Pos-sono contenere stringhe di caratteri, numeri, liste o variabili e vengono at-tivati con un click del mouse quando si in run mode oppure alla ricezionedi un altro messaggio o di particolari azioni.

    questo un messaggio

    print

    Figure 6: un click con il mouse sul messaggio produce un output del messaggiostesso nella Pd window

    18

  • bang E number box

    Un altro modo di attivare un messaggio quello di utilizzare un bang, unodei pi importanti oggetti di Pd. La sua funzione quella di innescareunazione o una sequenza di azioni, pu mettere in funzione un algoritmo.Si avr modo di incontrarne praticamente in ogni patch.

    questo un messaggio

    print

    Figure 7: la stessa patch precedente, con la differenza che il messaggio viene atti-vato da un click del mouse sul bang

    Il bang ha una sua versione grafica (si ottiene premendo allinterno dellapatch ctrl+shift+b e una doppia versione testuale, che permette di evitareun eccessivo uso di elementi grafici che appesantiscono lesecuzione deiprogrammi.

    bang

    b

    bang grafico

    oggetti bang

    Figure 8: le varie versioni del bangUn altro oggetto molto comune nelle patch di Pd la number box checonsente di inviare messaggi numerici con il vantaggio di poter variarei numeri allinterno della box stessa con la pressione e il trascinamentodel mouse verso il basso per diminuire e verso lalto per aumentare il nu-mero stesso. Per comodit possibile stabilire eventuali minimi e massimidella number box premendo il destro del mouse e andando sulle propriet

    19

  • delloggetto3 . Una number box pu inviare o ricevere dati attraverso i suoiinlet.

    7

    + 5

    12

    Figure 9: loggetto + effettua in questo caso la somma fra il numero che entranellinlet 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 configurareuna serie di parametri come la veste grafica o i valori consentiti

    20

  • 3 BAS I D I PROGRAMMAZ IONE CONPURE DATA3.1 VARIABILI E COSTANTI

    Pure Data un linguaggio di programmazione orientato allaudio, quindial tempo. Per tale ragione i valori e le quantit passate agli oggetti sonoquasi sempre variabili, interattivamente o meno. In fase di apertura di unapatch ci potranno essere delle quantit inizializzate, ma esse alloccorrenzapotranno essere variate durante lesecuzione del programma. Ne sono es-empio i parametri passati agli oggetti dallinterno dellobjet box, cio gliatomi che seguono il primo (il quale, ricordiamo, da il nome alloggettostesso).

    Per comprendere meglio questo concetto esaminiamo la patch che abbiamogi incontrato nella figura 9 . Linlet di sinistra delloggetto + riceve unaquantit variabile che viene sommata alla costante 5 definita allinternodellobject box. Cos com la patch non fa altro che operare una sommafra la quantit in entrata e la costante definita nelloggetto. Linlet destrodelloggetto + offre per lopportunit di variare il secondo addendodella somma.

    30

    10 20

    + 5

    Figure 10: possibile cambiare a piacimento gli addendi della somma

    21

  • Esaminiamo il comportamento della patch in figura 10: se cambiamo ilprimo elemento delladdizione senza toccare il secondo, loutput sar lostesso di prima: somma del primo elemento con 5. Ora proviamo a cam-biare il secondo addendo. Non avremo alcun output!

    Non va dimenticato che gli inlet successivi al primo di sinistra sono freddi:immagazznano il dato in entrata senza produrre uscita. E necessarioquindi dire alloggetto + di effettuare loperazione fra i due nuovi ad-dendi e di far uscire il risultato. Nel caso di questo oggetto sufficienteinserire nellinlet di sinistra un bang, collegato alluscita del secondo ad-dendo, che ordina allobject box di far uscire il risultato immediatamente1 .

    17

    14 3

    + 5

    Figure 11: il bang collegato alluscita del secondo addendo, in entrata nellinletsinistro delloggetto + rende caldo linlet destro delloggetto stesso

    E buona norma stabilire dei valori in fase di inizializzazione della patch inmodo che essa sia immediatamente funzionante alla sua apertura. Per farequesto sufficiente scrivere i parametri degli oggetti allinterno delle objectbox. Quando questo non possibile si pu ricorrere aloggetto loadbang cheattiva un bang allapertura della patch (figura 12).Vi sono circostanze in cui necessario specificare delle variabili allinternodelle object box. Questo possibile attraverso il simbolo $n, dove n un

    1 Loggetto + oltre ad accettare numeri in entrata, accetta anche bang nellinlet di sinistra. Ilbang non fa altro che dire alloggetto di far uscire ci che ha in memoria, cio il risultatodelladdizione

    22

  • 12

    7

    loadbang

    + 5

    Figure 12: allapertura della patch si avr come output la somma fra 7 e 12numero identificativo. La variabile assume di volta in volta il valore che lamessage box riceve nel suo inlet (figura 13)2 .

    scelgo il numero $1

    12

    print

    Figure 13: variabile in una message box, osservare loutput nella Pd window

    3.1.1 pack E unpack

    Nel caso in cui una messege box contenga pi di una variabile necessarioche 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 devonoassumere. Per realizzare tali liste esiste un oggetto apposito chiamato pack,

    2 I simboli identificativi delle variabili devono iniziare da $1 e seguire ordinatamente. Se unamessage box ha 3 variabili $1 $2 ed $3 e riceve una lista di 3 atomi, il primo andr nellavariabile $1, il secondo nella $2, etc. . .

    23

  • che mette insieme diversi valori singoli (atomi), combinandoli in liste. Gliargomenti di pack inizializzano il valore del relativo inlet al valore segnato.Ad esempio pack 2 19 25 avr 3 inlet rispettivamente inizializzati con i valori2, 19, 25. Un bang in entrata nellinlet sinistro produrr loutput della listain memoria in quel momento (fig. 14).

    la data di oggi: giorno $1 mese $2 anno $3

    print

    pack 20 1 2010

    0 0 0

    Figure 14: pack: un click sul bang senza cambiare i valori delle number box produceluscita dei valori inizializzati. Una variazione delle number box pro-duce un output nel momento in cui viene cambiato il valore dellinletdi sinistra. Osservare il risultato nella Pd window

    Loggetto unpack fa il contrario rispetto a pack: prende una lista e ne con-voglia i singoli atomi attraverso i suoi inlet.

    3.2 GESTIONE DEL TEMPO

    Come detto in precedenza, Pd un linguaggio orientato al tempo, quindici sono molti oggetti deputati alla gestione di eventi temporali. Esaminer-emo alcuni di questi senza dimenticare che la presente trattazione non putrattare di molti altri oggetti che il programmatore scoprir nel suo cam-mino3.

    3 Premendo il destro del mouse su un oggetto si pu accedere allhelp dello stesso. In molticasi la pagina dellhelp rimanda anche ad oggetti simili a quello esaminato. E sempreutilissimo pertanto navigare fra le pagine di help che sono uno strumento di navigazionefondamentale fra gli oggetti di Pd.

    24

  • unpack 0 0 0

    20 1 2010

    20 1 2010

    Figure 15: unpack: un click sulla message box produce un output in ognuno dei treoutlet

    3.2.1 metro

    Loggetto metro produce in output un bang ogni n millisecondi, dove n largomento delloggetto e rappresenta la distanza temporale fra un bang elaltro. Per funzionare ha bisogno che sia attivato attraverso un messaggiodiverso da zero o un bang. Un messaggio uguale a zero oppure stop, spegneloggetto.

    1

    bang

    0

    stop

    0

    metro 500

    un numero diverso da 0 o un

    "bang" attivano metro

    0 o "stop" fermano metro

    l'inlet di sinistra consente

    di modificare la distanza

    temporale fra i "bang"

    Figure 16: metro

    25

  • UN CONTATORE

    Attraverso loggetto metro e un altro oggetto che esamineremo in questoparagrafo, possiamo costruire un contatore4. La patch non fa altro cheemettere a intervalli regolari (nel nostro caso 500 ms) un numero intero apartire da zero tale che il successivo sia maggiore del precedente di unaunit. Lalgoritmo necessita di un oggetto che permetta di conservare inmemoria un numero intero. Loggetto che fa al caso nostro int. Linlet de-stro di int riceve un intero e lo memorizza finch un bang nellinlet sinistronon lo costringe a inviarlo dalloutlet. Allapertura della patch loggettoint viene inizializzato con uno zero nella sua memoria (tramite loadbang.Allattivazione di metro, int riceve un bang nella sua entrata calda facendouscire zero, che viene mandato alluscita della patch e contemporaneamenteviene sommato a 1, tramite loggetto +. Questultimo a sua volta spedisceil risultato, cio uno, nellentrata fredda di int. Il nuovo valore (uno) uscirnon appena il successivo bang prodotto da metro non sopravvenga, e cosvia (figura 17).

    3.2.2 line

    Un oggetto molto comune in Pd line, che generara delle rampe per rag-giungere un determinato valore. line ha bisogno di almeno due argomenti,il valore-obiettivo, cio la quantit da raggiungere, e il tempo in millisec-ondi necessario a raggiungerlo. In presenza di un messaggio con una listadi due numeri, line raggiunger il primo nel tempo in millisecondi indicatodal secondo (figura 18).Un oggetto molto comune in Pd line, che generara delle rampe per rag-giungere un determinato valore. Accetta due argomenti via message box,ovvero il valore-obiettivo e il tempo in millisecondi per raggiungerlo (fig.18).Una volta terminato il suo percorso line mantiene in memoria il valore-obiettivo, quindi un secondo click sulla message box non produrr un nuovooutput perch si direbbe a line di creare un percorso da 1000 a 1000 in5 secondi. Se volessimo reinizializzare ogni volta loggetto line ad esem-pio chiedendogli di creare ogni volta il percorso da 0 a 1000 in 5 secondi,baster creare una lista di tre atomi, con il primo che indica il valore di

    4 In generale un contatore un dispositivo che memorizza (e a volte visualizza) il numerodi volte che un particolare evento o processo si verifica. In una caso molto semplice, uncontatore pu contare i bang che riceve ed emettere il conteggio dal suo outlet.

    26

  • metro 500

    0 1

    int

    0

    + 1

    23

    loadbang

    Figure 17: click su 1 per avviare il contatore, su 0 per fermarlopartenza, il secondo con il valore-obiettivo, separato dal precedente dauna virgola e infine con il tempo in millisecondi (figura 19).line pu avere anche due argomenti interni alla object box:

    1. Il valore da cui iniziare la prima rampa (default 0)

    2. La distanza di tempo in millisecondi fra luscita di un valore e ilsuccessivo (default 20 ms)

    Nella figura 20 il valore-obiettivo 2000, da raggiungere in 5 secondi. Larampa inizia da 1000 e i valori escono ogni mezzo secondo (500 ms).

    3.2.3 delay

    Loggetto delay emette un bang dopo aver ricevuto un bang a sua volta.Lunico argomento che accetta (dallinlet destro) il ritardo con cui verremesso il bang stesso (figura 21).

    27

  • 1000 5000

    line

    0

    Figure 18: line al momento della creazione inizializzato a zero, quindi in questocaso al momento del click sulla message box inizier un percorso da 0 a1000, completandolo in 5 secondi

    line

    0, 1000 5000

    0

    Figure 19: si pu ricominciare la rampa da 0 a 1000 ogni volta che si preme sullamessage box

    0

    line 1000 500

    2000 5000

    Figure 20: rampa da 1000 a 2000 in 5 secondi, con step di mezzo secondo fra unvalore e laltro in uscita

    28

  • metro 1000

    delay 500

    1

    0

    Figure 21: i bang saranno intermittenti3.2.4 line MULTIRAMPA CON delay

    Con gli oggetti line e delay possiamo costruire rampe multiple in modomolto semplice. E sufficiente preparare tante message box quante sarannole rampe e metterle in azione in successione con delay. Nel caso della patchin figura 22 c un oggetto grafico per rappresentare le rampe, una sliderorizzontale, di cui ci occuperemo in un apposito capitolo.

    3.3 ARITMETICA

    Pd dispone di una serie di oggetti che consentono di effettuare le pi co-muni operazioni matematiche. Abbiamo gi incontrato loggetto + chepermette loperazione di somma. Nel prossimo paragrafo esamineremoalcuni altri oggetti per operare sui numeri.

    3.3.1 OPERATORI ARITMETICI

    Gli oggetti per le operazioni aritmetiche e matematiche funzionano tuttiallo stesso modo, per ora ci limitiamo a darne qui un elenco. Successiva-mente avremo modo di usarli massicciamente.

    Operazioni aritmetiche:

    + -

    29

  • 0, 127 1000 50 600 100 1500

    line

    0

    delay 1000 delay 1600

    Figure 22: click sul bang pi in alto della patch * / pow

    Operazioni trigonometriche:

    sin cos tan atan atan2

    Operazioni sulle frazioni

    mod div

    e molti altri...

    30

  • 3.3.2 expr

    expr un versatile strumento che permette di raggruppare in un unicooggetto una serie di operazioni. Con Pd pu capitare spesso di dovereffettuare una sequenza di operazioni matematiche, attraverso expr si pos-sono combinare insieme in modo da non occupare spazio e da rendere pichiara per il programmatore la sequenza delle operazioni stesse. Per poterfunzionare con dei dati in ingresso expr necessita di simboli per rappre-sentare delle variabili, che, a differenza delle variabili delle message box siscrivono in questa forma: $xn dove x il tipo della variabile e n il numeroordinale che la rappresenta (fig. 23).Le variabili possono essere di tipo intero, decimale, simbolo e rispettivamenteavranno la forma $in, $fn e $sn.

    4

    + 12

    42.6667 42.6667

    /

    * 24 - 7

    expr (($f1 + 12) * 24)/(($f1 + 12) - 7)

    Figure 23: nella parte sinistra le operazioni si succedono dallalto verso il basso,nella parte destra le stesse vengono raggruppate da expr. Valutare idue algoritmi in parallelo con un click sul bang

    31

  • 3.4 GENERATORI DI NUMERI CASUALI

    Dopo i pi comuni operatori matematici utile soffermarsi su alcuni oggettidi Pd che generano numeri casuali. Qualunque coder prima o poi si imbattenellesigenza di usare numeri casuali e chi usa Pd non fa eccezione. Ilprimo strumento che esaminiamo random che genera un numero casualeogni volta che riceve un bang. Questo numero viene scelto in un range com-preso fra 0 e il numero definito nel primo argomento delloggetto meno 1.Un secondo argomento, facoltativo, imposta il seme della sequenza. Senzavolersi soffermare troppo sulle implicazioni tecniche della generazione dinumeri casuali, c da dire quantomeno che generalmente quando si parladi generatori di numeri casuali si usa un termine improprio, perch inrealt si tratta di generazione di numeri pseudo-casuali, poich questi ven-gono generati da algoritmi. Nel caso di Pd alla base della generazionedi questi numeri c una complessa equazione con una serie di variabili.Il seme della sequenza generata non altro che una variabile di questaequazione.

    random 250

    metro 500

    1 0

    0

    Figure 24: la patch genera un numero pseudo-casuale ogni mezzo secondorandom produce solo interi, ma se volessimo generare dei numeri pseudo-casuali 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 generatacon una certa probabilit potremmo usare loggetto moses che consente diconvogliare un flusso di numeri in due outlet diversi in base a un valore-soglia definito come argomento. I numeri al di sotto del valore-soglia ven-gono convogliati dalloutlet sinistro, quelli al di sopra da quello destro.

    32

  • metro 500

    1 0

    0

    random 1001

    / 1000

    Figure 25: la patch genera un numero pseudo-casuale compreso fra 0 e 1, con 3cifre decimali

    metro 500

    1 0

    random 100

    moses 25

    Figure 26: i numeri da 0 a 24 producono un bang dalloutlet sinistro, quelli da 25 a99 dal destro. Volendo parlare di percentuali, loutlet sinistro ha il 25%di possibilit di produrre un bang, quello destro il 75%

    Loggetto decide produce pseudo-casualmente solo sequenze di 0 e 1, men-tre drunk funziona come random ma sceglie il numero effettuando un saltoche lo distanzia dal precedente al massimo quanto stabilito nel secondoargomento (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

    1 0

    80

    drunk 100 10

    Figure 27: ogni mezzo secondo viene generato un numero compreso fra 0 e 99,dove ogni numero a una distanza minore o uguale 10 dal precedente

    frutto di drunk molto pi ordinata: gli elementi della sequenza si spostanoentro un range limitato (definito dal secondo argomento di drunk).

    3.5 CONNESSIONI SENZA CAVI

    Al fine di evitare di riempire la patch window di cavi che possono rendernemeno chiara linterpretazione, si possono usare i due oggetti send e receive,che permettono di creare una connessione senza fili fra le box. Largomentodi receive un nome identificativo che deve essere identico a quello di send.E possibile avere pi oggetti receive con lo stesso identificativo: tutti ricev-eranno dalloggetto send che ha lo stesso nome. Unultima annotazione,send e receive possono essere abbreviati in s e r (fig. 29).

    3.6 Subpatches E Abstractions

    Ci sono circostanze in cui le patch sono molto complesse e articolate. Inquesti casi Pd mette a disposizione degli strumenti per annidare delle porzionidi patch in box apposite. Esistono due modi per annidare contenuti dentrotali box, il primo quello di creare delle subpatch, laltro quello di creareabstraction. Le subpatch appaiono come delle normali object box formatedal nome pd seguito da un nome identificativo per la subpatch, esse pos-sono essere utilizzate solo allinterno della patch dove sono state create oallinterno di altre subpatch della stessa patch. Le abstraction invece, pur ap-parendo come delle normali object box, hanno solo un nome identificativo,

    34

  • random

    drunk

    Figure 28: in alto la sequenza generata da random, in basso quella creata con drunk,con una stepsize di 25

    ma vengono salvate indipendentemente dalla patch in cui vengono usate esono riutilizzabili in altre patch.

    3.6.1 subpatch

    Per creare una subpatch sufficiente scrivere allinterno di una nuova objectbox pd nome, si aprir una nuova finestra allinterno della quale si inseriril contenuto della subpatch. Questa nuova finestra si pu chiudere in qual-sisasi momento senza bisogno di salvarla e riaprirla con un semplice clicksulla object box in run mode. La patch in figura 30 realizza un algoritmo at-traverso il quale vengono emessi dei bang da quattro outlet diversi, il primo

    35

  • 4send numero

    receive numero

    r numero

    r numero

    4

    4

    8

    * 2

    Figure 29: connessioni senza fili

    random 500

    + 1

    moses 250

    metro 500

    moses 126 moses 376

    Figure 30: un semplice algoritmo senza annidamentida sinistra se random emette un numero fra 1 e 125, il secondo se il numero compreso fra 126 e 250, e cos via. Lalgoritmo della figura 31 identicoal precedente, con lunica differenza che realizzato con una subpatch. Le

    36

  • subpatch funzionano esattamente come le patch solo che devono contenereal loro interno le entrate e le uscite necessarie perch siano, nella patch,collegabili alle box da cui ricevono dati e a cui li inviano.

    pd miasubpatch

    Figure 31: lalgoritmo precedente realizzato con una subpatchCome si pu vedere dalla figura 32 linterno della subpatch del nostroalgoritmo uguale alla porzione di patch della figura 30, ma in alto cloggetto inlet che crea un inlet nella subpatch e 4 oggetti outlet, che creanoi rispettivi 4 outlet per i bang. Le subpatch possono essere modificate in

    inlet

    outlet

    random 500

    + 1

    moses 250

    metro 500

    moses 126 moses 376

    outlet outlet outlet

    Figure 32: linterno della subpatch con gli inlet e gli outletqualunque momento e, soprattutto, possono essere duplicate a piacimento.Rappresentano uno strumento molto comodo per rendere pi leggibile e

    37

  • chiaro un algoritmo nella patch window, quindi il consiglio di usarle il pipossibile.

    3.6.2 abstraction

    Unabstraction non altro che una patch che pu essere richiamata dallinternodi una patch. Anchessa, come la subpatch contiene gli oggetti inlet e outletper creare le varie entrate e uscite dellobject box e, a differenza della sub-patch, pu essere utilizzata in qualunque patch. Limportante che il filedellabstraction sia salvato con lestensione .pd e che si trovi nella stessadirectory in cui si sta lavorando o in una delle directory definite nel Path delprogramma (cap. 2.1).

    Per richiamare unabstraction sufficiente aprire unobject box e inserireil nome dellabstraction senza lestensione .pd. Labstraction potr essereaperta e chiusa in qualunque momento e anche modificata, a patto chesia salvata, ma il consiglio di stare attenti a modificare unabstractiondallinterno di una patch: labstraction risulter modificata in tutti gli altriprogetti in cui viene utilizzata!

    Unabstraction pu anche essere inizializzata con un argomento, questo possibile scrivendo largomento stesso (o gli argomenti) dopo il nome. Ilprimo argomento determina il valore della variabile $1, il secondo quellodella variabile $2 e cos via. Queste variabili possono essere create allinternodegli oggetti dellabstraction, ma non dentro le message box.

    myabstraction 100 1000

    0

    Figure 33: unabstraction con due argomentiOsserviamo la figura 33: loggetto myabstraction viene inizializzato con dueargomenti: 100 per la variabile $1, 1000 per la variabile $2. Un bang mettein azione labstraction. Ma vediamo cosa accade al suo interno (figura 34).I due argomenti inviati tramite lobject box myabstraction si sostituiscono

    38

  • inlet

    outlet

    pack $1 $2

    line

    Figure 34: linterno dellabstractiona $1 ed $2, che sono le variabili di pack, che riceve quindi la lista (1001000) che sono rispettivamente il valore-obiettivo e il tempo in millisecondidelloggetto line. Un bang ricevuto dallinlet dellabstraction mette in azioneline restituendo la rampa alloutlet.

    3.6.3 GRAPH ON PARENT

    subpatch e abstraction possono anche essere pilotate dalla patch senza bisognodi essere aperte ogni volta ci fosse il bisogno di cambiare un valore. Insostanza subpatch e abstraction possono diventare oggetti interattivi. Perfare questo una delle soluzioni potrebbe essere quella di creare degli inletaggiuntivi nella subpatch oppure utilizzare unaltro metodo che Pd mette adisposizione. Se nelle propriet della subpatch (o dellabstraction, questo sis-tema funziona su entrambe), cui si accede premendo il sinistro del mousesu un punto qualunque della subpatch window, selezioniamo lopzione graphon parent, comparir allinterno della subpatch stessa un riquadro allinternodel quale possiamo mettere ci che vogliamo sia visibile dalla patch geni-trice. 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 conuna number box che regola la distanza in millisecondi fra i bang.I cavi di connessione vengono nascosti nella patch in modo da rendere pichiara la lettura dellalgoritmo.

    39

  • 1 0

    pd submetro

    301

    regola_metro

    Figure 35: Una subpatch con una number box in graph on parent

    inlet

    outlet

    metro 500

    301

    regola_metro

    Figure 36: linterno della subpatch. Per creare il riquadro di visibilit basta andaresulle propriet della subpatch e selezionare lopzione graph on parent

    40

  • 4 VETTOR I , GRAF IC I E TABELLE4.1 VETTORI

    Un vettore (in inglese array) un oggetto che permette di conservare e ma-nipolare comodamente una grande quantit di dati. Pu essere pensatocome un contenitore di locazioni di memoria, identificate da un indice, at-traverso il quale possibile accedere alla locazione desiderata. I vettoriin Pd sono rappresentati da grafici bidimensionali che hanno sullascissalindice e sullordinata il valore corrispondente. Si tratta sempre di vettorimonodimensionali che gestiscono collezioni di numeri interi, decimali o disegnale (ma di questi ultimi ci occuperemo in seguito) quindi lindice unintero che identifica una e una sola posizione in memoria. Nel linguaggioC i vettori monodimensionali vengono definiti, come le variabili, in questomodo:

    int i[4] = {5, 2, 7, 3}

    che crea il vettore i di tipo intero di 4 elementi. Immediatamente doporiempie il vettore con i valori interi 5, 2, 7, 3. In Pd questo vettore vienerappresentato come in figura 37.Ricordiamo che lindice di un vettore inizia da 0, quindi un vettore di4 elementi avr un indice che va da 0 a 3. Un array in Pd si crea dalmenu Put/Array. Se premiamo col destro del mouse sul grafico possiamoaccedere alle propriet dellarray, dove possiamo impostare la dimensionedel grafico e del vettore. Osserviamo dalla figura 37 le seguenti cose:

    1. allinterno del grafico ci sono delle barrette orizzontali che rappresen-tano le coordinate (x, y) degli elementi

    2. in alto a sinistra del grafico c il nome del vettore (in questo caso i)

    3. incolonnati a sinistra ci sono dei valori che rappresentano il rangedellordinata, quindi dei valori che pu assumere ogni elemento dellarray

    41

  • i0 1 2 3

    0

    5

    10

    Figure 37: vettori: sullasse delle ascisse c lindice, sullordinata il valore4. in riga in basso ci sono invece i valori dellindice

    Punto 1. Il grafico di un vettore pu essere riempito in numerosi modi:

    - interattivamente, cio con il mouse

    - con una message box che invia i dati al grafico stesso. La sintassi diuna message box per un vettore la seguente:

    ;

    nome_vettore (comando) argomenti

    Si possono scrivere esplicitamente i singoli valori inserendo nella mes-sage box lindice del primo elemento da scrivere seguito da tutti i val-ori da inserire nel vettore. Si possono possono produrre i valori delvettore attraverso una funzione trigonometrica come sinesum (sommadi seni), seguita dal numero degli elementi del vettore e dal valore diogni curva sinusoidale (compreso fra 0 e 1), oppure cosinesum, ugualealla precedente, ma che genera una cosinusoide o una somma di cos-inusoidi. Si possono inoltre leggere i dati richiamandoli da un file ditesto con il comando read seguito dal nome del file che contiene didati (figura 38).

    42

  • - con oggetti speciali che scrivono i dati allinterno dei vettori. Loggettotabwrite scrive valori allinterno di un vettore. Nellinlet di sinistra en-trano i valori, in quello di destra i relativi indici. Il messaggio setin 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 sinesum 32 0.5

    ;

    i resize 4

    i 0 0.5 0.75 -0.6 0.1

    ;

    i cosinesum 32 0.25 0.5 0.25

    i

    Figure 38: attivare le tre message box con un click e verificarne il risultato sulgrafico. Il comando resize ridimensiona il vettore secondo quanto indi-cato dal suo argomento, in questo caso 32

    Nella patch della figura 39 until provoca luscita di una sequenza di 32bang che vengono numerati da un contatore, che a sua volta li spedisceallinlet destro di tabwrite (lindice dellarray). Contemporaneamente i bangproducono luscita di numeri pseudo-casuali decimali, compresi fra 0 e 2,dalloggetto randomF. Da questi ultimi viene sottratto 1 in modo da avere

    43

  • tabwrite i

    int 1 + 1

    randomF 2

    - 1

    1

    until

    32

    i

    -1

    0

    1

    Figure 39: click sulla message box in alto e verificare il risultato sul graficoun range compreso fra -1 e 1, che rappresentano i valori minimi e massimidel grafico del vettore.

    Punti 2-4. Linterfaccia del vettore, il grafico, pu presentare anche ele-menti come un etichetta che rappresenta lordinata e uno che rappresentalascissa. Questi elementi si possono aggiungere tramite message box sec-ondo le seguenti sintassi:

    44

  • nome_vettore xlabel posizione valori_ascissa_da_mostrare

    nome_vettore ylabel posizione valori_ordinata_da_mostrare

    nome_vettore xticks posizione intervallo intervallo_tick_grande

    nome_vettore yticks posizione intervallo intervallo_tick_grande

    Gli stessi comandi seguiti da hide rimuovono i risultati del comando. Perverificare il funzionamento di questi comandi si copi il codice della figura40, che mostra un vettore di 100 punti, con range da -1 a 1.

    ;

    i ylabel hide

    ;

    i ylabel -5.5 -1 0 1

    ;

    i xlabel hide

    ;

    i xlabel -1.2 0 100

    ;

    i yticks hide

    ;

    i xticks hide

    ;

    i xticks 0 2 10

    ;

    i yticks 0 0.1 5

    i

    0 100

    -1

    0

    1

    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 verrdisegnato il grafico: come punti discreti (draw as points), come punti inter-polati (polygon) cio singoli punti uniti da una linea che traccia il percorsopi breve fra punti adiacenti, infine come curva di bzier (bzier) che smussagli spigoli (figura 41).

    punti polygon

    bezier

    i

    i

    i

    Figure 41: le tre diverse rappresentazioni di un vettore di 16 punti

    4.1.1 LEGGERE UN VETTORE

    Un vettore pu essere letto e utilizzato per processare altri dati. Uno deglioggetti che permettere di leggere i dati di un vettore tabread che ha ununico inlet che riceve lindice del valore da restituire. Nella figura 42 tabreadlegge 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 tabreadmodifica la dimensione di un bang e il movimento dellindicatore di unaslider verticale.

    4.1.2 LOGGETTO table

    Loggetto table simile ad un normale oggetto array con lunica differenzache crea il grafico in una subpatch invece che nella patch window doveviene creato loggetto. Il primo argomento il nome dellarray, il secondo,opzionale la sua dimensione. E inoltre possibile mandare messaggi alvettore, con i consueti metodi visti nei paragrafi precedenti.

    46

  • until

    16

    int + 1

    tabread i

    tabwrite new

    metro 1000

    int 0

    0

    + 1

    line

    1 0

    mod 16

    0

    tabwrite new

    0

    t i i sel 15

    reset

    0, $1 950

    size $1

    line

    $1 950

    s reset

    r reset

    i

    new

    Figure 42: click sulle message box per aggiungere o rimuovere le etichette

    47

  • 5 PROGRAMMAZ IONE AVANZATA5.1 ISTRUZIONI CONDIZIONALI

    Nella logica della programmazione le istruzioni condizionali sono gli stru-menti che permettono di verificare se una data condizione sia vera o falsa1.In Pd, come nella maggior parte degli altri linguaggi di programmazione,esistono degli oggetti e dei costrutti sintattici che permettono di verificareuna condizione e di eseguire delle operazioni al verificarsi di determinatesituazioni. Tutti queste istruzioni possono essere raccolte e combinate inalgoritmi di selezione.

    5.1.1 OPERATORI RELAZIONALI

    Gli operatori relazionali consentono di confrontare due valori fra loro, quindisono binari. Come nel linguaggio C producono un output uguale a 1 se lacondizione richiesta dalloperatore relazionale soddisfatta, uguale a 0 incaso contrario. I principali operatori relazionali sono sei:

    > (maggiore di) < (minore di) >= (maggiore o uguale a)

  • > 10

    0

    0

    Figure 43: Loutput di > restituisce 0 finch il numero in entrata minore ouguale a 10, 1 quando diventa maggiore di 10

    5.1.2 select

    select (forma abbreviata: sel) opera una selezione sugli atomi in entrataconfrontandoli con i suoi argomenti. Se la condizione soddisfatta selectemette un bang dalloutlet corrispondente, in caso contrario spedisce fuorilatomo in entrata dallultimo outlet a destra.

    sel 10

    5 123 10

    0

    Figure 44: selectselect pu selezionare pi atomi, in tal caso avr tanti outlet quanti sarannogli atomi da valutare, pi uno, da cui far uscire gli atomi che non soddis-fano la selezione (figura 45).Con gli operatori relazionali e select realizziamo un algoritmo che operauna selezione su dei numeri. Quando la selezione soddisfatta e selectemette 1, verr attivata una rampa con loggetto line (figura 46).

    49

  • 5

    123

    10

    0

    sel 10 4

    4

    Figure 45: select con pi selezioni

    > 50

    sel 1

    line

    0, 127 2000

    20 32 69

    Figure 46: valutare lalgoritmo con un click sulle 3 message box in altoSe volessimo modificare questo algoritmo in modo da operare una verificasu una rampa invece che su valori singoli, avremmo bisogno di uno stru-mento che individui il superamento di una soglia. Loggetto che fa al casoin questione change, che filtra le ridondanze in un flusso in entrata. Adesempio se in change entra per 10 volte consecutive il numero 1, emetter 1

    50

  • solo alla prima entrata. Combinando cos > e change possiamo soddisfarela nostra richiesta.

    line

    0, 100 2000

    > 50

    sel 1

    line

    0, 127 2000

    100

    change

    Figure 47: click sulla message box in altoEsaminiamo la patch in figura 47: allattivazione della rampa, inizia il cam-mino da 0 a 100 effettuato da line. Appena superato il valore-soglia di 50,loperatore > emette 1 a ripetizione, ma change elimina tutte le ripetizionisuccessive, consentendo luscita solo del primo 1, attivando cos il selettoresel ununica volta. Si attiva in quel momento la rampa in basso.

    5.1.3 OPERATORI LOGICI

    Gli operatori logici eseguono operazioni secondo le tavole di verit dellalgebrabooleana2. In Pd ci sono operatori che operano al livello di bit e altri che op-erano sui numeri decimali. Nel primo caso i numeri interi decimali ricevutidagli operatori logici vengono trasformati nella loro forma binaria e ogni

    2 Le tavole di verit sono tabelle usate nella logica per determinare se, attribuiti i valori diverit alle proposizioni che la compongono, una determinata proposizione vera o falsa.

    51

  • bit viene valutato con il bit dellaltro numero che si trova nella stessa po-sizione. Ad esempio loperatore AND (oggetto & in Pd) segue le regoledella tavola di verit illustrate nella tabella 1.

    a b a b0 0 00 1 01 0 01 1 1

    Table 1: tavola di verit per loperatore ANDSe volessimo realizzare un AND sugli interi 21 e 6, & opererebbe nelmodo illustrato nella tabella 2.

    21 = 1 0 1 0 1 6 = 0 0 1 1 0 =

    4 = 0 0 1 0 0

    Table 2: operazione AND su gli interi 21 e 6

    &

    21 6

    t b b

    4

    Figure 48: loperatore AND in azione in una patch di Pd

    52

  • Loperatore OR (in Pd |) agisce allo stesso modo ma seguendo le regoledella tavola di verit dellOR booleano (tabella 3).

    a b a b0 0 00 1 11 0 11 1 1

    Table 3: tavola di verit per loperatore OR

    |

    t b b

    63

    41 22

    Figure 49: loperatore ORIn relazione a questi due operatori ci sono due oggetti (&& e ||) checonfrontano due valori (interi o decimali) producendo come risultato lostesso delle tavole di verit su citato. Ad esempio && restituisce 1 se esolo se entrambi i valori sono diversi da zero, mentre restituisce 0 se unodei due valori o entrambi sono uguali a zero (tabella 1).Altri due operatori che lavorano a livello di bit sono e , che potremmochiamare rispettivamente scivola a sinistra e scivola a destra. Il primo, ad es-empio, converte lintero che riceve nel suo inlet sinistro nella sua forma bi-naria e aggiunge a destra tanti bit uguali zero quanti sono richiesti dallinletdi destra. Nella tabella 4 c un esempio con il numero 113 da spostare asinistra di due posizioni.

    53

  • 1&&

    10 10

    Figure 50: loperatore && confronta due valori in base alla tavol di verit perAND

    113 = 1 1 1 0 0 0 1

  • if valuta unespressione, se vera restituisce un certo risultato, se falsa nerestituisce un altro. Nel linguaggio C la sintassi del costrutto if la seguente:

    if (espressione)

    fai una certa cosa;

    else

    fanne unaltra;

    che significa: "Se lespressione vera fai una certa cosa, altrimenti fanneunaltra". In Pd invece la sintassi :

    if (espressione, a se vera, b se falsa)

    0

    0

    expr if ($f1 < 10, $f1 * 5, 10)

    Figure 52: se il numero in entrata minore di 10 espr restituisce il numero stessomoltiplicato per 5, altrimenti restituisce 10

    5.2 loops E ITERAZIONI

    Le iterazioni in Pd si possono gestire in molti modi. Generalmente uniterazionenei linguaggi di programmazione la ripetizione di un evento fino alluscitadallevento stesso, determinata dal verificarsi di una certa condizione. InPd uniterazione pu essere lemissione di un bang ogni mezzo secondoper un numero definito di volte. Come sappiamo metro genera bang a ripe-tizione, finch non viene spento. E semplice quindi inserire un contatoreche si occupa di contare i bang usciti e appena raggiungo il valore desider-ato si occupa di spegnere metro. Osserviamo la patch in figura 53.Pd implementa anche loggetto until che emette un numero di bang definitoda un numero in entrata nel suo inlet sinistro. A differenza della patch infigura 53 until non orientato al tempo ma opera quasi istantaneamente

    55

  • 1 0

    float + 1

    0

    sel 9

    loadbang

    metro 500

    0

    Figure 53: la patch produce 10 bang attraverso un oggetto metro controllato da uncontatore e da un selettore

    come nei tradizionali linguaggi di programmazione. In effetti until fun-ziona secondo lo schema classico di un ciclo for del C:

    for (i=0; i

  • until

    100

    + 1

    0

    print

    loadbang

    int

    Figure 54: ciclo until: valutare lalgoritmo con un click sulla message box in alto eosservare il risultato nella Pd window

    57

  • 6 I L M ID I6.1 PANORAMICA SUL PROTOCOLLO MIDI

    Il protocollo MIDI (Musical Instrument Digital Interface) consente a dispos-itivi diversi di comunicare fra loro attraverso linvio messaggi che vengonointerpretati e tradotti. a tutti gli effetti un protocollo di comunicazione,quindi i messaggi sono formati esclusivamente da numeri. Il MIDI nonmanipola, non invia, non riceve, n gestisce suoni di alcun tipo.Anche se, tipicamente, il protocollo MIDI viene usato in ambito musicale,teoricamente pu essere utilizzato anche per altri scopi.Affinch il MIDI possa funzionare necessario che ci siano almeno duedispositivi che devono comunicare e che siano fornite di porte di comuni-cazione. Le porte di uscita dei messaggi sono le porte MIDI OUT, quelledi entrata MIDI IN. C un altro tipo di porta, MIDI THRU che consentedi reindirizzare un messaggio in entrata da una MIDI IN verso un altrodispositivo.Praticamente un dispositivo che invia (Master) dati, indirizza i propri mes-saggi attraverso la sua porta MIDI OUT. Il dispositivo ricevente (Slave) liriceve attraverso la sua porta MIDI IN ed eventualmente li indirizza a suavolta ad un altro SLAVE attraverso la sua MIDI THRU.Questo schema logico non lunico possibile, ma in questa sede non ciaddentreremo oltre negli schemi di collegamento MIDI, anche perch con-cettualmente lo schema appena illustrato quello su cui si basano tutte lepossibili configurazioni.Il MIDI anche in grado di permettere la comunicazione fra dispositivisoftware risiedenti su una stessa macchina, tipicamente un computer. Adesempio Pd potrebbe ricevere messaggi MIDI da un qualunque sequencere inviarli a sua volta alla scheda audio.

    58

  • 6.1.1 ANATOMIA DI UN MESSAGGIO MIDI

    Il messaggi MIDI sono fondamentalmente costituiti da sequenze di due otre bytes, il primo dei quali detto STATUS BYTE, gli altri DATA BYTE. Ilprimo si distinuge dal secondo perch il bit pi significativo (quello pi asinistra) uguale a 1:

    10000000 (statys byte)

    00000000 (data byte)

    Lo STATUS BYTE concettualmente diviso in due nibble, cio gruppi diquattro bit, il primo dei quali, quello a sinistra, contiene il bit pi signi-ficativo e altro tre bit che indicano il tipo di messaggio. Il secondo nibbleinforma sul canale verso cui sar inviato il messaggio.

    Riassumendo, quindi, uno STATUS BYTE costituito da 3 elementi infor-mativi: il primo bit, che indica che lo STATUS BYTE tale, 3 bit per il tipodi messaggio e 4 bit per il canale o per un tipo particolare di messaggionel caso di un System Message. Poich con quattro bit si possono avere 16combinazioni diverse (0-15) un dispositivo MIDI pu inviare e ricevere su16 diversi canali.

    I 3 bit di tipo di dato ci danno 8 possibili tipi diversi:

    000 Note OFF

    001 Note ON

    010 Polyphonic Key Pressure

    011 Control Change

    100 Program Change

    101 Channel Pressure

    110 Pitch Bend Change

    111 System Message

    Un esempio. Una macchina master invia un messaggio come questo:

    10010000

    59

  • si tratta di uno STATUS BYTE (il bit pi a sinistra 1) che sta per inviari unDATA BYTE di tipo Note ON (001) sul primo canale (0000). Abbreviando,potremmo anche pensare a questo come lo STATUS BYTE 144, che il bytein 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 rimandaallidea che la velocit con cui un tasto viene premuto proporzionale alvolume che si ottiene)Uno STATUS BYTE di Note On quindi sar sempre seguito da due DATABYTE, 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 bitindica 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 DATABYTE. Ad esempio, un messaggio di Program Change (100), che serve adimpostare o cambiare il timbro per una determinata sequenza di eventiMIDI, il DATA BYTE soltanto uno.Nel caso di un un System Message, codice 111, i 4 bit a destra dello STATUSBYTE non rappresentano il canale, ma, appunto, il codice di un particolaremessaggio detto messaggio di sistema, inviato a tutto il sistema per dareinformazioni 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 DATABYTE portano i dati del tipo di messaggio. Per maggiori informazioni suitipi di messaggio la rete unottima fonte di informazioni.

    6.2 PD E IL MIDI

    Pd pu ricevere e inviare messaggi MIDI. Dal menu MIDI settings (che siapre 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 an-cora non codoficati in base al tipo midiin che manda fuori dalloutlet disinistra messaggi Channel Voice in forma decimale. In sostanza restituiscesequenze di numeri interi compresi fra 0 e 239 poich gli STATUS BYTE ditipo SYSYTEM MESSAGE, che sono compresi fra 240 e 255 non vengonocatturati.

    Ora proviamo a implementare un oggetto, midianalyze che analizza i datiricevuti da midiin convogliandoli a vari inlet in base al loro significato.Tale oggetto esiste gi in una forma quasi uguale nella libreria che emulagli oggetti di Max/MSP e prende il nome di midiparse.midianalyze (fig. 55) non ha inlet in quanto contiene al suo interno loggettomidiin che riceve messaggi midi dallesterno di Pd. Ha invece 6 outlets,il primo dei quali restituisce messaggi di noteON, il secondo di ChannelPressure, il terzo di Control Change, il quarto di Program Change, il quintodi Channel Pressure e lultimo di Pitch Bend. Sono esclusi i messaggi dinote OFF perch sono ormai inutilizzati dal protocollo. Per chiudere unanota infatti si usa un normale messaggio di Note ON con velocity pari azero. Ogni outlet formatta i messaggi restituendo una lista composta da idati e dal numero del canale.

    midianalyze

    45 0 0

    prepend set prepend set

    10 74 0

    prepend set

    16 40 0

    prepend set

    42 0

    prepend set

    51 9

    prepend set

    0 53 0NoteON keypressure controlchange programchange channelpressure pitchbend

    Figure 55: midianalyze e i suoi outletsLinterno dellabstraction (fig. 56) semplice, loggetto midiin invia i mes-saggi alloggetto moses che li divide fra i suoi due outlet: se un messaggo(che, ricordiamo non altro che un byte in forma decimale) inferiore a128 (0-127) sar inviato al primo outlet in quanto si tratter di un DATABYTE, al contrario sar uno STATUS BYTE e sar inviato allaltro outletmoses smista i messaggi inviandoli a sei subpatches, ognuna delle qualicostruir la lista appropriata. I messaggi di Program Change e di Chan-nel pressure saranno formati da una lista di due interi: il dato e il canale,

    61

  • moses 128

    outlet noteon outlet keypressure outlet cc outlet pgmchange outlet chnpressure outlet pitchbend

    pd noteon pd keypressure pd cc pd pgmchange pd chnpressure pd pitchbend

    midiin

    Figure 56: Linterno dimidianalyzetutti gli altri messaggi saranno formati da una lista di tre interi, due per idati, uno per il canale.

    In figura (fig. 57) mostrata la subpatch che interpreta e resistuisce la listadei messaggi di Program Change. Se lo STATUS BYTE compreso fra192 e 207, lalgoritmo fa un AND restituendo 1 se entrambe le condizionisono 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 dientrare in list append, dove verr unito al numero di canale.

    spigot

    t f f f

    list append

    >= 192

  • 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 vieneemesso un bang che fa uscire la lista e permette che questa venga unita alterzo elemento, cio il numero del canale.

    spigot

    = 144

    outlet noteon

    inlet statusinlet data

    &&

    Figure 58: La subpatch che restituisce la lista dei messaggi Note ONTutte le altre subpatches delloggetto midianalyze funzionano come quelleche abbiamo appena analizzato. Lasciamo al lettore la possibilit di ri-costruirle.

    6.2.2 ALTRI OGGETTI MIDI

    Una volta capito il funzionamendo dei messaggi MIDI ed aver implemen-tato loggetto midianalyze non ci sar bisogno di soffermarsi troppo sugli

    63

  • oggetti che in Pd si occupano del MIDI. Nella maggioranza dei casi glioggetti avranno una versione per linput dei dati e una per loutput. Nediamo di seguito un elenco (parziale):

    oggetti descrizione

    midiin/midiout dati MIDI grezzinotein/noteout Note ONpgmin/pgmout Program Changebendin/bendout Pitch Bendctlin/ctlout Control Changetouchin/touchout Channel Pressurepolytouchin/polytouchout Polyphonic Key Pressure

    Oltre a tali oggetti, ce ne sono altri legati alla gestione di eventi MIDI.Esaminiamo due oggetti, uno per la manipolazione di eventi Note ON inentrata, un altro per gli stessi tipi di eventi in uscita.

    Loggetto stripnote riceve coppie di valori (pitch,velocity) e lascia passaresltanto quelle coppie che hanno velocity diversa da zero. Pu essere utilequando necessario processare soltanto le altezze, evitando cos la ripe-tizione del pitch. Infatti ogni volta che un messaggio note ON ricevuto, seguito sempre da un altro messaggio, con lo stesso pitch, ma con velocityuguale a zero. Piuttosto che fare un esempio di uso di stripnote, proviamoad implementare un oggetto che faccia la stessa cosa (fig. 59).Loggetto makenote riceve coppie di valori (pitch,velocity), li fa uscire e ag-giunge un messaggio con lo stesso pitch, ma con velocity uguale a zero.In pratica chiude un evento Note ON. Pu avere due argomenti: velocityiniziale e durata della nota.Un esempio di makenote sar spiegato nella prossima sezione, dove verrimplementata una versione del brano di Steve Reich Piano Phase.

    6.3 UN ESEMPIO DI EDITING ALGORITMICO MIDI

    Nel 1967 il compositore americano Steve Reich compose un brano per duepianoforti intitolato Piano Phase che esplorava la tecnica del dephasing.Un pattern di 12 semicrome viene eseguito allunisono e in ostinato dai duepianisti. Dopo un certo numero di ripetizioni il secondo pianista aumentaleggermente la velocit in modo da produrre una sfasatura fra le due frasi,

    64

  • 60 64

    60 0

    70 25

    unpack 0 0

    != 0

    *

    t f f

    moses 1

    spigot

    t f f

    print pitch print vel

    Figure 59: Loggetto clone di stripnotesfasatura che si allarga fino a far si che i due pattern non si ritorvano dinuovo sovrapposti esattamente, ma ad una nota di distanza. I due pianistia questo punto suonano per un po allo stesso tempo per poi ricominciare ilprocesso, fino a che, completato il giro di tutte e 12 le note, non si ritrovanoallunisono. A quel punto il primo pianista viene lasciato solo per un po einizia la seconda parte del brano, della quale non ci occuperemo.

    Per implementare tale algoritmo necessario formalizzare il problema. Laquestione principale da risolvere data dal fatto che, mentre uno dei pi-anisti suona a velocit costante (avremo, intuitivamente, un oggetto metroche non cambia mai, il secondo pianista suona alla stessa velocit del primoper un po, poi accelera per sfasare i pattern poi torna alla velocit inizialenon appena i pattern non sono sovrapposti esattamente a una nota di dis-tanza.

    Bisogna quindi stabilire:

    65

  • quanti pattern i pianisti suonano allo stesso tempo; qual il tempo costante; qual il tempo del secondo pianista che produce la sfasatura; quanti pattern sono necessari perch i pattern si reincontrino esatta-

    mente a una nota di distanza;

    Convenzionalmente scegliamo che i pianisti suoneranno quattro patternallo stesso tempo, poi il secondo pianista inizier a suonare pi veloce-mente. Se suonasse ogni nota 1 millesimo di secondo pi velocementedel primo, alla fine del suo pattern avr guadagnato 12 millisecondi. Persemplicit quindi assumiamo che ogni durata del primo pianista sar unmultiplo di 12, per esempio 144 millisecondi. In questo modo dopo 12esecuzioni del pattern i due si ritrovano nuovamente in fase.Riassumendo:

    4 pattern in fase con durata di 144 ms per nota 12 pattern dove il primo pianista suona a 144 ms e il secondo a 143

    ms

    il ciclo ricomincia a una nota di distanza.

    Pima di tutto implementiamo la sequenza a velocit costante (fig. 60).Loggetto metro collegato ad un contatore che enumera le 12 note del pat-tern, ovviamente espresse in altezze MIDI. Loggetto list-nth riceve la listadelle altezze e nel suo inlet destro lindice della lista da far uscire dalloutlet.Infine makenote formatter ogni altezza in modo che abbia velocity pari a 64e durata di 120 ms.Come detto, il secondo pianista suoner la stessa cosa, variando per la ve-locit. Lalgoritmo sar identico (fig. 60) cln le sole differenze che linlet de-stro di metro ospita le due possibili velocit di esecuzione e che loggetto no-teout invier i dati al secondo pianoforte, sul secondo canale MIDI. Sarannoquindi caricati nelleventuale gestore dei suoni due pianoforti, uno sulprimo, laltro sul secondo canale.Infine la parte pi interessante dellalgoritmo. Un contatore (fig. 62) enu-mera ogni pattern del pianista di sinistra, con modulo 16, in modo dacontare da 0 a 15. Un selettore poi emette un bang quando il contatore

    66

  • noteout 1

    list-nth

    64 66 71 73 74 66 64 73 71 66 74 73

    + 1f 0

    t f b

    0

    % 12

    t b f

    makenote 64 120

    metro 144

    Figure 60: La sequenza a velocit costanteraggiunge lo zero e il 4, cio linizio della parte in fase e linizio di quella avelocit diverse. Quando il selettore banga in corrispondenza di uno zeroin entrata, metro riceve 144 nel suo inlet destro. Quando invece c il 4 metroviene settato a 143 finch il contatore non torna a zero.Lalgoritmo cos concluso, ma se lo eseguiamo ci rendiamo conto chelesecuzione molto poco umana. Proviamo a modificare la patch in modoche ogni nota abbia una velocity leggermente diversa (fig. ??). Il risultatoche si ottiene leggermente pi realistico.Allo stesso modo si possono fare altre migliorie, come ad esempio ac-centare alcune note del pattern, aumentare il range dinamico, o inserireil pedale di risonanza (che gestito dal controller 64 dello standard MIDIcon un normale messaggio di tipo Control Change) e altro, ma lasciamo allettore il divertimento di sperimentare eventuali modifiche alla patch.

    67

  • noteout 1

    list-nth

    64 66 71 73 74 66 64 73 71 66 74 73

    + 1f 0

    t f b

    0

    % 12

    t b f

    makenote 64 120

    metro 144

    144 143

    list-nth

    64 66 71 73 74 66 64 73 71 66 74 73

    + 1f 0

    t f b

    0

    % 12

    t b f

    makenote 64 120

    metro 144

    noteout 2

    Figure 61: I due pianisti virtuali di Piano Phase

    68

  • noteout 1

    list-nth

    64 66 71 73 74 66 64 73 71 66 74 73

    + 1f 0

    t f b

    0

    % 12

    t b f

    makenote 64 120

    metro 144

    sel 00

    % 16

    sel 0 4

    + 1f 0

    144 143

    list-nth

    64 66 71 73 74 66 64 73 71 66 74 73

    + 1f 0

    t f b

    0

    % 12

    t b f

    makenote 64 120

    metro 144

    noteout 2

    reset counter

    Figure 62: Il contatore che regola la velocit di esecuzione del pattern

    69

  • noteout 1

    list-nth

    64 66 71 73 74 66 64 73 71 66 74 73

    + 1f 0

    t f b

    0

    % 12

    makenote 64 120

    metro 144

    sel 00

    % 16

    sel 0 4

    + 1f 0

    144 143

    list-nth

    64 66 71 73 74 66 64 73 71 66 74 73

    + 1f 0

    t f b

    0

    % 12

    makenote 64 120

    metro 144

    noteout 2

    reset counter

    t b f b

    random 32

    + 48

    random 32

    + 48

    t b f b

    Figure 63: La sequenza a velocit costante

    70

  • 7 OGGETT I GU INel corso dei nostri primi esperimenti abbiamo gi avuto modo di incon-trare alcuni oggetti grafici, che nellambito del mondo informatico sonodette GUI (graphical user interfaces). Pd mette a disposizione un certo nu-mero di GUIs, alcuni nativi, cio facenti parte del pacchetto standard delprogramma, altri derivati da librerie esterne, la maggior parte delle qualisono caricate nella versione extended. Genericamente possiamo dire chetutte le GUI di Pd possono essere configurate tramite le properties, accessi-bili 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 moltissimevolte. toggle invece un oggetto molto utile che permette di restituire 1quando attivo, 0 quando disattivo. Praticamente una variabile binariache si attiva con un click del mouse. Quando attivato mostra una croceallinterno del quadrato che la costituisce (figura 64).

    Pd offre due tipi di slider, che sono delle leve attivabili con il mouse o daaltri oggetti. Fra le due non c alcuna differenza se non nel fatto che un

    71

  • tipo verticale, laltro orizzontale. Dalle propriet si pu impostare ladimensione, ma soprattutto il range delloutput.

    1 0

    metro 500

    int 1 + 1

    mod 2

    sel 0

    Figure 64: loggetto toggleNella figura 64 il toggle pi grande attiva un oggetto metro che a sua voltamanda dei bang a un contatore che attraverso loggetto mod conta solo da0 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 verticaledi sinistra pilota gli altri due: quello di destra attraverso expr effettua ilmovimento contrario, mentre quello di sotto si muove in parallelo, ma som-mato a un movimento continuo generato dallalgoritmo a sinistra. metroattiva un contatore da 0 a 1. Il valore in uscita viene moltiplicato per unaltro valore che va da 0 a 20, gestito dallo slider principale. Il prodottodi questi due fattori diventa il valore-obiettivo delloggetto line che crea ilmovimento dello slider in basso. C da notare che ci sono due oggetti r,cio receive, ma non c nessun send! Le GUI infatti possono mandare o rice-vere messaggi senza bisogno di creare oggetti e supplementari. Possiedonodegli oggetti send e receive incorporati che possono essere impostati dalle

    72

  • line

    $1 90

    int 1 + 1

    mod 2

    * 10

    +

    manovrare_da_qui

    r slide

    expr ($f1 / 127) * 20

    r slide

    expr (127 - $i1)

    metro 100

    Figure 65: lo slider verticale a sinistra pilota gli altri dueproperties della GUI stessa.

    I radio button sono oggetti formati da barrette orizzontali o verticali cos-tituite da caselle ordinate. Luscita il numero della casella a partire daquella pi a sinistra nel caso di radio button orizzontali, e da quella pi inalto nel caso di verticali. Ricordiamo che il conteggio inizia dallo 0, quindiun radio button di 16 elementi, avr un output che va da 0 a 15. In figura66 due radio button disegnano un grafico. Unica annotazione, i valori delradio button verticale vengono invertiti per consentire un migliore adesione

    73

  • al grafico, cos il primo valore in alto diventa 9 in luogo di zero, il secondo8 invece che 1, etc. . . .

    tabwrite array1

    r ascissaexpr (9 - $i1)

    r ordinata

    array1

    Figure 66: impostare prima lindice (radio button) orizzontale, poi il valore conquello verticale

    74

  • Della GUI VU-meter avremo modo di scrivere nella parte che riguardalaudio, mentre possiamo ora accennare alle canvas che sono oggetti sem-plici che servono a connotare graficamente le nostre patch in modo dacaratterizzare con i colori alcune zone della finestra. Possono essere utiliin patch molto articolate dove c bisogno di rendere riconoscibili le varieparti dellalgoritmo. Infine loggetto number2 molto simile alla normalenumber box con qualche possibilit in pi di configurazione grafica.

    7.1 ALTRE GUI DALLE LIBRERIE DI PD

    Oltre alle GUI native che abbiamo appena discusso, diamo ora una panoram-ica veloce di alcune altre GUI introdotte con le nuove librerie:

    - grid

    - gcanvas

    - knob

    - envgen

    grid e gcanvas sono molto simili, sono due griglie bidimensionali che emet-tono la posizione del mouse (x, y) dai due outlet alla pressione di questultimo.knob la classica manopola tipo sintetizzatore analogico. Ha ununica us-cita che emette loutput nel range impostato nelle properties. Infine loggettoenvgen un envelope generator che emette dati in un formato compatibilecon la versione audio di line, cio line , del quale tratteremo approfondi-tamente nella parte di questo manuale dedicata allaudio.

    Prima di concludere questo capitolo, va ricordato che luso massiccio diGUI nelle patch sconsigliato. La grafica vettoriale che sta alla base ditali oggetti pu rallentare la capacit di calcolo quindi quando possibileevitarne luso, si eviti. Ad esempio in luogo dei bang grafici si cerchi diusare loggetto relativo bang o b. Non importante la bellezza estetica diuna patch quanto la sua chiarezza, quindi meglio evitare troppi oggettigrafici e abbondare, al contrario, di subpatches e annidamenti.

    75

  • Part II

    AUD IO

  • 8 LAUD IO D IG I TALE8.1 LOSCILLATORE

    Il suono pi semplice che pu essere prodotto sinteticamente quello gen-erato da un oscillatore. Nel mondo analogico un oscillatore un circuito chegenera forme donda di vari tipi, anche se generalmente se non si specificaaltro si parla di oscillatore intendendo un generatore di onde sinusoidali.Un onda sinusoidale unonda generata da una funzione sinusoidale (vedifig. 67), che si pu esprimere tramite la formula:

    y = A sin(2pi f x + )

    dove A lampiezza dellonda, tipicamente impostata ad 1, quindi i valoridella funzione oscillano fra 1 e -1, 2pi f = 2pi la frequenza angolare cheindica quanti periodi ci sono in un intervallo di 2pi, 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 perme-tte di anticipare o ritardare i valori della funzione1.

    Per produrre una sinusoide con un calcolatore necessario fare uso di unoscillatore digitale, un algoritmo che produca i valori della funzione sinu-soidale, ossia delle ampiezze dellonda. A differenza di un segnale elettrico,che continuo, il calcolatore pu solo produrre segnali discreti, quindiloscillatore digitale calcola i valori della funzione il numero delle volte in-dicato dalla frequenza di campionamento. Ad esempio se la frequenza dicampionamento 44100 hertz, loscillatore calcola i valori della funziona44100 volte al secondo. Questa frequenza di campionamento approssimerla forma donda desiderata, pur non riuscendo a costruirne una identica aquella analogica (fig. 68).

    1 http://it.wikipedia.org/wiki/Sinusoide

    77

  • Parametri di una sinusoide

    tempo

    ampiezza

    21

    01

    2

    21

    01

    2