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);
}
// 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(),
};
}
}
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;
}
if (parameterIndex >= 0) {
List<LXParameter> parameters = midiEngine.getFocusedPattern().getParameters();
if (parameterIndex < parameters.size()) {
- parameters.get(parameterIndex).setValue(cc.getValue() / 127.);
+ parameters.get(parameterIndex).setValue(value);
}
}
int effectIndex = number - 20;
List<LXParameter> parameters = glucose.getSelectedEffect().getParameters();
if (effectIndex < parameters.size()) {
- parameters.get(effectIndex).setValue(cc.getValue() / 127.);
+ parameters.get(effectIndex).setValue(value);
}
}
}
}
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;
}
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