From: Mark Slee Date: Fri, 18 Oct 2013 22:02:43 +0000 (-0700) Subject: Add global effect mappings to sliders, global sharp/blur/invert/quantize X-Git-Url: https://git.piment-noir.org/?p=SugarCubes.git;a=commitdiff_plain;h=65450eb37e927a75899c1ab50c7eca15790477b1 Add global effect mappings to sliders, global sharp/blur/invert/quantize --- 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 fa01739..d5352fc 100755 Binary files a/code/HeronLX.jar and b/code/HeronLX.jar differ