diff options
Diffstat (limited to 'plugins/ZaMultiComp/ZaMultiCompUI.cpp')
-rw-r--r-- | plugins/ZaMultiComp/ZaMultiCompUI.cpp | 961 |
1 files changed, 716 insertions, 245 deletions
diff --git a/plugins/ZaMultiComp/ZaMultiCompUI.cpp b/plugins/ZaMultiComp/ZaMultiCompUI.cpp index 8bea548..ee22371 100644 --- a/plugins/ZaMultiComp/ZaMultiCompUI.cpp +++ b/plugins/ZaMultiComp/ZaMultiCompUI.cpp @@ -1,5 +1,5 @@ /* - * ZaMultiComp mono multiband compressor + * ZaMultiComp multiband compressor * Copyright (C) 2014 Damien Zammit <damien@zamaudio.com> * * This program is free software; you can redistribute it and/or @@ -37,102 +37,170 @@ ZaMultiCompUI::ZaMultiCompUI() fLedYellowImg = Image(ZaMultiCompArtwork::ledyellowData, ZaMultiCompArtwork::ledyellowWidth, ZaMultiCompArtwork::ledyellowHeight); // led values - fLedRedValue1 = 0.0f; - fLedRedValue2 = 0.0f; - fLedRedValue3 = 0.0f; - fLedYellowValue = 0.0f; + fLedRedValue[0] = 0.0f; + fLedRedValue[1] = 0.0f; + fLedRedValue[2] = 0.0f; + fLedYellowValueL = 0.0f; // knob Image knobImage(ZaMultiCompArtwork::knobData, ZaMultiCompArtwork::knobWidth, ZaMultiCompArtwork::knobHeight); + int x = 250; + int y = 291; // knob - fKnobAttack = new ImageKnob(this, knobImage); - fKnobAttack->setAbsolutePos(24, 43); - fKnobAttack->setRange(0.1f, 200.0f); - fKnobAttack->setStep(0.1f); - fKnobAttack->setUsingLogScale(true); - fKnobAttack->setDefault(10.0f); - fKnobAttack->setRotationAngle(240); - fKnobAttack->setCallback(this); - - fKnobRelease = new ImageKnob(this, knobImage); - fKnobRelease->setAbsolutePos(108, 43); - fKnobRelease->setRange(50.0f, 500.0f); - fKnobRelease->setStep(1.0f); - fKnobRelease->setDefault(80.0f); - fKnobRelease->setRotationAngle(240); - fKnobRelease->setCallback(this); - - fKnobThresh = new ImageKnob(this, knobImage); - fKnobThresh->setAbsolutePos(191.5, 43); - fKnobThresh->setRange(-60.0f, 0.0f); - fKnobThresh->setStep(1.0f); - fKnobThresh->setDefault(0.0f); - fKnobThresh->setRotationAngle(240); - fKnobThresh->setCallback(this); - - fKnobRatio = new ImageKnob(this, knobImage); - fKnobRatio->setAbsolutePos(270, 43); - fKnobRatio->setRange(1.0f, 20.0f); - fKnobRatio->setStep(0.1f); - fKnobRatio->setDefault(4.0f); - fKnobRatio->setRotationAngle(240); - fKnobRatio->setCallback(this); - - fKnobKnee = new ImageKnob(this, knobImage); - fKnobKnee->setAbsolutePos(348.5, 43); - fKnobKnee->setRange(0.0f, 8.0f); - fKnobKnee->setStep(0.1f); - fKnobKnee->setDefault(0.0f); - fKnobKnee->setRotationAngle(240); - fKnobKnee->setCallback(this); + fKnobAttack1 = new ImageKnob(this, knobImage); + fKnobAttack1->setAbsolutePos(26+x, 43+y); + fKnobAttack1->setRange(0.1f, 200.0f); + fKnobAttack1->setUsingLogScale(true); + fKnobAttack1->setDefault(10.0f); + fKnobAttack1->setStep(0.1f); + fKnobAttack1->setRotationAngle(240); + fKnobAttack1->setCallback(this); + + fKnobAttack2 = new ImageKnob(this, knobImage); + fKnobAttack2->setAbsolutePos(26+x, 43+y-50); + fKnobAttack2->setRange(0.1f, 200.0f); + fKnobAttack2->setUsingLogScale(true); + fKnobAttack2->setDefault(10.0f); + fKnobAttack2->setStep(0.1f); + fKnobAttack2->setRotationAngle(240); + fKnobAttack2->setCallback(this); + + fKnobAttack3 = new ImageKnob(this, knobImage); + fKnobAttack3->setAbsolutePos(26+x, 43+y-100); + fKnobAttack3->setRange(0.1f, 200.0f); + fKnobAttack3->setUsingLogScale(true); + fKnobAttack3->setDefault(10.0f); + fKnobAttack3->setStep(0.1f); + fKnobAttack3->setRotationAngle(240); + fKnobAttack3->setCallback(this); + + fKnobRelease1 = new ImageKnob(this, knobImage); + fKnobRelease1->setAbsolutePos(108+x, 43+y); + fKnobRelease1->setRange(1.0f, 500.0f); + fKnobRelease1->setDefault(80.0f); + fKnobRelease1->setRotationAngle(240); + fKnobRelease1->setCallback(this); + + fKnobRelease2 = new ImageKnob(this, knobImage); + fKnobRelease2->setAbsolutePos(108+x, 43+y-50); + fKnobRelease2->setRange(1.0f, 500.0f); + fKnobRelease2->setDefault(80.0f); + fKnobRelease2->setRotationAngle(240); + fKnobRelease2->setCallback(this); + + fKnobRelease3 = new ImageKnob(this, knobImage); + fKnobRelease3->setAbsolutePos(108+x, 43+y-100); + fKnobRelease3->setRange(1.0f, 500.0f); + fKnobRelease3->setDefault(80.0f); + fKnobRelease3->setRotationAngle(240); + fKnobRelease3->setCallback(this); + + fKnobThresh3 = new ImageKnob(this, knobImage); + fKnobThresh3->setAbsolutePos(94.5+31, 99+134); + fKnobThresh3->setRange(-60.0f, 0.0f); + fKnobThresh3->setDefault(-16.0f); + fKnobThresh3->setRotationAngle(240); + fKnobThresh3->setCallback(this); + + fKnobThresh2 = new ImageKnob(this, knobImage); + fKnobThresh2->setAbsolutePos(94.5+31, 150+134); + fKnobThresh2->setRange(-60.0f, 0.0f); + fKnobThresh2->setDefault(-18.0f); + fKnobThresh2->setRotationAngle(240); + fKnobThresh2->setCallback(this); + + fKnobThresh1 = new ImageKnob(this, knobImage); + fKnobThresh1->setAbsolutePos(94.5+31, 201+134); + fKnobThresh1->setRange(-60.0f, 0.0f); + fKnobThresh1->setDefault(-20.0f); + fKnobThresh1->setRotationAngle(240); + fKnobThresh1->setCallback(this); + + fKnobRatio1 = new ImageKnob(this, knobImage); + fKnobRatio1->setAbsolutePos(191.5+x, 43+y); + fKnobRatio1->setRange(1.0f, 20.0f); + fKnobRatio1->setDefault(4.0f); + fKnobRatio1->setRotationAngle(240); + fKnobRatio1->setCallback(this); + + fKnobRatio2 = new ImageKnob(this, knobImage); + fKnobRatio2->setAbsolutePos(191.5+x, 43+y-50); + fKnobRatio2->setRange(1.0f, 20.0f); + fKnobRatio2->setDefault(4.0f); + fKnobRatio2->setRotationAngle(240); + fKnobRatio2->setCallback(this); + + fKnobRatio3 = new ImageKnob(this, knobImage); + fKnobRatio3->setAbsolutePos(191.5+x, 43+y-100); + fKnobRatio3->setRange(1.0f, 20.0f); + fKnobRatio3->setDefault(4.0f); + fKnobRatio3->setRotationAngle(240); + fKnobRatio3->setCallback(this); + + fKnobKnee1 = new ImageKnob(this, knobImage); + fKnobKnee1->setAbsolutePos(273+x, 43+y); + fKnobKnee1->setRange(0.0f, 8.0f); + fKnobKnee1->setDefault(0.0f); + fKnobKnee1->setRotationAngle(240); + fKnobKnee1->setCallback(this); + + fKnobKnee2 = new ImageKnob(this, knobImage); + fKnobKnee2->setAbsolutePos(273+x, 43+y-50); + fKnobKnee2->setRange(0.0f, 8.0f); + fKnobKnee2->setDefault(0.0f); + fKnobKnee2->setRotationAngle(240); + fKnobKnee2->setCallback(this); + + fKnobKnee3 = new ImageKnob(this, knobImage); + fKnobKnee3->setAbsolutePos(273+x, 43+y-100); + fKnobKnee3->setRange(0.0f, 8.0f); + fKnobKnee3->setDefault(0.0f); + fKnobKnee3->setRotationAngle(240); + fKnobKnee3->setCallback(this); fKnobGlobalGain = new ImageKnob(this, knobImage); - fKnobGlobalGain->setAbsolutePos(427.3, 43); + fKnobGlobalGain->setAbsolutePos(427-170, 41); fKnobGlobalGain->setRange(-30.0f, 30.0f); - fKnobGlobalGain->setStep(1.0f); fKnobGlobalGain->setDefault(0.0f); fKnobGlobalGain->setRotationAngle(240); fKnobGlobalGain->setCallback(this); fKnobXover2 = new ImageKnob(this, knobImage); - fKnobXover2->setAbsolutePos(84, 121); + fKnobXover2->setAbsolutePos(22+333, 121-80); fKnobXover2->setRange(1400.f, 14000.f); - fKnobXover2->setStep(1.0f); fKnobXover2->setUsingLogScale(true); fKnobXover2->setDefault(1400.f); + fKnobXover2->setStep(5.f); fKnobXover2->setRotationAngle(240); fKnobXover2->setCallback(this); fKnobXover1 = new ImageKnob(this, knobImage); - fKnobXover1->setAbsolutePos(84, 176); + fKnobXover1->setAbsolutePos(22+333, 175.5-80); fKnobXover1->setRange(20.0f, 1400.0f); - fKnobXover1->setStep(1.0f); fKnobXover1->setUsingLogScale(true); fKnobXover1->setDefault(160.0f); + fKnobXover1->setStep(1.f); fKnobXover1->setRotationAngle(240); fKnobXover1->setCallback(this); fKnobMakeup3 = new ImageKnob(this, knobImage); - fKnobMakeup3->setAbsolutePos(167.75, 99.5); + fKnobMakeup3->setAbsolutePos(167.75+30, 99.5+134); fKnobMakeup3->setRange(0.0f, 30.0f); - fKnobMakeup3->setStep(0.1f); fKnobMakeup3->setDefault(0.0f); fKnobMakeup3->setRotationAngle(240); fKnobMakeup3->setCallback(this); fKnobMakeup2 = new ImageKnob(this, knobImage); - fKnobMakeup2->setAbsolutePos(167.75, 150.25); + fKnobMakeup2->setAbsolutePos(167.75+30, 150.25+134); fKnobMakeup2->setRange(0.0f, 30.0f); - fKnobMakeup2->setStep(0.1f); fKnobMakeup2->setDefault(0.0f); fKnobMakeup2->setRotationAngle(240); fKnobMakeup2->setCallback(this); fKnobMakeup1 = new ImageKnob(this, knobImage); - fKnobMakeup1->setAbsolutePos(167.75, 201.4); + fKnobMakeup1->setAbsolutePos(167.75+30, 201.4+134); fKnobMakeup1->setRange(0.0f, 30.0f); - fKnobMakeup1->setStep(0.1f); fKnobMakeup1->setDefault(0.0f); fKnobMakeup1->setRotationAngle(240); fKnobMakeup1->setCallback(this); @@ -142,47 +210,122 @@ ZaMultiCompUI::ZaMultiCompUI() Image toggleonhImage(ZaMultiCompArtwork::toggleonhorizData, ZaMultiCompArtwork::toggleonhorizWidth, ZaMultiCompArtwork::toggleonhorizHeight); Image toggleoffhImage(ZaMultiCompArtwork::toggleoffhorizData, ZaMultiCompArtwork::toggleoffhorizWidth, ZaMultiCompArtwork::toggleoffhorizHeight); - Point<int> togglePosStart(247,109); + Point<int> togglePosStart(247-230+4,108+130+5); fToggleBypass3 = new ImageToggle(this, toggleoffImage, toggleonImage); fToggleBypass3->setAbsolutePos(togglePosStart); fToggleBypass3->setCallback(this); - togglePosStart.setY(158); + togglePosStart.setY(158+130+5); fToggleBypass2 = new ImageToggle(this, toggleoffImage, toggleonImage); fToggleBypass2->setAbsolutePos(togglePosStart); fToggleBypass2->setCallback(this); - togglePosStart.setY(209); + togglePosStart.setY(209+130+5); fToggleBypass1 = new ImageToggle(this, toggleoffImage, toggleonImage); fToggleBypass1->setAbsolutePos(togglePosStart); fToggleBypass1->setCallback(this); - togglePosStart.setX(278); - togglePosStart.setY(113); + togglePosStart.setX(278-230+4); + togglePosStart.setY(113+130+5); - fToggleListen3 = new ImageToggle(this, toggleoffhImage, toggleonhImage); + fToggleListen3 = new ImageToggle(this, toggleoffhImage, toggleonhImage); fToggleListen3->setAbsolutePos(togglePosStart); fToggleListen3->setCallback(this); - togglePosStart.setY(164); + togglePosStart.setY(164+130+5); fToggleListen2 = new ImageToggle(this, toggleoffhImage, toggleonhImage); fToggleListen2->setAbsolutePos(togglePosStart); fToggleListen2->setCallback(this); - togglePosStart.setY(214); + togglePosStart.setY(214+130+5); fToggleListen1 = new ImageToggle(this, toggleoffhImage, toggleonhImage); fToggleListen1->setAbsolutePos(togglePosStart); fToggleListen1->setCallback(this); + togglePosStart.setX(369); + togglePosStart.setY(181); + + fCanvasArea.setPos(430, 42); + fCanvasArea.setSize(145, 145); + + int i,k; + + for (k = 0; k < MAX_COMP; ++k) { + for (i = 0; i < COMPOINTS; ++i) { + compx[k][i] = fCanvasArea.getX(); + compy[k][i] = fCanvasArea.getY() + fCanvasArea.getHeight(); + } + dotx[k] = 0.f; + doty[k] = 0.f; + } + // set default values programLoaded(0); } +void ZaMultiCompUI::compcurve(float in, int k, float *outx, float* outy) { + float knee = fKnee[k]; + float ratio = fRatio[k]; + float makeup = fMakeup[k] + fMaster; + float thresdb = fThresh[k]; + float width=6.f*knee+0.01; + float xg, yg; + + yg = 0.f; + xg = (in==0.f) ? -160.f : to_dB(fabs(in)); + xg = sanitize_denormal(xg); + + if (2.f*(xg-thresdb)<-width) { + yg = xg; + } else if (2.f*fabs(xg-thresdb)<=width) { + yg = xg + (1.f/ratio-1.f)*(xg-thresdb+width/2.f)*(xg-thresdb+width/2.f)/(2.f*width); + } else if (2.f*(xg-thresdb)>width) { + yg = thresdb + (xg-thresdb)/ratio; + } + yg = sanitize_denormal(yg); + + *outx = (to_dB(in) + 1.) / 55. + 1.; + *outy = !fBypass[k] ? (to_dB(in) + fMaster + 1.) / 55. + 1. : (yg + makeup + 1.) / 55. + 1.; + //printf("x = %f y = %f\n",*outx,*outy); +} + +void ZaMultiCompUI::compdot(float in, int k, float *outx, float* outy) { + float makeup = fMakeup[k] + fMaster; + float xg, yg; + + yg = 0.f; + xg = (in==0.f) ? -160.f : to_dB(fabs(in)); + xg = sanitize_denormal(xg); + yg = xg - fLedRedValue[k]; + yg = sanitize_denormal(yg); + + *outx = (to_dB(in) + 1.) / 55. + 1.; + *outy = !fBypass[k] ? (to_dB(in) + fMaster + 1.) / 55. + 1. : (yg + makeup + 1.) / 55. + 1.; +} + +void ZaMultiCompUI::calc_compcurves() { + float max_x = 1.f; + float min_x = 0.f; + float x2; + for (int k = 0; k < MAX_COMP; ++k) { + for (int i = 0; i < COMPOINTS; ++i) { + x2 = (max_x - min_x) / COMPOINTS * i + min_x; + compcurve(x2, k, &compx[k][i], &compy[k][i]); + compx[k][i] = fCanvasArea.getX() + compx[k][i]*fCanvasArea.getWidth(); + compy[k][i] = fCanvasArea.getY() + (1.-compy[k][i])*fCanvasArea.getHeight(); + } + //dot follows curve: + compdot((max_x - min_x)*from_dB(outlevel[k]), k, &dotx[k], &doty[k]); + dotx[k] = fCanvasArea.getX() + dotx[k]*fCanvasArea.getWidth(); + doty[k] = fCanvasArea.getY() + (1. - doty[k])*fCanvasArea.getHeight(); + } +} + // ----------------------------------------------------------------------- // DSP Callbacks @@ -190,30 +333,63 @@ void ZaMultiCompUI::parameterChanged(uint32_t index, float value) { switch (index) { - case ZaMultiCompPlugin::paramAttack: - fKnobAttack->setValue(value); + case ZaMultiCompPlugin::paramAttack1: + fKnobAttack1->setValue(value); + break; + case ZaMultiCompPlugin::paramAttack2: + fKnobAttack2->setValue(value); break; - case ZaMultiCompPlugin::paramRelease: - fKnobRelease->setValue(value); + case ZaMultiCompPlugin::paramAttack3: + fKnobAttack3->setValue(value); break; - case ZaMultiCompPlugin::paramThresh: - fKnobThresh->setValue(value); + case ZaMultiCompPlugin::paramRelease1: + fKnobRelease1->setValue(value); break; - case ZaMultiCompPlugin::paramRatio: - fKnobRatio->setValue(value); + case ZaMultiCompPlugin::paramRelease2: + fKnobRelease2->setValue(value); break; - case ZaMultiCompPlugin::paramKnee: - fKnobKnee->setValue(value); + case ZaMultiCompPlugin::paramRelease3: + fKnobRelease3->setValue(value); + break; + case ZaMultiCompPlugin::paramThresh1: + fKnobThresh1->setValue(value); + fThresh[0] = value; + break; + case ZaMultiCompPlugin::paramThresh2: + fKnobThresh2->setValue(value); + fThresh[1] = value; + break; + case ZaMultiCompPlugin::paramThresh3: + fKnobThresh3->setValue(value); + fThresh[2] = value; + break; + case ZaMultiCompPlugin::paramRatio1: + fKnobRatio1->setValue(value); + fRatio[0] = value; + break; + case ZaMultiCompPlugin::paramRatio2: + fKnobRatio2->setValue(value); + fRatio[1] = value; + break; + case ZaMultiCompPlugin::paramRatio3: + fKnobRatio3->setValue(value); + fRatio[2] = value; + break; + case ZaMultiCompPlugin::paramKnee1: + fKnobKnee1->setValue(value); + fKnee[0] = value; + break; + case ZaMultiCompPlugin::paramKnee2: + fKnobKnee2->setValue(value); + fKnee[1] = value; + break; + case ZaMultiCompPlugin::paramKnee3: + fKnobKnee3->setValue(value); + fKnee[2] = value; break; case ZaMultiCompPlugin::paramGlobalGain: fKnobGlobalGain->setValue(value); - break; - case ZaMultiCompPlugin::paramGainR1: - if (fLedRedValue1 != value) - { - fLedRedValue1 = value; - repaint(); - } + fMaster = value; break; case ZaMultiCompPlugin::paramXover1: fKnobXover1->setValue(value); @@ -221,82 +397,193 @@ void ZaMultiCompUI::parameterChanged(uint32_t index, float value) case ZaMultiCompPlugin::paramXover2: fKnobXover2->setValue(value); break; + case ZaMultiCompPlugin::paramGainR1: + if (fLedRedValue[0] != value) + { + fLedRedValue[0] = value; + repaint(); + } + break; case ZaMultiCompPlugin::paramGainR2: - if (fLedRedValue2 != value) + if (fLedRedValue[1] != value) { - fLedRedValue2 = value; + fLedRedValue[1] = value; repaint(); } break; case ZaMultiCompPlugin::paramGainR3: - if (fLedRedValue3 != value) + if (fLedRedValue[2] != value) { - fLedRedValue3 = value; + fLedRedValue[2] = value; repaint(); } break; case ZaMultiCompPlugin::paramOutputLevel: - if (fLedYellowValue != value) + if (fLedYellowValueL != value) { - fLedYellowValue = value; + fLedYellowValueL = value; repaint(); } break; + case ZaMultiCompPlugin::paramOutputLevelLow: + if (outlevel[0] != value) { + outlevel[0] = value; + repaint(); + } + break; + case ZaMultiCompPlugin::paramOutputLevelMed: + if (outlevel[1] != value) { + outlevel[1] = value; + repaint(); + } + break; + case ZaMultiCompPlugin::paramOutputLevelHigh: + if (outlevel[2] != value) { + outlevel[2] = value; + repaint(); + } + break; case ZaMultiCompPlugin::paramMakeup1: fKnobMakeup1->setValue(value); + if (fMakeup[0] != value) + { + fMakeup[0] = value; + repaint(); + } break; case ZaMultiCompPlugin::paramMakeup2: fKnobMakeup2->setValue(value); + if (fMakeup[1] != value) + { + fMakeup[1] = value; + repaint(); + } break; case ZaMultiCompPlugin::paramMakeup3: fKnobMakeup3->setValue(value); + if (fMakeup[2] != value) + { + fMakeup[2] = value; + repaint(); + } break; case ZaMultiCompPlugin::paramToggle1: - //fToggleBypass1->setValue(value); + fToggleBypass1->setValue(value); + if (fBypass[0] != value) + { + fBypass[0] = value; + repaint(); + } break; case ZaMultiCompPlugin::paramToggle2: - //fToggleBypass2->setValue(value); + fToggleBypass2->setValue(value); + if (fBypass[1] != value) + { + fBypass[1] = value; + repaint(); + } break; case ZaMultiCompPlugin::paramToggle3: - //fToggleBypass3->setValue(value); + fToggleBypass3->setValue(value); + if (fBypass[2] != value) + { + fBypass[2] = value; + repaint(); + } break; case ZaMultiCompPlugin::paramListen1: - //fToggleListen1->setValue(value); + fToggleListen1->setValue(value); + if (fListen[0] != value) + { + fListen[0] = value; + repaint(); + } break; case ZaMultiCompPlugin::paramListen2: - //fToggleListen2->setValue(value); + fToggleListen2->setValue(value); + if (fListen[1] != value) + { + fListen[1] = value; + repaint(); + } break; case ZaMultiCompPlugin::paramListen3: - //fToggleListen3->setValue(value); + fToggleListen3->setValue(value); + if (fListen[2] != value) + { + fListen[2] = value; + repaint(); + } break; } } void ZaMultiCompUI::programLoaded(uint32_t index) { - if (index != 0) - return; + switch(index) { + case 0: + fKnobAttack1->setValue(10.0f); + fKnobRelease1->setValue(80.0f); + fKnobKnee1->setValue(0.0f); + fKnobRatio1->setValue(4.0f); + fKnobAttack2->setValue(10.0f); + fKnobRelease2->setValue(80.0f); + fKnobKnee2->setValue(0.0f); + fKnobRatio2->setValue(4.0f); + fKnobAttack3->setValue(10.0f); + fKnobRelease3->setValue(80.0f); + fKnobKnee3->setValue(0.0f); + fKnobRatio3->setValue(4.0f); + fKnobThresh1->setValue(-20.0f); + fKnobThresh2->setValue(-18.0f); + fKnobThresh3->setValue(-16.0f); + fKnobMakeup1->setValue(0.0f); + fKnobMakeup2->setValue(0.0f); + fKnobMakeup3->setValue(0.0f); + fKnobXover1->setValue(160.0f); + fKnobXover2->setValue(1400.0f); + fToggleBypass1->setValue(0.0f); + fToggleBypass2->setValue(0.0f); + fToggleBypass3->setValue(0.0f); + fToggleListen1->setValue(0.0f); + fToggleListen2->setValue(0.0f); + fToggleListen3->setValue(0.0f); + fKnobGlobalGain->setValue(0.0f); + break; + case 1: + fKnobAttack1->setValue(10.0f); + fKnobRelease1->setValue(200.0f); + fKnobKnee1->setValue(3.0f); + fKnobRatio1->setValue(5.0f); + fKnobAttack2->setValue(10.0f); + fKnobRelease2->setValue(200.0f); + fKnobKnee2->setValue(3.0f); + fKnobRatio2->setValue(5.0f); + fKnobAttack3->setValue(10.0f); + fKnobRelease3->setValue(200.0f); + fKnobKnee3->setValue(3.0f); + fKnobRatio3->setValue(5.0f); + fKnobThresh1->setValue(-20.0f); + fKnobThresh2->setValue(-18.0f); + fKnobThresh3->setValue(-16.0f); + fKnobMakeup1->setValue(9.0f); + fKnobMakeup2->setValue(6.0f); + fKnobMakeup3->setValue(6.0f); + fKnobXover1->setValue(160.0f); + fKnobXover2->setValue(1400.0f); + fToggleBypass1->setValue(1.0f); + fToggleBypass2->setValue(1.0f); + fToggleBypass3->setValue(1.0f); + fToggleListen1->setValue(0.0f); + fToggleListen2->setValue(0.0f); + fToggleListen3->setValue(0.0f); + fKnobGlobalGain->setValue(0.0f); + break; + } +} - // Default values -/* - fKnobAttack->setValue(10.0f); - fKnobRelease->setValue(80.0f); - fKnobThresh->setValue(0.0f); - fKnobRatio->setValue(4.0f); - fKnobKnee->setValue(0.0f); - fKnobGlobalGain->setValue(0.0f); - fKnobMakeup1->setValue(0.0f); - fKnobMakeup2->setValue(0.0f); - fKnobMakeup3->setValue(0.0f); - fKnobXover1->setValue(160.0f); - fKnobXover2->setValue(1400.0f); -*/ - fToggleBypass1->setValue(0.0f); - fToggleBypass2->setValue(0.0f); - fToggleBypass3->setValue(0.0f); - fToggleListen1->setValue(0.0f); - fToggleListen2->setValue(0.0f); - fToggleListen3->setValue(0.0f); +void ZaMultiCompUI::stateChanged(const char*, const char*) +{ } // ----------------------------------------------------------------------- @@ -304,16 +591,36 @@ void ZaMultiCompUI::programLoaded(uint32_t index) void ZaMultiCompUI::imageKnobDragStarted(ImageKnob* knob) { - if (knob == fKnobAttack) - editParameter(ZaMultiCompPlugin::paramAttack, true); - else if (knob == fKnobRelease) - editParameter(ZaMultiCompPlugin::paramRelease, true); - else if (knob == fKnobThresh) - editParameter(ZaMultiCompPlugin::paramThresh, true); - else if (knob == fKnobRatio) - editParameter(ZaMultiCompPlugin::paramRatio, true); - else if (knob == fKnobKnee) - editParameter(ZaMultiCompPlugin::paramKnee, true); + if (knob == fKnobAttack1) + editParameter(ZaMultiCompPlugin::paramAttack1, true); + else if (knob == fKnobAttack2) + editParameter(ZaMultiCompPlugin::paramAttack2, true); + else if (knob == fKnobAttack3) + editParameter(ZaMultiCompPlugin::paramAttack3, true); + else if (knob == fKnobRelease1) + editParameter(ZaMultiCompPlugin::paramRelease1, true); + else if (knob == fKnobRelease2) + editParameter(ZaMultiCompPlugin::paramRelease2, true); + else if (knob == fKnobRelease3) + editParameter(ZaMultiCompPlugin::paramRelease3, true); + else if (knob == fKnobThresh1) + editParameter(ZaMultiCompPlugin::paramThresh1, true); + else if (knob == fKnobThresh2) + editParameter(ZaMultiCompPlugin::paramThresh2, true); + else if (knob == fKnobThresh3) + editParameter(ZaMultiCompPlugin::paramThresh3, true); + else if (knob == fKnobRatio1) + editParameter(ZaMultiCompPlugin::paramRatio1, true); + else if (knob == fKnobRatio2) + editParameter(ZaMultiCompPlugin::paramRatio2, true); + else if (knob == fKnobRatio3) + editParameter(ZaMultiCompPlugin::paramRatio3, true); + else if (knob == fKnobKnee1) + editParameter(ZaMultiCompPlugin::paramKnee1, true); + else if (knob == fKnobKnee2) + editParameter(ZaMultiCompPlugin::paramKnee2, true); + else if (knob == fKnobKnee3) + editParameter(ZaMultiCompPlugin::paramKnee3, true); else if (knob == fKnobGlobalGain) editParameter(ZaMultiCompPlugin::paramGlobalGain, true); else if (knob == fKnobMakeup1) @@ -330,16 +637,36 @@ void ZaMultiCompUI::imageKnobDragStarted(ImageKnob* knob) void ZaMultiCompUI::imageKnobDragFinished(ImageKnob* knob) { - if (knob == fKnobAttack) - editParameter(ZaMultiCompPlugin::paramAttack, false); - else if (knob == fKnobRelease) - editParameter(ZaMultiCompPlugin::paramRelease, false); - else if (knob == fKnobThresh) - editParameter(ZaMultiCompPlugin::paramThresh, false); - else if (knob == fKnobRatio) - editParameter(ZaMultiCompPlugin::paramRatio, false); - else if (knob == fKnobKnee) - editParameter(ZaMultiCompPlugin::paramKnee, false); + if (knob == fKnobAttack1) + editParameter(ZaMultiCompPlugin::paramAttack1, false); + else if (knob == fKnobAttack2) + editParameter(ZaMultiCompPlugin::paramAttack2, false); + else if (knob == fKnobAttack3) + editParameter(ZaMultiCompPlugin::paramAttack3, false); + else if (knob == fKnobRelease1) + editParameter(ZaMultiCompPlugin::paramRelease1, false); + else if (knob == fKnobRelease2) + editParameter(ZaMultiCompPlugin::paramRelease2, false); + else if (knob == fKnobRelease3) + editParameter(ZaMultiCompPlugin::paramRelease3, false); + else if (knob == fKnobThresh1) + editParameter(ZaMultiCompPlugin::paramThresh1, false); + else if (knob == fKnobThresh2) + editParameter(ZaMultiCompPlugin::paramThresh2, false); + else if (knob == fKnobThresh3) + editParameter(ZaMultiCompPlugin::paramThresh3, false); + else if (knob == fKnobRatio1) + editParameter(ZaMultiCompPlugin::paramRatio1, false); + else if (knob == fKnobRatio2) + editParameter(ZaMultiCompPlugin::paramRatio2, false); + else if (knob == fKnobRatio3) + editParameter(ZaMultiCompPlugin::paramRatio3, false); + else if (knob == fKnobKnee1) + editParameter(ZaMultiCompPlugin::paramKnee1, false); + else if (knob == fKnobKnee2) + editParameter(ZaMultiCompPlugin::paramKnee2, false); + else if (knob == fKnobKnee3) + editParameter(ZaMultiCompPlugin::paramKnee3, false); else if (knob == fKnobGlobalGain) editParameter(ZaMultiCompPlugin::paramGlobalGain, false); else if (knob == fKnobMakeup1) @@ -356,24 +683,70 @@ void ZaMultiCompUI::imageKnobDragFinished(ImageKnob* knob) void ZaMultiCompUI::imageKnobValueChanged(ImageKnob* knob, float value) { - if (knob == fKnobAttack) - setParameterValue(ZaMultiCompPlugin::paramAttack, value); - else if (knob == fKnobRelease) - setParameterValue(ZaMultiCompPlugin::paramRelease, value); - else if (knob == fKnobThresh) - setParameterValue(ZaMultiCompPlugin::paramThresh, value); - else if (knob == fKnobRatio) - setParameterValue(ZaMultiCompPlugin::paramRatio, value); - else if (knob == fKnobKnee) - setParameterValue(ZaMultiCompPlugin::paramKnee, value); - else if (knob == fKnobGlobalGain) + if (knob == fKnobAttack1) + setParameterValue(ZaMultiCompPlugin::paramAttack1, value); + else if (knob == fKnobAttack2) + setParameterValue(ZaMultiCompPlugin::paramAttack2, value); + else if (knob == fKnobAttack3) + setParameterValue(ZaMultiCompPlugin::paramAttack3, value); + else if (knob == fKnobRelease1) + setParameterValue(ZaMultiCompPlugin::paramRelease1, value); + else if (knob == fKnobRelease2) + setParameterValue(ZaMultiCompPlugin::paramRelease2, value); + else if (knob == fKnobRelease3) + setParameterValue(ZaMultiCompPlugin::paramRelease3, value); + else if (knob == fKnobThresh1) { + setParameterValue(ZaMultiCompPlugin::paramThresh1, value); + fThresh[0] = value; + } + else if (knob == fKnobThresh2) { + setParameterValue(ZaMultiCompPlugin::paramThresh2, value); + fThresh[1] = value; + } + else if (knob == fKnobThresh3) { + setParameterValue(ZaMultiCompPlugin::paramThresh3, value); + fThresh[2] = value; + } + else if (knob == fKnobRatio1) { + setParameterValue(ZaMultiCompPlugin::paramRatio1, value); + fRatio[0] = value; + } + else if (knob == fKnobRatio2) { + setParameterValue(ZaMultiCompPlugin::paramRatio2, value); + fRatio[1] = value; + } + else if (knob == fKnobRatio3) { + setParameterValue(ZaMultiCompPlugin::paramRatio3, value); + fRatio[2] = value; + } + else if (knob == fKnobKnee1) { + setParameterValue(ZaMultiCompPlugin::paramKnee1, value); + fKnee[0] = value; + } + else if (knob == fKnobKnee2) { + setParameterValue(ZaMultiCompPlugin::paramKnee2, value); + fKnee[1] = value; + } + else if (knob == fKnobKnee3) { + setParameterValue(ZaMultiCompPlugin::paramKnee3, value); + fKnee[2] = value; + } + else if (knob == fKnobGlobalGain) { setParameterValue(ZaMultiCompPlugin::paramGlobalGain, value); - else if (knob == fKnobMakeup1) + fMaster = value; + } + else if (knob == fKnobMakeup1) { setParameterValue(ZaMultiCompPlugin::paramMakeup1, value); - else if (knob == fKnobMakeup2) + fMakeup[0] = value; + } + else if (knob == fKnobMakeup2) { setParameterValue(ZaMultiCompPlugin::paramMakeup2, value); - else if (knob == fKnobMakeup3) + fMakeup[1] = value; + } + else if (knob == fKnobMakeup3) { setParameterValue(ZaMultiCompPlugin::paramMakeup3, value); + fMakeup[2] = value; + } else if (knob == fKnobXover1) setParameterValue(ZaMultiCompPlugin::paramXover1, value); else if (knob == fKnobXover2) @@ -383,113 +756,127 @@ void ZaMultiCompUI::imageKnobValueChanged(ImageKnob* knob, float value) void ZaMultiCompUI::imageToggleClicked(ImageToggle* toggle, int) { float v = toggle->getValue(); - if (toggle == fToggleBypass1) + if (toggle == fToggleBypass1) { setParameterValue(ZaMultiCompPlugin::paramToggle1, v); - else if (toggle == fToggleBypass2) + fBypass[0] = v; + } + else if (toggle == fToggleBypass2) { setParameterValue(ZaMultiCompPlugin::paramToggle2, v); - else if (toggle == fToggleBypass3) + fBypass[1] = v; + } + else if (toggle == fToggleBypass3) { setParameterValue(ZaMultiCompPlugin::paramToggle3, v); - else if (toggle == fToggleListen1) + fBypass[2] = v; + } + else if (toggle == fToggleListen1) { setParameterValue(ZaMultiCompPlugin::paramListen1, v); - else if (toggle == fToggleListen2) + fListen[0] = v; + } + else if (toggle == fToggleListen2) { setParameterValue(ZaMultiCompPlugin::paramListen2, v); - else if (toggle == fToggleListen3) + fListen[1] = v; + } + else if (toggle == fToggleListen3) { setParameterValue(ZaMultiCompPlugin::paramListen3, v); + fListen[2] = v; + } } void ZaMultiCompUI::onDisplay() { fImgBackground.draw(); + setState("stateMeterReset", ""); + // draw leds - static const float sLedSpacing = 15.5f; - static const int sLedInitialX = 343; + static const float sLedSpacing = 15.3f; + static const int sLedInitialX = 35.5; - static const int sYellowLedStaticY = 265; - static const int sRedLed1StaticY = 215; - static const int sRedLed2StaticY = 164; - static const int sRedLed3StaticY = 113; + static const int sYellowLedStaticYL = 254.5-70+3; + static const int sRedLed1StaticY = 215-70+3; + static const int sRedLed2StaticY = 164-70+4; + static const int sRedLed3StaticY = 113-70+5; int numRedLeds1; int numRedLeds2; int numRedLeds3; - int numYellowLeds; + int numYellowLedsL; - if (fLedRedValue1 >= 40.f) + if (fLedRedValue[0] >= 40.f) numRedLeds1 = 12; - else if (fLedRedValue1 >= 30.f) + else if (fLedRedValue[0] >= 30.f) numRedLeds1 = 11; - else if (fLedRedValue1 >= 20.f) + else if (fLedRedValue[0] >= 20.f) numRedLeds1 = 10; - else if (fLedRedValue1 >= 15.f) + else if (fLedRedValue[0] >= 15.f) numRedLeds1 = 9; - else if (fLedRedValue1 >= 10.f) + else if (fLedRedValue[0] >= 10.f) numRedLeds1 = 8; - else if (fLedRedValue1 >= 8.f) + else if (fLedRedValue[0] >= 8.f) numRedLeds1 = 7; - else if (fLedRedValue1 >= 6.f) + else if (fLedRedValue[0] >= 6.f) numRedLeds1 = 6; - else if (fLedRedValue1 >= 5.f) + else if (fLedRedValue[0] >= 5.f) numRedLeds1 = 5; - else if (fLedRedValue1 >= 4.f) + else if (fLedRedValue[0] >= 4.f) numRedLeds1 = 4; - else if (fLedRedValue1 >= 3.f) + else if (fLedRedValue[0] >= 3.f) numRedLeds1 = 3; - else if (fLedRedValue1 >= 2.f) + else if (fLedRedValue[0] >= 2.f) numRedLeds1 = 2; - else if (fLedRedValue1 >= 1.f) + else if (fLedRedValue[0] >= 1.f) numRedLeds1 = 1; else numRedLeds1 = 0; - if (fLedRedValue2 >= 40.f) + if (fLedRedValue[1] >= 40.f) numRedLeds2 = 12; - else if (fLedRedValue2 >= 30.f) + else if (fLedRedValue[1] >= 30.f) numRedLeds2 = 11; - else if (fLedRedValue2 >= 20.f) + else if (fLedRedValue[1] >= 20.f) numRedLeds2 = 10; - else if (fLedRedValue2 >= 15.f) + else if (fLedRedValue[1] >= 15.f) numRedLeds2 = 9; - else if (fLedRedValue2 >= 10.f) + else if (fLedRedValue[1] >= 10.f) numRedLeds2 = 8; - else if (fLedRedValue2 >= 8.f) + else if (fLedRedValue[1] >= 8.f) numRedLeds2 = 7; - else if (fLedRedValue2 >= 6.f) + else if (fLedRedValue[1] >= 6.f) numRedLeds2 = 6; - else if (fLedRedValue2 >= 5.f) + else if (fLedRedValue[1] >= 5.f) numRedLeds2 = 5; - else if (fLedRedValue2 >= 4.f) + else if (fLedRedValue[1] >= 4.f) numRedLeds2 = 4; - else if (fLedRedValue2 >= 3.f) + else if (fLedRedValue[1] >= 3.f) numRedLeds2 = 3; - else if (fLedRedValue2 >= 2.f) + else if (fLedRedValue[1] >= 2.f) numRedLeds2 = 2; - else if (fLedRedValue2 >= 1.f) + else if (fLedRedValue[1] >= 1.f) numRedLeds2 = 1; else numRedLeds2 = 0; - if (fLedRedValue3 >= 40.f) + if (fLedRedValue[2] >= 40.f) numRedLeds3 = 12; - else if (fLedRedValue3 >= 30.f) + else if (fLedRedValue[2] >= 30.f) numRedLeds3 = 11; - else if (fLedRedValue3 >= 20.f) + else if (fLedRedValue[2] >= 20.f) numRedLeds3 = 10; - else if (fLedRedValue3 >= 15.f) + else if (fLedRedValue[2] >= 15.f) numRedLeds3 = 9; - else if (fLedRedValue3 >= 10.f) + else if (fLedRedValue[2] >= 10.f) numRedLeds3 = 8; - else if (fLedRedValue3 >= 8.f) + else if (fLedRedValue[2] >= 8.f) numRedLeds3 = 7; - else if (fLedRedValue3 >= 6.f) + else if (fLedRedValue[2] >= 6.f) numRedLeds3 = 6; - else if (fLedRedValue3 >= 5.f) + else if (fLedRedValue[2] >= 5.f) numRedLeds3 = 5; - else if (fLedRedValue3 >= 4.f) + else if (fLedRedValue[2] >= 4.f) numRedLeds3 = 4; - else if (fLedRedValue3 >= 3.f) + else if (fLedRedValue[2] >= 3.f) numRedLeds3 = 3; - else if (fLedRedValue3 >= 2.f) + else if (fLedRedValue[2] >= 2.f) numRedLeds3 = 2; - else if (fLedRedValue3 >= 1.f) + else if (fLedRedValue[2] >= 1.f) numRedLeds3 = 1; else numRedLeds3 = 0; @@ -502,55 +889,139 @@ void ZaMultiCompUI::onDisplay() for (int i=numRedLeds3; i>0; --i) fLedRedImg.drawAt(sLedInitialX + (12 - i)*sLedSpacing, sRedLed3StaticY); - if (fLedYellowValue >= 20.f) - numYellowLeds = 19; - else if (fLedYellowValue >= 10.f) - numYellowLeds = 18; - else if (fLedYellowValue >= 8.f) - numYellowLeds = 17; - else if (fLedYellowValue >= 4.f) - numYellowLeds = 16; - else if (fLedYellowValue >= 2.f) - numYellowLeds = 15; - else if (fLedYellowValue >= 1.f) - numYellowLeds = 14; - else if (fLedYellowValue >= 0.f) - numYellowLeds = 13; - else if (fLedYellowValue >= -1.f) - numYellowLeds = 12; - else if (fLedYellowValue >= -2.f) - numYellowLeds = 11; - else if (fLedYellowValue >= -3.f) - numYellowLeds = 10; - else if (fLedYellowValue >= -4.f) - numYellowLeds = 9; - else if (fLedYellowValue >= -5.f) - numYellowLeds = 8; - else if (fLedYellowValue >= -6.f) - numYellowLeds = 7; - else if (fLedYellowValue >= -8.f) - numYellowLeds = 6; - else if (fLedYellowValue >= -10.f) - numYellowLeds = 5; - else if (fLedYellowValue >= -15.f) - numYellowLeds = 4; - else if (fLedYellowValue >= -20.f) - numYellowLeds = 3; - else if (fLedYellowValue >= -30.f) - numYellowLeds = 2; - else if (fLedYellowValue >= -40.f) - numYellowLeds = 1; - else numYellowLeds = 0; - - if (numYellowLeds > 12) { - for (int i=12; i<numYellowLeds; ++i) - fLedRedImg.drawAt(sLedInitialX + i*sLedSpacing, sYellowLedStaticY); + if (fLedYellowValueL >= 20.f) + numYellowLedsL = 19; + else if (fLedYellowValueL >= 10.f) + numYellowLedsL = 18; + else if (fLedYellowValueL >= 8.f) + numYellowLedsL = 17; + else if (fLedYellowValueL >= 4.f) + numYellowLedsL = 16; + else if (fLedYellowValueL >= 2.f) + numYellowLedsL = 15; + else if (fLedYellowValueL >= 1.f) + numYellowLedsL = 14; + else if (fLedYellowValueL >= 0.f) + numYellowLedsL = 13; + else if (fLedYellowValueL >= -1.f) + numYellowLedsL = 12; + else if (fLedYellowValueL >= -2.f) + numYellowLedsL = 11; + else if (fLedYellowValueL >= -3.f) + numYellowLedsL = 10; + else if (fLedYellowValueL >= -4.f) + numYellowLedsL = 9; + else if (fLedYellowValueL >= -5.f) + numYellowLedsL = 8; + else if (fLedYellowValueL >= -6.f) + numYellowLedsL = 7; + else if (fLedYellowValueL >= -8.f) + numYellowLedsL = 6; + else if (fLedYellowValueL >= -10.f) + numYellowLedsL = 5; + else if (fLedYellowValueL >= -15.f) + numYellowLedsL = 4; + else if (fLedYellowValueL >= -20.f) + numYellowLedsL = 3; + else if (fLedYellowValueL >= -30.f) + numYellowLedsL = 2; + else if (fLedYellowValueL >= -40.f) + numYellowLedsL = 1; + else numYellowLedsL = 0; + + if (numYellowLedsL > 12) { + for (int i=12; i<numYellowLedsL; ++i) + fLedRedImg.drawAt(sLedInitialX + i*sLedSpacing, sYellowLedStaticYL); for (int i=0; i<12; ++i) - fLedYellowImg.drawAt(sLedInitialX + i*sLedSpacing, sYellowLedStaticY); + fLedYellowImg.drawAt(sLedInitialX + i*sLedSpacing, sYellowLedStaticYL); } else { - for (int i=0; i<numYellowLeds; ++i) - fLedYellowImg.drawAt(sLedInitialX + i*sLedSpacing, sYellowLedStaticY); + for (int i=0; i<numYellowLedsL; ++i) + fLedYellowImg.drawAt(sLedInitialX + i*sLedSpacing, sYellowLedStaticYL); } + +/* +// TESTING - remove later +// this paints the 'fCanvasArea' so we can clearly see its bounds +{ +const int x = fCanvasArea.getX(); +const int y = fCanvasArea.getY(); +const int w = fCanvasArea.getWidth(); +const int h = fCanvasArea.getHeight(); + +glColor4f(0.0f, 1.0f, 0.0f, 0.9f); + +glBegin(GL_QUADS); +glTexCoord2f(0.0f, 0.0f); +glVertex2i(x, y); + +glTexCoord2f(1.0f, 0.0f); +glVertex2i(x+w, y); + +glTexCoord2f(1.0f, 1.0f); +glVertex2i(x+w, y+h); + +glTexCoord2f(0.0f, 1.0f); +glVertex2i(x, y+h); +glEnd(); + +// reset color +glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +} +*/ + + calc_compcurves(); + + //draw comp curves + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_LINE_SMOOTH); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glEnable(GL_POINT_SMOOTH); + glPointSize(8.0); + glEnable(GL_POINT_SPRITE); + + glLineWidth(2); + int i,k; + int flip[3] = {1,1,1}; + if (fListen[0]) { + flip[1] = 0; + flip[2] = 0; + } + if (fListen[1]) { + flip[0] = 0; + flip[2] = 0; + } + if (fListen[2]) { + flip[0] = 0; + flip[1] = 0; + } + for (k = 0; k < MAX_COMP; ++k) { + glColor4f((k==0)?1.f:0.235f, (k==1)?1.f:0.235f, (k==2)?1.f:0.235f, 1.0f); + if (flip[k]) { + for (i = 2; i < COMPOINTS; ++i) { + glBegin(GL_LINES); + if (compy[k][i-1] < fCanvasArea.getY() + fCanvasArea.getHeight() + && compy[k][i-1] > fCanvasArea.getY() + && compy[k][i] < fCanvasArea.getY() + fCanvasArea.getHeight() + && compy[k][i] > fCanvasArea.getY()) { + glVertex2i(compx[k][i-1], compy[k][i-1]); + glVertex2i(compx[k][i], compy[k][i]); + } + glEnd(); + } + + glBegin(GL_POINTS); + if (doty[k] < fCanvasArea.getY() + fCanvasArea.getHeight() + && doty[k] > fCanvasArea.getY() + && dotx[k] < fCanvasArea.getX() + fCanvasArea.getWidth() + && dotx[k] > fCanvasArea.getX()) { + glVertex2i(dotx[k], doty[k]); + } + glEnd(); + } + } + // reset color + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } // ----------------------------------------------------------------------- |