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