Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

Permutation Mausinteraction

8. Dezember 2010

Mit Processing haben wir parallel im Kurs «Technologie 1»ein interaktives programm Programmiert. Mit welchem wir später zu einem Musikstück performen mussten. Bei meinem Programm wird die Musik direkt durch, das einsetzen der Minim Bbiliothek, importert. Und eine Grundanimation liegen den Zeichen zugrunden. Nàmlich eine Skalierung und Alphawert abhänging von dem Beat, sowie eine Rotation abhängig von der Amplitude. Mit der Maus kann man die Rotation auch beinflussen. Nähert man sich einem Zeichen wenden sich die Kreise von der Maus ab und das Zeichen selber wird kleiner. Desweitere kann ich durch die Maus und die Tastatur entscheiden, ob Kreise oder Quadrate angezeigt werden sollen. Und ob sich nur die schwarzen Zeichen oder nur die Weissen oder beide bewegen sollen.
import ddf.minim.*;
import ddf.minim.analysis.*;
import fullscreen.*;

FullScreen fs;
Minim minim;
AudioPlayer groove;
WaveformRenderer waveform;
BeatDetect beat;
float eRadius;

signDev  sign;
float[] left;
int anzahl = 21, anzSign = 6;
boolean form,farbe,space,p = false;
int[] xP = {0,0,0,0,0,0};
int[] r  = { 87,77,63,54,42,36};
int[] yP = {0,0,0,0,0,0};
boolean[] cS = {true,false,true,false,true,false};
boolean[] cF = {true,false,true,false,true,false};
int wS = 600;//850;
int rand = 10;
int permutationsIndexList = 0;
//

void setup()
{
 fs = new FullScreen(this);
 fs.enter();
 //
 size(wS,wS);
 background(255);
 minim = new Minim(this);
 groove = minim.loadFile("sound.mp3", 2048);
 waveform = new WaveformRenderer();
 groove.addListener(waveform);
 groove.play();
 beat = new BeatDetect();
 groove.pause();
 eRadius = 20;
 smooth();
 sign = new signDev();
 sign.add(1,anzSign,xP,yP,r,cS,cF);
 background(255);
 //noLoop();
}
void draw()
{
 background(255);
 beat.detect(groove.mix);
 float wave = map(waveform.wave(), -30, 30 ,0,360);
 float a = map(eRadius, 5, 10, 200, 255);
 if ( beat.isOnset() ) eRadius = 10;
 eRadius *= 0.95;
 if ( eRadius < 5 ) eRadius = 5;
 //sprintln(wave);
 sign.draw(anzahl,permutationsIndexList,rand,form,farbe,space,wave,a,eRadius);

 switch(key)
 {
 case 's':
 save("permutation_"+hour()+"-"+minute()+"-"+second()+".jpg");
 break;
 case 'p':
 if(p==false){
 groove.pause();
 }else{
 groove.play();
 }
 break;
 case 'l':
 groove.loop(10);
 break;
 default:
 if (key == CODED) {
 if (keyCode == UP) {
 form = true;
 // println("up");
 } else if (keyCode == DOWN) {
 form = false;
 //println("down");
 }
 if (key == CODED && space == true) {
 if (keyCode == LEFT){
 farbe = false;
 //println('l');
 }else if(keyCode == RIGHT){
 farbe = true;
 // println('r');
 }
 }

 }
 break;
 }

}

void keyPressed()
{
 switch(key)
 {
 case ' ':
 space = true;
 break;
 case 'p':
 if(p==false){
 p = true;
 }else{
 p=false;
 }
 break;
 }
}
void keyReleased(){
 switch(key)
 {
 case ' ':
 space = false;
 break;
 }

}

void stop()
{
 groove.close();
 minim.stop();
 super.stop();
}

KLASSEN:

class Sign
{
 int   _index, _anzObj, _rotat;
 float _dis,_PosX,_PosY;
 float _alpha, _scale,_dirx,_diry;
 float _aRangeScale,_oRangeScale;
 int[] _xP = new int[6];
 int[] _yP = new int[6];
 int [] _r = new int[6];
 boolean [] _cS  = new boolean [6];
 boolean [] _cF = new boolean [6];

 Sign(int sindex,int anzObj, int[] xP,int [] yP,int [] r
 ,boolean [] cS ,boolean [] cF)
 {
 _index = sindex;
 _anzObj = anzObj;
 _xP = xP;
 _yP = yP;
 _r  = r;
 _cS = cS;
 _cF = cF;
 _alpha = 1;
 _scale = 1;
 _aRangeScale = 0.5;
 _oRangeScale = 1;
 _dis = 0;
 _PosX = 0;
 _PosY = 0;
 _rotat = 0;
 _dirx= 0;
 _diry = 0;
 }
 void display(boolean form,boolean farbe, boolean space,float wave,float a, float eRadius)
 {
 pushMatrix();
 pushStyle();
 rotate(wave);
 //scale(.5);
 scale(_scale*.5);
 int c = 0;
 int b = 0;
 for(int i=0; i< _anzObj; i++)
 {
 smooth();
 ellipseMode(CENTER_RADIUS);
 rectMode(CENTER);
 noStroke();

 fill(_cF[i]?0:255,_cF[i]?a:255);
 if(_cF[i] == false)
 {
 if(form)
 if(space && farbe)
 rect(_xP[i],_yP[i],((_r[i]*2*eRadius)*eRadius),(_r[i]*2*eRadius));
 else
 rect(_xP[i]-_dirx*i,_yP[i]-_diry*i,(_r[i]*2*eRadius),(_r[i]*2*eRadius));
 else
 if(space && farbe)
 ellipse(_xP[i],_yP[i],(_r[i]*eRadius),(_r[i]*eRadius));
 else
 ellipse(_xP[i]-_dirx*i,_yP[i]-_diry*i,(_r[i]*eRadius),(_r[i]*eRadius));
 c++;
 }
 else
 {
 if(form)
 if(space && farbe == false)
 rect(_xP[i],_yP[i],(_r[i]*2*eRadius),(_r[i]*2*eRadius));
 else
 rect(_xP[i]-_dirx*i,_yP[i]-_diry*i,(_r[i]*2*eRadius),(_r[i]*2*eRadius));
 else
 if(space && farbe == false)
 ellipse(_xP[i],_yP[i],(_r[i]*eRadius),(_r[i]*eRadius));
 else
 ellipse(_xP[i]-_dirx*i,_yP[i]-_diry*i,(_r[i]*eRadius),(_r[i]*eRadius));
 b++;
 }
 }
 popStyle();
 popMatrix();
 }

}


class signDev
{
 ArrayList _signs;
 float xStep = 80;
 float yStep = 80;
 PVector mPos = new PVector();
 PVector Pos = new PVector();
 signDev()
 {
 _signs = new ArrayList();
 }

 void add(int idx,int anzObj, int[] xP,int [] yP,int [] r
 ,boolean [] cS ,boolean [] cF){
 _signs.add(new Sign(idx,anzObj,xP,yP, r ,cS ,cF));
 }

 void draw(int anzahl,int i,int rand, boolean form, boolean farbe,
 boolean space,float wave,float a,float eRadius)
 {

 pushMatrix();

 int     permutationsIndex = 0;
 if(form)
 translate(rand/3,rand/3);
 else
 translate(rand,rand);
 //translate(-200,-200);
 for(int y=0; y<anzahl;y++)
 {
 pushMatrix();
 for(int x=0; x<anzahl;x++)
 {
 Sign sign = (Sign) _signs.get(i);
 sign._PosX = rand + (xStep * x);
 sign._PosY = rand + (yStep * y);
 Pos.set(sign._PosX,sign._PosY,0);
 mPos.set(mouseX,mouseY,0);
 PVector dir = PVector.sub(Pos,mPos);
 sign._dis = dir.mag();
 //
 float hr = map(sign._dis,0.0,5,1,2);
 /*PVector cent = new PVector();
 cent.set(sign._PosX,sign._PosY,0);
 float angleMouse = atan2(mPos.y - cent.y, mPos.x - cent.x);
 */
 sign._dirx = (dir.x/hr);
 println(dir.x/hr);
 sign._diry = (dir.y/hr);
 //
 float mapX= map(sign._dis, 0.0, width ,1,0);
 float mapY= map(sign._dis, 0.0, height ,1,0);
 float t = mapY + mapX;
 sign._scale = map(t, 0.0, 2 ,sign._oRangeScale,sign._aRangeScale);
 sign._alpha = map(t, 0.0, 2 ,1,0.5);
 sign._rotat = (int)map(sign._dis, 0.0, width ,0,360);
 sign.display(form,farbe,space,wave,a,(eRadius/10));
 translate(xStep,0.0f);
 ++permutationsIndex;

 }
 popMatrix();
 translate(0.0f,yStep);
 }
 popMatrix();

 }
}


class WaveformRenderer implements AudioListener
{
 private float[] left;
 private float[] right;

 WaveformRenderer()
 {
 left = null;
 right = null;
 }

 synchronized void samples(float[] samp)
 {
 left =  samp;

 }

 synchronized void samples(float[] sampL, float[] sampR)
 {
 left = sampL;
 right = sampR;
 }

 synchronized int wave()
 {
 if ( left != null && right !=null)
 {
 return (int)((left[1]*50)+(right[1]*50));
 }else
 return 0;
 }

}

Verwendete Bibliotheken : - minim - fullscreen