<< Chapter < Page Chapter >> Page >
La produzione di fenomeni oscillatori è un aspetto frequente di molte realizzazioni interattive. Vengono descritte tecniche di riproduzione di oscillazioni di varia forma e frequenza. Inoltre, si presenta il buffer circolare come struttura di supporto alla manipolazione continua del tempo.

Tra i pattern emergenti nel design dell'interazione, si nota la necessità di produrrefenomeni oscillatori, di tipo uditivo o visuale. La gestione più versatile di questi fenomeni si fa mediante array contenenti un periodo del fenomeno oscillatorio da produrre.

L'oscillatore tabellare

L'approccio più classico e versatile alla sintesi di forme d'onda periodiche è la lettura ciclica di una tabellacontenente un periodo della forma d'onda periodica da generare. Detto buf[] il buffer (è un array) contenente la forma d'onda da generare, l'oscillatoretabellare funziona per lettura ciclica della tabella, con un passo di avanzamento I B f R , dove B è la lunghezza del buffer, f è la frequenza (numero di oscillazioni al secondo) che si vuole generare, e R è il rate (frequenza di campionamento) al quale si vuole produrre l'oscillazione.

Onda propagantesi

Per dare l'illusione di una onda prodotta da un gesto di interazione e propagantesi in una certa direzione si puòfare uso dell'oscillatore tabellare. Nel codice che segue il buffer viene precaricato con un periodo di sinusoide. Ilpunto in cui l'utilizzatore clicca sulla finestra determina la posizione iniziale della cresta, e viene generata unaoscillazione la cui frequenza è impostata tramite la variabile f . int B = 256; // lunghezza di tabella (risoluzione)int R = 20; // rate float f = 0.8; // frequenza in cicli al secondofloat[] buf = new float[B]; int HEIGHT = 128; // altezza della finestrafloat amp; // ampiezza della oscillazione int readPoint; // posizione orizzontale della crestafloat decayFactor = 0.95; // fattore di decadimento dell'onda void setup() {size(B,HEIGHT); stroke(255); strokeWeight(2);for (int i = 0; i<buf.length; i++) buf[i] = sin(2*PI*(float)i/buf.length);} void draw() {background(0); if ((mouseX>= 0)&&(mouseX<B)&&(mousePressed)) { amp = 2*(HEIGHT/2 - mouseY)/float(HEIGHT);readPoint = mouseX; }for (int i = 0; i<buf.length; i++) { point(i, HEIGHT - HEIGHT/2 - HEIGHT/2*amp*buf[(i - readPoint + B/4 + B)%B]); }amp = decayFactor*amp; readPoint = (readPoint + round(f*B/R))%B; // incremento dell'oscillatore}

Si renda la frequenza di oscillazione dipendente dalla lunghezza dell'intervallo di tempo durante il quale iltasto del mouse viene tenuto premuto.

int B = 256; // lunghezza di tabella (risoluzione) int R = 20; // ratefloat f = 1.1; // frequenza in cicli al secondo float[]buf = new float[B];int HEIGHT = 128; // altezza della finestra float amp; // ampiezza della oscillazionefloat readPoint; // posizione orizzontale della cresta float decayFactor = 0.92; // fattore di decadimento dell'ondafloat tempo; void setup() {size(B,HEIGHT); stroke(255); strokeWeight(2);for (int i = 0; i<buf.length; i++) buf[i] = sin(2*PI*(float)i/buf.length);} void mousePressed() {tempo = millis(); }void mouseReleased() { tempo = millis() - tempo; println(tempo);f = 500/tempo; }void draw() { background(0);if ((mouseX>= 0)&&(mouseX<B)&&(mousePressed)) { amp = 2*(HEIGHT/2 - mouseY)/float(HEIGHT);readPoint = mouseX; }for (int i = 0; i<buf.length; i++) { point(i, HEIGHT - HEIGHT/2 - HEIGHT/2*amp*buf[(i - round(readPoint) + B/4 + B)%B]); }amp = decayFactor*amp; readPoint = (readPoint + (f*B/R))%B; // incremento dell'oscillatore}

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Programmazione di artefatti interattivi. OpenStax CNX. Dec 09, 2010 Download for free at http://cnx.org/content/col10417/1.9
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Programmazione di artefatti interattivi' conversation and receive update notifications?

Ask