guionly/plugin/ui.cpp

271 lines
8.5 KiB
C++

#include "ui.hpp"
#include "chassis.hpp"
START_NAMESPACE_DISTRHO
namespace Art = Artwork;
//void prepSlider(ImageSlider* s, uint id, int x, int y) {
void DistrhoUIchassis::prepSlider( uint id, int x, int y) {
ImageSlider* s = slider[id];
s->setId(id);
s->setStartPos(x, y);
s->setEndPos(x, y + 79); // 80px high
s->setInverted(true);
s->setRange(0, 127.0f);
}
DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundHeight, true),
fImgBackground(Art::backgroundData, Art::backgroundWidth, Art::backgroundHeight, kImageFormatRGB),
fImgLedOn(Art::ledOnData, Art::ledWidth, Art::ledHeight, kImageFormatRGBA)
{
Image orangeSlider(Art::orangeData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA);
Image greenSlider(Art::greenData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA);
Image blueSlider(Art::blueData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA);
Image whiteSlider(Art::whiteData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA);
slider[sLfoRate] = new ImageSlider(this, orangeSlider);
prepSlider(sLfoRate, 50, 72);
slider[sLfoRate]->setCallback(this);
slider[sLfoDelay] = new ImageSlider(this, orangeSlider);
prepSlider(sLfoDelay, 90, 72);
slider[sLfoDelay]->setCallback(this);
slider[sLfoDepth] = new ImageSlider(this, greenSlider);
prepSlider(sLfoDepth, 292, 72);
slider[sLfoDepth]->setCallback(this);
slider[sPwmDepth] = new ImageSlider(this, greenSlider);
prepSlider(sPwmDepth, 331, 72);
slider[sPwmDepth]->setCallback(this);
slider[sSubLevel] = new ImageSlider(this, greenSlider);
prepSlider(sSubLevel, 517, 72);
slider[sSubLevel]->setCallback(this);
slider[sNoiseLevel] = new ImageSlider(this, greenSlider);
prepSlider(sNoiseLevel, 558, 72);
slider[sNoiseLevel]->setCallback(this);
// HPF slider is treated specially as it is part of the switches
slider[sHpf] = new ImageSlider(this, blueSlider);
prepSlider(sHpf, 618, 72);
slider[sHpf]->setRange(0, 3);
slider[sHpf]->setStep(1);
slider[sHpf]->setCallback(this);
slider[sCutoff] = new ImageSlider(this, blueSlider);
prepSlider(sCutoff, 21, 261);
slider[sCutoff]->setCallback(this);
slider[sRes] = new ImageSlider(this, blueSlider);
prepSlider(sRes, 60, 261);
slider[sRes]->setCallback(this);
slider[sEnv] = new ImageSlider(this, blueSlider);
prepSlider(sEnv, 144, 261);
slider[sEnv]->setCallback(this);
slider[sLfo] = new ImageSlider(this, blueSlider);
prepSlider(sLfo, 183, 261);
slider[sLfo]->setCallback(this);
slider[sKyb] = new ImageSlider(this, blueSlider);
prepSlider(sKyb, 222, 261);
slider[sKyb]->setCallback(this);
slider[sVcaLevel] = new ImageSlider(this, whiteSlider);
prepSlider(sVcaLevel, 314, 261);
slider[sVcaLevel]->setCallback(this);
slider[sAtk] = new ImageSlider(this, whiteSlider);
prepSlider(sAtk, 375, 261);
slider[sAtk]->setCallback(this);
slider[sDcy] = new ImageSlider(this, whiteSlider);
prepSlider(sDcy, 414, 261);
slider[sDcy]->setCallback(this);
slider[sStn] = new ImageSlider(this, whiteSlider);
prepSlider(sStn, 454, 261);
slider[sStn]->setCallback(this);
slider[sRls] = new ImageSlider(this, whiteSlider);
prepSlider(sRls, 493, 261);
slider[sRls]->setCallback(this);
xBtn16ft = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGB),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGB));
xBtn16ft->setAbsolutePos(149, 103);
xBtn16ft->setId(btn16);
xBtn16ft->setCallback(this);
xBtn8ft = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGB),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGB));
xBtn8ft->setAbsolutePos(190, 103);
xBtn8ft->setId(btn8);
xBtn8ft->setCallback(this);
xBtn4ft = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGB),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGB));
xBtn4ft->setAbsolutePos(231, 103);
xBtn4ft->setId(btn4);
xBtn4ft->setCallback(this);
programLoaded(0);
}
DistrhoUIchassis::~DistrhoUIchassis() {
printf("Called destructor for UI\n");
}
void DistrhoUIchassis::programLoaded(uint32_t index) {
switch (index) {
case sLfoRate:
// slider[pLFORate->setValue(0.5);
break;
case sLfoDelay:
// slider[pLFODelay->setValue(0.5);
break;
}
}
void DistrhoUIchassis::parameterChanged(uint32_t index, float value) {
#if 0
switch (index) {
case sLfoRate:
slider[pLFORate->setValue(value);
break;
case sLfoDelay:
slider[pLFODelay->setValue(value);
break;
case sLfoDepth:
slider[pLFODepth->setValue(value);
break;
case pPWMDepth:
slider[pPWMDepth->setValue(value);
break;
case sSubLevel:
slider[sSubLevel->setValue(value);
break;
case sNoiseLevel:
slider[sNoiseLevel->setValue(value);
break;
case sHpf:
slider[sHpf->setValue(value);
break;
case sCutoff:
slider[sCutoff->setValue(value);
break;
case sRes:
slider[sRes->setValue(value);
break;
case sEnv:
slider[sEnv->setValue(value);
break;
case sLfo:
slider[sLfo->setValue(value);
break;
case sKyb:
slider[sKyb->setValue(value);
break;
case sAtk:
slider[sAtk->setValue(value);
break;
case sDcy:
slider[sDcy->setValue(value);
break;
case sStn:
slider[sStn->setValue(value);
break;
case pRls:
slider[pRls->setValue(value);
break;
// now the switches
case pVCORange:
sw1 &= 0xf8; // mask
if (value > 2) value = 2;
sw1 |= (1 << (int)value);
break;
case pSqr:
sw1 &= 0xf7;
sw1 |= ((value >= 0.5)) << 3;
break;
case pSaw:
sw1 &= 0xef;
sw1 |= (value > 0.5) << 4;
break;
case pChorus:
sw1 &= 0x9f;
// 60, 40, 00
switch ((int)value) {
case 0:
sw1 |= 0x60;
break;
case 1:
sw1 |= 0x40;
break;
case 2:
sw1 |= 0x00;
break;
}
}
#endif
}
void DistrhoUIchassis::imageSliderDragStarted(ImageSlider* slider) {
editParameter(slider->getId(), true);
}
void DistrhoUIchassis::imageSliderDragFinished(ImageSlider* slider) {
editParameter(slider->getId(), false);
}
void DistrhoUIchassis::imageSliderValueChanged(ImageSlider* slider, float value) {
setParameterValue(slider->getId(), value);
printf("slider %d changed to %f\n",slider->getId(), value);
}
void DistrhoUIchassis::imageButtonClicked(ImageButton* imgBtn, int) {
int id = imgBtn->getId();
// printf("imagebutton %d\n", id);
switch (id) {
case btn16:
sw1 &= 0xf8;
sw1 |= 0x01;
break;
case btn8:
sw1 &= 0xf8;
sw1 |= 0x02;
break;
case btn4:
sw1 &= 0xf8;
sw1 |= 0x04;
break;
default:
break;
}
}
void DistrhoUIchassis::onDisplay() {
const GraphicsContext& context(getGraphicsContext());
fImgBackground.draw(context);
// switch 1 LEDs
if (sw1 & 0x01) fImgLedOn.drawAt(context, 160, 77); // 16'
if (sw1 & 0x02) fImgLedOn.drawAt(context, 198, 77); // 8'
if (sw1 & 0x04) fImgLedOn.drawAt(context, 238, 77); // 4'
if (sw1 & 0x08) fImgLedOn.drawAt(context, 427, 77); // pulse
if (sw1 & 0x10) fImgLedOn.drawAt(context, 465, 77); // saw
if ((sw1 & 0x60) == 0x40) fImgLedOn.drawAt(context, 604, 269); // chorus 1
if ((sw1 & 0x60) == 0x00) fImgLedOn.drawAt(context, 644, 269); // chorus 2
};
UI* createUI() {
return new DistrhoUIchassis();
}
END_NAMESPACE_DISTRHO