From 34327c962351112e07c3d93f56ffc543fac45b58 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Thu, 19 Sep 2013 16:23:35 -0700 Subject: [PATCH] Add speed slider, new HeronLX with deltaMs as double --- ArjunBanker.pde | 6 +-- Audio.pde | 2 +- BenMorrow.pde | 8 ++-- DanKaminsky.pde | 4 +- DanUtil.pde | 6 +-- GranimPattern.pde | 2 +- JR.pde | 4 +- JackStahl.pde | 4 +- MarkSlee.pde | 26 +++++------ SamMorrow.pde | 2 +- ShaheenGandhi.pde | 4 +- TestPatterns.pde | 24 +++++----- TimBavaro.pde | 24 +++++----- TobySegaran.pde | 12 ++--- _Internals.pde | 100 +++++++++++++++++++++++++++++++++--------- _UIFramework.pde | 17 +++++++ _UIImplementation.pde | 12 +++++ code/HeronLX.jar | Bin 64496 -> 64495 bytes 18 files changed, 172 insertions(+), 85 deletions(-) mode change 100755 => 100644 BenMorrow.pde mode change 100755 => 100644 GranimPattern.pde mode change 100755 => 100644 JR.pde mode change 100755 => 100644 JackStahl.pde mode change 100755 => 100644 SamMorrow.pde mode change 100755 => 100644 ShaheenGandhi.pde mode change 100755 => 100644 TimBavaro.pde mode change 100755 => 100644 TobySegaran.pde diff --git a/ArjunBanker.pde b/ArjunBanker.pde index dcd5fae..6af635a 100644 --- a/ArjunBanker.pde +++ b/ArjunBanker.pde @@ -13,7 +13,7 @@ class TelevisionStatic extends SCPattern { addParameter(hueParameter); } - void run(int deltaMs) { + void run(double deltaMs) { boolean d = direction.getValuef() > 5.0; for (Point p : model.points) { colors[p.index] = color((lx.getBaseHuef() + random(hueParameter.getValuef() * 360))%360, random(saturationParameter.getValuef() * 100), random(brightParameter.getValuef() * 100)); @@ -37,7 +37,7 @@ class AbstractPainting extends SCPattern { img.loadPixels(); } - void run(int deltaMs) { + void run(double deltaMs) { for (Point p : model.points) { color c = img.get((int)((p.x / model.xMax) * img.width), img.height - (int)((p.y / model.yMax) * img.height)); colors[p.index] = color(hue(c) + colorMod.getValuef()%360, saturation(c), brightness(c) - ((p.fz - brightMod.getValuef())/p.fz)); @@ -60,7 +60,7 @@ class Spirality extends SCPattern { } } - public void run(int deltaMs) { + public void run(double deltaMs) { angle += deltaMs * 0.007; rad += deltaMs * .025 * direction; float x = model.xMax / 2 + cos(angle) * rad; diff --git a/Audio.pde b/Audio.pde index 6e36a29..4547a74 100644 --- a/Audio.pde +++ b/Audio.pde @@ -57,7 +57,7 @@ public static class GraphicEQ { return avg; } - public void run(int deltaMs) { + public void run(double deltaMs) { fft.forward(lx.audioInput().mix); float zeroDBReference = pow(10, 100*(1-level.getValuef())/20.); float decibelRange = 12 + range.getValuef() * 60; diff --git a/BenMorrow.pde b/BenMorrow.pde old mode 100755 new mode 100644 index 87b22be..1eb8ae1 --- a/BenMorrow.pde +++ b/BenMorrow.pde @@ -53,7 +53,7 @@ class TowerParams extends SCPattern println("towers "+towerSize); } - void run(int deltaMs) + void run(double deltaMs) { clearALL(); Tower t; @@ -101,7 +101,7 @@ class Sandbox extends SCPattern println("towers "+towerrange); } - public void run(int deltaMs) { + public void run(double deltaMs) { if(counter % 10 ==0) @@ -137,7 +137,7 @@ class GranimTestPattern extends GranimPattern getGraphicByName("myOtherColors").position=100; } int counter=0; - public void run(int deltaMs) + public void run(double deltaMs) { clearALL(); super.run(deltaMs); @@ -177,7 +177,7 @@ class GranimTestPattern2 extends GranimPattern } int counter=0; float count=0; - public void run(int deltaMs) + public void run(double deltaMs) { clearALL(); super.run(deltaMs); diff --git a/DanKaminsky.pde b/DanKaminsky.pde index 0290786..3dd9d14 100644 --- a/DanKaminsky.pde +++ b/DanKaminsky.pde @@ -173,7 +173,7 @@ class OSC_Balls extends OSCPattern { balls[ballnum].y = msg.get(1).floatValue(); } - void run(int deltaMs){ + void run(double deltaMs){ for(Point p: model.points){ colors[p.index]=0; } for(int i=1; i 40) lx.tempo.setBpm(lx.tempo.bpm()/2); UpdateLights(); } - void StartRun(int deltaMs) { } + void StartRun(double 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))) ) )); @@ -109,7 +109,7 @@ public class DPat extends SCPattern uiDebugText.setText(DanTextLine1, DanTextLine2); } - void run(int deltaMs) { + void run(double deltaMs) { NoiseMove += deltaMs; xdMax = model.xMax; ydMax = model.yMax; @@ -154,7 +154,7 @@ public class DPat extends SCPattern 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.)) + 100 * (s_Trails()==0 ? b : max(b, (float) (brightness(cOld)/100. - (1-s_Trails()) * deltaMs/200.))) * (s_Dim ()==0 ? 1 : 1-s_Dim()) ); diff --git a/GranimPattern.pde b/GranimPattern.pde old mode 100755 new mode 100644 index 425b97c..abe2237 --- a/GranimPattern.pde +++ b/GranimPattern.pde @@ -96,7 +96,7 @@ class GranimPattern extends SCPattern return displayList.get(name); } - public void run(int deltaMs) + public void run(double deltaMs) { drawToPointList(); } diff --git a/JR.pde b/JR.pde old mode 100755 new mode 100644 index ec0923f..cd494fa --- a/JR.pde +++ b/JR.pde @@ -39,7 +39,7 @@ class Gimbal extends SCPattern { float a = 0, b = 0, g = 0; - public void run(int deltaMs) { + public void run(double deltaMs) { if (DEBUG_MANUAL_ABG) { a = aP.getValuef() * (2 * PI); @@ -186,7 +186,7 @@ class Zebra extends SCPattern { return f > 0 ? 1 : 0; } - public void run(int deltaMs) { + public void run(double deltaMs) { float a = (millis() / 1000.f) % (2 * PI); float b = (millis() / 1200.f) % (2 * PI); float g = (millis() / 1600.f) % (2 * PI); diff --git a/JackStahl.pde b/JackStahl.pde old mode 100755 new mode 100644 index 05e2ec6..a840882 --- a/JackStahl.pde +++ b/JackStahl.pde @@ -34,7 +34,7 @@ class Swim extends SCPattern { int beat = 0; float prevRamp = 0; - void run(int deltaMs) { + void run(double deltaMs) { // Sync to the beat float ramp = (float)lx.tempo.ramp(); @@ -146,7 +146,7 @@ class Balance extends SCPattern { int beat = 0; float prevRamp = 0; - void run(int deltaMs) { + void run(double deltaMs) { // Sync to the beat float ramp = (float)lx.tempo.ramp(); diff --git a/MarkSlee.pde b/MarkSlee.pde index d22386a..9804b5c 100644 --- a/MarkSlee.pde +++ b/MarkSlee.pde @@ -28,7 +28,7 @@ class SpaceTime extends SCPattern { } } - void run(int deltaMs) { + void run(double deltaMs) { angle += deltaMs * 0.0007; float sVal1 = model.strips.size() * (0.5 + 0.5*sin(angle)); float sVal2 = model.strips.size() * (0.5 + 0.5*cos(angle)); @@ -84,7 +84,7 @@ class Swarm extends SCPattern { } } - void run(int deltaMs) { + void run(double deltaMs) { float s = 0; for (Strip strip : model.strips ) { int i = 0; @@ -93,7 +93,7 @@ class Swarm extends SCPattern { colors[p.index] = color( (lx.getBaseHuef() + 0.3 * abs(p.fx - hOffX.getValuef())) % 360, constrain(80 + 40 * fV, 0, 100), - constrain(100 - (30 - fV * falloff.getValuef()) * modDist(i + (s*63)%61, (int) (offset.getValuef() * strip.metrics.numPoints), strip.metrics.numPoints), 0, 100) + constrain(100 - (30 - fV * falloff.getValuef()) * modDist(i + (s*63)%61, offset.getValuef() * strip.metrics.numPoints, strip.metrics.numPoints), 0, 100) ); ++i; } @@ -226,7 +226,7 @@ class BassPod extends SCPattern { } } - public void run(int deltaMs) { + public void run(double deltaMs) { eq.run(deltaMs); float bassLevel = eq.getAverageLevel(0, 5); @@ -276,7 +276,7 @@ class CubeEQ extends SCPattern { } } - public void run(int deltaMs) { + public void run(double deltaMs) { eq.run(deltaMs); float edgeConst = 2 + 30*edge.getValuef(); @@ -434,7 +434,7 @@ public class PianoKeyPattern extends SCPattern { getEnvelope(note.getPitch()).setEndVal(0, getReleaseTime()).start(); } - public void run(int deltaMs) { + public void run(double deltaMs) { int i = 0; float huef = lx.getBaseHuef(); float levelf = level.getValuef(); @@ -504,7 +504,7 @@ class CrossSections extends SCPattern { zv = z.getValuef(); } - public void run(int deltaMs) { + public void run(double deltaMs) { updateXYZVals(); float xlv = 100*xl.getValuef(); @@ -556,7 +556,7 @@ class Blinders extends SCPattern { s.modulateDurationBy(r); } - public void run(int deltaMs) { + public void run(double deltaMs) { float hv = lx.getBaseHuef(); int si = 0; for (Strip strip : model.strips) { @@ -591,7 +591,7 @@ class Psychedelia extends SCPattern { addModulator(c).trigger(); } - void run(int deltaMs) { + void run(double deltaMs) { float huev = h.getValuef(); float cv = c.getValuef(); float sv = s.getValuef(); @@ -627,7 +627,7 @@ class AskewPlanes extends SCPattern { addModulator(c = new SinLFO(-50, 50, 4000 + 1000*i * ((i % 2 == 0) ? 1 : -1))).trigger(); } - void run(int deltaMs) { + void run(double deltaMs) { av = a.getValuef(); bv = b.getValuef(); cv = c.getValuef(); @@ -646,7 +646,7 @@ class AskewPlanes extends SCPattern { } } - public void run(int deltaMs) { + public void run(double deltaMs) { float huev = lx.getBaseHuef(); // This is super fucking bizarre. But if this is a for loop, the framerate @@ -691,7 +691,7 @@ class ShiftingPlane extends SCPattern { addModulator(d).trigger(); } - public void run(int deltaMs) { + public void run(double deltaMs) { float hv = lx.getBaseHuef(); float av = a.getValuef(); float bv = b.getValuef(); @@ -747,7 +747,7 @@ class Traktor extends SCPattern { int counter = 0; - public void run(int deltaMs) { + public void run(double deltaMs) { eq.run(deltaMs); int stepThresh = (int) (40 - 39*speed.getValuef()); diff --git a/SamMorrow.pde b/SamMorrow.pde old mode 100755 new mode 100644 index 520ff29..0b70698 --- a/SamMorrow.pde +++ b/SamMorrow.pde @@ -11,7 +11,7 @@ class JazzRainbow extends SamPattern { } - public void run(int deltaMs) { + public void run(double deltaMs) { // Access the core master hue via this method call float hv = lx.getBaseHuef(); for (int i = 0; i < colors.length*5; i=i+27) { diff --git a/ShaheenGandhi.pde b/ShaheenGandhi.pde old mode 100755 new mode 100644 index 2e9ead0..a9428aa --- a/ShaheenGandhi.pde +++ b/ShaheenGandhi.pde @@ -103,7 +103,7 @@ class HelixPattern extends SCPattern { return phase; } - void step(int deltaMs) { + void step(double deltaMs) { // Rotate if (rotationPeriod != 0) { this.phase = (phase + ((float)deltaMs / (float)rotationPeriod) * TWO_PI); @@ -243,7 +243,7 @@ class HelixPattern extends SCPattern { return color((lx.getBaseHuef() + (360*(phase / TWO_PI)))%360, 80.f, b); } - void run(int deltaMs) { + void run(double deltaMs) { boolean h1on = helix1On.getValue() > 0.5; boolean h2on = helix2On.getValue() > 0.5; boolean spokesOn = (float)basePairsOn.getValue() > 0.5; diff --git a/TestPatterns.pde b/TestPatterns.pde index b566e33..f8d59ee 100644 --- a/TestPatterns.pde +++ b/TestPatterns.pde @@ -10,7 +10,7 @@ class TestSpeakerMapping extends TestPattern { super(glucose); } - public void run(int deltaMs) { + public void run(double deltaMs) { int h = 0; for (Speaker speaker : model.speakers) { for (Strip strip : speaker.strips) { @@ -31,7 +31,7 @@ class TestBassMapping extends TestPattern { super(glucose); } - public void run(int deltaMs) { + public void run(double deltaMs) { int[] strips = { 2, 1, 0, 3, 13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6 }; int h = 0; for (int si : strips) { @@ -50,7 +50,7 @@ class TestFloorMapping extends TestPattern { super(glucose); } - public void run(int deltaMs) { + public void run(double deltaMs) { int[] strutIndices = {6, 5, 4, 3, 2, 1, 0, 7}; int h = 0; for (int si : strutIndices) { @@ -83,7 +83,7 @@ class TestStripPattern extends TestPattern { addModulator(d).trigger(); } - public void run(int deltaMs) { + public void run(double deltaMs) { for (Strip s : model.strips) { for (Point p : s.points) { colors[p.index] = color( @@ -105,7 +105,7 @@ class TestHuePattern extends TestPattern { super(glucose); } - public void run(int deltaMs) { + public void run(double deltaMs) { // Access the core master hue via this method call float hv = lx.getBaseHuef(); for (int i = 0; i < colors.length; ++i) { @@ -123,7 +123,7 @@ class TestXPattern extends TestPattern { super(glucose); addModulator(xPos).trigger(); } - public void run(int deltaMs) { + public void run(double deltaMs) { float hv = lx.getBaseHuef(); for (Point p : model.points) { // This is a common technique for modulating brightness. @@ -145,7 +145,7 @@ class TestYPattern extends TestPattern { super(glucose); addModulator(yPos).trigger(); } - public void run(int deltaMs) { + public void run(double deltaMs) { float hv = lx.getBaseHuef(); for (Point p : model.points) { float bv = max(0, 100 - abs(p.fy - yPos.getValuef())); @@ -163,7 +163,7 @@ class TestZPattern extends TestPattern { super(glucose); addModulator(zPos).trigger(); } - public void run(int deltaMs) { + public void run(double deltaMs) { float hv = lx.getBaseHuef(); for (Point p : model.points) { float bv = max(0, 100 - abs(p.fz - zPos.getValuef())); @@ -183,7 +183,7 @@ class TestTowerPattern extends TestPattern { addModulator(towerIndex).trigger(); } - public void run(int deltaMs) { + public void run(double deltaMs) { int ti = 0; for (Tower t : model.towers) { for (Point p : t.points) { @@ -230,7 +230,7 @@ class TestProjectionPattern extends TestPattern { addModulator(yPos).trigger(); } - public void run(int deltaMs) { + public void run(double deltaMs) { // For the same reasons described above, it may logically feel to you that // some of these operations are in reverse order. Again, just keep in mind that // the car itself is what's moving, not the object @@ -268,7 +268,7 @@ class TestCubePattern extends TestPattern { addModulator(index).start(); } - public void run(int deltaMs) { + public void run(double deltaMs) { for (Cube c : model.cubes) { int i = 0; for (Point p : c.points) { @@ -354,7 +354,7 @@ class MappingTool extends TestPattern { printInfo(); } - public void run(int deltaMs) { + public void run(double deltaMs) { color off = color(0, 0, 0); color c = off; color r = #FF0000; diff --git a/TimBavaro.pde b/TimBavaro.pde old mode 100755 new mode 100644 index 1dd062e..4da4b6e --- a/TimBavaro.pde +++ b/TimBavaro.pde @@ -41,7 +41,7 @@ class TimSpheres extends SCPattern { spheres[1].radius = 50; } - public void run(int deltaMs) { + public void run(double deltaMs) { // Access the core master hue via this method call float hv = hueParameter.getValuef(); float lfoValue = lfo.getValuef(); @@ -224,8 +224,8 @@ class TimRaindrops extends SCPattern { } // returns TRUE when this should die - boolean age(int ms) { - p.add(v, ms / 1000.0); + boolean age(double ms) { + p.add(v, (float) (ms / 1000.0)); return this.p.y < (0 - this.radius); } } @@ -239,7 +239,7 @@ class TimRaindrops extends SCPattern { raindrops = new LinkedList(); } - public void run(int deltaMs) { + public void run(double deltaMs) { leftoverMs += deltaMs; while (leftoverMs > msPerRaindrop) { leftoverMs -= msPerRaindrop; @@ -300,16 +300,16 @@ class TimCubes extends SCPattern { } // returns TRUE if this should die - boolean age(int ms) { + boolean age(double ms) { if (!hasPeaked) { - value = value + (ms / 1000.0f * ((attackParameter.getValuef() + 0.01) * 5)); + value = value + (float) (ms / 1000.0f * ((attackParameter.getValuef() + 0.01) * 5)); if (value >= 1.0) { value = 1.0; hasPeaked = true; } return false; } else { - value = value - (ms / 1000.0f * ((decayParameter.getValuef() + 0.01) * 10)); + value = value - (float) (ms / 1000.0f * ((decayParameter.getValuef() + 0.01) * 10)); return value <= 0; } } @@ -329,7 +329,7 @@ class TimCubes extends SCPattern { flashes = new LinkedList(); } - public void run(int deltaMs) { + public void run(double deltaMs) { leftoverMs += deltaMs; float msPerFlash = 1000 / ((rateParameter.getValuef() + .01) * 100); while (leftoverMs > msPerFlash) { @@ -416,7 +416,7 @@ class TimPlanes extends SCPattern { float prevRamp = 0; float[] wobbleSpeeds = { 1.0/8, 1.0/4, 1.0/2, 1.0 }; - public void run(int deltaMs) { + public void run(double deltaMs) { float ramp = (float)lx.tempo.ramp(); if (ramp < prevRamp) { beat = (beat + 1) % 32; @@ -609,7 +609,7 @@ class TimPinwheels extends SCPattern { private float prevRamp = 0; - public void run(int deltaMs) { + public void run(double deltaMs) { float ramp = lx.tempo.rampf(); float numBeats = (1 + ramp - prevRamp) % 1; prevRamp = ramp; @@ -620,7 +620,7 @@ class TimPinwheels extends SCPattern { // 1 -> 180 float hueSpread = (hueSpreadParameter.getValuef() - 0.5) * 360; - float fadeAmount = (deltaMs / 1000.0) * pow(sharpnessParameter.getValuef() * 10, 1); + float fadeAmount = (float) (deltaMs / 1000.0) * pow(sharpnessParameter.getValuef() * 10, 1); for (Pinwheel pw : pinwheels) { pw.age(numBeats); @@ -816,7 +816,7 @@ class TimTrace extends SCPattern { return m; } - public void run(int deltaMs) { + public void run(double deltaMs) { for (Point p : model.points) { color c = colors[p.index]; colors[p.index] = color(hue(c), saturation(c), brightness(c) - 3); diff --git a/TobySegaran.pde b/TobySegaran.pde old mode 100755 new mode 100644 index 443be5b..32b6d82 --- a/TobySegaran.pde +++ b/TobySegaran.pde @@ -23,7 +23,7 @@ class GlitchPlasma extends SCPattern { } } - public void run(int deltaMs) { + public void run(double deltaMs) { for (Point p : model.points) { float hv = sin(dist(p.fx + pos, p.fy, 128.0, 128.0) / 8.0) + sin(dist(p.fx, p.fy, 64.0, 64.0) / 8.0) @@ -67,7 +67,7 @@ class FireEffect extends SCPattern { float br=min(100,sqrt(level)*15); return color(level/1.7,100,br); } - public void run(int deltaMs) { + public void run(double deltaMs) { for (int x=10;x45 || x%50<5) { intensity[x][ym-1] = random(30,100); @@ -111,7 +111,7 @@ class StripBounce extends SCPattern { } } - public void run(int deltaMs) { + public void run(double deltaMs) { float[] bright = new float[model.points.size()]; for (Strip strip : model.strips) { for (int i=0;i midiListeners = new ArrayList(); // Display configuration mode boolean mappingMode = false; boolean debugMode = false; DebugUI debugUI; +boolean uiOn = true; +LXPattern restoreToPattern = null; // Handles to UI objects UIContext[] overlays; @@ -64,6 +67,9 @@ UIDebugText uiDebugText; // Camera variables float eyeR, eyeA, eyeX, eyeY, eyeZ, midX, midY, midZ; +/** + * Engine construction and initialization. + */ LXPattern[] _patterns(GLucose glucose) { LXPattern[] patterns = patterns(glucose); for (LXPattern p : patterns) { @@ -72,6 +78,12 @@ LXPattern[] _patterns(GLucose glucose) { return patterns; } +void logTime(String evt) { + int now = millis(); + println(evt + ": " + (now - lastMillis) + "ms"); + lastMillis = now; +} + void setup() { startMillis = lastMillis = millis(); @@ -113,11 +125,12 @@ void setup() { overlays = new UIContext[] { uiPatternA = new UIPatternDeck(lx.engine.getDeck(0), "PATTERN A", 4, 4, 140, 344), uiCrossfader = new UICrossfader(4, 352, 140, 212), + new UIOutput(4, 568, 140, 106), new UIPatternDeck(lx.engine.getDeck(1), "PATTERN B", width-144, 4, 140, 344), new UIEffects(width-144, 352, 140, 144), new UITempo(width-144, 498, 140, 50), - new UIOutput(width-144, 552, 140, 106), + new UISpeed(width-144, 552, 140, 50), uiDebugText = new UIDebugText(4, height-64, width-8, 44), uiMapping = new UIMapping(mappingTool, 4, 4, 140, 344), @@ -126,8 +139,9 @@ void setup() { logTime("Built overlay UI"); // MIDI devices + midiListeners.add(new MidiListener().setEnabled(true)); for (MidiInputDevice d : RWMidi.getInputDevices()) { - d.createInput(this); + midiListeners.add(new MidiListener(d)); } SCMidiDevices.initializeStandardDevices(glucose); logTime("Setup MIDI devices"); @@ -150,31 +164,74 @@ void setup() { println("Hit the 'p' key to toggle Panda Board output"); } - -void controllerChangeReceived(rwmidi.Controller cc) { - if (debugMode) { +public class MidiListener { + private boolean enabled = false; + private final String name; + + MidiListener(MidiInputDevice d) { + d.createInput(this); + name = d.getName(); + } + + MidiListener() { + registerKeyEvent(this); + name = "Keyboard"; + } + + public String getName() { + return name; + } + + public void keyEvent(KeyEvent e) { + if (e.getID() == KeyEvent.KEY_PRESSED) { + switch (e.getKeyChar()) { + case 'q': + noteOnReceived(new Note(60, 127)); + break; + } + } else if (e.getID() == KeyEvent.KEY_RELEASED) { + switch (e.getKeyChar()) { + case 'q': + noteOffReceived(new Note(60, 0)); + break; + } + } + } + + public MidiListener setEnabled(boolean enabled) { + if (enabled != this.enabled) { + this.enabled = enabled; + // notify midi UI to update + } + return this; + } + + void controllerChangeReceived(rwmidi.Controller cc) { + if (!enabled) { + return; + } println("CC: " + cc.toString()); } -} -void noteOnReceived(Note note) { - if (debugMode) { + void noteOnReceived(Note note) { + if (!enabled) { + return; + } println("Note On: " + note.toString()); } -} -void noteOffReceived(Note note) { - if (debugMode) { + void noteOffReceived(Note note) { + if (!enabled) { + return; + } println("Note Off: " + note.toString()); } -} -void logTime(String evt) { - int now = millis(); - println(evt + ": " + (now - lastMillis) + "ms"); - lastMillis = now; } +/** + * Core render loop and drawing functionality. + */ void draw() { // Draws the simulation and the 2D UI overlay background(40); @@ -388,9 +445,9 @@ void drawUI() { } } -boolean uiOn = true; -LXPattern restoreToPattern = null; - +/** + * Top-level keyboard event handling + */ void keyPressed() { if (mappingMode) { mappingTool.keyPressed(uiMapping); @@ -434,6 +491,9 @@ void keyPressed() { } } +/** + * Top-level mouse event handling + */ int mx, my; void mousePressed() { boolean debugged = false; @@ -470,8 +530,6 @@ void mouseReleased() { for (UIContext context : overlays) { context.mouseReleased(mouseX, mouseY); } - - // ui.mouseReleased(); } void mouseWheel(int delta) { diff --git a/_UIFramework.pde b/_UIFramework.pde index ba5a8c8..3ca493b 100644 --- a/_UIFramework.pde +++ b/_UIFramework.pde @@ -602,11 +602,28 @@ public class UIParameterSlider extends UIParameterControl { } private boolean editing = false; + private long lastClick = 0; + private float doubleClickMode = 0; + private float doubleClickX = 0; protected void onMousePressed(float mx, float my) { + long now = millis(); float handleLeft = 4 + parameter.getValuef() * (w-8-handleWidth); if (mx >= handleLeft && mx < handleLeft + handleWidth) { editing = true; + } else { + if ((now - lastClick) < 300 && abs(mx - doubleClickX) < 3) { + parameter.setValue(doubleClickMode); + } + doubleClickX = mx; + if (mx < w*.25) { + doubleClickMode = 0; + } else if (mx > w*.75) { + doubleClickMode = 1; + } else { + doubleClickMode = 0.5; + } } + lastClick = now; } protected void onMouseReleased(float mx, float my) { diff --git a/_UIImplementation.pde b/_UIImplementation.pde index d25df48..c223444 100644 --- a/_UIImplementation.pde +++ b/_UIImplementation.pde @@ -459,6 +459,18 @@ class UIDebugText extends UIContext { } } +class UISpeed extends UIWindow { + UISpeed(float x, float y, float w, float h) { + super("SPEED", x, y, w, h); + new UIParameterSlider(4, titleHeight, w-10, 20) + .setParameter(new BasicParameter("SPEED", 0.5).addListener(new LXParameter.Listener() { + public void onParameterChanged(LXParameter parameter) { + lx.setSpeed(parameter.getValuef() * 2); + } + })).addToContainer(this); + } +} + String className(Object p, String suffix) { String s = p.getClass().getName(); int li; diff --git a/code/HeronLX.jar b/code/HeronLX.jar index a163fc95981f280b77fa3b25c0adfd446088a7ae..5a98f5e5d93681e73eebac40dc9b8c4768da479e 100755 GIT binary patch delta 26917 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