From 19d16a168003953f5abcb90d73849673d3d06f16 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Sun, 13 Oct 2013 17:47:51 -0700 Subject: [PATCH] Add 't' button to toggle optional threading mode, TestPerformancePattern --- MarkSlee.pde | 36 +++++++++++++------------- SugarCubes.pde | 1 + TestPatterns.pde | 66 +++++++++++++++++++++++++++++++++++++---------- _Internals.pde | 26 +++++++++++-------- code/GLucose.jar | Bin 24757 -> 24757 bytes code/HeronLX.jar | Bin 65367 -> 66851 bytes 6 files changed, 87 insertions(+), 42 deletions(-) diff --git a/MarkSlee.pde b/MarkSlee.pde index 26c1cd7..0eb12ac 100644 --- a/MarkSlee.pde +++ b/MarkSlee.pde @@ -44,7 +44,7 @@ class MidiMusic extends SCPattern { for (Point p : model.points) { float b = max(0, bVal - 3*dist(p.x, p.y, xPos, yVal)); if (b > 0) { - colors[p.index] = blendColor(colors[p.index], color( + colors[p.index] = blendColor(colors[p.index], lx.hsb( (lx.getBaseHuef() + abs(p.x - model.cx) + abs(p.y - model.cy)) % 360, 100, b @@ -173,7 +173,7 @@ class Pulley extends SCPattern { float falloff = 100. / (3 + sz.getValuef() * 36 + fPos * beatAmount.getValuef()*48); for (Point p : model.points) { int g = (int) constrain((p.x - model.xMin) * NUM_DIVISIONS / (model.xMax - model.xMin), 0, NUM_DIVISIONS-1); - colors[p.index] = color( + colors[p.index] = lx.hsb( (lx.getBaseHuef() + abs(p.x - model.cx)*.8 + p.y*.4) % 360, constrain(130 - p.y*.8, 0, 100), max(0, 100 - abs(p.y - gravity[g].getValuef())*falloff) @@ -354,7 +354,7 @@ class BouncyBalls extends SCPattern { float d = sqrt((p.x-xv)*(p.x-xv) + (p.y-yv)*(p.y-yv) + .1*(p.z-zPos)*(p.z-zPos)); float b = constrain(130 - falloff*d, 0, 100); if (b > 0) { - colors[p.index] = blendColor(colors[p.index], color( + colors[p.index] = blendColor(colors[p.index], lx.hsb( (lx.getBaseHuef() + p.y*.5 + abs(model.cx - p.x) * .5) % 360, max(0, 100 - .45*(p.y - flrLevel)), b @@ -436,7 +436,7 @@ class SpaceTime extends SCPattern { for (Strip strip : model.strips) { int i = 0; for (Point p : strip.points) { - colors[p.index] = color( + colors[p.index] = lx.hsb( (lx.getBaseHuef() + 360 - p.x*.2 + p.y * .3) % 360, constrain(.4 * min(abs(s - sVal1), abs(s - sVal2)), 20, 100), max(0, 100 - fVal*abs(i - pVal*(strip.metrics.numPoints - 1))) @@ -486,7 +486,7 @@ class Swarm extends SCPattern { int i = 0; for (Point p : strip.points) { float fV = max(-1, 1 - dist(p.x/2., p.y, fX.getValuef()/2., fY.getValuef()) / 64.); - colors[p.index] = color( + colors[p.index] = lx.hsb( (lx.getBaseHuef() + 0.3 * abs(p.x - hOffX.getValuef())) % 360, constrain(80 + 40 * fV, 0, 100), constrain(100 - (30 - fV * falloff.getValuef()) * modDist(i + (s*63)%61, offset.getValuef() * strip.metrics.numPoints, strip.metrics.numPoints), 0, 100) @@ -636,7 +636,7 @@ class BassPod extends SCPattern { value /= 5.; float b = constrain(8 * (value*model.yMax - abs(p.y-model.yMax/2.)), 0, 100); - colors[p.index] = color( + colors[p.index] = lx.hsb( (lx.getBaseHuef() + abs(p.y - model.cy) + abs(p.x - model.cx)) % 360, constrain(bassLevel*240 - .6*dist(p.x, p.y, model.cx, model.cy), 0, 100), b @@ -696,7 +696,7 @@ class CubeEQ extends SCPattern { float value = lerp(smoothValue, chunkyValue, blockiness.getValuef()); float b = constrain(edgeConst * (value*model.yMax - p.y), 0, 100); - colors[p.index] = color( + colors[p.index] = lx.hsb( (480 + lx.getBaseHuef() - min(clrConst*p.y, 120)) % 360, 100, b @@ -736,7 +736,7 @@ class BoomEffect extends SCEffect { for (Point p : model.points) { colors[p.index] = blendColor( colors[p.index], - color(huev, satv, constrain(brightv - falloffv*abs(boom.getValuef() - dist(p.x, 2*p.y, 3*p.z, model.xMax/2, model.yMax, model.zMax*1.5)), 0, 100)), + lx.hsb(huev, satv, constrain(brightv - falloffv*abs(boom.getValuef() - dist(p.x, 2*p.y, 3*p.z, model.xMax/2, model.yMax, model.zMax*1.5)), 0, 100)), ADD); } } @@ -834,7 +834,7 @@ public class PianoKeyPattern extends SCPattern { float levelf = level.getValuef(); for (Cube c : model.cubes) { float v = max(getBase(i).getValuef() * levelf/4., getEnvelope(i++).getValuef()); - setColor(c, color( + setColor(c, lx.hsb( (huef + 20*v + abs(c.cx-model.xMax/2.)*.3 + c.cy) % 360, min(100, 120*v), 100*v @@ -911,17 +911,17 @@ class CrossSections extends SCPattern { for (Point p : model.points) { color c = 0; - c = blendColor(c, color( + c = blendColor(c, lx.hsb( (lx.getBaseHuef() + p.x/10 + p.y/3) % 360, constrain(140 - 1.1*abs(p.x - model.xMax/2.), 0, 100), max(0, xlv - xwv*abs(p.x - xv)) ), ADD); - c = blendColor(c, color( + c = blendColor(c, lx.hsb( (lx.getBaseHuef() + 80 + p.y/10) % 360, constrain(140 - 2.2*abs(p.y - model.yMax/2.), 0, 100), max(0, ylv - ywv*abs(p.y - yv)) ), ADD); - c = blendColor(c, color( + c = blendColor(c, lx.hsb( (lx.getBaseHuef() + 160 + p.z / 10 + p.y/2) % 360, constrain(140 - 2.2*abs(p.z - model.zMax/2.), 0, 100), max(0, zlv - zwv*abs(p.z - zv)) @@ -957,7 +957,7 @@ class Blinders extends SCPattern { int i = 0; float mv = m[si % m.length].getValuef(); for (Point p : strip.points) { - colors[p.index] = color( + colors[p.index] = lx.hsb( (hv + p.z + p.y*hs.getValuef()) % 360, min(100, abs(p.x - s.getValuef())/2.), max(0, 100 - mv/2. - mv * abs(i - (strip.metrics.length-1)/2.)) @@ -993,7 +993,7 @@ class Psychedelia extends SCPattern { int i = 0; for (Strip strip : model.strips) { for (Point p : strip.points) { - colors[p.index] = color( + colors[p.index] = lx.hsb( (huev + i*constrain(cv, 0, 2) + p.z/2. + p.x/4.) % 360, min(100, abs(p.y-sv)), max(0, 100 - 50*abs((i%NUM) - mv)) @@ -1061,7 +1061,7 @@ class AskewPlanes extends SCPattern { d = min(d, abs(plane.av*(p.x-model.cx) + plane.bv*(p.y-model.cy) + plane.cv) / plane.denom); } } - colors[p.index] = color( + colors[p.index] = lx.hsb( (huev + abs(p.x-model.cx)*.3 + p.y*.8) % 360, max(0, 100 - .8*abs(p.x - model.cx)), constrain(140 - 10.*d, 0, 100) @@ -1094,7 +1094,7 @@ class ShiftingPlane extends SCPattern { float denom = sqrt(av*av + bv*bv + cv*cv); for (Point p : model.points) { float d = abs(av*(p.x-model.cx) + bv*(p.y-model.cy) + cv*(p.z-model.cz) + dv) / denom; - colors[p.index] = color( + colors[p.index] = lx.hsb( (hv + abs(p.x-model.cx)*.6 + abs(p.y-model.cy)*.9 + abs(p.z - model.cz)) % 360, constrain(110 - d*6, 0, 100), constrain(130 - 7*d, 0, 100) @@ -1163,12 +1163,12 @@ class Traktor extends SCPattern { int i = (int) constrain((model.xMax - p.x) / model.xMax * FRAME_WIDTH, 0, FRAME_WIDTH-1); int pos = (index + FRAME_WIDTH - i) % FRAME_WIDTH; - colors[p.index] = color( + colors[p.index] = lx.hsb( (360 + lx.getBaseHuef() + .8*abs(p.x-model.cx)) % 360, 100, constrain(9 * (bass[pos]*model.cy - abs(p.y - model.cy)), 0, 100) ); - colors[p.index] = blendColor(colors[p.index], color( + colors[p.index] = blendColor(colors[p.index], lx.hsb( (400 + lx.getBaseHuef() + .5*abs(p.x-model.cx)) % 360, 60, constrain(5 * (treble[pos]*.6*model.cy - abs(p.y - model.cy)), 0, 100) diff --git a/SugarCubes.pde b/SugarCubes.pde index d37e12f..84a311a 100644 --- a/SugarCubes.pde +++ b/SugarCubes.pde @@ -102,6 +102,7 @@ LXPattern[] patterns(GLucose glucose) { new TestBassMapping(glucose), new TestFloorMapping(glucose), new TestSpeakerMapping(glucose), + new TestPerformancePattern(glucose), // new TestHuePattern(glucose), // new TestXPattern(glucose), // new TestYPattern(glucose), diff --git a/TestPatterns.pde b/TestPatterns.pde index 4c78995..3f8f8e1 100644 --- a/TestPatterns.pde +++ b/TestPatterns.pde @@ -26,7 +26,7 @@ class TestSpeakerMapping extends TestPattern { for (Strip strip : speaker.strips) { float b = 100; for (Point p : strip.points) { - colors[p.index] = color(h % 360, 100, b); + colors[p.index] = lx.hsb(h % 360, 100, b); b = max(0, b - 10); } h += 70; @@ -47,7 +47,7 @@ class TestBassMapping extends TestPattern { for (int si : strips) { float b = 100; for (Point p : model.bassBox.strips.get(si).points) { - colors[p.index] = color(h % 360, 100, b); + colors[p.index] = lx.hsb(h % 360, 100, b); b = max(0, b - 10); } h += 70; @@ -66,7 +66,7 @@ class TestFloorMapping extends TestPattern { for (int si : strutIndices) { float b = 100; for (Point p : model.bassBox.struts.get(si).points) { - colors[p.index] = color(h % 360, 100, b); + colors[p.index] = lx.hsb(h % 360, 100, b); b = max(0, b - 10); } h += 50; @@ -76,7 +76,7 @@ class TestFloorMapping extends TestPattern { for (int fi : floorIndices) { float b = 100; for (Point p : model.boothFloor.strips.get(fi).points) { - colors[p.index] = color(h, 100, b); + colors[p.index] = lx.hsb(h, 100, b); b = max(0, b - 3); } h += 90; @@ -84,6 +84,46 @@ class TestFloorMapping extends TestPattern { } } +class TestPerformancePattern extends TestPattern { + + final BasicParameter ops = new BasicParameter("OPS", 0); + final BasicParameter iter = new BasicParameter("ITER", 0); + + TestPerformancePattern(GLucose glucose) { + super(glucose); + addParameter(ops); + addParameter(iter); + } + + public void run(double deltaMs) { + if (iter.getValuef() > 0.5) { + for (int i = 0; i < colors.length; ++i) { + float x = 1; + for (int j = 0; j < ops.getValuef() * 30; ++j) { + x *= random(0, 1); + } + colors[i] = lx.hsb( + (lx.getBaseHuef() + model.px[i]*.2 + model.py[i]*.4) % 360, + 100, + 100 + ); + } + } else { + for (Point p : model.points) { + float x = 1; + for (int j = 0; j < ops.getValuef() * 30; ++j) { + x *= random(0, 1); + } + colors[p.index] = lx.hsb( + (lx.getBaseHuef() + p.x*.2 + p.y*.4) % 360, + 100, + 100 + ); + } + } + } +} + class TestStripPattern extends TestPattern { SinLFO d = new SinLFO(4, 40, 4000); @@ -96,7 +136,7 @@ class TestStripPattern extends TestPattern { public void run(double deltaMs) { for (Strip s : model.strips) { for (Point p : s.points) { - colors[p.index] = color( + colors[p.index] = lx.hsb( lx.getBaseHuef(), 100, max(0, 100 - d.getValuef()*dist(p.x, p.y, s.cx, s.cy)) @@ -119,7 +159,7 @@ class TestHuePattern extends TestPattern { // Access the core master hue via this method call float hv = lx.getBaseHuef(); for (int i = 0; i < colors.length; ++i) { - colors[i] = color(hv, 100, 100); + colors[i] = lx.hsb(hv, 100, 100); } } } @@ -141,7 +181,7 @@ class TestXPattern extends TestPattern { // values. The further away this point is from an exact // point, the more we decrease its brightness float bv = max(0, 100 - abs(p.x - xPos.getValuef())); - colors[p.index] = color(hv, 100, bv); + colors[p.index] = lx.hsb(hv, 100, bv); } } } @@ -159,7 +199,7 @@ class TestYPattern extends TestPattern { float hv = lx.getBaseHuef(); for (Point p : model.points) { float bv = max(0, 100 - abs(p.y - yPos.getValuef())); - colors[p.index] = color(hv, 100, bv); + colors[p.index] = lx.hsb(hv, 100, bv); } } } @@ -177,7 +217,7 @@ class TestZPattern extends TestPattern { float hv = lx.getBaseHuef(); for (Point p : model.points) { float bv = max(0, 100 - abs(p.z - zPos.getValuef())); - colors[p.index] = color(hv, 100, bv); + colors[p.index] = lx.hsb(hv, 100, bv); } } } @@ -197,7 +237,7 @@ class TestTowerPattern extends TestPattern { int ti = 0; for (Tower t : model.towers) { for (Point p : t.points) { - colors[p.index] = color( + colors[p.index] = lx.hsb( lx.getBaseHuef(), 100, max(0, 100 - 80*LXUtils.wrapdistf(ti, towerIndex.getValuef(), model.towers.size())) @@ -260,7 +300,7 @@ class TestProjectionPattern extends TestPattern { float d = sqrt(c.x*c.x + c.y*c.y + c.z*c.z); // distance from origin // d = abs(d-60) + max(0, abs(c.z) - 20); // life saver / ring thing d = max(0, abs(c.y) - 10 + .1*abs(c.z) + .02*abs(c.x)); // plane / spear thing - colors[c.index] = color( + colors[c.index] = lx.hsb( (hv + .6*abs(c.x) + abs(c.z)) % 360, 100, constrain(140 - 40*d, 0, 100) @@ -282,7 +322,7 @@ class TestCubePattern extends TestPattern { for (Cube c : model.cubes) { int i = 0; for (Point p : c.points) { - colors[p.index] = color( + colors[p.index] = lx.hsb( lx.getBaseHuef(), 100, max(0, 100 - 80.*abs(i - index.getValuef())) @@ -365,7 +405,7 @@ class MappingTool extends TestPattern { } public void run(double deltaMs) { - color off = color(0, 0, 0); + color off = #000000; color c = off; color r = #FF0000; color g = #00FF00; diff --git a/_Internals.pde b/_Internals.pde index f634497..d616264 100644 --- a/_Internals.pde +++ b/_Internals.pde @@ -52,6 +52,7 @@ LXPattern[] patterns; MappingTool mappingTool; PandaDriver[] pandaBoards; MidiEngine midiEngine; +color[] threadColors; // Display configuration mode boolean mappingMode = false; @@ -120,6 +121,7 @@ void setup() { glucose = new GLucose(this, buildModel()); lx = glucose.lx; lx.enableKeyboardTempo(); + threadColors = new color[lx.total]; logTime("Built GLucose engine"); // Set the patterns @@ -196,16 +198,19 @@ void setup() { void draw() { // Draws the simulation and the 2D UI overlay background(40); - color[] colors = glucose.getColors(); + color[] simulationColors; + color[] sendColors; + simulationColors = sendColors = glucose.getColors(); String displayMode = uiCrossfader.getDisplayMode(); if (displayMode == "A") { - colors = lx.engine.getDeck(0).getColors(); + simulationColors = lx.engine.getDeck(0).getColors(); } else if (displayMode == "B") { - colors = lx.engine.getDeck(1).getColors(); + simulationColors = lx.engine.getDeck(1).getColors(); } if (debugMode) { - debugUI.maskColors(colors); + debugUI.maskColors(simulationColors); + debugUI.maskColors(sendColors); } camera( @@ -251,7 +256,7 @@ void draw() { strokeWeight(2); beginShape(POINTS); for (Point p : glucose.model.points) { - stroke(colors[p.index]); + stroke(simulationColors[p.index]); vertex(p.x, p.y, p.z); } endShape(); @@ -259,12 +264,6 @@ void draw() { // 2D Overlay UI drawUI(); - // Send output colors - color[] sendColors = glucose.getColors(); - if (debugMode) { - debugUI.maskColors(sendColors); - } - // Gamma correction here. Apply a cubic to the brightness // for better representation of dynamic range for (int i = 0; i < sendColors.length; ++i) { @@ -458,6 +457,11 @@ void keyPressed() { } } break; + case 't': + if (!midiEngine.isQwertyEnabled()) { + lx.engine.setThreaded(!lx.engine.isThreaded()); + } + break; case 'p': for (PandaDriver p : pandaBoards) { p.toggle(); diff --git a/code/GLucose.jar b/code/GLucose.jar index bcd6cbdadc10e8532a2e5ab5a184c171dc550ad9..aceb24606c4e168eb3627d001c513f460458bdf2 100755 GIT binary patch delta 549 zcmdmbka6olMxFp~W)?061`Y-WmhOo>noP{y6V3ZU2 zQ41m{HF*=G5QuqP!!S)MifR8V(TM&i#uKL^tz(1Jl*~OiUnty`UGE ze_ALNtjpqr!F0X4$`6do|pN}_s#$R-sFoUUnI4DpF*i-7!|{uC3Cgy>}fJL zlx5}jdo!Nj7P%31q)QH>lXQYL(ord!#T%kWQzAX!m-OO;mHm{FY82Zlc%Ug0xL5Z} zP1LijJT0YkQ#3#6<8*GIg;!!OV|20b#aym}k5&(zt8d>_YEP3hp6ilDb6(9bMy8KC9Mg73KL@(M{qGdr&a;c8Zf>2EO2dG@q{{R30 diff --git a/code/HeronLX.jar b/code/HeronLX.jar index 7fd5ba8de8fc0821cf5a04b3ad58c19bffc5e216..fff350c9e2503a5d2361021f3abbd410301371ae 100755 GIT binary patch delta 13074 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 delta 11592 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 DGzf-G -- 2.34.1