From 65450eb37e927a75899c1ab50c7eca15790477b1 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Fri, 18 Oct 2013 15:02:43 -0700 Subject: [PATCH] Add global effect mappings to sliders, global sharp/blur/invert/quantize --- MarkSlee.pde | 76 ++++++++++++++++++++++++++++++++++++++++------- SugarCubes.pde | 15 ++++++---- _MIDI.pde | 60 +++++++++++++++++++++++++++++++++---- code/HeronLX.jar | Bin 67726 -> 67756 bytes 4 files changed, 128 insertions(+), 23 deletions(-) diff --git a/MarkSlee.pde b/MarkSlee.pde index 649d61c..81b2629 100644 --- a/MarkSlee.pde +++ b/MarkSlee.pde @@ -1195,38 +1195,92 @@ class Traktor extends SCPattern { class ColorFuckerEffect extends SCEffect { - BasicParameter hueShift = new BasicParameter("HSHFT", 0); - BasicParameter sat = new BasicParameter("SAT", 1); - BasicParameter bright = new BasicParameter("BRT", 1); + final BasicParameter level = new BasicParameter("BRT", 1); + final BasicParameter desat = new BasicParameter("DSAT", 0); + final BasicParameter sharp = new BasicParameter("SHARP", 0); + final BasicParameter soft = new BasicParameter("SOFT", 0); + final BasicParameter invert = new BasicParameter("INVERT", 0); + final BasicParameter hueShift = new BasicParameter("HSHFT", 0); + float[] hsb = new float[3]; ColorFuckerEffect(GLucose glucose) { super(glucose); + addParameter(level); + addParameter(desat); + addParameter(sharp); + addParameter(soft); + addParameter(invert); addParameter(hueShift); - addParameter(bright); - addParameter(sat); } public void doApply(int[] colors) { if (!enabled) { return; } - float bMod = bright.getValuef(); - float sMod = sat.getValuef(); + float bMod = level.getValuef(); + float sMod = 1 - desat.getValuef(); float hMod = hueShift.getValuef(); - if (bMod < 1 || sMod < 1 || hMod > 0) { + float fSharp = 1/(1.0001-sharp.getValuef()); + float fSoft = soft.getValuef(); + boolean ivt = invert.getValuef() > 0.5; + if (bMod < 1 || sMod < 1 || hMod > 0 || fSharp > 0 || ivt || fSoft > 0) { for (int i = 0; i < colors.length; ++i) { lx.RGBtoHSB(colors[i], hsb); + if (ivt) { + hsb[2] = 1 - hsb[2]; + } + if (fSharp > 0) { + hsb[2] = hsb[2] < .5 ? pow(hsb[2],fSharp) : 1-pow(1-hsb[2],fSharp); + } + if (fSoft > 0) { + if (hsb[2] > 0.5) { + hsb[2] = lerp(hsb[2], 0.5 + 2 * (hsb[2]-0.5)*(hsb[2]-0.5), fSoft); + } else { + hsb[2] = lerp(hsb[2], 0.5 * sqrt(2*hsb[2]), fSoft); + } + } colors[i] = lx.hsb( - (360. * hsb[0] + hueShift.getValuef()*360.) % 360, - 100. * hsb[1] * sat.getValuef(), - 100. * hsb[2] * bright.getValuef() + (360. * hsb[0] + hMod*360.) % 360, + 100. * hsb[1] * sMod, + 100. * hsb[2] * bMod ); } } } } +class QuantizeEffect extends SCEffect { + + color[] quantizedFrame; + float lastQuant; + final BasicParameter amount = new BasicParameter("AMT", 0); + + QuantizeEffect(GLucose glucose) { + super(glucose); + quantizedFrame = new color[glucose.lx.total]; + lastQuant = 0; + } + + public void doApply(int[] colors) { + float fQuant = amount.getValuef(); + if (fQuant > 0) { + float tRamp = (lx.tempo.rampf() % (1./pow(2,floor((1-fQuant) * 4)))); + float f = lastQuant; + lastQuant = tRamp; + if (tRamp > f) { + for (int i = 0; i < colors.length; ++i) { + colors[i] = quantizedFrame[i]; + } + return; + } + } + for (int i = 0; i < colors.length; ++i) { + quantizedFrame[i] = colors[i]; + } + } +} + class BlurEffect extends SCEffect { final LXParameter amount = new BasicParameter("AMT", 0); diff --git a/SugarCubes.pde b/SugarCubes.pde index 805c326..9faf3ec 100644 --- a/SugarCubes.pde +++ b/SugarCubes.pde @@ -129,15 +129,18 @@ LXTransition[] transitions(GLucose glucose) { } // Handles to globally triggerable effects -BoomEffect EFF_boom; +BoomEffect EFF_boom; FlashEffect EFF_flash; +ColorFuckerEffect EFF_colorFucker; +BlurEffect EFF_blur; +QuantizeEffect EFF_quantize; LXEffect[] effects(GLucose glucose) { return new LXEffect[] { - EFF_flash = new FlashEffect(lx), - EFF_boom = new BoomEffect(glucose), - new BlurEffect(glucose), - new DesaturationEffect(lx), - new ColorFuckerEffect(glucose), + EFF_flash = new FlashEffect(lx), + EFF_boom = new BoomEffect(glucose), + (EFF_blur = new BlurEffect(glucose)).enable(), + (EFF_quantize = new QuantizeEffect(glucose)).enable(), + (EFF_colorFucker = new ColorFuckerEffect(glucose)).enable(), }; } diff --git a/_MIDI.pde b/_MIDI.pde index b0b8fc4..40f1c15 100644 --- a/_MIDI.pde +++ b/_MIDI.pde @@ -370,11 +370,39 @@ public class APC40MidiInput extends GenericDeviceMidiInput { } protected void handleControllerChange(rwmidi.Controller cc) { + int channel = cc.getChannel(); int number = cc.getCC(); + float value = cc.getValue() / 127.; switch (number) { + + case 7: + switch (channel) { + case 0: + EFF_colorFucker.sharp.setValue(value); + break; + case 1: + EFF_colorFucker.soft.setValue(value); + break; + case 5: + EFF_blur.amount.setValue(value); + break; + case 6: + EFF_quantize.amount.setValue(value); + break; + case 7: + EFF_colorFucker.desat.setValue(value); + break; + } + break; + + // Master bright + case 14: + EFF_colorFucker.level.setValue(value); + break; + // Crossfader case 15: - lx.engine.getDeck(1).getCrossfader().setValue(cc.getValue() / 127.); + lx.engine.getDeck(1).getCrossfader().setValue(value); break; } @@ -387,7 +415,7 @@ public class APC40MidiInput extends GenericDeviceMidiInput { if (parameterIndex >= 0) { List parameters = midiEngine.getFocusedPattern().getParameters(); if (parameterIndex < parameters.size()) { - parameters.get(parameterIndex).setValue(cc.getValue() / 127.); + parameters.get(parameterIndex).setValue(value); } } @@ -395,7 +423,7 @@ public class APC40MidiInput extends GenericDeviceMidiInput { int effectIndex = number - 20; List parameters = glucose.getSelectedEffect().getParameters(); if (effectIndex < parameters.size()) { - parameters.get(effectIndex).setValue(cc.getValue() / 127.); + parameters.get(effectIndex).setValue(value); } } } @@ -407,9 +435,18 @@ public class APC40MidiInput extends GenericDeviceMidiInput { } protected void handleNoteOn(Note note) { - int nPitch = note.getPitch(), nChan = note.getChannel(); + int nPitch = note.getPitch(); + int nChan = note.getChannel(); switch (nPitch) { - + + case 49: // SOLO/CUE + switch (nChan) { + case 5: + EFF_colorFucker.invert.setValue(1); + break; + } + break; + case 82: // scene 1 EFF_boom.trigger(); break; @@ -479,8 +516,19 @@ public class APC40MidiInput extends GenericDeviceMidiInput { } protected void handleNoteOff(Note note) { - int nPitch = note.getPitch(), nChan = note.getChannel(); + int nPitch = note.getPitch(); + int nChan = note.getChannel(); + switch (nPitch) { + + case 49: // SOLO/CUE + switch (nChan) { + case 5: + EFF_colorFucker.invert.setValue(0); + break; + } + break; + case 90: // SEND C long tapDelta = millis() - tap1; if (lbtwn(tapDelta,5000,300*1000)) { // hackish tapping mechanism diff --git a/code/HeronLX.jar b/code/HeronLX.jar index fa0173929c7238682d054769af4a02c4d73e15b1..d5352fca9013d71d09ec18427cfdb0e77c370b08 100755 GIT binary patch delta 8680 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 bxDZ4ZB?htH)qlto8Q#QjI>Kuk*h&5$xU=N@ delta 8504 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 -- 2.34.1