<< Chapter < Page | Chapter >> Page > |
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'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
,
dove
è la lunghezza del buffer,
è la frequenza (numero di oscillazioni al secondo) che si vuole generare, e
è il rate (frequenza di campionamento) al quale si vuole produrre l'oscillazione.
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}
Notification Switch
Would you like to follow the 'Programmazione di artefatti interattivi' conversation and receive update notifications?