Introduzione

Nei primi due articoli della serie abbiamo visto come Processing permetta di creare applicazioni grafiche e animazioni in modo semplice e intuitivo. Ma le potenzialità di questo ambiente vanno ben oltre la grafica: esistono numerose librerie sviluppate dalla comunità open source che permettono di gestire video, audio, accesso ai dati tramite database o XML, e comunicazione in rete tramite web services. In questo articolo esploreremo le principali librerie esterne che estendono le funzionalità di Processing, permettendoci di creare applicazioni multimediali complete e di realizzare visualizzazioni di dati provenienti da fonti diverse.

line(i, 150 + song.right.get(i)*50, i+1, 150 + song.right.get(i+1)*50);
}

Oppure, volendo analizzare lo spettro sonoro invece che la forma d'onda, potremmo usare l'oggetto FFT (Fast Fourier Transform[4]).

setup()
{
...
//Creo l'oggetto FFT passando la grandezza del buffer
//del segnale e la sua frequenza di campionamento
fft = new FFT(song.bufferSize(), song.sampeRate());
...
}

draw()
{
//Prima analizzo un canale audio (left, right o mix)
fft.forward(song.mix);

//per ogni valore dello spettro calcolato
//disegno una linea con l'ampiezza relativa
//alla frequenza i getBand(i)
for(int i = 0; i < fft.specSize(); i++)
{
line(i, height, i, height - fft.getBand(i)*4);
}
}

Accesso ai dati

Uno dei possibili usi di Processing è sviluppare animazioni, e per questo abbiamo visto come gestire immagini, video e audio. L'altro grosso uso di Processing è la visualizzazione di dati. A questo scopo esistono svariate librerie realizzate dalla community open source che si è sviluppata attorno a Processing. Di queste ne vedremo due: una per l'accesso a database e una per la gestione di file XML.

Database

La libreria Processing-MySQL[5], è un "mini-wrapper](attorno al JDBC driver per MySQL, sviluppato con lo scopo di permettere un utilizzo immediato e tralasciando gli scenari d'uso complessi. Quello che segue è un esempio di codice per accedere ad una ipotetica tabella utenti.

MySQL msql = new MySQL( "localhost", database, user, pass, this );
msql.connect()
msql.query( "SELECT * FROM USERS]();
while (msql.next()) {
println(msql.getString("name"));
}
mysql.close( );

L'accesso al database da applet Java è però problematico: le policy di sicurezza permetto l'accesso solo al server dal quale la applet è stata scaricata (a meno che non sia digitalmente firmata), e inoltre chiunque potrebbe leggere, decompilando l'applet, la stringa di connessione e quindi connettersi a sua volta al database. Per questi motivi è preferibile, nel caso di sviluppo di applicativi remoti, l'utilizzo di XML.

XML

Con la core library di Processing è disponibile una API molto semplice e compatta per leggere file XML. Si basa sull'oggetto XMLElement e permette di interrogare l'albero dell'XML DOM per ottenere gli elementi presenti nell'XML:

XMLElement xml = new XMLElement(this, "feed.xml");
XMLElement item = xml.getChild("channel/author");
println(item.getStringAttribute("email"));

Nel caso si volessero avere maggiori funzionalità per la gestione dell'XML esiste una libreria opensource che permette di interagire con il file xml in maniera più completa: si chiama proXML[6].

Rete e Web Services

Con le librerie XML appena esposte è possibile accedere anche a file che si trovano su server remoti, ma con Processing è possibile anche interrogare e ricevere dati da webservices. La libreria di networking presente all'interno di Processing permette di usare in maniera semplificata la socket per scrivere e leggere dati direttamente dalla rete, ma come al solito la comunità open source ci è venuta in aiuto semplificando l'utilizzo di quello che è attualmente lo standard de-facto per la comunicazione client-server: web services.

Xmlrpclib[7] di Burak Arikan fornisce un'API per interrogare servizi remoti che espongono delle webAPI basate sul protocollo XMLRPC. Switchboard[8] di Jeff Crouse permette invece di accedere alle informazioni esposte da molti dei servizi web 2.0 più famosi: Google, Yahoo, Del.icio.us, Amazon, ecc.

Altre librerie interessanti

La community opensource ha prodotto un'infinità di librerie [9] per estendere Processing. In questo paragrafo ne vedremo alcune:

  • Simulazioni fisiche:
  • Phisics [10], di Jeffrey Traer Bernstein, è un motore di simulazione fisico per particelle: calcola la posizione di "punti](sottoposti ad attrito, gravità e forze varie
  • CellNoise[11], di Carl-Johan Rosén. è un algoritmo per generare valori randomici che però siano generati secondo la distribuzione di Poisson, quindi in maniere da sembrare più naturali.
  • Computer Vision:
  • WebcamExtra[12] è una libreria general purpose per elaborare le immagini acquisite da una webcam. Basata su di essa, FaceDetect[13], permette di riconoscere visi all'interno delle immagini acquisite.
  • Integrazione con l'Hardware:
  • Il SMS[14], Sudden Motion Sensor, è presente in tutti i laptop Apple dal 2005 in poi: questa libreria permette di interagire con esso.
  • Sempre sviluppato da Daniel Shiffman, Most Pixel Ever[15], permette di realizzare animazioni multi-schermo, su schermi collegati a computer differenti.

Conclusioni

In questo articolo abbiamo fatto una veloce carrellata delle principali librerie che permettono a Processing di interagire con l'esterno: video, audio, accesso alla rete. Ora che abbiamo gli strumenti per poter usare proficuamente queste librerie, nel prossimo articolo vedremo quali sono i concetti teorici che stanno dietro alla realizzazione di una "visualizzazione di dati".

Riferimenti

  • [1] ESS Audio library
  • [http://www.tree-axis.com/Ess/](http://www.tree-axis.com/Ess/)
  • [2] SONIA SOUND LIBRARY for Java and Processing
  • [http://sonia.pitaru.com/](http://sonia.pitaru.com/
  • [3] Minim audio library
  • [http://code.compartmental.net/tools/minim/](http://code.compartmental.net/tools/minim/
  • [4] Wikipedia - Fast Fourier transform
  • [http://en.wikipedia.org/wiki/Fast_Fourier_transform](http://en.wikipedia.org/wiki/Fast_Fourier_transform
  • [5] MySql Library for Processing
  • [http://www.bezier.de/mysql/](http://www.bezier.de/mysql/
  • [6] proXML
  • [http://www.texone.org/proxml/](http://www.texone.org/proxml/
  • [7] xmlrpclib - XML-RPC library for Processing
  • [http://plw.media.mit.edu/people/arikan/xmlrpclib/](http://plw.media.mit.edu/people/arikan/xmlrpclib/
  • [8] Switchboard - web service library for Processing
  • [http://switchboard.sourceforge.net/](http://switchboard.sourceforge.net/
  • [9] Processing.org - Elenco delle librerie esterne
  • [http://www.processing.org/reference/libraries/index.html](http://www.processing.org/reference/libraries/index.html
  • [10] traer.physics
  • [http://www.cs.princeton.edu/%7Etraer/physics/](http://www.cs.princeton.edu/%7Etraer/physics/
  • [11] CellNoise
  • [http://carljohanrosen.com/processing/](http://carljohanrosen.com/processing/
  • [12] JMyron cross-platform video capture library
  • [http://webcamxtra.sourceforge.net/](http://webcamxtra.sourceforge.net/
  • [13] Face detect library per Mac
  • [http://tokage.cafe24.com/facedetect/](http://tokage.cafe24.com/facedetect/
  • [14] Processing Sudden Motion Sensor Library
  • [http://www.shiffman.net/p5/sms/](http://www.shiffman.net/p5/sms/
  • [15] The Most Pixels Ever
  • [http://www.mostpixelsever.com/](http://www.mostpixelsever.com/