From e28f168cec8ae5a8c25cae159af94f5b0aa7b342 Mon Sep 17 00:00:00 2001 From: Alexander Green Date: Fri, 6 Sep 2013 02:46:21 -0700 Subject: [PATCH] This is the working branch from my desktop, that drives the cubes well with no bugs, and displays Dan Horwitz's text. It may already be committed in another branch but I am unsure. --- .gitignore | 0 AlexGreen.pde | 40 +-- Audio.pde | 0 BenMorrow.pde | 2 +- DanHorwitz.pde | 587 +++++++++++++++-------------------------- DanKaminsky.pde | 268 +++++++++++++++++++ DanUtil.pde | 262 ++++++++++++++++++ GranimPattern.pde | 0 JR.pde | 280 ++++++++++++++++++++ JackStahl.pde | 0 MarkSlee.pde | 0 README.md | 0 SamMorrow.pde | 0 ShaheenGandhi.pde | 0 SugarCubes.pde | 17 +- TestPatterns.pde | 0 TimBavaro.pde | 0 TobySegaran.pde | 0 _Internals.pde | 43 ++- _Mappings.pde | 228 ++++++++++++---- _Overlay.pde | 9 + _PandaDriver.pde | 46 +++- code/GLucose.jar | Bin 25782 -> 25664 bytes code/HeronLX.jar | Bin code/ScreenShot.dll | Bin 0 -> 148480 bytes code/ScreenShot.jar | Bin 0 -> 1663 bytes code/oscP5.jar | Bin code/rwmidi.jar | Bin code/toxiclibscore.jar | Bin data/logo-sm.png | Bin 30 files changed, 1329 insertions(+), 453 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 AlexGreen.pde mode change 100644 => 100755 Audio.pde mode change 100644 => 100755 BenMorrow.pde mode change 100644 => 100755 DanHorwitz.pde create mode 100644 DanKaminsky.pde create mode 100755 DanUtil.pde mode change 100644 => 100755 GranimPattern.pde create mode 100755 JR.pde mode change 100644 => 100755 JackStahl.pde mode change 100644 => 100755 MarkSlee.pde mode change 100644 => 100755 README.md mode change 100644 => 100755 SamMorrow.pde mode change 100644 => 100755 ShaheenGandhi.pde mode change 100644 => 100755 TestPatterns.pde mode change 100644 => 100755 TimBavaro.pde mode change 100644 => 100755 TobySegaran.pde mode change 100644 => 100755 code/GLucose.jar mode change 100644 => 100755 code/HeronLX.jar create mode 100755 code/ScreenShot.dll create mode 100755 code/ScreenShot.jar mode change 100644 => 100755 code/oscP5.jar mode change 100644 => 100755 code/rwmidi.jar mode change 100644 => 100755 code/toxiclibscore.jar mode change 100644 => 100755 data/logo-sm.png diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/AlexGreen.pde b/AlexGreen.pde old mode 100644 new mode 100755 index 9e53975..f73c26d --- a/AlexGreen.pde +++ b/AlexGreen.pde @@ -1,4 +1,4 @@ -class SineSphere extends SCPattern { +class SineSphere extends DPat { float modelrad = sqrt((model.xMax)*(model.xMax) + (model.yMax)*(model.yMax) + (model.zMax)*(model.zMax)); private final SinLFO rs = new SinLFO(0, 180, 5000); private final SinLFO noisey = new SinLFO(modelrad/8.0, modelrad/4.0, 2300); @@ -52,34 +52,38 @@ final Sphery[] spherys; spherys[2] = new Sphery(.75*model.xMax, model.yMax/2, model.zMax/2, modelrad/20, modelrad/10, 2000); } - public void run(int deltaMs) { - float rsv = rs.getValuef(); - float noiseyv = noisey.getValuef(); - float bandv = band.getValuef(); - - spherys[1].run(deltaMs); - spherys[2].run(deltaMs); + + float rsv, noiseyv, bandv; + + public void StartRun(int deltaMs) { + rsv = rs.getValuef(); + noiseyv = noisey.getValuef(); + bandv = band.getValuef(); - for (Point p: model.points) { - + spherys[1].run(deltaMs); + spherys[2].run(deltaMs); + } + + + color CalcPoint(xyz Px) { + color c = 0; - c = blendColor(c, spherys[2].spheryvalue(p.fx, p.fy, p.fz, .75*model.xMax, model.yMax/2, model.zMax/2), ADD); - c = blendColor(c, spherys[1].spheryvalue(p.fx, p.fy, p.fz, model.xMax/4, model.yMax/4, model.zMax/2), ADD); - float distfromcenter = dist(p.fx, p.fy, p.fz, model.xMax/2, model.yMax/2, model.zMax/2); + c = blendColor(c, spherys[2].spheryvalue(Px.x, Px.y, Px.z, .75*model.xMax, model.yMax/2, model.zMax/2), ADD); + c = blendColor(c, spherys[1].spheryvalue(Px.x, Px.y, Px.z, model.xMax/4, model.yMax/4, model.zMax/2), ADD); + float distfromcenter = dist(Px.x, Px.y, Px.z, model.xMax/2, model.yMax/2, model.zMax/2); int distint = floor(distfromcenter); c = blendColor(c, color( - constrain( p.fx , 0, 360), + constrain( Px.x , 0, 360), constrain( distfromcenter, 20, 80), max(0, 100 - 10*abs(distfromcenter - noiseyv ) ) ), ADD); - - colors[p.index]=c; + return c; } - } -} + } + diff --git a/Audio.pde b/Audio.pde old mode 100644 new mode 100755 diff --git a/BenMorrow.pde b/BenMorrow.pde old mode 100644 new mode 100755 index e610155..9314c3c --- a/BenMorrow.pde +++ b/BenMorrow.pde @@ -183,4 +183,4 @@ class DriveableCrossSections extends CrossSections } } -} \ No newline at end of file +} diff --git a/DanHorwitz.pde b/DanHorwitz.pde old mode 100644 new mode 100755 index 5435e62..3b7e1d6 --- a/DanHorwitz.pde +++ b/DanHorwitz.pde @@ -1,371 +1,216 @@ -//---------------------------------------------------------------------------------------------------------------------------------- -static MidiOutput midiout; -int nNumRows = 6, nNumCols = 8; -boolean btwn (int a,int b,int c) { return a >= b && a <= c; } - -public class _P extends BasicParameter { - _P(String label, double value) { super(label,value); } - void updateValue (double value) { super.updateValue(value); } - float Val () { return getValuef(); } -} - -public class Pick { - Pick (String label, int _Def, int _Max) { Picks=_Max; Default = _Def; tag=label; } - int Cur() { return (CurCol-StartCol)*nNumRows + CurRow; } - int Picks, Default, CurRow, CurCol, StartCol, EndCol; - String tag; -} -//---------------------------------------------------------------------------------------------------------------------------------- -float xMax,yMax,zMax; -public class xyz { float x,y,z; - xyz() {x=y=z=0;} - xyz(Point p ) {x=p.fx ; y=p.fy; z=p.fz;} - xyz(float _x,float _y,float _z) {x=_x ; y=_y ; z=_z ;} - void set(float _x,float _y,float _z) {x=_x ; y=_y ; z=_z ;} - float distance(xyz b) {return dist(x,y,z,b.x,b.y,b.z); } - float dot (xyz b) {return x*b.x + y*b.y + z*b.z; } - xyz minus (xyz b) {return new xyz(x-b.x,y-b.y,z-b.z); } - xyz plus (xyz b) {return new xyz(x+b.x,y+b.y,z+b.z); } - xyz plus (float b) {return new xyz(x+b ,y+b ,z+b ); } - xyz over (xyz b) {return new xyz(x/b.x,y/b.y,z/b.z); } - xyz times (float b) {return new xyz(x*b ,y*b ,z*b ); } - - xyz RotateX (xyz o, float a) { return new xyz ( x, - cos(a)*(y-o.y) - sin(a)*(z-o.z) + o.y, - sin(a)*(y-o.y) + cos(a)*(z-o.z) + o.z); } - - xyz RotateY (xyz o, float a) { return new xyz ( cos(a)*(x-o.x) - sin(a)*(z-o.z) + o.x, - y, - sin(a)*(x-o.x) + cos(a)*(z-o.z) + o.z); } - - xyz RotateZ (xyz o, float a) { return new xyz ( cos(a)*(x-o.x) - sin(a)*(y-o.y) + o.x, - sin(a)*(x-o.x) + cos(a)*(y-o.y) + o.y, - z ); } - - - xyz setRand () { return new xyz ( random(xMax), random(yMax), random(zMax)); } - xyz setNorm () { return new xyz ( x / xMax, y / yMax, z / zMax); } - - - float interp (float a, float b, float c) { return (1-a)*b + a*c; } - xyz interpolate(float i, xyz d) { return new xyz ( interp(i,x,d.x), interp(i,y,d.y), interp(i,z,d.z)); } -} -//---------------------------------------------------------------------------------------------------------------------------------- -public class hsb { float h,s,b; - hsb(color c) { h=hue(c); s=saturation(c); b=brightness(c); } - color Out() { return color(h%360.,constrain(s,0,100),constrain(b,0,100)); } -} - -public class DPat extends SCPattern -{ - float zSpinHue; - xyz xyzMax, xyz0, xyzMid, xyzHalf; - - ArrayList picks = new ArrayList(); - int nMaxCol = 0; - boolean bIsActive = false; - float Dist (xyz a, xyz b) { return dist(a.x,a.y,a.z,b.x,b.y,b.z); } - float c1c (float a) { return 100*constrain(a,0,1); } - int mapRow (int a) { return a == 52 ? 5 : btwn(a,53,57) ? a-53 : a; } - int unmapRow (int a) { return a == 5 ? 52 : btwn(a,0 , 4) ? a+53 : a; } - void SetLight (int row, int col, int clr){ if (midiout != null) midiout.sendNoteOn(col, unmapRow(row), clr); } - void keypad (int row, int col) {} - void onInactive() { bIsActive=false; } - void onActive () { bIsActive=true; - zSpinHue = 0; - for (int i=0; i0) cNew.b = max(cNew.b,cOld.b - (1-s_Trails()) * deltaMs); - if (s_Dim ()>0) cNew.b *= 1-s_Dim (); - if (s_Saturate ()>0) cNew.s += s_Saturate()*100; - if (s_SpinHue ()>0) cNew.h += zSpinHue; - if (s_ModHue ()>0) cNew.h += s_ModHue()*360; - colors[p.index] = cNew.Out(); - } - } - - void controllerChangeReceived(rwmidi.Controller cc) { - if (cc.getCC() == 7 && btwn(cc.getChannel(),0,7)) Sliders[cc.getChannel()] = 1.*cc.getValue()/127.; - } - - float Sliders[] = new float[] {0,0,0,0,0,0,0,0}; - float s_Trails () { return Sliders[0]; } - float s_Dim () { return Sliders[1]; } - float s_Saturate () { return Sliders[2]; } - float s_SpinHue () { return Sliders[3]; } - float s_ModHue () { return Sliders[4]; } - - DPat(GLucose glucose) { - super(glucose); - xMax = model.xMax; yMax = model.yMax; zMax = model.zMax; - xyzMax = new xyz(xMax,yMax,zMax); - xyzMid = new xyz(xMax/2, yMax/2, zMax/2); - xyzHalf = new xyz(.5,.5,.5); - xyz0 = new xyz(0,0,0); - for (MidiInputDevice input : RWMidi.getInputDevices ()) { if (input.toString().contains("APC")) input .createInput (this);} - for (MidiOutputDevice output : RWMidi.getOutputDevices()) { - if (midiout == null && output.toString().contains("APC")) midiout = output.createOutput(); - } - } - - void UpdateLights(Pick P) { - if (P==null) return; - for (int i=0; i xMax/2) v.x = xMax-v.x; - if ((symm == YSym || symm == XyzSym) && v.y > yMax/2) v.y = yMax-v.y; - if (( symm == XyzSym) && v.z > zMax/2) v.z = zMax-v.z; - - NDat n = (NDat) noises.get(i); - float deg = radians(n.angle + (symm==XyzSym?45:0)); - float zx = zTime * n.speed * sin(deg), - zy = zTime * n.speed * cos(deg), - sharp = 1/constrain(2-n.sharp - 2*pSharp.Val(),0,1); - - float b = (symm==RadSym ? noise(zTime*n.speed+n.xoff-Dist(v,xyzMid)/n.xz) - : noise(v.x/n.xz+zx+n.xoff,v.y/n.yz+zy+n.yoff,v.z/n.zz+n.zoff)) - *1.8-.4 + n.den/100 + pDensity.Val() -1; - - b += n.den/100 + pDensity.Val() -1; - b = b < .5 ? pow(b,sharp) : 1-pow(1-b,sharp); - b += transAdd; - c = blendColor(c,color(n.hue,n.sat,c1c(b)),ADD); - } - return c; - } -} -//---------------------------------------------------------------------------------------------------------------------------------- -public class Play extends DPat -{ - int nBeats = 0; - _P pAmp, pRotX, pRotY, pRotZ, pRad; - Pick pTimePattern, pTempoMult, pShape; - - Play(GLucose glucose) { - super(glucose); - addParameter(pAmp = new _P("Amp" , .2 )); - addParameter(pRotX = new _P("RotX", 0 )); - addParameter(pRotY = new _P("RotY", 0 )); - addParameter(pRotZ = new _P("RotZ", 0 )); - addParameter(pRad = new _P("Rad" , .1 )); - - pTimePattern = addPick("TPat", 0 , 5 ); - pTempoMult = addPick("TMul", 5 , 6 ); - pShape = addPick("Shap", 8 , 10 ); - - lx.tempo.setBpm(30); - } - - float t,a; - xyz cPrev = new xyz(), cCur = new xyz(), cMid = new xyz(), cMidNorm; - float LastBeat=3, LastMeasure=3; - int CurRandTempo = 1; - - void StartRun(int deltaMs) { - t = lx.tempo.rampf(); - a = pAmp.Val(); - - if (t (pRad.getValuef()+.1)*100?1:0)) ); // sphere - - case 8: V = new xyz(cMid.x,cMid.y,cMid.z); - return color(0,0,c1c(1 - CalcCone(Px,V,xyzMid) * 0.02 > .5?1:0)); // cone - - } - - return color(0,0,c1c(1 - V.distance(P)/pRad.getValuef() > .5?1:0)); - } -} -//---------------------------------------------------------------------------------------------------------------------------------- \ No newline at end of file +//---------------------------------------------------------------------------------------------------------------------------------- +public class Pong extends DPat { + SinLFO x,y,z,dx,dy,dz; + float cRad; _DhP pSize; + Pick pChoose; + + Pong(GLucose glucose) { + super(glucose); + cRad = xdMax/15; + addModulator(dx = new SinLFO(6000, 500, 30000 )).trigger(); + addModulator(dy = new SinLFO(3000, 500, 22472 )).trigger(); + addModulator(dz = new SinLFO(1000, 500, 18420 )).trigger(); + addModulator(x = new SinLFO(cRad, xdMax - cRad, 0)).trigger(); x.modulateDurationBy(dx); + addModulator(y = new SinLFO(cRad, ydMax - cRad, 0)).trigger(); y.modulateDurationBy(dy); + addModulator(z = new SinLFO(cRad, zdMax - cRad, 0)).trigger(); z.modulateDurationBy(dz); + pSize = addParam ("Size" , 0.4 ); + pChoose = addPick ("Animiation" , 0 , 3 ); + } + + void StartRun(int deltaMs) { cRad = xdMax*pSize.Val()/6; } + color CalcPoint(xyz p) { + xyz v = new xyz(x.getValuef(), y.getValuef(), z.getValuef()); + switch(pChoose.Cur()) { + case 0: return color(0,0,c1c(1 - min(v.distance(p), v.distance(xyzdMax.minus(p)))*.5/cRad)); // balls + case 1: return color(0,0,c1c(1 - v.distance(p)*.5/cRad)); // ball + case 2: return color(0,0,c1c(1 - CalcCone(p,v,new xyz(xdMax/2,0,zdMax/2)) * max(.02,.45-pSize.Val()))); // spot + } + return color(0,0,0); + } +} +//---------------------------------------------------------------------------------------------------------------------------------- +public class NDat { + float xz, yz, zz, hue, sat, speed, angle, den; + float xoff,yoff,zoff; + NDat (float _hue, float _sat, float _xz, float _yz, float _zz, float _den, float _speed, float _angle) { + hue=_hue; sat=_sat; xz=_xz; yz=_yz; zz =_zz; den=_den; speed=_speed; angle=_angle; + xoff = random(100e3); yoff = random(100e3); zoff = random(100e3); + } +} + +public class Noise extends DPat +{ + int CurAnim = -1, numAnims = 6; + float zTime = random(10000), zTheta=0; + float rtime = 0, ttime = 0, transAdd=0; + int XSym=1,YSym=2,RadSym=3; + int iSymm; + ArrayList noises = new ArrayList(); + _DhP pSpeed , pDensity, pRotZ; + Pick pChoose, pSymm; + + Noise(GLucose glucose) { + super(glucose); + pRotZ = addParam("RotZ" , .5 ); pSpeed = addParam("Fast", .55); + pDensity= addParam("Dens" , .5); + pSymm = addPick("Symmetry", 0, 4); pChoose = addPick("Animation", 1, 6); + } + + void StartRun(int deltaMs) { + zTime += deltaMs*(pSpeed.Val()-.5)*.002 ; + zTheta += deltaMs*(pRotZ .Val()-.5)*.01 ; + rtime += deltaMs; + iSymm = pSymm.Cur(); + transAdd = 1*(1 - constrain(rtime - ttime,0,1000)/1000); + + if (pChoose.Cur() != CurAnim) { + noises.clear(); CurAnim = pChoose.Cur(); ttime = rtime; + switch(CurAnim) { + // hue sat xz yz zz den mph angle + case 0: noises.add(new NDat(0 ,0 ,75 ,75 ,150,45 ,3 ,0 )); pSharp.Set(1 ); break; // drip + case 1: noises.add(new NDat(0 ,0 ,100,100,200,45 ,3 ,180)); pSharp.Set(0 ); break; // clouds + case 2: noises.add(new NDat(0 ,0 ,2 ,400,2 ,20 ,3 ,0 )); pSharp.Set(.5); break; // rain + case 3: noises.add(new NDat(40 ,1 ,100,100,200,10 ,1 ,180)); + noises.add(new NDat(0 ,1 ,100,100,200,10 ,5 ,180)); pSharp.Set(0 ); break; // fire 1 + case 4: noises.add(new NDat(0 ,1 ,40 ,40 ,40 ,15 ,2.5,180)); + noises.add(new NDat(20 ,1 ,40 ,40 ,40 ,15 ,4 ,0 )); + noises.add(new NDat(40 ,1 ,40 ,40 ,40 ,15 ,2 ,90 )); + noises.add(new NDat(60 ,1 ,40 ,40 ,40 ,15 ,3 ,-90)); pSharp.Set(.5); break; // machine + case 5: noises.add(new NDat(0 ,1 ,400,100,2 ,15 ,3 ,90 )); + noises.add(new NDat(20 ,1 ,400,100,2 ,15 ,2.5,0 )); + noises.add(new NDat(40 ,1 ,100,100,2 ,15 ,2 ,180)); + noises.add(new NDat(60 ,1 ,100,100,2 ,15 ,1.5,270)); pSharp.Set(.5); break; // spark + } + } + + } + + color CalcPoint(xyz P) { + color c = 0; + xyz v = P.RotateZ(xyzMid,zTheta); + if (iSymm == XSym && v.x > xdMax/2) v.x = xdMax-v.x; + if (iSymm == YSym && v.y > ydMax/2) v.y = ydMax-v.y; + + for (int i=0;i0) P = P.RotateZ(xyzHalf, Theta.x); + if (Theta.y>0) P = P.RotateZ(xyzHalf, Theta.y); + if (Theta.z>0) P = P.RotateZ(xyzHalf, Theta.z); + + float mp = min(P.x, P.z); + float yt = map(t,0,1,.5-a/2,.5+a/2); + + switch (pShape.Cur()) { + case 0: V = new xyz(P.x, yt , P.z); break; // bouncing line + case 1: V = new xyz(P.x, map(cos(PI*t * P.x),-1,1,0,1) , P.z); break; // top tap + case 2: V = new xyz(P.x, a*map(P.x<.5?P.x:1-P.x,0,.5 ,0,t-.5)+.5, P.z); break; // V shape + case 3: V = new xyz(P.x, P.x < cMidNorm.x ? map(P.x,0,cMidNorm.x, .5,yt) : + map(P.x,cMidNorm.x,1, yt,.5), P.z); break; // Random V shape + + case 4: V = new xyz(P.x, .5*(P.x < cMidNorm.x ? map(P.x,0,cMidNorm.x, .5,yt) : + map(P.x,cMidNorm.x,1, yt,.5)) + + .5*(P.z < cMidNorm.z ? map(P.z,0,cMidNorm.z, .5,yt) : + map(P.z,cMidNorm.z,1, yt,.5)), P.z); break; // Random Pyramid shape + + case 5: V = new xyz(P.x, a*map((P.x-.5)*(P.x-.5),0,.25,0,t-.5)+.5, P.z); break; // wings + case 6: V = new xyz(P.x, a*map((mp -.5)*(mp -.5),0,.25,0,t-.5)+.5, P.z); break; // wings + + case 7: V = new xyz(cMid.x,cMid.y,cMid.z); + return color(0,0,c1c(1 - (V.distance(Px) > (pRad.getValuef()+.1)*150?1:0)) ); // sphere + + case 8: V = new xyz(cMid.x,cMid.y,cMid.z); + return color(0,0,c1c(1 - CalcCone(Px,V,xyzMid) * 0.02 > .5?1:0)); // cone + + case 9: return color(100 + noise(P.x,P.y,P.z + (NoiseMove+50000)/1000.)*200, + 85,c1c(P.y < noise(P.x + NoiseMove/2000.,P.z)*(1+a)-a/2.-.1 ? 1 : 0)); // + } + + + switch (pForm.Cur()) { + case 0: return color(0,0,c1c(1 - V.distance(P)/pRad.getValuef() > .5?1:0)); + case 1: return color(0,0,c1c(P.y < V.y ?1:0)); + case 2: return color(0,0,c1c(1 - V.distance(P)/pRad.getValuef())); + + default: return color(0,0,c1c(P.y < V.y ?1:0)); + } + } +} +//---------------------------------------------------------------------------------------------------------------------------------- diff --git a/DanKaminsky.pde b/DanKaminsky.pde new file mode 100644 index 0000000..59bde73 --- /dev/null +++ b/DanKaminsky.pde @@ -0,0 +1,268 @@ +class GenericController { + GenericController(){} + public void RotateKnob(int type, int num, float val){ + LXParameter p = null; + if(type==0) { + p = glucose.patternKnobs.get(num); + if(p!=null) { p.setValue(val); } + } + if(type==1) { + p = glucose.transitionKnobs.get(num); + if(p!=null) { p.setValue(val); } + } + if(type==2) { + p = glucose.effectKnobs.get(num); + if(p!=null) { p.setValue(val); } + } + } +} + +class MidiController extends GenericController { + MidiController() { + super(); + } +} +//PApplet xparent; // be sure to set + + + +OscP5 listener; +// Setup OSC +//listener = new OscP5(this,7022); + +//boolean[] noteState = new boolean[16]; +// +//void controllerChangeReceived(rwmidi.Controller cc) { +// if (debugMode) { +// println("CC: " + cc.toString()); +// } +// if(cc.getCC()==1){ +// for(int i=0; i<16; i++){ +// if(noteState[i] && i<8) { LXParameter p = glucose.patternKnobs.get(i); p.setValue(cc.getValue()/127.0); } +// else if(noteState[i] && i<12) { LXParameter p = glucose.transitionKnobs.get(i-8); p.setValue(cc.getValue()/127.0); } +// else if(noteState[i] && i<16) { LXParameter p = glucose.effectKnobs.get(i-12); p.setValue(cc.getValue()/127.0); } +// } +// } +//} +// +//void noteOnReceived(Note note) { +// if (debugMode) { +// println("Note On: " + note.toString()); +// } +// int pitch = note.getPitch(); +// if(pitch>=36 && pitch <36+16){ +// noteState[pitch-36]=true; +// } +//} +// +//void noteOffReceived(Note note) { +// if (debugMode) { +// println("Note Off: " + note.toString()); +// } +// int pitch = note.getPitch(); +// if(pitch>=36 && pitch <36+16){ +// noteState[pitch-36]=false; +// } +//} +// +//void oscEvent(OscMessage theOscMessage) { +// println(theOscMessage); +// LXPattern currentPattern = lx.getPattern(); +// if (currentPattern instanceof OSCPattern) { +// ((OSCPattern)currentPattern).oscEvent(theOscMessage); +// } +//} +// + + +class ObjectMuckerEffect extends SCEffect { + ObjectMuckerEffect(GLucose glucose) { + super(glucose); + } + public void doApply(int[] colors){ + /*for(Strip s: model.strips){ + for(int i=0; i0; i--){ + frames[i] = frames[i-1]; + } + frames[0] = new int[model.points.size()]; + + for(int i=0; i> 16) & 0xFF); + g += ((frames[j][i] >> 8) & 0xFF); + b += ((frames[j][i] >> 0) & 0xFF); + } + r/=blendfactor; + g/=blendfactor; + b/=blendfactor; + colorMode(ARGB); + colors[i] = (0xFF << 24) | (r << 16) | (g << 8) | b; + colorMode(HSB); + } + + } + } +} + + +import netP5.*; +import oscP5.*; + + + +abstract class OSCPattern extends SCPattern { + public OSCPattern(GLucose glucose){super(glucose);} + public abstract void oscEvent(OscMessage msg); +} + +class Ball { + public int lastSeen; + public float x,y; + public Ball(){ + x=y=lastSeen=0; + } +} + +class OSC_Balls extends OSCPattern { + Ball[] balls; + public OSC_Balls(GLucose glucose){ + super(glucose); + balls = new Ball[20]; + for(int i=0; i x-4 && p.y < y+4 && p.y > y-4) { colors[p.index] = #FF0000; } + } + } + } + } +} + +import processing.serial.*; + + +/*class ScreenScrape extends SCPattern { + PImage pret; + ScreenShot ss; + public ScreenScrape(GLucose glucose) { + super(glucose); + System.loadLibrary("ScreenShot"); + pret = new PImage(8, 128, ARGB); + ss = new ScreenShot(); + } + void run(int deltaMs){ + int x=(1366/2)+516; + int y=768-516; + int w=8; + int h=128; + pret.pixels = ss.getScreenShotJNI2(x, y, w, h); + //for(int i=0; i gparams; + +class DualBlender extends SCEffect { + int lastSeen; + BasicParameter p1 = new BasicParameter("p1", 0); + BasicParameter p2 = new BasicParameter("p2", 0); + BasicParameter p3 = new BasicParameter("p3", 0); + BasicParameter p4 = new BasicParameter("p4", 0); + BasicParameter p5 = new BasicParameter("p5", 0); + BasicParameter p6 = new BasicParameter("p6", 0); + BasicParameter p7 = new BasicParameter("p7", 0); + BasicParameter p8 = new BasicParameter("p8", 0); + DualBlender(GLucose glucose){ + super(glucose); + gparams = gplay.getParameters(); + addParameter(p1); + addParameter(p2); + addParameter(p3); + addParameter(p4); + addParameter(p5); + addParameter(p6); + addParameter(p7); + addParameter(p8); + + lastSeen=millis(); + } + + void onParameterChanged(LXParameter p){ + if(p==p1) { gparams.get(0).setValue(p.getValuef()); } + if(p==p2) { gparams.get(1).setValue(p.getValuef()); } + if(p==p3) { gparams.get(2).setValue(p.getValuef()); } + if(p==p4) { gparams.get(3).setValue(p.getValuef()); } + if(p==p5) { gparams.get(4).setValue(p.getValuef()); } + if(p==p6) { gparams.get(5).setValue(p.getValuef()); } + if(p==p7) { gparams.get(6).setValue(p.getValuef()); } + if(p==p8) { gparams.get(7).setValue(p.getValuef()); } + } + + void doApply(int[] colors){ + if(doDual==true){ + //gplay.onActive(); + gplay.go(millis()-lastSeen); + lastSeen=millis(); + int[] pcolors = gplay.getColors(); + for(int i=0; i= b && a <= c; } +boolean btwn (double a,double b,double c) { return a >= b && a <= c; } + +public class Pick { + Pick (String label, int _Def, int _Max) { NumPicks=_Max; Default = _Def; tag=label; } + int Cur() { return (CurRow-StartRow)*nNumCols + CurCol; } + int NumPicks, Default, CurRow, CurCol, StartRow, EndRow; + String tag; +} +//---------------------------------------------------------------------------------------------------------------------------------- +public class _DhP extends BasicParameter { + double dflt; + _DhP (String label, double value) { super(label,value); dflt=value; } + void Set (double value) { super.updateValue(value); } + void reset () { super.updateValue(dflt); } + float Val () { return getValuef(); } + boolean ZeroOrOne () { return Val()==0 || Val() == 1; } +} + +public class IndexNums { + int point ;//, cube , tower , face , strip ; + int nPoints ;//, nCubes, nTowers, nFaces, nStrips ; +// boolean isHoriz; + void reset() { point=0;}//cube=tower=face=strip=0; } +} +IndexNums iCur = new IndexNums(); +//---------------------------------------------------------------------------------------------------------------------------------- +public class xyz { float x,y,z; + xyz() {x=y=z=0;} + xyz(Point p ) {x=p.fx ; y=p.fy; z=p.fz;} + xyz(float _x,float _y,float _z) {x=_x ; y=_y ; z=_z ;} + void set(float _x,float _y,float _z) {x=_x ; y=_y ; z=_z ;} + float distance(xyz b) {return dist(x,y,z,b.x,b.y,b.z); } + float dot (xyz b) {return x*b.x + y*b.y + z*b.z; } + xyz minus (xyz b) {return new xyz(x-b.x,y-b.y,z-b.z); } + xyz plus (xyz b) {return new xyz(x+b.x,y+b.y,z+b.z); } + xyz plus (float b) {return new xyz(x+b ,y+b ,z+b ); } + xyz over (xyz b) {return new xyz(x/b.x,y/b.y,z/b.z); } + xyz times (float b) {return new xyz(x*b ,y*b ,z*b ); } + + xyz RotateX (xyz o, float a) { return new xyz ( x, + cos(a)*(y-o.y) - sin(a)*(z-o.z) + o.y, + sin(a)*(y-o.y) + cos(a)*(z-o.z) + o.z); } + + xyz RotateY (xyz o, float a) { return new xyz ( cos(a)*(x-o.x) - sin(a)*(z-o.z) + o.x, + y, + sin(a)*(x-o.x) + cos(a)*(z-o.z) + o.z); } + + xyz RotateZ (xyz o, float a) { return new xyz ( cos(a)*(x-o.x) - sin(a)*(y-o.y) + o.x, + sin(a)*(x-o.x) + cos(a)*(y-o.y) + o.y, + z ); } + + xyz setRand () { return new xyz ( random(xdMax), random(ydMax), random(zdMax)); } + xyz setNorm () { return new xyz ( x / xdMax, y / ydMax, z / zdMax); } + + float interp (float a, float b, float c) { return (1-a)*b + a*c; } + xyz interpolate(float i, xyz d) { return new xyz ( interp(i,x,d.x), interp(i,y,d.y), interp(i,z,d.z)); } +} +//---------------------------------------------------------------------------------------------------------------------------------- +public class DPat extends SCPattern +{ + float zSpinHue; + xyz xyzdMax, xyz0, xyzMid, xyzHalf; + PFont itemFont = createFont("Lucida Grande", 11); + ArrayList picklist = new ArrayList(); + ArrayList paramlist = new ArrayList(); + int nMaxRow = 0; + boolean bIsActive = false; + float NoiseMove = random(10000); + + float Dist (xyz a, xyz b) { return dist(a.x,a.y,a.z,b.x,b.y,b.z); } + int c1c (float a) { return int(100*constrain(a,0,1)); } + int mapRow (int a) { return btwn(a,53,57) ? a-53 : a; } + int unmapRow (int a) { return btwn(a,0 , 4) ? a+53 : a; } + void SetLight (int row, int col, int clr){ if (midiout != null) midiout.sendNoteOn(col, unmapRow(row), clr); } + void keypad (int row, int col) { println(row + " " + col); } + void onInactive() { bIsActive=false; DanTextLine1 = ""; DanTextLine2 = "";} + void onActive () { bIsActive=true; + zSpinHue = 0; + for (int i=0; i 40) lx.tempo.setBpm(lx.tempo.bpm()/2); + UpdateLights(); + } + void StartRun(int deltaMs) { } + color CalcPoint(xyz p) { return color(0,0,0); } + float CalcCone (xyz v1, xyz v2, xyz c) { + return degrees( acos ( v1.minus(c).dot(v2.minus(c)) / (sqrt(v1.minus(c).dot(v1.minus(c))) * sqrt(v2.minus(c).dot(v2.minus(c))) ) )); + } + + void AddDanText() { + DanTextLine1 = "APC40: "; + for (int i=0; i 0) P.y += s_Spark () * (noise(P.x,P.y+NoiseMove/30 ,P.z)*ydMax - ydMax/2.); + if (s_Wiggle() > 0) P.y += s_Wiggle() * (noise(P.x/(xdMax*.3)-NoiseMove/1500.) - .5) * (ydMax/2.); + + color cOld = colors[p.index]; + color cNew = CalcPoint(P); + +// if (_Horiz && !iCur.isHoriz) { colors[p.index] = 0; continue; } +// if (_Vert && iCur.isHoriz) { colors[p.index] = 0; continue; } + if (_XSym) cNew = blendColor(cNew, CalcPoint(new xyz(xdMax-P.x,P.y,P.z)), ADD); + if (_YSym) cNew = blendColor(cNew, CalcPoint(new xyz(P.x,ydMax-P.y,P.z)), ADD); + if (_ZSym) cNew = blendColor(cNew, CalcPoint(new xyz(P.x,P.y,zdMax-P.z)), ADD); + + float b = brightness(cNew)/100.; + b = b < .5 ? pow(b,fSharp) : 1-pow(1-b,fSharp); + + float modhue = s_ModHue ()>0 ? s_ModHue ()*360:0; + + float noizhue = s_NoiseHue()>0 ? s_NoiseHue()*360*noise( P.x/(xdMax*.3)+NoiseMove/3000., + P.y/(ydMax*.3)+NoiseMove/4000., + P.z/(zdMax*.3)+NoiseMove/5000.) : 0; + + cNew = color( (hue(cNew) + modhue + zSpinHue - noizhue) % 360, + saturation(cNew) + 100*s_Saturate(), + 100 * (s_Trails()==0 ? b : max(b, brightness(cOld)/100. - (1-s_Trails()) * deltaMs/200.)) + * (s_Dim ()==0 ? 1 : 1-s_Dim()) + ); + + colors[p.index] = cNew; + } +// }}}} + } + + void controllerChangeReceived(rwmidi.Controller cc) { + if (cc.getCC() == 7 && btwn(cc.getChannel(),0,7)) Sliders[cc.getChannel()] = 1.*cc.getValue()/127.; + } + + public float Sliders[] = new float[] {0,0,0,0,0,0,0,0}; + String SliderText[]= new String[] {"Trails", "Dim", "Saturate", "SpinHue", "Hue", "NoiseHue", "Spark", "Wiggle"}; + float s_Trails () { return Sliders[0]; } + float s_Dim () { return Sliders[1]; } + float s_Saturate () { return Sliders[2]; } + float s_SpinHue () { return Sliders[3]; } + float s_ModHue () { return Sliders[4]; } + float s_NoiseHue () { return Sliders[5]; } + float s_Spark () { return Sliders[6]; } + float s_Wiggle () { return Sliders[7]; } + _DhP pSharp; + + DPat(GLucose glucose) { + super(glucose); + xyzHalf = new xyz(.5,.5,.5); + xyz0 = new xyz(0,0,0); + pSharp = addParam("Shrp", 0); + + for (MidiInputDevice input : RWMidi.getInputDevices ()) { if (input.toString().contains("APC")) input .createInput (this);} + for (MidiOutputDevice output : RWMidi.getOutputDevices()) { + if (midiout == null && output.toString().contains("APC")) midiout = output.createOutput(); + } + } + + void UpdateLights() { + for (int i=0; i 40) bpm/=2; + lx.tempo.setBpm(bpm); lx.tempo.trigger(); Tap1=0; println("Tap Set - " + bpm + " bpm"); + } + + UpdateLights(); + } + + boolean _XSym=false, _YSym=false, _ZSym=false, _RadSym=false; //, _Horiz=false, _Vert=false; + + void noteOnReceived (Note note) { if (!bIsActive) return; + int row = mapRow(note.getPitch()), col = note.getChannel(); + Pick P = GetPick(row,col); + if (P != null) { P.CurRow=row; P.CurCol=col; } + else if (row == 50 && col == 0) { lx.tempo.trigger(); Tap1 = getNow(); } + else if (row == 82 && col == 0) _XSym = !_XSym ; + else if (row == 83 && col == 0) _YSym = !_YSym ; + else if (row == 84 && col == 0) _ZSym = !_ZSym ; + else if (row == 85 && col == 0) _RadSym = !_RadSym ; + else keypad(row, col) ; + } + + _DhP addParam(String label, double value) { + _DhP P = new _DhP(label, value); + super.addParameter(P); + paramlist.add(P); return P; + } + + Pick addPick(String name, int def, int nmax) { + Pick P = new Pick(name, def, nmax); + P.StartRow = nMaxRow; + P.EndRow = P.StartRow + int((nmax-1) / nNumCols); + nMaxRow = P.EndRow + 1; + P.CurCol = def % nNumCols; + P.CurRow = P.StartRow + def/nNumCols; + picklist.add(P); + return P; + } +} +//---------------------------------------------------------------------------------------------------------------------------------- diff --git a/GranimPattern.pde b/GranimPattern.pde old mode 100644 new mode 100755 diff --git a/JR.pde b/JR.pde new file mode 100755 index 0000000..ec0923f --- /dev/null +++ b/JR.pde @@ -0,0 +1,280 @@ +color BLACK = color(0, 0, 0); + +class Gimbal extends SCPattern { + + private final boolean DEBUG_MANUAL_ABG = false; + private final int MAXIMUM_BEATS_PER_REVOLUTION = 100; + + private boolean first_run = true; + private final Projection projection; + private final BasicParameter beatsPerRevolutionParam = new BasicParameter("SLOW", 20./MAXIMUM_BEATS_PER_REVOLUTION); + private final BasicParameter hueDeltaParam = new BasicParameter("HUED", 60./360); + private final BasicParameter fadeFromCoreParam = new BasicParameter("FADE", 1); + private final BasicParameter girthParam = new BasicParameter("GRTH", .18); + private final BasicParameter ringExtendParam = new BasicParameter("XTND", 1); + private final BasicParameter relativeSpeedParam = new BasicParameter("RLSP", .83); + private final BasicParameter sizeParam = new BasicParameter("SIZE", .9); + + private final BasicParameter aP = new BasicParameter("a", 0); + private final BasicParameter bP = new BasicParameter("b", 0); + private final BasicParameter gP = new BasicParameter("g", 0); + + Gimbal(GLucose glucose) { + super(glucose); + projection = new Projection(model); + addParameter(beatsPerRevolutionParam); + addParameter(hueDeltaParam); + addParameter(fadeFromCoreParam); + addParameter(girthParam); + addParameter(ringExtendParam); + addParameter(relativeSpeedParam); + addParameter(sizeParam); + + if (DEBUG_MANUAL_ABG) { + addParameter(aP); + addParameter(bP); + addParameter(gP); + } + } + + float a = 0, b = 0, g = 0; + + public void run(int deltaMs) { + + if (DEBUG_MANUAL_ABG) { + a = aP.getValuef() * (2 * PI); + b = bP.getValuef() * (2 * PI); + g = gP.getValuef() * (2 * PI); + } else { + float relativeSpeed = relativeSpeedParam.getValuef(); + float time = millis() / 1000.f; + + int beatsPerRevolution = (int) (beatsPerRevolutionParam.getValuef() * MAXIMUM_BEATS_PER_REVOLUTION) + 1; + float radiansPerMs = 2 * PI // radians / revolution + / beatsPerRevolution // beats / revolution + * lx.tempo.bpmf() // BPM beats / min + / 60 // sec / min + / 1000; // ms / sec + + a += deltaMs * radiansPerMs * pow(relativeSpeed, 0); + b += deltaMs * radiansPerMs * pow(relativeSpeed, 1); + g += deltaMs * radiansPerMs * pow(relativeSpeed, 2); + a %= 2 * PI; + b %= 2 * PI; + g %= 2 * PI; + } + + float hue = lx.getBaseHuef(); + float hue_delta = hueDeltaParam.getValuef() * 360; + + float radius1 = model.xMax / 2 * sizeParam.getValuef(); + float radius2 = ((model.xMax + model.yMax) / 2) / 2 * sizeParam.getValuef(); + float radius3 = model.yMax / 2 * sizeParam.getValuef(); + float girth = model.xMax * girthParam.getValuef(); + Ring ring1 = new Ring((hue + hue_delta * 0) % 360, radius1, girth); + Ring ring2 = new Ring((hue + hue_delta * 1) % 360, radius2, girth); + Ring ring3 = new Ring((hue + hue_delta * 2) % 360, radius3, girth); + + projection.reset(model) + // Translate so the center of the car is the origin + .translateCenter(model, 0, 0, 0); + + for (Coord c : projection) { + //if (first_run) println(c.x + "," + c.y + "," + c.z); + + rotate3d(c, a, 0, 0); + rotate3d(c, PI/4, PI/4, PI/4); + color color1 = ring1.colorFor(c); + + rotate3d(c, 0, b, 0); + color color2 = ring2.colorFor(c); + + rotate3d(c, 0, 0, g); + color color3 = ring3.colorFor(c); + + colors[c.index] = specialBlend(color1, color2, color3); + } + + first_run = false; + } + + class Ring { + + float hue; + float radius, girth; + + public Ring(float hue, float radius, float girth) { + this.hue = hue; + this.radius = radius; + this.girth = girth; + } + + public color colorFor(Coord c) { + float theta = atan2(c.y, c.x); + float nearest_circle_x = cos(theta) * radius; + float nearest_circle_y = sin(theta) * radius; + float nearest_circle_z = 0; + + float distance_to_circle + = sqrt(pow(nearest_circle_x - c.x, 2) + + pow(nearest_circle_y - c.y, 2) + + pow(nearest_circle_z - c.z * ringExtendParam.getValuef(), 2)); + + float xy_distance = sqrt(c.x*c.x + c.y*c.y); + return color(this.hue, 100, (1 - distance_to_circle / girth * fadeFromCoreParam.getValuef()) * 100); + } + + } + +} + + + + + + +class Zebra extends SCPattern { + + private final Projection projection; + SinLFO angleM = new SinLFO(0, PI * 2, 30000); + +/* + SinLFO x, y, z, dx, dy, dz; + float cRad; + _P size; + */ + + Zebra(GLucose glucose) { + super(glucose); + projection = new Projection(model); + + addModulator(angleM).trigger(); + } + + color colorFor(Coord c) { + float hue = lx.getBaseHuef(); + + + + +/* SLIDE ALONG + c.x = c.x + millis() / 100.f; + */ + + + + int stripe_count = 12; + float stripe_width = model.xMax / (float)stripe_count; + if (Math.floor((c.x) / stripe_width) % 2 == 0) { + return color(hue, 100, 100); + } else { + return color((hue + 90) % 360, 100, 100); + } + + + /* OCTANTS + + if ((isPositiveBit(c.x) + isPositiveBit(c.y) + isPositiveBit(c.z)) % 2 == 0) { + return color(lx.getBaseHuef(), 100, 100); + } else { + return color(0, 0, 0); + } + */ + } + + int isPositiveBit(float f) { + return f > 0 ? 1 : 0; + } + + public void run(int deltaMs) { + float a = (millis() / 1000.f) % (2 * PI); + float b = (millis() / 1200.f) % (2 * PI); + float g = (millis() / 1600.f) % (2 * PI); + + projection.reset(model) + // Translate so the center of the car is the origin + .translateCenter(model, 0, 0, 0); + + for (Coord c : projection) { +// rotate3d(c, a, b, g); + colors[c.index] = colorFor(c); + } + + first_run = false; + } + + + // Utility! + boolean first_run = true; + private void log(String s) { + if (first_run) { + println(s); + } + } + + +} + +void rotate3d(Coord c, float a /* roll */, float b /* pitch */, float g /* yaw */) { + float cosa = cos(a); + float cosb = cos(b); + float cosg = cos(g); + float sina = sin(a); + float sinb = sin(b); + float sing = sin(g); + + float a1 = cosa*cosb; + float a2 = cosa*sinb*sing - sina*cosg; + float a3 = cosa*sinb*cosg + sina*sing; + float b1 = sina*cosb; + float b2 = sina*sinb*sing + cosa*cosg; + float b3 = sina*sinb*cosg - cosa*sing; + float c1 = -sinb; + float c2 = cosb*sing; + float c3 = cosb*cosg; + + float[] cArray = { c.x, c.y, c.z }; + c.x = dotProduct(new float[] {a1, a2, a3}, cArray); + c.y = dotProduct(new float[] {b1, b2, b3}, cArray); + c.z = dotProduct(new float[] {c1, c2, c3}, cArray); +} + +float dotProduct(float[] a, float[] b) { + float ret = 0; + for (int i = 0 ; i < a.length; ++i) { + ret += a[i] * b[i]; + } + return ret; +} + +color specialBlend(color c1, color c2, color c3) { + float h1 = hue(c1); + float h2 = hue(c2); + float h3 = hue(c3); + + // force h1 < h2 < h3 + while (h2 < h1) { + h2 += 360; + } + while (h3 < h2) { + h3 += 360; + } + + float s1 = saturation(c1); + float s2 = saturation(c2); + float s3 = saturation(c3); + + float b1 = brightness(c1); + float b2 = brightness(c2); + float b3 = brightness(c3); + float relative_b1 = b1 / (b1 + b2 + b3); + float relative_b2 = b2 / (b1 + b2 + b3); + float relative_b3 = b3 / (b1 + b2 + b3); + + return color( + (h1 * relative_b1 + h2 * relative_b1 + h3 * relative_b3) % 360, + s1 * relative_b1 + s2 * relative_b2 + s3 * relative_b3, + max(max(b1, b2), b3) + ); +} + diff --git a/JackStahl.pde b/JackStahl.pde old mode 100644 new mode 100755 diff --git a/MarkSlee.pde b/MarkSlee.pde old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/SamMorrow.pde b/SamMorrow.pde old mode 100644 new mode 100755 diff --git a/ShaheenGandhi.pde b/ShaheenGandhi.pde old mode 100644 new mode 100755 diff --git a/SugarCubes.pde b/SugarCubes.pde index dac639a..4722852 100644 --- a/SugarCubes.pde +++ b/SugarCubes.pde @@ -22,12 +22,18 @@ * If you're an artist, create a new tab in the Processing environment with * your name. Implement your classes there, and add them to the list below. */ +LXPattern gplay; LXPattern[] patterns(GLucose glucose) { return new LXPattern[] { + + new Gimbal(glucose), + + // DMK // Slee new Swarm(glucose), + //new ScreenScrape(glucose), new SpaceTime(glucose), new ShiftingPlane(glucose), new AskewPlanes(glucose), @@ -40,9 +46,10 @@ LXPattern[] patterns(GLucose glucose) { new CubeEQ(glucose).setEligible(false), new PianoKeyPattern(glucose).setEligible(false), - // Dan - new Pong(glucose), + // DanH new Noise(glucose), + gplay=new Play(glucose), // XXX do this properly + new Pong(glucose), // Alex G new SineSphere(glucose), @@ -105,8 +112,8 @@ LXEffect[] effects(GLucose glucose) { return new LXEffect[] { new FlashEffect(lx), new BoomEffect(glucose), - new DesaturationEffect(lx), - new ColorFuckerEffect(glucose), + //new DesaturationEffect(lx), + //new ColorFuckerEffect(glucose), + new DualBlender(glucose), }; } - diff --git a/TestPatterns.pde b/TestPatterns.pde old mode 100644 new mode 100755 diff --git a/TimBavaro.pde b/TimBavaro.pde old mode 100644 new mode 100755 diff --git a/TobySegaran.pde b/TobySegaran.pde old mode 100644 new mode 100755 diff --git a/_Internals.pde b/_Internals.pde index a358f1b..e2291fb 100644 --- a/_Internals.pde +++ b/_Internals.pde @@ -124,24 +124,56 @@ void setup() { println("Hit the 'p' key to toggle Panda Board output"); } +boolean[] noteState = new boolean[16]; + void controllerChangeReceived(rwmidi.Controller cc) { if (debugMode) { println("CC: " + cc.toString()); } + //println(cc.getInput().getName()); + int c = cc.getCC(); + if(c==1){ + for(int i=0; i<16; i++){ + if(noteState[i] && i<8) { LXParameter p = glucose.patternKnobs.get(i); p.setValue(cc.getValue()/127.0); } + else if(noteState[i] && i<16) { try { LXParameter p = gparams.get(i-8); p.setValue(cc.getValue()/127.0); } catch(Exception e) {} } + } + } + if(c==2){ + for(int i=0; i<16; i++){ + //sif(noteState[i] && i<8) { println( gplay.Sliders ); } + //else if(noteState[i] && i<16) { try { LXParameter p = gparams.get(i-8); p.setValue(cc.getValue()/127.0); } catch(Exception e) {} } + } + } + + + //if(c>=16 || c<16+8){ + // LXParameter p = gparams.get(c-16); + // p.setValue(c/127.0); + //} } + void noteOnReceived(Note note) { if (debugMode) { println("Note On: " + note.toString()); } + int pitch = note.getPitch(); + if(pitch>=36 && pitch <36+16){ + noteState[pitch-36]=true; + } } void noteOffReceived(Note note) { if (debugMode) { println("Note Off: " + note.toString()); } + int pitch = note.getPitch(); + if(pitch>=36 && pitch <36+16){ + noteState[pitch-36]=false; + } } + void logTime(String evt) { int now = millis(); println(evt + ": " + (now - lastMillis) + "ms"); @@ -217,11 +249,12 @@ void draw() { // TODO(mcslee): move into GLucose engine for (PandaDriver p : pandaBoards) { - p.send(colors); + p.sendNow(colors); } } void drawBassBox(BassBox b) { + /* float in = .15; noStroke(); @@ -263,7 +296,7 @@ void drawBassBox(BassBox b) { box(0, BassBox.EDGE_HEIGHT - in*2, Cube.CHANNEL_WIDTH-in); translate(BassBox.EDGE_WIDTH-2*in, 0, 0); box(0, BassBox.EDGE_HEIGHT - in*2, Cube.CHANNEL_WIDTH-in); - popMatrix(); + popMatrix();*/ } @@ -335,16 +368,21 @@ void drawUI() { ui.drawHelpTip(); } ui.drawFPS(); + ui.drawDanText(); } boolean uiOn = true; int restoreToIndex = -1; +boolean doDual = false; void keyPressed() { if (mappingMode) { mappingTool.keyPressed(); } switch (key) { + case 'w': + doDual = !doDual; + break; case '-': case '_': frameRate(--targetFramerate); @@ -426,4 +464,3 @@ void mouseWheel(int delta) { eyeZ = midZ + eyeR*cos(eyeA); } } - diff --git a/_Mappings.pde b/_Mappings.pde index 3932f0b..a07c6d4 100644 --- a/_Mappings.pde +++ b/_Mappings.pde @@ -46,10 +46,94 @@ public Model buildModel() { // The cubes automatically increment their y-position by Cube.EDGE_HEIGHT. TowerMapping[] towerCubes = new TowerMapping[] { - // DJ booth, from left to right + + + //back left cubes: temp Channel 1 + new TowerMapping(0, Cube.EDGE_HEIGHT, 72, new CubeMapping[] { + new CubeMapping(0, 14, -45 , WRL), + new CubeMapping(18, -12, -20, WFL), + new CubeMapping(5, 9, 45, WRR), + + + }), + //back left cube tower: Channel 2 + new TowerMapping(0, Cube.EDGE_HEIGHT, 70, new CubeMapping[] { + new CubeMapping(18, -2.5, 45, WRL), + new CubeMapping(15, -6, 45, WFR), + new CubeMapping(-6 , 7, 5, WRR), + new CubeMapping(18, 11, -5, WFL) + + }), + + //second from left back tower: Channel 3 + new TowerMapping(31, Cube.EDGE_HEIGHT, 73.5, new CubeMapping[] { + new CubeMapping( 12.5, 5.5 , 10 , WRR), + new CubeMapping( 16.5, 2.5 , 30, WRR), + new CubeMapping( 16.5, 3, 10, WRR), + new CubeMapping(.5, 4.5, -10 , WFL) + } ), + + //center tower, Channel 4 + new TowerMapping(106, Cube.EDGE_HEIGHT, 84, new CubeMapping[] { + new CubeMapping( -3.5, -2, 10, WFL), + new CubeMapping( -11, 5, 30, WFR), + new CubeMapping( 13.5, 2, 15, WRR), + new CubeMapping(20.75, -4, 35 , WRL) + } ), + + //second from back right tower, Channel 5 + + new TowerMapping(160, Cube.EDGE_HEIGHT, 78, new CubeMapping[] { + new CubeMapping( -31.5, -.5 , 5 , WFR), + new CubeMapping( 7, -.5, 60, WRL), + new CubeMapping( -5.5, -3, 0, WFR), + new CubeMapping(22 , 2 , 30 , WRL) + }), + + + //back right cubes: temp Channel 6 + new TowerMapping(201, Cube.EDGE_HEIGHT, 72, new CubeMapping[] { + new CubeMapping(7.5, 6, 25, WRL), + new CubeMapping(-4.5, -0.5, 18, WFR), + new CubeMapping(8.5, .5, 30, WRL), + new CubeMapping(-7, -14, 10, WFR) + + }), + + + + + + //tower to the right of BASS BOX + new TowerMapping (192, Cube.EDGE_HEIGHT, 40, new CubeMapping[] { + new CubeMapping(-6, 4, -10, WRL), + new CubeMapping(5 ,5 , 5, WFR ), + new CubeMapping(-2, .5 , -3, WFL), + new CubeMapping(-10, 5.5 , -20, WRR ) + }), + + //end right tower in middle, right of previous tower + new TowerMapping (214, Cube.EDGE_HEIGHT, 37, new CubeMapping[] { + new CubeMapping(10,0 , 50, WRR), + new CubeMapping(5 ,5 , 65, WFL) + }), +// // DJ booth, from back left to back right + + new TowerMapping(BBX, BBY, BBZ, new CubeMapping[] { + new CubeMapping(3, 28, 3, WFL), + new CubeMapping(-2, 11.5, 10, WFR), + new CubeMapping(10.5, 4.5, 40, WFR) + + + }), + + + new TowerMapping(BBX, BBY, BBZ, new CubeMapping[] { new CubeMapping(-7.25, 7.5, -25, WFR), new CubeMapping(7.5, -15.75, 12, WRL), + + }), new TowerMapping(BBX, BBY, BBZ, new CubeMapping[] { new CubeMapping(19.625, 5.375, -22, WFR), @@ -63,27 +147,76 @@ public Model buildModel() { new CubeMapping(78.75, 3.75, -28, WRR), new CubeMapping(8, -15, 10, WRR), }), - new TowerMapping(BBX, BBY, BBZ, new CubeMapping[] { + + // next two are right DJ channel + + new TowerMapping(BBX, BBY, BBZ, new CubeMapping[] { + new CubeMapping(105, 20.5, 20, WRR), + new CubeMapping(6, -6, 30, WFR), + }), + + new TowerMapping(BBX, BBY, BBZ, new CubeMapping[] { new CubeMapping(104.75, 0, -27, WRL), new CubeMapping(8, -15, 10, WFL), }), + }; // Single cubes can be constructed directly here if you need them Cube[] singleCubes = new Cube[] { + //back left channel behind speaker + new Cube(15, int( Cube.EDGE_HEIGHT), 39, 0, 10, 0, WRL), + new Cube(-6, int(Cube.EDGE_HEIGHT), 47, 0, 20, 0, WFR), + new Cube(0, int(2*Cube.EDGE_HEIGHT), 46, 0, 40, 0, WRR), + + // Top left Channel Above DJ booth + new Cube(33, int(4.5*Cube.EDGE_HEIGHT ), 28, 0, 10, 0, WRR), + new Cube(35, int(5*Cube.EDGE_HEIGHT ), 52, 0, 10, 0, WRR), + new Cube(56, int(5*Cube.EDGE_HEIGHT ), 69, 0, 10, 0, WFL), + new Cube(76, int(5*Cube.EDGE_HEIGHT ), 61, 0, -45, 0, WRL), + + //next channel to the right, same height + new Cube(85, int(5*Cube.EDGE_HEIGHT ), 77, 0, 20, 0, WRL), + new Cube(92, int(6*Cube.EDGE_HEIGHT ), 63, 0,20, 0, WRR), + new Cube(86, int(6*Cube.EDGE_HEIGHT ), 47, 0, -45, 0, WRL), + new Cube(123, int(6*Cube.EDGE_HEIGHT ), 31, 0, 20, 0, WFR), + + // next channel to right, same height + new Cube(111, int(5*Cube.EDGE_HEIGHT ), 79, 0, 30, 0, WRL), + new Cube(125, int(6*Cube.EDGE_HEIGHT ), 76, 0,27, 0, WRL), + new Cube(144, int(5*Cube.EDGE_HEIGHT ), 44, 0, 45, 0, WRR), + new Cube(134, int(5*Cube.EDGE_HEIGHT ), 42, 0, 45, 0, WRL), + + //next channel to right + new Cube(185, int(4*Cube.EDGE_HEIGHT ), 73, 0, -45, 0, WRR), + new Cube(170, int(5*Cube.EDGE_HEIGHT ), 58, 0,40, 0, WRL), + new Cube(158, int(6*Cube.EDGE_HEIGHT ), 34, 0, 40, 0, WFR), + new Cube(130, int(6*Cube.EDGE_HEIGHT ), 10, 0, -5, 30, WRL), + + //next channel highest to the right + new Cube(203, int(5*Cube.EDGE_HEIGHT ), 55, 0, 35, 0, WRR), + new Cube(174, int(5*Cube.EDGE_HEIGHT ), 32, 0,35, 0, WFR), + new Cube(178, int(6.5*Cube.EDGE_HEIGHT ), 16, 0, 20 , 30, WRL), + new Cube(212, int(6.5*Cube.EDGE_HEIGHT ), 23, 0, 20 ,30, WRR), + + //last channel + new Cube(204, int(5*Cube.EDGE_HEIGHT ), 28, 0, 25, 0, WFR), + new Cube(185, int(6*Cube.EDGE_HEIGHT ), 38, 0,40, 0, WRR), + // new Cube(x, y, z, rx, ry, rz, wiring), }; // The bass box! - BassBox bassBox = new BassBox(BBX, 0, BBZ); - + //BassBox bassBox = new BassBox(BBX, 0, BBZ); + //test for Alex, should be commented out + // The speakers! - List speakers = Arrays.asList(new Speaker[] { + //List speakers = Arrays.asList(new Speaker[] { // each speaker parameter is x, y, z, rotation, the left speaker comes first - new Speaker(-12, 6, 0, 15), - new Speaker(TRAILER_WIDTH - Speaker.EDGE_WIDTH + 8, 6, 3, -15) - }); + // new Speaker(-12, 6, 0, 15), + // new Speaker(TRAILER_WIDTH - Speaker.EDGE_WIDTH + 8, 6, 3, -15) + // }); ////////////////////////////////////////////////////////////////////// // BENEATH HERE SHOULD NOT REQUIRE ANY MODIFICATION!!!! // @@ -110,7 +243,7 @@ public Model buildModel() { cubes[cubeIndex++] = cube; } - return new Model(towerList, cubes, bassBox, speakers); + return new Model(towerList, cubes, null, null); } /** @@ -123,47 +256,45 @@ public PandaMapping[] buildPandaList() { return new PandaMapping[] { new PandaMapping( - "10.200.1.29", new ChannelMapping[] { - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_BASS), - new ChannelMapping(ChannelMapping.MODE_STRUTS_AND_FLOOR), - new ChannelMapping(ChannelMapping.MODE_SPEAKER, LEFT_SPEAKER), - new ChannelMapping(ChannelMapping.MODE_SPEAKER, RIGHT_SPEAKER), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), + // 8 maps to: 3, 4, 7, 8, 13, 14, 15, 16. So if it's J4, + "10.200.1.30", new ChannelMapping[] { + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 52, 53, 54, 55}), //30 J3 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 64, 65, 66, 67}), //30 J4 //ORIG + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1,2,3,7 }), //30 J7 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 39, 40, 38, 37}), //30 J8 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 16, 17, 18, 19 }), //30 J13 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 20, 21, 22, 23}), //30 J14 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 24, 25, 26, 27 }), // 30 J15 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 28, 29 }), // 30 J16 }), - + new PandaMapping( + "10.200.1.29", new ChannelMapping[] { + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 68, 65, 66, 67 }), //29 J3 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 30,31 }), //29 J4 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 20, 21, 22, 23 }), // 29 J7 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 60, 61 , 62, 63 }), //29 J8 //XXX + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 17, 18, 19, 20 }), //29 J13 //XX //bassbox + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 24, 25, 26, 27}), //29 J14 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 41,42,43,44 }), //29 J15 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 16, 17,18,19 }), //29 J16 + }), new PandaMapping( "10.200.1.28", new ChannelMapping[] { - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2, 3, 4 }), - }), - }; + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 56, 57, 58, 59 }), //28 J3 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 64, 69 }), //28 J4 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 48, 49, 50, 51 }), //28 J7 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 13, 14 , 15, 16 }), //28 J8 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 8,9,10,11 }), //28 J13 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 35,36,34,33}), //28 J14 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 12, 13, 14, 15 }), //28 J15 + new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 30, 31, 32, 48 }), //28 J16 + }), + }; + } + + class TowerMapping { public final float x, y, z; public final CubeMapping[] cubeMappings; @@ -204,7 +335,7 @@ class CubeMapping { class PandaMapping { // How many channels are on the panda board - public final static int CHANNELS_PER_BOARD = 16; + public final static int CHANNELS_PER_BOARD = 8; // How many total pixels on the whole board public final static int PIXELS_PER_BOARD = ChannelMapping.PIXELS_PER_CHANNEL * CHANNELS_PER_BOARD; @@ -277,11 +408,11 @@ class ChannelMapping { } int speakerIndex = rawObjectIndices[0]; if (speakerIndex < 0 || speakerIndex >= glucose.model.speakers.size()) { - throw new RuntimeException("Invalid speaker channel mapping: " + speakerIndex); + //throw new RuntimeException("Invalid speaker channel mapping: " + speakerIndex); } } else if ((mode == MODE_STRUTS_AND_FLOOR) || (mode == MODE_BASS) || (mode == MODE_NULL)) { if (rawObjectIndices.length > 0) { - throw new RuntimeException("Bass/floor/null mappings cannot specify object indices"); + //throw new RuntimeException("Bass/floor/null mappings cannot specify object indices"); } } else if (mode == MODE_CUBES) { for (int rawCubeIndex : rawObjectIndices) { @@ -297,4 +428,3 @@ class ChannelMapping { } } } - diff --git a/_Overlay.pde b/_Overlay.pde index b071128..f1bc1d4 100644 --- a/_Overlay.pde +++ b/_Overlay.pde @@ -75,6 +75,14 @@ abstract class OverlayUI { text("Tap 'u' to restore UI", width-4, height-6); } + public void drawDanText() { + textFont(itemFont); + textAlign(LEFT); + fill(#FFFFFF); + text(DanTextLine1, 4, height-50); + text(DanTextLine2, 4, height-30); + } + public void drawFPS() { textFont(titleFont); textAlign(LEFT); @@ -630,6 +638,7 @@ class MappingUI extends OverlayUI { public void draw() { drawLogoAndBackground(); + int yPos = 0; firstMappingY = yPos + lineHeight + 6; yPos = drawObjectList(yPos, "MAPPING MODE", mappingModes, mappingModes, mappingModeStateMethod); diff --git a/_PandaDriver.pde b/_PandaDriver.pde index d2998a7..2c8b96c 100644 --- a/_PandaDriver.pde +++ b/_PandaDriver.pde @@ -1,6 +1,11 @@ import netP5.*; import oscP5.*; +//import hypermedia.net.*; + + + + /** * DOUBLE BLACK DIAMOND DOUBLE BLACK DIAMOND * @@ -14,7 +19,23 @@ import oscP5.*; * This class implements the output function to the Panda Boards. It * will be moved into GLucose once stabilized. */ -public static class PandaDriver { +public static class PandaDriver extends Thread{ + int lastSeen; + void start(){super.start();} + void run(){ + while(true){ + if(queue.size()>0) { + for(int i=0; i queue; public PandaDriver(String ip, Model model, PandaMapping pm) { this(ip); + + queue = new ArrayList(); // Ok, we are initialized, time to build the array if points in order to // send out. We start at the head of our point buffer, and work our way @@ -295,13 +323,18 @@ public static class PandaDriver { } public final void send(int[] colors) { - if (!enabled) { + queue.add(colors); + } + public final void sendNow(int[] colors) { + if (!enabled || colors==null) { return; } int len = 0; int packetNum = 0; - for (int index : points) { - int c = (index < 0) ? 0 : colors[index]; + if(points==null) { return; } + for (int index: points) { + int c = 0; + if(index>0) { c= colors[index]; } byte r = (byte) ((c >> 16) & 0xFF); byte g = (byte) ((c >> 8) & 0xFF); byte b = (byte) ((c) & 0xFF); @@ -323,16 +356,17 @@ public static class PandaDriver { } } + private void sendPacket(int packetNum) { message.clearArguments(); message.add(packetNum); message.add(packet.length); message.add(packet); try { + //udp.send(packet, "10.200.1.29", 9001); OscP5.flush(message, address); } catch (Exception x) { x.printStackTrace(); } } } - diff --git a/code/GLucose.jar b/code/GLucose.jar old mode 100644 new mode 100755 index 88f7e08aa4c0742214c5d1208f0b3efb913115e4..39466d60690c25ec9b883119704576aa1358c123 GIT binary patch delta 3479 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 PqJV@KC(}*Gqs+emQ0^#4 diff --git a/code/HeronLX.jar b/code/HeronLX.jar old mode 100644 new mode 100755 diff --git a/code/ScreenShot.dll b/code/ScreenShot.dll new file mode 100755 index 0000000000000000000000000000000000000000..68a6c99f340b669cda7ccd01a7923da70035c033 GIT binary patch literal 148480 zcmdSC34ByV_CI=iNzw@o9U$x=QG*gT69OZ#gEk3`VF@&3AuLf*h=>SGavN|Yq+=&P zxhbR38RzHx)fpLe#zAL{%V@xbCLI%kTUdlZP!Uk8xu_8$=|H64_td=|5I5fEz0do6 zUOwr2>eh1VRMn|dRi{qX&06S^jFKdoC7ToqNm4D`^yiQUYmQ%g8YF33tki4xYtbKE zS!`p%*y_r%}hE|%kOUlw2FUKQ_NwRBlg{QSFCrHtqcUi2^Rvd~3glJC@v3TMo?)rdvKb zTch%p6y3FCl?*&@;r-YCC_K!DPfv76FXC5&-)s0ikDn#QAtm5<8-7tab8cU;><)P+ z(nN({E@TjyeQ&Y6>>f$t2)D&dC*q3=m)x<8@)y*S!$%KEnx@A#K?=U_otj_{2FA{k zB+WIm+m#E~`~7-5q~Z7_;@6D_IDCW%s3ySQqPe9P;dbEnOMet@Mc^9HNac+$KwaY( zE^iv#;qvy*=`O-jt>nyCkMzBJF_}vX6kUN4jnp7)8Ql?PS9bJ4#((l zqz)5w7_Y;jI^3kgfjW%SVXO|H*5Q*nd|ZcC9a?l)qr(?<_`D9yI+S$S6;Jh;?X7?7 zO_Fsvd5sV8iljKqpes9%onkHgDWIzG>4;c=#bsf6X2oS?eU(@x->jsY z6;q7?37N~xEJ}H%n6heVk>!OW@i}|)@;hQ z+WWiXn4iBvglAZkNS0wWOf#$fS$|WW*?*HY(IOK=fbnx=QgMK zl*okzw}KGJ56aV9A7m};92*aO_O_yx>_gKGGvlVat@aPr-C}QZ4`JzM1F}yyCuUf^ z_gN+PRAe#{_*6TKVMS)shb(Bi&uah39g$dURj*+&z@S(YMt3S363nd6=w>C`%Jv~q z^Z76lsX`&RHR~VK{ z@sgB>_6z=iY6vR!ijaIY+gp1C^~hIhdGuW_d8mz<$;A&M8p>^=Qd1te>>%2VH)f!F z$4V>A0^f3S=kn*eQM!j;nz0r!FPD1|Nilit(uHilhZpMi;%sl%vlX>1^7YoARAwcZ z(Z-Ea6D+8~P|6-9C&7vqHz%0hRi-AyvSCyTbuOB`*kb=?-89x<%COoIvd(Uo6D-AM z1<$ajb*&kRta@4V__tkx3u781-U1d9r>ONxD$-|V=LoU;pA6y{xyE`oBv>VR5WTXT z1d9?2mvuDA!W*%xw?0k~uJK5_PB&|2C(6E%+Cm{yTtZo0$cBbFO0Ot}g>We&@wAM7 zSI5F8isGcPTP$p&)pX9Tt~Ihx>>Cm+Yt0N#`?iBi)GBIf)F_iRcNRxSP;Z8+iw+fTCZ?-WNUh7$SJn z5+wI?@PI6c9AVKE ziyHkuXHlb3I;JoiQ~yI1u}&o}q3UtbT*pLnO-L}cfq~F+_D_o!v5(mP(R+d9FUSkj zp=N5Sg?Ryxvc(DJidK1eH`RW@uc!yBLfr_R6wsnoUK~}Nmi93sh$L?ms39Sg%TA{3 z$zA^GV289cG=8aa)p8%@k=hvwc_uq!(kXM}qZmEf1mx zKo%YjhC{{m!PLdHu#?hi!AOOpD<(-gaa%8>1uOm4|m{yuV|64ea}m*^4%g+QR? zBW)&vTzmq2Qhb79UFP)(i|h=Gi;qAs8=?!XFSROA;HOnVDY--yxZx7xc7;zKfDyAF zjomK3zoXmR9q2Au6Ue)Su#XW@tLnXQ`2!<{ql~SK3jEpj2&x=+G!4Q1$Vnr2rlqWt zgjMMz47LL*n(j4ucbIl`8bzTb=y(wDIb~7SNl#fHYiOp-4wW6FJVyK3&XnFAb&z|Z za5yrP&KL}GJYli2BFpFo`x;9)6w@(@S0cXYQ|9lUo3NIY5HtM?VIH~12*PX%np&9Y zd84~8I}I6=j}&a0g?znNpJ$EKxAgIf1Yv_YK|-uQQ>>PXR$KY~MC9ET_AcZcYp$|h zKYBNcUutH-(dSvi=y$zAYe^h>w*f*R+hQV_^Dc?!-oozy>aJ>F;#Kbk8b8qAq0}Z0Fm<08T0{jf}zr!5FX0F1E3d^ zks$j_DYh`bslm&w${Gu%K*VL&v;7r&z+-i$9cMKjV^gc!G0%(@45uuvZdVqWl_Ba4 zVEqiU(ibz;g=TdOlBY@1hMr$crzv|Xd}tw`X-CjFSprq1{WY1(a_(=h*yFb7QuhQp zF!3g9+fFU;HdPfHX2ui4vF)L9V$I=V4!-d|VueL!_?HIR043dGA1<4f;p!baSM&tO zRe%^`YWHls4Adx#O7R6Y0gv4+l|Gy3mb@jBwZvj_qh%DQB$~`Hky?uF4|jM?LU_M1 z8zz!aP-mggM&j>m3#%L5fDQqfve&f#QJ#Y~Q2Ve`_Tlab23Cs_%o=~5`F|0cn5|)) zK&29wx9G!#JDQ(Ey_WlAOBp#zH^vZwU4b0Pv6QCV<<(cwD3ZKXx$+WW9e)b#=a2Fp z>++tnmPEWsYyGlw)KhE^|B))tf1xcdZUp&WG-`v%4>^WqjJ?@C_(w5&iXk$jY$$8T z>gBzQ#J3nqm8lQ6vlt~S$g+Yoo5T|na5m2pu0+tT*Q07S3=_h&ZjdAes7>v|sG&<| zBnlYrTRlzURqruc%M24Ov-ek!-UFoSc(l-KXbWW8J+A#PD(sS~`T=ute_;MV8nKzP z3!P!Xf&yCep*`k`)pZfaoD>3q z*YSX8uCu!=Kl1-8{7qOZ@*HrGHtbLfv!H!4)uVe%qNq=UsOPfD)CeRJH%9QjU~j>1 zd>CpcP(c~Qo~bj+L-i5ztT`&@>AZ1DDRhD-t%DgcZk^; z_kL|=C0J_EXowM~k+s;*+aB~%*n!deF}byia=RyC{+k#fSPDZ<1eITBK3ml+G$(=$ z;ow9O%sK)o6wq?UWF$QTie!jO;O!W-ATzBShOkdCI%DkGX;e&5%Ru-)iSh=pSeKBt zgFwURM$CZCIt_P^brDYxN4Fg3y&CfKENYy(A;WG$cVNPiT@kWm} z#Vyqs0)Iztd^)DTAnG$BI1BY&hv^xufvgF3%-l2(D<#HqaAd7o*3ZUnDcE z*9iAHj4a{q)|Ypj7TrykeUG3(G=pxs<`-tr315Ty{UG5pbbgQ!p%iqfzXPv5K`WCW z8ibpf6z*a6wh|+2fL^3GR!;9d!v9V!>*pcxzEW~Qa5N*gOIWi0B(dZbaX(^7nx|Cw zHuekk8zW)(pmC>1je)m;Xw{g~%KVsjVFHfuBt2a2QDfxI7lkuRMUyPIi-t?r(DuN~nmS}WyShYr=L@H zct1Cte)iT|{8e&tSJj5pE(+-VgC62-FnJph4iWE9TT&F6_J?)GG4cLt?@7yNX$eo{ zFC>~Lj}*m@4D};N?H*(qco@=8$Qr7fLJaAJlWPtXMHWte^}yPwHwzI(9Zg;`MtXkA zC`pA-zIpD;l-xbN_YIWXQH>b`>k}QIJ(N9=SVBaMM$yF-zHr+s2l(HpBA}nZOx~wt z#L~mMLaNG$bz!E1U!05dbDwabbLqv?0+2Pqd)$#JzC~z5Q733htldf5Q*5m`Bc^ND z00p|VD=&` zuO)wn=8wt(Baw&iM-lT8v2j|$vjW8D0C+ZLV)^_EVy=*udjRIHkmk9nre(VL-@c;C z2-(Ul$V-VVEZb;)^?A^|CH%&g;ZbZ%_N@Ra7s4n#!gj%X zg`^w>UXel7pGo}BLxe&^SeR+6cpfp5eW}gGcYEH7q`+RX$)SF`!ni_8Y$i;(8YU0o z;q4~8WxCg@ldJxRA~#O6PymWWx;qIyrNw-uK1oG|56l5 zPSuL@@&S1O5WWLn2#;8A&VU~{ebOa4YO+QHd?Mbw6IgUky%j^K-tU-e zD6b(_MIU6Yc>b*JhTLdLIivNBmk$(OM}1>mV&RBa4irv)<$xO7YAy(hqLyjzH`VH5PBiNk729dcM-Q=>uiw zjw7*!%1&iB$(HETFDSc7=xn)F=*yJ`7usiKvM;%H`}^;|Z>_vyn&(`+9Q?23IX70m z-E(fVe5>bN0zKBt3q9xZA@|=raHzGB-?#e2& z$KW%xASUGSm*+o_qbqzRv(@NnYGg;tM(6sBMTwuPQ_jDO2&#WOn#Crf%Aa}8Eh#d2 z)OZcq+8!RYx942Mx@M0*26&rx95IKne!L+0j53~9gVguS&IzW#%0qBPpA_HI@sRR` zN=78a+|6jC!m|6ozYrFz1vJG7#^d8@kcE(DKFH|(g=OoB#cd@2p9fLp*ult`C$jZ% zru8(L9qqEF?kbHpxU7l0U2~P)r=JbEhGNxjUXZUI;$LD8u^=Df+K_1#a=lvFy>0n8 zhve;aY+ULMI9zkLI*4N)0ct*JV)ytW(to@l-yi?~@UNoD_V5HCzcA)#OnCYqG|D)n z00}md+sUmJz71Kna?%q|mM|xm1UjO*?pm>?U8EY}Ne# zo22=hx&sPlgUG!)6pUjl}x=9Nhcvm`Y96lo8^HQA?Z|OT3>J@U)6ZCY1?)f{j^887~xHaY~9q@59A*IA41ay)6(T`s>(cO|s<(OjNCKi*$+#lQ8=Ak8)M z?r(-_u1@1)@xtYJBV*gu!WH}6K90#0{ziRO{>UhDdD`Q@{O?$DJ)QioTaTeaV05v) zX~;tp$o1~HxBmX}^>8`X-f(x1Pj7&WE9R>kD{qAB_7~q(*Z+G8#)m%)c;lJ_EmIv* z^^2>mzXeW&?@rc+I~JN|rCnbWah zb=NY-U;n#i^z;9I_o=%aAOGW{(DdQ!>-IXHiF@MR{x7`x?c^y(9t?PzZr=9C=cjBL z@MY=f&HZ2RlYV#ZwW(DdYmRJ4Pijg#7W(tN%CFKN`n2<@bLz$|b2A>iZpGq3UDxb+ zGh^+s_fI8WS6+6_)IBlPtiP<9#{LJ$U^Rwve@qC{Q|E?+l*4cKhFV7JTAa^~C?iR~qNtRzJes zw&3GcxA&g-pI!I)LnF$?K6G|UD>UfephtLvQSPBD4E!kEBP0ms$x=^@|4~A-<2Jqu zJs#wU&}p>W-iWY5bSTbXm9xvW!ayVVc!#tcqrZnA#M}ZsJ}bqSyLg7)&6f1NW{|}OMFX?X!`)-1-KkyLN;p(@An<>M>5x!6%%MBKK zkKR<+qpt87@?>8W_@(SQ({kodnde-bzPf1Tl2uC=PhGZh&GNez&&!!5O>^aDEh)Y` zZ^=rxu-Rxm_Qb)lloI_MI_Wy7r>Y^_4zM-*lA9`fP0?nYn8PNwM(>e_G6#8E>@&LD zu`?>u4CB*!d%pV2ZJzEvm9eP>b;2BnF-RDhkQ|K>omOYfWI0UM!jNS zmeAZT(yb|e<-iMUW=pbf?v8+Q`so)Ih(SzgR*tfnwOD=_=CVbHG5nj^5cTWSee$qH ztcTZcX2r1>w1htkY?2lkBw#gMJt`mmH%r67n6|J*JX zBrbU#VnO2)Op_xSyrcLXR82IsPR3LhrR{49DmQAIgOM&KgsH6J6MiSBr*awMS`8$m|s^5Q5jiAEiy=C7ECMHczcq2Ah!1H zYs~IgDC?oBcUxGI)xO3m_x1WvLx(Tamp{=n%Dk+^!+zrYxwbl$Pgy93qjtu%M zJ6Lq;Zn+nmei()qr)y#YTcFj$Jmk-+5w*Or8H?7Qwl{2Zy^Y3Gg)hl53#i)9pgH{c z24CV%Cg0q3E84|1mr1-4MP86E8$(|%2n+x(!5>(p)MnWt_|bhD%Shs{dcj|{XbunJ zP&opKKmmOAJfjTf6^2izyH9J_KG_td#&{bdyL+bC=g{Z@!EDV=kP|1!iPXp$ zh{a;m9QP?L{o#e`kjlXbQTavmd`o_h7ptb}1XI3{vj0 zG)^&p@jFcHr&yONF^d)~^ao~R)(<_(80N5|L3=UFD`hV9zt3OLahN!V!z6it%QY{D z)+5W0cZYiGE%}sBju5;@F7h`E|1jQYSE$$=*pC(s<1?&{a%BhV$%lBd2}Tf844%}0 zZ1tq7ZmaDb-;^mT_VpqRJ3xOJ&oG+oeS}1FwH!b1&T#=Ie;07~0i`q)9PJKYh~kE^ z#A?Mjb|Ekyd5~7B!(m3Jlx!7!QN3l8K1B@X8ptx^)Hb78e@nK#$PbF{=X*cH}{-#`!x3y+a}-6&97gUlr5X?n8N7Iv$-@n&-xB6|H1yb$z;js;#ox%mu4 zW}8H`-b%HAQ!Ifv6u%b1VywEju2y%~l{~zQCt_mF`dRf_%0?K~k~=1l2`6(5L`Q+y zg4l$CiPM6Js^3Q|@3KfRafb3Oy5UWb96|Ydmf2#T)8Zb0A&<=$qaM~)(T;S!1cFK) z$Vv|*O~~EsZLrLA`)HFRAlhMSLfntqZAwVA81fv-$3tlsZj%cYtGCGy2f}UgH#rrwZGC7OT7(SJ!ppcU#74J~is?_tdv zy2Bi}8Z_`a#QkYIJP1YU#qB`Vsq?KooXs#drkjV_#g=9+TVX*D;_ndB-Bd^6bkOa^ z)V5F_y}<7ab8_eBfqQaRM8U3$n0{Vpgy{UBDXGz6{$JqZ6Nnm(8)6iVJJPM*+sr>` z^^GAX-NL_xGMfJf3%Fz-%q*6&*afVQ()&Wz=<8g)_NRy}{J%)KkS$FZlk9^5geAX# zUq@sg^(XH^#}alfD9cjC7}{NDB_6~W&T=ixIQda%cuL2}izmaf+E?07o;ovEJULUIt=<;#`%vg6FE@80oiw!HEJT6o2n<*!#H;ny(Ua#}= z$?`Son3|pHsG27Anwk&Pt7<+{ufY4@ngeS8nh(`JH7#ndnnP+#%|SJ?W*7D@LnAOx zmDoHhx2T~|L7kb}^MX845E$;tHla7;4}L5dPX0Yb?Bd_ib}X8bxaPyOZmuD7momE$ zMA>mHW1u|jf(SZ`KC857Lg*W~S+HLx7ZUHoBs|GUsY1SwFfHd^m7kK%)eNp~i7q9e>Y3 zjLZeBx6;oAmmHO5DlvuP%H~olp}j1K#ByUpyBENbX2L`uuFN}m3{XJd+Ym7U4#UC8 zVx{4&vIqM^dy$-&t5GE5;QK<3{bgR1#UN61r`1ZDh=O>xlF2y5ZLbev-? z)3F!P`ts1tr0s`o$x&P7qZ{B%X{|iCDeemB4yI!W_>yKg%$MwY0R1yv>S!6{b7*XH z>p-?TF0^iFXk9$JUT=h3Z)wu{`CQNBsZ;~<{KB%y1EEZW(l5?CIUX))ZI4>gBw@n> zPhBCs;)>-&Iy9YUcZWhQK4woS6b>>j&v!T|=ra-28$k>Gp2M#K!{@Hr2=vsf_LzEDvaM4t+d-9l{QthP4se$|55cy<{+dVhDO}b}UPewWpiq z82ClHcqNGE1$qLvDU_W+M92|*Gjf4Jtb2fWa)PKb>@|>sA<;x6Vx~OS#?I+Ad`n<0 z2om-I&rosr6?pYmKO8{>2Cxf&nS3nPT05Auh09;c_2V(-7-X+$gN?raumf6KU zP&F^iSIupq^xy-Ocbv%eB3y%kOW=qh92O|*ne`^pLnRO9)yQn-uf=h*gRNqrZgI>#|MF1y|rqU zq3nlHlq8jm%%fQ!Nr!D@W6K`|O|%r9bW1fY=yS6Mz)vlK?~%uC`y92 z#d`b_+8?CgR}qZNVCbYyB8+z4(tP+VvL~pW9JpxW90ZkJ0cIj(=7MGGm_F+)Z^YdqxLUS?hXXH zy32eO4-SmpLk zJ-ETB9Nc7aJj$JD*+u>aO}~MDVq%UiKce15d!DxP|AD+m%?nn&w~OU<8P2ADC=cL& zN7q)`*z7LW*Kn3gKte6c8N8WE=~Ox4SV9=40)stPUTn9>y)cKLh}VVrf&YVwBfNW+ z53!ZjWt!H-8A6msuuKb^*~R~T3~y&e7N+bj{#U%_D`&C3HihN{g{?ScsO$HhOm|>mKIYF>l+J`M%?pwHLQs-lmGGy~ z5o%j16*fXsn{DL}gGJB{mLsRT*|aV;zbmnMozYM?Z^sGRBI(73V^<`92DV6Mo3X6G z%S;S8-bTv|u|?8g_BNUqdXJjqt0*qEJ*Lc%2VfuMh8c2f*)dFrrLxcIiG$^y4rZNZKpxS4?z)KpW{q(UcpLp$>85@SA9x550xVNHd z!=TiIrM(TbShMh*m~pASllQ1!CU29RGN7RlqiiNMXYibm5}-!ddzox0J4EB z8%n{tEXxKD??Q)bl_S8niM!_V6OhIWltYUGRdA3gKn1Bmk$EhXru@nGNV#e&N0$+@ zK*;OJdHhfCr@9pF(MuaUT=RGdyoF9cA1|m7R&Bg+@!Jq6MhK3=A}uYj-=Z3$o^LCE z8P2)$Ts&FN^7oV_>f{&Ys0R_$f}fY8kgNPQl$+$}#tU*Z6;-W{VxI^x$SZoFp}-{nU5>6U3M!|=1P4mBz4YEzWlrG} zK_0`nvoRKjjhbMfBEmzT!uLH>Q&rqLr2dZH;D3M*r^1LKgKYRUxgZxoCd`FQ$oWN? zfPQ{KCQSG_nSk*H3b#TwybzuLN_75VTIcVtb$;7I@{iW`OW~x>fcn7L3NlzH9aMs< z^#@SrJ!dE}V|zJjrri&-o0f_YUVW-%wBH`YI|e_~9@Bo7WqE|pMsy&eMH+AsBG~?> zw4yGq1+t-#noyTT@qZ#3>}~pLW;|>sYH2UL4}XGi8cTa1qE1h8Q+DMH19kQ)xpxfP z&^r>-ZyYpfVSTjm)dudOS$OGJN{gPx+bP+~kHFtWH7aHu$$KgzEAtF#G4hDC9`cQ8 zR(Wn(PkC`#FL`a6%~oEH$Z5T88QrMy6$f>13) zIVJ2{=ajY;sG|vmnXl=sp%|*PD5uEdB}|a#lzyl7Kmqe%PBj0ps2|d;iAo5>2;N0$ zbE&w=zRD?vstuMHwz>-g+nnHBHpiT}V`C4c&d`R1i;U#3C1wLypUN0dXN;We>Fgm- z_H

7LG>*xv5!C9m;xqGCKKuBQ_c!^&FN2B{^Q$6q0_ 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 literal 0 HcmV?d00001 diff --git a/code/ScreenShot.jar b/code/ScreenShot.jar new file mode 100755 index 0000000000000000000000000000000000000000..c75b8de040d302fe178a9978eebf6b3f230fe5b8 GIT binary patch literal 1663 zcmZ{keKZq#7{})=tm7rdq=?#GG%u@5$s*Cl+QmjhvtG6)smNA&OLdkrONH9XVx@Hp zSE3gpG>us#H;QOjTXNI3Y^0V|*WK>9l{)8spFe)T-#Op!bAHeB#|MisFa!Ziv^7Fv ztOU%GDZmgAirl!)9UX@9{QDsQU;w~kj7@Y7{r_y({|$q*j&I@6bzx`}GIFCwD2m*5 z57+_+(WQO`neF94he1e1xrYrb;z+dVo71SGE0ACexSHT#$dy0nd}kvXTmX3mW^~Lc zxp^GRs$7zgom;I@!ojkNb9?q5N{f!M4w6~ZFm7tpN!Jd-;8BBo`?ZE^WA`|b2D1)( z&AVUbD{<1ySm&N9-QZqdlu~O)1FNDKi*Re-yY4X`z2sBac(RYN7fS9waJf$?c3Z!l z#`Jt0uxWDqdgY~EyJ1Hxf2m}#u#OlfrQOy=y|l=uHuz#A^Ju}OprbP2CMYC*VVS(n8afNu7OW? zgwUB`lryF^9xNk#VO6)8qeX)NDI(>&5$d~b@T(dow|0}hh#{dsWPTB6NIjmV9#)Sl zdFsj5k{AAZaFgK^t#(s^!UD@O5XaWtJ((CY^=BHKb{mMgr`m=^#?_DlPtIK~ZNvMN z5hIX+d=}WB114^6J4u_nO#I<880{H9k!Mm!Num;LlodqoyhpC}E_}auHr?BqKR++- zoKyH&N<(%YYrBkE+h=o+;(9yc3UW)AU1_#h6(KwLR~R(<5qmmDRACqI?*Yvy>%W!p ze8qO-UJac-}6Cgsna|rgAT0fT0RSDV;n7QQSITcro{ zccy8jSsiBpvlEej0#^6lO`2L4dR?=Rd*|%jH|dBzO6ikI_S(-htEDB!OSV*R)+~GH z(kIC74O{$f{~aIX<4U3F(nt?^d{|2d7&$~rB)%4G^O+8Bt%yowL#DFTzQWYW!v}-b zqQ%9G42C`}8uqLf&5XgpWq|jAZts z-&SR;p@g>Zh^|b`eAwCF$PU42Q5HdmKp`*Tk&ahwiLjdokgJ^h;)7eRv62P{+SC&7 zg~wVCp7J92^@RF-q}~};x1yi7dVf9y%t+xBJ-XRH->JzuK$dgDSM}8PRhwCT1nzY= zbZ7(@>t&5AOrVdJ4<-@5@C&wnXp~`5!!H7cX*tX$Ue#J`uG_?MwoIKxZhc961R)Q9z~cMG9*sEmJo)e`9vnCK8GP$ zfpf!sVsGv2+umswwYR*Ao{>DTq~MbuqDj6|S-rXGSZ3N| zZt1`f6~$U?d=__P~wqSS$R!MI}q!{k*~5YHkD0y$E#Rn=>v;X6z5!TA@1LWyd8VWFcll|r-=eeFJ-dUBd$T{L`7 U1+f^TIXZ`dwi>l(m67iC56^tah5!Hn literal 0 HcmV?d00001 diff --git a/code/oscP5.jar b/code/oscP5.jar old mode 100644 new mode 100755 diff --git a/code/rwmidi.jar b/code/rwmidi.jar old mode 100644 new mode 100755 diff --git a/code/toxiclibscore.jar b/code/toxiclibscore.jar old mode 100644 new mode 100755 diff --git a/data/logo-sm.png b/data/logo-sm.png old mode 100644 new mode 100755 -- 2.34.1