//----------------------------------------------------------------------------------------------------------------------------------\r
public class Pong extends DPat {\r
SinLFO x,y,z,dx,dy,dz; \r
- float cRad; _DhP pSize;\r
+ float cRad; DParam pSize;\r
Pick pChoose;\r
\r
Pong(GLucose glucose) {\r
int XSym=1,YSym=2,RadSym=3;\r
float zTime = random(10000), zTheta=0, zSin, zCos;\r
float rtime = 0, ttime = 0, transAdd=0;\r
- _DhP pSpeed , pDensity, pRotZ;\r
+ DParam pSpeed , pDensity, pRotZ;\r
Pick pChoose, pSymm;\r
int _ND = 4;\r
NDat N[] = new NDat[_ND];\r
public class Play extends DPat\r
{\r
int nBeats = 0;\r
- _DhP pAmp, pRad;\r
- _DhP pRotX, pRotY, pRotZ;\r
+ DParam pAmp, pRad;\r
+ DParam pRotX, pRotY, pRotZ;\r
xyz Theta = new xyz();\r
xyz TSin = new xyz();\r
xyz TCos = new xyz();\r
pRotZ = addParam("RotZ", .5);\r
pAmp = addParam("Amp" , .2);\r
pRad = addParam("Rad" , .1 );\r
- pTempoMult = addPick ("TMult" , 0 , 6 , new String[] {"1x", "2x", "4x", "8x", "16x", "Rand" } );\r
- pTimePattern= addPick ("TPat" , 0 , 5 , new String[] {"Bounce", "Sin", "Roll", "Quant", "Accel" } );\r
+ pTempoMult = addPick ("TMult" , 5 , 6 , new String[] {"1x", "2x", "4x", "8x", "16x", "Rand" } );\r
+ pTimePattern= addPick ("TPat" , 5 , 6 , new String[] {"Bounce", "Sin", "Roll", "Quant", "Accel", "Rand" } );\r
pShape = addPick ("Shape" , 0 , 10 , new String[] {"Line", "Tap", "V", "RandV", "Pyramid",\r
"Wings", "W2", "Sphere", "Cone", "Noise" } );\r
pForm = addPick ("Form" , 0 , 3 , new String[] {"Bar", "Volume", "Fade" } );\r
float t,a;\r
xyz cPrev = new xyz(), cCur = new xyz(), cMid = new xyz(), cMidNorm;\r
float LastBeat=3, LastMeasure=3;\r
- int CurRandTempo = 1;\r
+ int CurRandTempo = 1, CurRandTPat = 1;\r
\r
void StartRun(double deltaMs) {\r
t = lx.tempo.rampf();\r
TSin .set(sin(Theta.x), sin(Theta.y), sin(Theta.z));\r
TCos .set(cos(Theta.x), cos(Theta.y), cos(Theta.z));\r
\r
- if (t<LastMeasure) { CurRandTempo = int(random(4)); } LastMeasure = t;\r
+ if (t<LastMeasure) {\r
+ if (random(2) < 1) CurRandTempo = int(random(4));\r
+ if (random(2) < 1) CurRandTPat = int(random(5));\r
+ } LastMeasure = t;\r
+ \r
+ int nTempo = pTempoMult .Cur(); if (nTempo == 5) nTempo = CurRandTempo;\r
+ int nTPat = pTimePattern.Cur(); if (nTPat == 5) nTPat = CurRandTPat ;\r
\r
- switch (pTempoMult.Cur()) {\r
+ switch (nTempo) {\r
case 0: t = t; break;\r
case 1: t = (t*2. )%1.; break;\r
case 2: t = (t*4. )%1.; break;\r
case 3: t = (t*8. )%1.; break;\r
case 4: t = (t*16.)%1.; break;\r
- case 5: t = (t*pow(2,CurRandTempo))%1.; break;\r
}\r
\r
if (t<LastBeat) { cPrev = cCur; cCur = cCur.setRand(); } LastBeat = t;\r
\r
- switch (pTimePattern.Cur()) {\r
+ switch (nTPat) {\r
case 0: t = sin(PI*t); break;\r
case 1: t = norm(sin(2*PI*(t+PI/2)),-1,1); break;\r
case 2: t = t; break;\r
boolean btwn (double a,double b,double c) { return a >= b && a <= c; }
public class Pick {
- Pick (String label, int _Def, int _Max, String d[]) { NumPicks=_Max; Default = _Def; tag=label; Desc = d; }
- int Cur() { return (CurRow-StartRow)*NumApcCols + CurCol; }
- int NumPicks, Default, CurRow, CurCol, StartRow, EndRow;
- String Desc[] ;
- String tag ;
+ int Cur() { return (CurRow-StartRow)*NumApcCols + CurCol; }
+ String CurDesc() { return Desc[Cur()]; }
+ void reset() { CurCol = Default % NumApcCols; CurRow = StartRow + Default / NumApcCols; }
+
+ int NumPicks, Default ,
+ CurRow , CurCol ,
+ StartRow, EndRow ;
+ String tag , Desc[] ;
+
+ Pick (String label, int _Def, int _Max, int nStart, String d[]) {
+ NumPicks = _Max; Default = _Def;
+ StartRow = nStart; EndRow = StartRow + int((NumPicks-1) / NumApcCols);
+ tag = label; Desc = d;
+ reset();
+ }
}
-//----------------------------------------------------------------------------------------------------------------------------------
-public class _DhP extends BasicParameter {
+
+public class DBool {
+ boolean def, b;
+ String tag;
+ int row, col;
+ void reset() { b = def; }
+ DBool(String _tag, boolean _def, int _row, int _col) {
+ def = _def; b = _def; tag = _tag; row = _row; col = _col;
+ }
+}
+
+public class DParam extends BasicParameter {
double dflt;
- _DhP (String label, double value) { super(label,value); dflt=value; }
+ DParam (String label, double value) { super(label,value); dflt=value; }
void Set (double value) { super.setValue(value); }
void reset () { super.setValue(dflt); }
float Val () { return getValuef(); }
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 ); }
- boolean isZero () {return x==0 && y==0 && z==0; }
+ void add (xyz b) {x += b.x; y += b.y; z += b.z; }
+ void add (float b) {x += b ; y += b ; z += b ; }
void RotateZ (xyz o, float nSin, float nCos) {
float nX = nCos*(x-o.x) - nSin*(y-o.y) + o.x;
boolean bInit = false;
MidiOutput APCOut = null;
MidiInput APCIn = null, OxygenIn = null;
- DPat CurPat = null;// NextPat = null;
- boolean _XSym = false, _YSym = false,
- _ZSym = false, _RSym = false;
- String Text1 = "", Text2 = "";
+ DPat CurPat = null;
- 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 Sliders[] = new float [] {1,0,0,0,0,0,0,0};
+ String SliderText[] = new String[] {"Level", "SpinHue", "Spark", "Wiggle", "Trails", "??", "??", "??"};
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 (APCOut != null) APCOut.sendNoteOn(col, unmapRow(row), clr); }
- void SetKnob (int cc , int chan,int val){ if (APCOut != null) APCOut.sendController(cc , chan , val); }
+ void SetKnob (int cc , int c , int v ){ if (APCOut != null) APCOut.sendController(cc , c, v); }
- float _Trails () { return Sliders[0]; }
- float _Dim () { return Sliders[1]; }
- float _Saturate () { return Sliders[2]; }
- float _SpinHue () { return Sliders[3]; }
- float _ModHue () { return Sliders[4]; }
- float _NoiseHue () { return Sliders[5]; }
- float _Spark () { return Sliders[6]; }
- float _Wiggle () { return Sliders[7]; }
+ DBool GetBool (int i) { return (DBool)CurPat.bools .get(i); }
+ Pick GetPick (int i) { return (Pick) CurPat.picks .get(i); }
+ DParam GetParam(int i) { return (DParam) CurPat.params.get(i); }
+
+ float _Dim () { return Sliders[0]; }
+ float _SpinHue () { return Sliders[1]; }
+ float _Spark () { return Sliders[2]; }
+ float _Wiggle () { return Sliders[3]; }
+ float _Trails () { return Sliders[4]; }
void Init () {
if (bInit) return; bInit=true;
- for (MidiOutputDevice output : RWMidi.getOutputDevices()) { if (APCOut == null && output.toString().contains("APC")) APCOut = output.createOutput(); }
- for (MidiInputDevice input : RWMidi.getInputDevices ()) { if (input.toString().contains("APC")) input.createInput (this); }
+ for (MidiOutputDevice o: RWMidi.getOutputDevices()) { if (o.toString().contains("APC")) { APCOut = o.createOutput(); break;}}
+ for (MidiInputDevice i: RWMidi.getInputDevices ()) { if (i.toString().contains("APC")) { i.createInput (this); break;}}
}
-
- void SetText()
- {
- if (!isFocused()) return;
- Text1 = ""; Text2 = "";
- Text1 += " XSym: " + (_XSym ? "ON" : "OFF") + " ";
- Text1 += " YSym: " + (_YSym ? "ON" : "OFF") + " ";
- Text1 += " ZSym: " + (_ZSym ? "ON" : "OFF") + " ";
- Text1 += " RSym: " + (_RSym ? "ON" : "OFF") + " ";
- for (int i=0; i<CurPat.picks.size(); i++) {
- Pick P = (Pick)CurPat.picks.get(i); Text1 += P.tag + ": " + P.Desc[P.Cur()] + " ";
- }
-
- Text2 = "SLIDERS: ";
- for (int i=0; i<8; i++) if (SliderText[i] != "") {
- Text2 += SliderText[i] + ": " + int(100*Sliders[i]) + " "; }
-
- uiDebugText.setText(Text1, Text2);
- }
-
- boolean isFocused () { return CurPat != null && CurPat == midiEngine.getFocusedDeck().getActivePattern(); }
- void Deactivate (DPat p) { if (p != CurPat) return; uiDebugText.setText(""); CurPat = null; }
+
+ boolean isFocused () { return CurPat != null && CurPat == midiEngine.getFocusedDeck().getActivePattern(); }
+ void Deactivate (DPat p) { if (p != CurPat) return; uiDebugText.setText(""); CurPat = null; }
void Activate (DPat p) {
CurPat = p;
while (lx.tempo.bpm() > 40) lx.tempo.setBpm(lx.tempo.bpm()/2);
- for (int i=0; i<p.paramlist.size(); i++) ((_DhP)p.paramlist.get(i)).reset();
+ for (int i=0; i<p.params.size(); i++) GetParam(i).reset();
+ for (int i=0; i<p.bools .size(); i++) GetBool (i).reset();
+ for (int i=0; i<p.picks .size(); i++) GetPick (i).reset();
UpdateLights();
}
+ void SetText() {
+ if (!isFocused()) return;
+ String Text1="", Text2="";
+ for (int i=0; i<CurPat.bools.size(); i++) if (GetBool(i).b) Text1 += " " + GetBool(i).tag + " ";
+ for (int i=0; i<CurPat.picks.size(); i++) Text1 += GetPick(i).tag + ": " + GetPick(i).CurDesc() + " ";
+ for (int i=0; i<5; i++) Text2 += SliderText[i] + ": " + int(100*Sliders[i]) + " ";
+ uiDebugText.setText(Text1, Text2);
+ }
+
void UpdateLights() {
+ if (!isFocused()) return;
for (int i=0; i<NumApcRows ; i++) for (int j=0; j<NumApcCols; j++) SetLight(i, j, 0);
for (int i=48;i< 56 ; i++) SetKnob(0, i, 0);
for (int i=16;i< 20 ; i++) SetKnob(0, i, 0);
- for (int i=0; i<CurPat.picks.size() ; i++) {
- Pick P = (Pick)CurPat.picks.get(i); SetLight(P.CurRow, P.CurCol, 3);
- }
- SetLight(82, 0, _XSym ? 3 : 0);
- SetLight(83, 0, _YSym ? 3 : 0);
- SetLight(84, 0, _ZSym ? 3 : 0);
- SetLight(85, 0, _RSym ? 3 : 0);
-
- for (int i=0; i<CurPat.paramlist.size(); i++) {
- _DhP Param = (_DhP)CurPat.paramlist.get(i);
- SetKnob ( 0, i<=55 ? 48+i : 16 + i - 8, int(Param.Val()*127) );
- }
+
+ for (int i=0; i<CurPat.picks.size() ; i++) SetLight (GetPick(i).CurRow, GetPick(i).CurCol, 3);
+ for (int i=0; i<CurPat.bools.size() ; i++) SetLight (GetBool(i).row, GetBool(i).col, GetBool(i).b ? 3 : 0);
+ for (int i=0; i<CurPat.params.size(); i++) SetKnob ( 0, i<=55 ? 48+i : 16 + i - 8, int(GetParam(i).Val()*127) );
}
- double Tap1 = 0;
- double getNow() { return millis() + 1000*second() + 60*1000*minute() + 3600*1000*hour(); }
-
void controllerChangeReceived(rwmidi.Controller cc) {
if (cc.getCC() == 7 && btwn(cc.getChannel(),0,7)) { Sliders[cc.getChannel()] = 1.*cc.getValue()/127.; }
}
+ double Tap1 = 0;
+ double getNow() { return millis() + 1000*second() + 60*1000*minute() + 3600*1000*hour(); }
+
void noteOffReceived(Note note) {
if (!isFocused()) return;
- int row = DG.mapRow(note.getPitch()), col = note.getChannel();
+ int row = mapRow(note.getPitch()), col = note.getChannel();
if (row == 50 && col == 0 && btwn(getNow() - Tap1,5000,300*1000)) { // hackish tapping mechanism
double bpm = 32.*60000./(getNow()-Tap1);
if (!isFocused()) return;
int row = mapRow(note.getPitch()), col = note.getChannel();
- 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) _RSym = !_RSym ;
- else {
- for (int i=0; i<CurPat.picks.size(); i++) { Pick P = (Pick)CurPat.picks.get(i);
- if (!btwn(row,P.StartRow,P.EndRow) ) continue;
- if (!btwn(col,0,NumApcCols-1) ) continue;
- if (!btwn((row-P.StartRow)*NumApcCols + col,0,P.NumPicks-1) ) continue;
- P.CurRow=row; P.CurCol=col; return;
- }
- //println(row + " " + col);
+ if (row == 50 && col == 0) { lx.tempo.trigger(); Tap1 = getNow(); return; }
+
+ for (int i=0; i<CurPat.picks.size(); i++) { Pick P = GetPick(i);
+ if (!btwn(row,P.StartRow,P.EndRow) ) continue;
+ if (!btwn(col,0,NumApcCols-1) ) continue;
+ if (!btwn((row-P.StartRow)*NumApcCols + col,0,P.NumPicks-1) ) continue;
+ P.CurRow=row; P.CurCol=col; return;
+ }
+
+ for (int i=0; i<CurPat.bools.size(); i++) { DBool B = GetBool(i);
+ if (row == GetBool(i).row && col == B.col) { B.b = !B.b; return; }
}
}
+
+
}
//----------------------------------------------------------------------------------------------------------------------------------
public class DPat extends SCPattern
{
ArrayList picks = new ArrayList();
- ArrayList paramlist = new ArrayList();
+ ArrayList params = new ArrayList();
+ ArrayList bools = new ArrayList();
int nMaxRow = 0;
float zSpinHue = 0;
+ float LastQuant = -1, LastJog = -1;
int nPoint , nPoints;
xyz xyzHalf = new xyz(.5,.5,.5),
xyzdMax = new xyz(),
- xyzMid = new xyz();
+ xyzMid = new xyz(),
+ xyzJog = new xyz(0,0,0);
float NoiseMove = random(10000);
- _DhP pSharp, pRotX, pRotY, pRotZ;
+ DParam pSharp, pQuantize, pSaturate;
+ DBool pXsym, pYsym, pZsym, pJog;
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)); }
float CalcCone (xyz v1, xyz v2, xyz c) { return degrees( acos ( v1.minus(c).dot(v2.minus(c)) /
void onActive () { UpdateState(); }
void UpdateState() { if (IsFocused() != IsActive()) { if (IsFocused()) DG.Activate(this); else DG.Deactivate(this); } }
- _DhP addParam(String label, double value) {
- _DhP P = new _DhP(label, value);
+ DParam addParam(String label, double value) {
+ DParam P = new DParam(label, value);
super.addParameter(P);
- paramlist.add(P); return P;
+ params.add(P); return P;
}
-
+
Pick addPick(String name, int def, int nmax, String[] desc) {
- Pick P = new Pick(name, def, nmax, desc);
- P.StartRow = nMaxRow;
- P.EndRow = P.StartRow + int((nmax-1) / NumApcCols);
+ Pick P = new Pick(name, def, nmax, nMaxRow, desc);
nMaxRow = P.EndRow + 1;
- P.CurCol = def % NumApcCols;
- P.CurRow = P.StartRow + def / NumApcCols;
picks.add(P);
return P;
}
-
+
DPat(GLucose glucose) {
super(glucose);
DG.Init();
- pSharp = addParam("Shrp" , 0);
+ pSharp = addParam("Shrp", 0 );
+ pQuantize = addParam("Qunt", 0 );
+ pSaturate = addParam("Sat" , .5);
+
nPoints = model.points.size();
xdMax = model.xMax;
ydMax = model.yMax;
zdMax = model.zMax;
xyzdMax = new xyz(xdMax,ydMax,zdMax);
xyzMid = new xyz(xdMax/2, ydMax/2, zdMax/2);
+
+ bools.add(pXsym = new DBool("X-SYM", false, 82, 0));
+ bools.add(pYsym = new DBool("Y-SYM", false, 83, 0));
+ bools.add(pZsym = new DBool("Z-SYM", false, 84, 0));
+ bools.add(pJog = new DBool("JOGGER",false, 85, 0));
}
void run(double deltaMs)
StartRun (deltaMs);
zSpinHue += DG._SpinHue ()*deltaMs*.05;
xyz P = new xyz();
- float modhue = DG._ModHue ()==0 ? 0 : DG._ModHue ()*360;
- float fSharp = 1/(1.01-pSharp.Val());
+ float fSharp = 1/(1.0001-pSharp.Val());
+ float fQuant = pQuantize.Val();
+ float fSaturate = pSaturate.Val();
+
DG.SetText();
nPoint = 0;
+
+ if (fQuant > 0) {
+ float tRamp = (lx.tempo.rampf() % (1./pow(2,int((1-fQuant) * 4))));
+ float f = LastQuant; LastQuant = tRamp; if (tRamp > f) return;
+ }
+
+
+ if (pJog.b) {
+ float tRamp = (lx.tempo.rampf() % .25);
+ if (tRamp < LastJog)
+ xyzJog.set(random(xdMax*.2)-.1,
+ random(ydMax*.2)-.1,
+ random(zdMax*.2)-.1);
+ LastJog = tRamp;
+ }
+
for (Point p : model.points) { nPoint++;
P.set(p);
- if (DG._Spark () > 0) P.y += DG._Spark () * (noise(P.x,P.y+NoiseMove/30 ,P.z)*ydMax - ydMax/2.);
- if (DG._Wiggle() > 0) P.y += DG._Wiggle() * (noise(P.x/(xdMax*.3)-NoiseMove/1500.) - .5) * (ydMax/2.);
-
- color cOld = colors[p.index];
+ if (pJog.b) P.add(xyzJog);
+ if (DG._Spark () > 0) P.y += DG._Spark () * (noise(P.x,P.y+NoiseMove/30 ,P.z)*ydMax - ydMax/2.);
+ if (DG._Wiggle() > 0) P.y += DG._Wiggle() * (noise(P.x/(xdMax*.3)-NoiseMove/1500.) - .5) * (ydMax/2.);
+ color cOld = colors[p.index];
color cNew = CalcPoint(P);
- if (DG._XSym) cNew = blendColor(cNew, CalcPoint(new xyz(xdMax-P.x,P.y,P.z)), ADD);
- if (DG._YSym) cNew = blendColor(cNew, CalcPoint(new xyz(P.x,ydMax-P.y,P.z)), ADD);
- if (DG._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 noizhue = DG._NoiseHue()==0 ? 0 : DG._NoiseHue()*360*noise(
- P.x/(xdMax*.3)+NoiseMove*.0003,
- P.y/(ydMax*.3)+NoiseMove*.00025,
- P.z/(zdMax*.3)+NoiseMove*.0002 );
-
- cNew = color( (hue(cNew) + modhue + zSpinHue - noizhue) % 360,
- saturation(cNew) + 100*DG._Saturate(),
- 100 * (DG._Trails()==0 ? b : max(b, (float) (brightness(cOld)/100. - (1-DG._Trails()) * deltaMs/200.)))
- * (DG._Dim ()==0 ? 1 : 1-DG._Dim())
- );
-
- colors[p.index] = cNew;
+
+ if (pXsym.b) cNew = blendColor(cNew, CalcPoint(new xyz(xdMax-P.x,P.y,P.z)), ADD);
+ if (pYsym.b) cNew = blendColor(cNew, CalcPoint(new xyz(P.x,ydMax-P.y,P.z)), ADD);
+ if (pZsym.b) cNew = blendColor(cNew, CalcPoint(new xyz(P.x,P.y,zdMax-P.z)), ADD);
+
+ float b = brightness(cNew)/100.;
+
+ if (pSharp.Val()>0) b = b < .5 ? pow(b,fSharp) : 1-pow(1-b,fSharp);
+ if (DG._Trails()>0 && fQuant == 0) b = max(b, (float) (brightness(cOld)/100. - (1-DG._Trails()) * deltaMs/200.));
+
+ colors[p.index] = color(
+ (hue(cNew) + zSpinHue) % 360,
+ saturation(cNew) + 100*(fSaturate*2-1),
+ 100 * b * DG._Dim()
+ );
}
}
}