decouple sliders and parameters

This commit is contained in:
Gordon JC Pearce 2025-02-16 22:03:46 +00:00
parent 7607c71dad
commit a54929c2b3
4 changed files with 153 additions and 119 deletions

View File

@ -31,25 +31,25 @@
#define DISTRHO_PLUGIN_HAS_UI 1 #define DISTRHO_PLUGIN_HAS_UI 1
enum Parameters { enum Parameters {
pLFORate, pLfoRate,
pLFODelay, pLfoDelay,
pVCORange, pVcoRange,
pLFODepth, pLfoDepth,
pPWMDepth, pPwmDepth,
pSqr, pSqr,
pSaw, pSaw,
pSubLevel, pSubLevel,
pNoiseLevel, pNoiseLevel,
pHPF, pHpf,
pCutoff, pCutoff,
pRes, pRes,
pEnv, pEnv,
pLfo, pLfo,
pKyb, pKyb,
pVCALevel, pVcaLevel,
pAtk, pAtk,
pDcy, pDcy,

View File

@ -25,20 +25,20 @@ void Chassis::initParameter(uint32_t index, Parameter& parameter) {
parameter.ranges.def = 0.0f; parameter.ranges.def = 0.0f;
switch (index) { switch (index) {
case pLFORate: case pLfoRate:
parameter.name = "LFO Rate"; parameter.name = "LFO Rate";
parameter.symbol = "ch_lforate"; parameter.symbol = "ch_lforate";
parameter.midiCC = 3; parameter.midiCC = 3;
break; break;
case pLFODelay: case pLfoDelay:
parameter.hints = kParameterIsAutomatable; parameter.hints = kParameterIsAutomatable;
parameter.name = "LFO Delay"; parameter.name = "LFO Delay";
parameter.symbol = "ch_lfodelay"; parameter.symbol = "ch_lfodelay";
parameter.midiCC = 9; parameter.midiCC = 9;
break; break;
case pVCORange: case pVcoRange:
parameter.hints = kParameterIsAutomatable | kParameterIsInteger; parameter.hints = kParameterIsAutomatable | kParameterIsInteger;
parameter.name = "Range"; parameter.name = "Range";
parameter.symbol = "ch_vcorange"; parameter.symbol = "ch_vcorange";
@ -58,14 +58,14 @@ void Chassis::initParameter(uint32_t index, Parameter& parameter) {
} }
break; break;
case pLFODepth: case pLfoDepth:
parameter.hints = kParameterIsAutomatable; parameter.hints = kParameterIsAutomatable;
parameter.name = "LFO"; parameter.name = "LFO";
parameter.symbol = "ch_lfo"; parameter.symbol = "ch_lfo";
parameter.midiCC = 13; parameter.midiCC = 13;
break; break;
case pPWMDepth: case pPwmDepth:
parameter.hints = kParameterIsAutomatable; parameter.hints = kParameterIsAutomatable;
parameter.name = "PWM"; parameter.name = "PWM";
parameter.symbol = "ch_pwm"; parameter.symbol = "ch_pwm";
@ -122,7 +122,7 @@ void Chassis::initParameter(uint32_t index, Parameter& parameter) {
parameter.midiCC = 19; parameter.midiCC = 19;
break; break;
case pHPF: case pHpf:
parameter.hints = kParameterIsAutomatable | kParameterIsInteger; parameter.hints = kParameterIsAutomatable | kParameterIsInteger;
parameter.name = "HPF"; parameter.name = "HPF";
parameter.symbol = "ch_hpf"; parameter.symbol = "ch_hpf";
@ -230,7 +230,7 @@ void Chassis::initParameter(uint32_t index, Parameter& parameter) {
} }
break; break;
*/ */
case pVCALevel: case pVcaLevel:
parameter.hints = kParameterIsAutomatable; parameter.hints = kParameterIsAutomatable;
parameter.name = "VCA Level"; parameter.name = "VCA Level";
parameter.symbol = "ch_vcalevel"; parameter.symbol = "ch_vcalevel";
@ -277,17 +277,17 @@ void Chassis::setParameterValue(uint32_t index, float value) {
if (value > 127.0f) value = 127.0f; if (value > 127.0f) value = 127.0f;
switch (index) { switch (index) {
case pLFORate: case pLfoRate:
patchRam.lfoRate = value; patchRam.lfoRate = value;
break; break;
case pLFODelay: case pLfoDelay:
patchRam.lfoDelay = value; patchRam.lfoDelay = value;
break; break;
case pLFODepth: case pLfoDepth:
patchRam.vcoLfo = value; patchRam.vcoLfo = value;
break; break;
case pPWMDepth: case pPwmDepth:
patchRam.pwmLfo = value / 1.27; patchRam.pwmLfo = value / 1.27;
break; break;
case pSubLevel: case pSubLevel:
@ -313,7 +313,7 @@ void Chassis::setParameterValue(uint32_t index, float value) {
patchRam.vcfKey = value; patchRam.vcfKey = value;
break; break;
case pVCALevel: case pVcaLevel:
patchRam.vca = value; patchRam.vca = value;
break; break;
@ -331,7 +331,7 @@ void Chassis::setParameterValue(uint32_t index, float value) {
break; break;
// switch 1 params // switch 1 params
case pVCORange: // bits 0-2 of switch 1 case pVcoRange: // bits 0-2 of switch 1
// doesn't look great in Carla because of odd behaviour with small integer knobs // doesn't look great in Carla because of odd behaviour with small integer knobs
patchRam.switch1 &= 0xf8; patchRam.switch1 &= 0xf8;
patchRam.switch1 |= (1 << (int)(value - 1)); patchRam.switch1 |= (1 << (int)(value - 1));
@ -380,7 +380,7 @@ void Chassis::setParameterValue(uint32_t index, float value) {
patchRam.switch2 |= (value >= 0.5) << 2; patchRam.switch2 |= (value >= 0.5) << 2;
break; break;
*/ */
case pHPF: // bits 3-4 of switch 2 case pHpf: // bits 3-4 of switch 2
// doesn't look great in Carla because of odd behaviour with small integer knobs // doesn't look great in Carla because of odd behaviour with small integer knobs
if (value > 3) value = 3; if (value > 3) value = 3;
patchRam.switch2 &= 0xe7; patchRam.switch2 &= 0xe7;
@ -396,14 +396,14 @@ void Chassis::setParameterValue(uint32_t index, float value) {
float Chassis::getParameterValue(uint32_t index) const { float Chassis::getParameterValue(uint32_t index) const {
switch (index) { switch (index) {
case pLFORate: case pLfoRate:
return patchRam.lfoRate; return patchRam.lfoRate;
break; break;
case pLFODelay: case pLfoDelay:
return patchRam.lfoDelay; return patchRam.lfoDelay;
break; break;
case pVCORange: case pVcoRange:
// FIXME this needs to be better generally // FIXME this needs to be better generally
switch (patchRam.switch1 & 0x07) { switch (patchRam.switch1 & 0x07) {
case 1: case 1:
@ -417,10 +417,10 @@ float Chassis::getParameterValue(uint32_t index) const {
} }
break; break;
case pLFODepth: case pLfoDepth:
return patchRam.vcoLfo; return patchRam.vcoLfo;
break; break;
case pPWMDepth: case pPwmDepth:
return patchRam.pwmLfo * 1.27f; return patchRam.pwmLfo * 1.27f;
break; break;
/* /*
@ -440,7 +440,7 @@ float Chassis::getParameterValue(uint32_t index) const {
case pNoiseLevel: case pNoiseLevel:
return patchRam.noise; return patchRam.noise;
break; break;
case pHPF: case pHpf:
return 3 - ((patchRam.switch2 & 0x18) >> 3); return 3 - ((patchRam.switch2 & 0x18) >> 3);
break; break;
case pCutoff: case pCutoff:
@ -479,7 +479,7 @@ float Chassis::getParameterValue(uint32_t index) const {
case paramEnvGate: case paramEnvGate:
return (patchRam.switch2 & 0x04) != 0; return (patchRam.switch2 & 0x04) != 0;
*/ */
case pVCALevel: case pVcaLevel:
return patchRam.vca; return patchRam.vca;
break; break;

View File

@ -7,7 +7,9 @@ START_NAMESPACE_DISTRHO
namespace Art = Artwork; namespace Art = Artwork;
void prepSlider(ImageSlider* s, uint id, int x, int y) { //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->setId(id);
s->setStartPos(x, y); s->setStartPos(x, y);
s->setEndPos(x, y + 79); // 80px high s->setEndPos(x, y + 79); // 80px high
@ -25,74 +27,77 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
Image blueSlider(Art::blueData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA); Image blueSlider(Art::blueData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA);
Image whiteSlider(Art::whiteData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA); Image whiteSlider(Art::whiteData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA);
xSliderLFORate = new ImageSlider(this, orangeSlider); slider[sLfoRate] = new ImageSlider(this, orangeSlider);
prepSlider(xSliderLFORate, pLFORate, 50, 72); prepSlider(sLfoRate, 50, 72);
xSliderLFORate->setCallback(this); slider[sLfoRate]->setCallback(this);
xSliderLFODelay = new ImageSlider(this, orangeSlider); slider[sLfoDelay] = new ImageSlider(this, orangeSlider);
prepSlider(xSliderLFODelay, pLFODelay, 90, 72); prepSlider(sLfoDelay, 90, 72);
xSliderLFODelay->setCallback(this); slider[sLfoDelay]->setCallback(this);
xSliderLFODepth = new ImageSlider(this, greenSlider); slider[sLfoDepth] = new ImageSlider(this, greenSlider);
prepSlider(xSliderLFODepth, pLFODepth, 292, 72); prepSlider(sLfoDepth, 292, 72);
xSliderLFODepth->setCallback(this); slider[sLfoDepth]->setCallback(this);
xSliderPWMDepth = new ImageSlider(this, greenSlider); slider[sPwmDepth] = new ImageSlider(this, greenSlider);
prepSlider(xSliderPWMDepth, pPWMDepth, 331, 72); prepSlider(sPwmDepth, 331, 72);
xSliderPWMDepth->setCallback(this); slider[sPwmDepth]->setCallback(this);
xSliderSubLevel = new ImageSlider(this, greenSlider); slider[sSubLevel] = new ImageSlider(this, greenSlider);
prepSlider(xSliderSubLevel, pSubLevel, 517, 72); prepSlider(sSubLevel, 517, 72);
xSliderSubLevel->setCallback(this); slider[sSubLevel]->setCallback(this);
xSliderNoiseLevel = new ImageSlider(this, greenSlider); slider[sNoiseLevel] = new ImageSlider(this, greenSlider);
prepSlider(xSliderNoiseLevel, pNoiseLevel, 558, 72); prepSlider(sNoiseLevel, 558, 72);
xSliderNoiseLevel->setCallback(this); slider[sNoiseLevel]->setCallback(this);
// FIXME - put the stops back in // HPF slider is treated specially as it is part of the switches
xSliderHPF = new ImageSlider(this, blueSlider); slider[sHpf] = new ImageSlider(this, blueSlider);
prepSlider(xSliderHPF, pHPF, 618, 72); prepSlider(sHpf, 618, 72);
xSliderHPF->setCallback(this); slider[sHpf]->setRange(0, 3);
slider[sHpf]->setStep(1);
slider[sHpf]->setCallback(this);
xSliderCutoff = new ImageSlider(this, blueSlider); slider[sCutoff] = new ImageSlider(this, blueSlider);
prepSlider(xSliderCutoff, pCutoff, 21, 261); prepSlider(sCutoff, 21, 261);
xSliderCutoff->setCallback(this); slider[sCutoff]->setCallback(this);
xSliderRes = new ImageSlider(this, blueSlider); slider[sRes] = new ImageSlider(this, blueSlider);
prepSlider(xSliderRes, pRes, 60, 261); prepSlider(sRes, 60, 261);
xSliderRes->setCallback(this); slider[sRes]->setCallback(this);
xSliderEnv = new ImageSlider(this, blueSlider); slider[sEnv] = new ImageSlider(this, blueSlider);
prepSlider(xSliderEnv, pEnv, 144, 261); prepSlider(sEnv, 144, 261);
xSliderEnv->setCallback(this); slider[sEnv]->setCallback(this);
xSliderLfo = new ImageSlider(this, blueSlider); slider[sLfo] = new ImageSlider(this, blueSlider);
prepSlider(xSliderLfo, pLfo, 183, 261); prepSlider(sLfo, 183, 261);
xSliderLfo->setCallback(this); slider[sLfo]->setCallback(this);
xSliderKyb = new ImageSlider(this, blueSlider); slider[sKyb] = new ImageSlider(this, blueSlider);
prepSlider(xSliderKyb, pKyb, 222, 261); prepSlider(sKyb, 222, 261);
xSliderKyb->setCallback(this); slider[sKyb]->setCallback(this);
xSliderVCALevel = new ImageSlider(this, whiteSlider); slider[sVcaLevel] = new ImageSlider(this, whiteSlider);
prepSlider(xSliderVCALevel, pVCALevel, 314, 261); prepSlider(sVcaLevel, 314, 261);
xSliderVCALevel->setCallback(this); slider[sVcaLevel]->setCallback(this);
xSliderAtk = new ImageSlider(this, whiteSlider); slider[sAtk] = new ImageSlider(this, whiteSlider);
prepSlider(xSliderAtk, pVCALevel, 375, 261); prepSlider(sAtk, 375, 261);
xSliderAtk->setCallback(this); slider[sAtk]->setCallback(this);
xSliderDcy = new ImageSlider(this, whiteSlider);
prepSlider(xSliderDcy, pDcy, 414, 261);
xSliderDcy->setCallback(this);
xSliderStn = new ImageSlider(this, whiteSlider); slider[sDcy] = new ImageSlider(this, whiteSlider);
prepSlider(xSliderStn, pStn, 454, 261); prepSlider(sDcy, 414, 261);
xSliderStn->setCallback(this); slider[sDcy]->setCallback(this);
xSliderRls = new ImageSlider(this, whiteSlider); slider[sStn] = new ImageSlider(this, whiteSlider);
prepSlider(xSliderRls, pRls, 493, 261); prepSlider(sStn, 454, 261);
xSliderRls->setCallback(this); 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), xBtn16ft = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGB),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGB)); Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGB));
@ -118,63 +123,64 @@ DistrhoUIchassis::~DistrhoUIchassis() {
void DistrhoUIchassis::programLoaded(uint32_t index) { void DistrhoUIchassis::programLoaded(uint32_t index) {
switch (index) { switch (index) {
case pLFORate: case sLfoRate:
xSliderLFORate->setValue(0.5); // slider[pLFORate->setValue(0.5);
break; break;
case pLFODelay: case sLfoDelay:
xSliderLFODelay->setValue(0.5); // slider[pLFODelay->setValue(0.5);
break; break;
} }
} }
void DistrhoUIchassis::parameterChanged(uint32_t index, float value) { void DistrhoUIchassis::parameterChanged(uint32_t index, float value) {
#if 0
switch (index) { switch (index) {
case pLFORate: case sLfoRate:
xSliderLFORate->setValue(value); slider[pLFORate->setValue(value);
break; break;
case pLFODelay: case sLfoDelay:
xSliderLFODelay->setValue(value); slider[pLFODelay->setValue(value);
break; break;
case pLFODepth: case sLfoDepth:
xSliderLFODepth->setValue(value); slider[pLFODepth->setValue(value);
break; break;
case pPWMDepth: case pPWMDepth:
xSliderPWMDepth->setValue(value); slider[pPWMDepth->setValue(value);
break; break;
case pSubLevel: case sSubLevel:
xSliderSubLevel->setValue(value); slider[sSubLevel->setValue(value);
break; break;
case pNoiseLevel: case sNoiseLevel:
xSliderNoiseLevel->setValue(value); slider[sNoiseLevel->setValue(value);
break; break;
case pHPF: case sHpf:
xSliderHPF->setValue(value); slider[sHpf->setValue(value);
break; break;
case pCutoff: case sCutoff:
xSliderCutoff->setValue(value); slider[sCutoff->setValue(value);
break; break;
case pRes: case sRes:
xSliderRes->setValue(value); slider[sRes->setValue(value);
break; break;
case pEnv: case sEnv:
xSliderEnv->setValue(value); slider[sEnv->setValue(value);
break; break;
case pLfo: case sLfo:
xSliderLfo->setValue(value); slider[sLfo->setValue(value);
break; break;
case pKyb: case sKyb:
xSliderKyb->setValue(value); slider[sKyb->setValue(value);
break; break;
case pAtk: case sAtk:
xSliderAtk->setValue(value); slider[sAtk->setValue(value);
break; break;
case pDcy: case sDcy:
xSliderDcy->setValue(value); slider[sDcy->setValue(value);
break; break;
case pStn: case sStn:
xSliderStn->setValue(value); slider[sStn->setValue(value);
break; break;
case pRls: case pRls:
xSliderRls->setValue(value); slider[pRls->setValue(value);
break; break;
// now the switches // now the switches
case pVCORange: case pVCORange:
@ -206,6 +212,7 @@ void DistrhoUIchassis::parameterChanged(uint32_t index, float value) {
break; break;
} }
} }
#endif
} }
void DistrhoUIchassis::imageSliderDragStarted(ImageSlider* slider) { void DistrhoUIchassis::imageSliderDragStarted(ImageSlider* slider) {
@ -218,6 +225,7 @@ void DistrhoUIchassis::imageSliderDragFinished(ImageSlider* slider) {
void DistrhoUIchassis::imageSliderValueChanged(ImageSlider* slider, float value) { void DistrhoUIchassis::imageSliderValueChanged(ImageSlider* slider, float value) {
setParameterValue(slider->getId(), value); setParameterValue(slider->getId(), value);
printf("slider %d changed to %f\n",slider->getId(), value);
} }
void DistrhoUIchassis::imageButtonClicked(ImageButton* imgBtn, int) { void DistrhoUIchassis::imageButtonClicked(ImageButton* imgBtn, int) {

View File

@ -25,14 +25,40 @@ class DistrhoUIchassis : public UI,
void imageButtonClicked(ImageButton *imageButton, int button) override; void imageButtonClicked(ImageButton *imageButton, int button) override;
void prepSlider( uint id, int x, int y);
enum {
sLfoRate,
sLfoDelay,
sLfoDepth,
sPwmDepth,
sSubLevel,
sNoiseLevel,
sCutoff,
sRes,
sEnv,
sLfo,
sKyb,
sVcaLevel,
sAtk,
sDcy,
sStn,
sRls,
sHpf
};
private: private:
Image fImgBackground; Image fImgBackground;
Image fImgLedOn; Image fImgLedOn;
ScopedPointer<ImageSlider> ScopedPointer<ImageSlider> slider[17];
/*
xSliderLFORate, xSliderLFODelay, xSliderLFORate, xSliderLFODelay,
xSliderLFODepth, xSliderPWMDepth, xSliderSubLevel, xSliderNoiseLevel, xSliderLFODepth, xSliderPWMDepth, xSliderSubLevel, xSliderNoiseLevel,
xSliderHPF, xSliderCutoff, xSliderRes, xSliderEnv, xSliderLfo, xSliderKyb, xSliderHPF, xSliderCutoff, xSliderRes, xSliderEnv, xSliderLfo, xSliderKyb,
xSliderVCALevel, xSliderAtk, xSliderDcy, xSliderStn, xSliderRls; xSliderVCALevel, xSliderAtk, xSliderDcy, xSliderStn, xSliderRls;
*/
ScopedPointer<ImageButton> xBtn16ft, xBtn8ft, xBtn4ft; ScopedPointer<ImageButton> xBtn16ft, xBtn8ft, xBtn4ft;
uint8_t sw1 = 0, sw2 = 0; uint8_t sw1 = 0, sw2 = 0;