From 5d70e4d754301bd011da0d3ea821c92ac6a8d362 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Sun, 26 May 2013 15:23:23 -0700 Subject: [PATCH] Add a MIDI-responding piano key pattern that lights up cubes based on notes --- MarkSlee.pde | 68 +++++++++++++++++++++++++++++++++++++++++++++++ SugarCubes.pde | 1 + _Internals.pde | 1 + code/GLucose.jar | Bin 12998 -> 12899 bytes 4 files changed, 70 insertions(+) diff --git a/MarkSlee.pde b/MarkSlee.pde index 07c8ce2..95e8545 100644 --- a/MarkSlee.pde +++ b/MarkSlee.pde @@ -276,3 +276,71 @@ class BoomEffect extends SCEffect { } } +public class PianoKeyPattern extends SCPattern { + + final LinearEnvelope[] cubeBrt; + final SinLFO base[]; + final BasicParameter attack = new BasicParameter("ATK", 0.1); + final BasicParameter release = new BasicParameter("REL", 0.5); + final BasicParameter level = new BasicParameter("AMB", 0.6); + + PianoKeyPattern(GLucose glucose) { + super(glucose); + + for (MidiInputDevice input : RWMidi.getInputDevices()) { + input.createInput(this); + } + + addParameter(attack); + addParameter(release); + addParameter(level); + cubeBrt = new LinearEnvelope[Cube.list.size() / 4]; + for (int i = 0; i < cubeBrt.length; ++i) { + addModulator(cubeBrt[i] = new LinearEnvelope(0, 0, 100)); + } + base = new SinLFO[Cube.list.size() / 12]; + for (int i = 0; i < base.length; ++i) { + addModulator(base[i] = new SinLFO(0, 1, 7000 + 1000*i)).trigger(); + } + } + + private float getAttackTime() { + return 15 + attack.getValuef()*attack.getValuef() * 2000; + } + + private float getReleaseTime() { + return 15 + release.getValuef() * 3000; + } + + private LinearEnvelope getEnvelope(int index) { + return cubeBrt[index % cubeBrt.length]; + } + + private SinLFO getBase(int index) { + return base[index % base.length]; + } + + public void noteOnReceived(Note note) { + LinearEnvelope env = getEnvelope(note.getPitch()); + env.setEndVal(min(1, env.getValuef() + (note.getVelocity() / 127.)), getAttackTime()).start(); + } + + public void noteOffReceived(Note note) { + getEnvelope(note.getPitch()).setEndVal(0, getReleaseTime()).start(); + } + + public void run(int deltaMs) { + int i = 0; + float huef = lx.getBaseHuef(); + float levelf = level.getValuef(); + for (Cube c : Cube.list) { + float v = max(getBase(i).getValuef() * levelf/4., getEnvelope(i++).getValuef()); + setColor(c, color( + (huef + 20*v + abs(c.fy-128.)*.3 + c.fz) % 360, + min(100, 120*v), + 100*v + )); + } + } +} + diff --git a/SugarCubes.pde b/SugarCubes.pde index 3a5354c..9ec4f07 100644 --- a/SugarCubes.pde +++ b/SugarCubes.pde @@ -28,6 +28,7 @@ LXPattern[] patterns(GLucose glucose) { new SpaceTime(glucose), new Swarm(glucose), new CubeEQ(glucose), + new PianoKeyPattern(glucose), // Basic test patterns for reference, not art // new TestHuePattern(glucose), diff --git a/_Internals.pde b/_Internals.pde index 05336ec..a458052 100644 --- a/_Internals.pde +++ b/_Internals.pde @@ -20,6 +20,7 @@ import ddf.minim.*; import ddf.minim.analysis.*; import processing.opengl.*; import java.lang.reflect.*; +import rwmidi.*; final int VIEWPORT_WIDTH = 900; final int VIEWPORT_HEIGHT = 700; diff --git a/code/GLucose.jar b/code/GLucose.jar index cc16b16bb425ef92031daf938c1062be05f2eb26..74084b63edd715547e06d82c6584b0cb25eb3dc1 100644 GIT binary patch delta 1536 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 -- 2.34.1