/* * ZaMultiCompX2 Stereo multiband compressor * Copyright (C) 2014 Damien Zammit * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * For a full copy of the GNU General Public License see the doc/GPL.txt file. */ #include "ZaMultiCompX2Plugin.hpp" #include "ZaMultiCompX2UI.hpp" using DGL::Point; START_NAMESPACE_DISTRHO // ----------------------------------------------------------------------- ZaMultiCompX2UI::ZaMultiCompX2UI() : UI() { // background fImgBackground = Image(ZaMultiCompX2Artwork::zamulticompx2Data, ZaMultiCompX2Artwork::zamulticompx2Width, ZaMultiCompX2Artwork::zamulticompx2Height, GL_BGR); // led images fLedRedImg = Image(ZaMultiCompX2Artwork::ledredData, ZaMultiCompX2Artwork::ledredWidth, ZaMultiCompX2Artwork::ledredHeight); fLedYellowImg = Image(ZaMultiCompX2Artwork::ledyellowData, ZaMultiCompX2Artwork::ledyellowWidth, ZaMultiCompX2Artwork::ledyellowHeight); // led values fLedRedValue1 = 0.0f; fLedRedValue2 = 0.0f; fLedRedValue3 = 0.0f; fLedYellowValueL = 0.0f; fLedYellowValueR = 0.0f; // knob Image knobImage(ZaMultiCompX2Artwork::knobData, ZaMultiCompX2Artwork::knobWidth, ZaMultiCompX2Artwork::knobHeight); // knob fKnobAttack = new ImageKnob(this, knobImage); fKnobAttack->setAbsolutePos(24, 43); fKnobAttack->setRange(0.1f, 200.0f); fKnobAttack->setUsingLogScale(true); fKnobAttack->setDefault(10.0f); fKnobAttack->setStep(0.1f); fKnobAttack->setRotationAngle(240); fKnobAttack->setCallback(this); fKnobRelease = new ImageKnob(this, knobImage); fKnobRelease->setAbsolutePos(108, 43); fKnobRelease->setRange(50.0f, 500.0f); fKnobRelease->setDefault(80.0f); fKnobRelease->setRotationAngle(240); fKnobRelease->setCallback(this); fKnobThresh3 = new ImageKnob(this, knobImage); fKnobThresh3->setAbsolutePos(94.5, 99); 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, 150); 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, 201); fKnobThresh1->setRange(-60.0f, 0.0f); fKnobThresh1->setDefault(-20.0f); fKnobThresh1->setRotationAngle(240); fKnobThresh1->setCallback(this); fKnobRatio = new ImageKnob(this, knobImage); fKnobRatio->setAbsolutePos(191.5, 43); fKnobRatio->setRange(1.0f, 20.0f); fKnobRatio->setDefault(4.0f); fKnobRatio->setRotationAngle(240); fKnobRatio->setCallback(this); fKnobKnee = new ImageKnob(this, knobImage); fKnobKnee->setAbsolutePos(273, 43); fKnobKnee->setRange(0.0f, 8.0f); fKnobKnee->setDefault(0.0f); fKnobKnee->setRotationAngle(240); fKnobKnee->setCallback(this); fKnobGlobalGain = new ImageKnob(this, knobImage); fKnobGlobalGain->setAbsolutePos(427.3, 43); fKnobGlobalGain->setRange(-30.0f, 30.0f); fKnobGlobalGain->setDefault(0.0f); fKnobGlobalGain->setRotationAngle(240); fKnobGlobalGain->setCallback(this); fKnobXover2 = new ImageKnob(this, knobImage); fKnobXover2->setAbsolutePos(23, 121); fKnobXover2->setRange(1400.f, 14000.f); fKnobXover2->setUsingLogScale(true); fKnobXover2->setDefault(1400.f); fKnobXover2->setStep(5.f); fKnobXover2->setRotationAngle(240); fKnobXover2->setCallback(this); fKnobXover1 = new ImageKnob(this, knobImage); fKnobXover1->setAbsolutePos(23, 175.5); fKnobXover1->setRange(20.0f, 1400.0f); fKnobXover1->setUsingLogScale(true); fKnobXover1->setDefault(250.0f); fKnobXover1->setStep(1.f); fKnobXover1->setRotationAngle(240); fKnobXover1->setCallback(this); fKnobMakeup3 = new ImageKnob(this, knobImage); fKnobMakeup3->setAbsolutePos(167.75, 99.5); fKnobMakeup3->setRange(0.0f, 30.0f); fKnobMakeup3->setDefault(0.0f); fKnobMakeup3->setRotationAngle(240); fKnobMakeup3->setCallback(this); fKnobMakeup2 = new ImageKnob(this, knobImage); fKnobMakeup2->setAbsolutePos(167.75, 150.25); fKnobMakeup2->setRange(0.0f, 30.0f); fKnobMakeup2->setDefault(0.0f); fKnobMakeup2->setRotationAngle(240); fKnobMakeup2->setCallback(this); fKnobMakeup1 = new ImageKnob(this, knobImage); fKnobMakeup1->setAbsolutePos(167.75, 201.4); fKnobMakeup1->setRange(0.0f, 30.0f); fKnobMakeup1->setDefault(0.0f); fKnobMakeup1->setRotationAngle(240); fKnobMakeup1->setCallback(this); Image toggleonImage(ZaMultiCompX2Artwork::toggleonData, ZaMultiCompX2Artwork::toggleonWidth, ZaMultiCompX2Artwork::toggleonHeight); Image toggleoffImage(ZaMultiCompX2Artwork::toggleoffData, ZaMultiCompX2Artwork::toggleoffWidth, ZaMultiCompX2Artwork::toggleoffHeight); Image toggleonhImage(ZaMultiCompX2Artwork::toggleonhorizData, ZaMultiCompX2Artwork::toggleonhorizWidth, ZaMultiCompX2Artwork::toggleonhorizHeight); Image toggleoffhImage(ZaMultiCompX2Artwork::toggleoffhorizData, ZaMultiCompX2Artwork::toggleoffhorizWidth, ZaMultiCompX2Artwork::toggleoffhorizHeight); Point togglePosStart(247,108); fToggleBypass3 = new ImageToggle(this, toggleoffImage, toggleonImage); fToggleBypass3->setAbsolutePos(togglePosStart); fToggleBypass3->setCallback(this); togglePosStart.setY(158); fToggleBypass2 = new ImageToggle(this, toggleoffImage, toggleonImage); fToggleBypass2->setAbsolutePos(togglePosStart); fToggleBypass2->setCallback(this); togglePosStart.setY(209); fToggleBypass1 = new ImageToggle(this, toggleoffImage, toggleonImage); fToggleBypass1->setAbsolutePos(togglePosStart); fToggleBypass1->setCallback(this); togglePosStart.setX(278); togglePosStart.setY(113); fToggleListen3 = new ImageToggle(this, toggleoffhImage, toggleonhImage); fToggleListen3->setAbsolutePos(togglePosStart); fToggleListen3->setCallback(this); togglePosStart.setY(164); fToggleListen2 = new ImageToggle(this, toggleoffhImage, toggleonhImage); fToggleListen2->setAbsolutePos(togglePosStart); fToggleListen2->setCallback(this); togglePosStart.setY(214); fToggleListen1 = new ImageToggle(this, toggleoffhImage, toggleonhImage); fToggleListen1->setAbsolutePos(togglePosStart); fToggleListen1->setCallback(this); togglePosStart.setX(285.5); togglePosStart.setY(254); fToggleStereo = new ImageToggle(this, toggleoffImage, toggleonImage); fToggleStereo->setAbsolutePos(togglePosStart); fToggleStereo->setCallback(this); fCanvasArea.setPos(540, 32); fCanvasArea.setSize(102, 102); fThresh[0] = -20.f; fThresh[1] = -18.f; fThresh[2] = -16.f; fRatio = 4.f; fKnee = 0.f; fMakeup[0] = 0.f; fMakeup[1] = 0.f; fMakeup[2] = 0.f; fBypass[0] = 0.f; fBypass[1] = 0.f; fBypass[2] = 0.f; fMaster = 0.f; 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(); } } // set default values d_programChanged(0); } void ZaMultiCompX2UI::compcurve(float in, int k, float *outx, float* outy) { float knee = fKnee; float ratio = fRatio; float makeup = fMakeup[k] + fMaster; float thresdb = fThresh[k]; float width=((knee+1.f)-0.99f)*6.f; 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 ZaMultiCompX2UI::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: //compcurve(from_dB(-ui->gainred), k, &dotx[0], &doty[0]); //dotx[0] = -(1-dotx[0])*280. + 280.; //doty[0] = (1.-doty[0])*280.; //dot follows centre: //dotx[0] = -(1.- from_dB(-gainred))*280. + 280.; //doty[0] = (1.- from_dB(-gainred))*280.; //printf("gainr=%.2f x=%.2f y=%.2f\n",ui->gainred, ui->dotx[0], ui->doty[0]); } } // ----------------------------------------------------------------------- // DSP Callbacks void ZaMultiCompX2UI::d_parameterChanged(uint32_t index, float value) { switch (index) { case ZaMultiCompX2Plugin::paramAttack: fKnobAttack->setValue(value); break; case ZaMultiCompX2Plugin::paramRelease: fKnobRelease->setValue(value); break; case ZaMultiCompX2Plugin::paramThresh1: fKnobThresh1->setValue(value); fThresh[0] = value; break; case ZaMultiCompX2Plugin::paramThresh2: fKnobThresh2->setValue(value); fThresh[1] = value; break; case ZaMultiCompX2Plugin::paramThresh3: fKnobThresh3->setValue(value); fThresh[2] = value; break; case ZaMultiCompX2Plugin::paramRatio: fKnobRatio->setValue(value); fRatio = value; break; case ZaMultiCompX2Plugin::paramKnee: fKnobKnee->setValue(value); fKnee = value; break; case ZaMultiCompX2Plugin::paramGlobalGain: fKnobGlobalGain->setValue(value); fMaster = value; break; case ZaMultiCompX2Plugin::paramGainR1: if (fLedRedValue1 != value) { fLedRedValue1 = value; repaint(); } break; case ZaMultiCompX2Plugin::paramGainR2: if (fLedRedValue2 != value) { fLedRedValue2 = value; repaint(); } break; case ZaMultiCompX2Plugin::paramGainR3: if (fLedRedValue3 != value) { fLedRedValue3 = value; repaint(); } break; case ZaMultiCompX2Plugin::paramOutputLevelL: if (fLedYellowValueL != value) { fLedYellowValueL = value; repaint(); } break; case ZaMultiCompX2Plugin::paramOutputLevelR: if (fLedYellowValueR != value) { fLedYellowValueR = value; repaint(); } break; case ZaMultiCompX2Plugin::paramMakeup1: fKnobMakeup1->setValue(value); if (fMakeup[0] != value) { fMakeup[0] = value; repaint(); } break; case ZaMultiCompX2Plugin::paramMakeup2: fKnobMakeup2->setValue(value); if (fMakeup[1] != value) { fMakeup[1] = value; repaint(); } break; case ZaMultiCompX2Plugin::paramMakeup3: fKnobMakeup3->setValue(value); if (fMakeup[2] != value) { fMakeup[2] = value; repaint(); } break; case ZaMultiCompX2Plugin::paramToggle1: fToggleBypass1->setValue(value); if (fBypass[0] != value) { fBypass[0] = value; repaint(); } break; case ZaMultiCompX2Plugin::paramToggle2: fToggleBypass2->setValue(value); if (fBypass[1] != value) { fBypass[1] = value; repaint(); } break; case ZaMultiCompX2Plugin::paramToggle3: fToggleBypass3->setValue(value); if (fBypass[2] != value) { fBypass[2] = value; repaint(); } break; case ZaMultiCompX2Plugin::paramListen1: fToggleListen1->setValue(value); break; case ZaMultiCompX2Plugin::paramListen2: fToggleListen2->setValue(value); break; case ZaMultiCompX2Plugin::paramListen3: fToggleListen3->setValue(value); break; } } void ZaMultiCompX2UI::d_programChanged(uint32_t index) { if (index != 0) return; // Default values fKnobAttack->setValue(10.0f); fKnobRelease->setValue(80.0f); /* * fKnobThresh->setValue(-6.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(250.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); fToggleStereo->setValue(0.0f); } void ZaMultiCompX2UI::d_stateChanged(const char*, const char*) { } // ----------------------------------------------------------------------- // Widget Callbacks void ZaMultiCompX2UI::imageKnobDragStarted(ImageKnob* knob) { if (knob == fKnobAttack) d_editParameter(ZaMultiCompX2Plugin::paramAttack, true); else if (knob == fKnobRelease) d_editParameter(ZaMultiCompX2Plugin::paramRelease, true); else if (knob == fKnobThresh1) d_editParameter(ZaMultiCompX2Plugin::paramThresh1, true); else if (knob == fKnobThresh2) d_editParameter(ZaMultiCompX2Plugin::paramThresh2, true); else if (knob == fKnobThresh3) d_editParameter(ZaMultiCompX2Plugin::paramThresh3, true); else if (knob == fKnobRatio) d_editParameter(ZaMultiCompX2Plugin::paramRatio, true); else if (knob == fKnobKnee) d_editParameter(ZaMultiCompX2Plugin::paramKnee, true); else if (knob == fKnobGlobalGain) d_editParameter(ZaMultiCompX2Plugin::paramGlobalGain, true); else if (knob == fKnobMakeup1) d_editParameter(ZaMultiCompX2Plugin::paramMakeup1, true); else if (knob == fKnobMakeup2) d_editParameter(ZaMultiCompX2Plugin::paramMakeup2, true); else if (knob == fKnobMakeup3) d_editParameter(ZaMultiCompX2Plugin::paramMakeup3, true); else if (knob == fKnobXover1) d_editParameter(ZaMultiCompX2Plugin::paramXover1, true); else if (knob == fKnobXover2) d_editParameter(ZaMultiCompX2Plugin::paramXover2, true); } void ZaMultiCompX2UI::imageKnobDragFinished(ImageKnob* knob) { if (knob == fKnobAttack) d_editParameter(ZaMultiCompX2Plugin::paramAttack, false); else if (knob == fKnobRelease) d_editParameter(ZaMultiCompX2Plugin::paramRelease, false); else if (knob == fKnobThresh1) d_editParameter(ZaMultiCompX2Plugin::paramThresh1, false); else if (knob == fKnobThresh2) d_editParameter(ZaMultiCompX2Plugin::paramThresh2, false); else if (knob == fKnobThresh3) d_editParameter(ZaMultiCompX2Plugin::paramThresh3, false); else if (knob == fKnobRatio) d_editParameter(ZaMultiCompX2Plugin::paramRatio, false); else if (knob == fKnobKnee) d_editParameter(ZaMultiCompX2Plugin::paramKnee, false); else if (knob == fKnobGlobalGain) d_editParameter(ZaMultiCompX2Plugin::paramGlobalGain, false); else if (knob == fKnobMakeup1) d_editParameter(ZaMultiCompX2Plugin::paramMakeup1, false); else if (knob == fKnobMakeup2) d_editParameter(ZaMultiCompX2Plugin::paramMakeup2, false); else if (knob == fKnobMakeup3) d_editParameter(ZaMultiCompX2Plugin::paramMakeup3, false); else if (knob == fKnobXover1) d_editParameter(ZaMultiCompX2Plugin::paramXover1, false); else if (knob == fKnobXover2) d_editParameter(ZaMultiCompX2Plugin::paramXover2, false); } void ZaMultiCompX2UI::imageKnobValueChanged(ImageKnob* knob, float value) { if (knob == fKnobAttack) d_setParameterValue(ZaMultiCompX2Plugin::paramAttack, value); else if (knob == fKnobRelease) d_setParameterValue(ZaMultiCompX2Plugin::paramRelease, value); else if (knob == fKnobThresh1) { d_setParameterValue(ZaMultiCompX2Plugin::paramThresh1, value); fThresh[0] = value; } else if (knob == fKnobThresh2) { d_setParameterValue(ZaMultiCompX2Plugin::paramThresh2, value); fThresh[1] = value; } else if (knob == fKnobThresh3) { d_setParameterValue(ZaMultiCompX2Plugin::paramThresh3, value); fThresh[2] = value; } else if (knob == fKnobRatio) { d_setParameterValue(ZaMultiCompX2Plugin::paramRatio, value); fRatio = value; } else if (knob == fKnobKnee) { d_setParameterValue(ZaMultiCompX2Plugin::paramKnee, value); fKnee = value; } else if (knob == fKnobGlobalGain) { d_setParameterValue(ZaMultiCompX2Plugin::paramGlobalGain, value); fMaster = value; } else if (knob == fKnobMakeup1) { d_setParameterValue(ZaMultiCompX2Plugin::paramMakeup1, value); fMakeup[0] = value; } else if (knob == fKnobMakeup2) { d_setParameterValue(ZaMultiCompX2Plugin::paramMakeup2, value); fMakeup[1] = value; } else if (knob == fKnobMakeup3) { d_setParameterValue(ZaMultiCompX2Plugin::paramMakeup3, value); fMakeup[2] = value; } else if (knob == fKnobXover1) d_setParameterValue(ZaMultiCompX2Plugin::paramXover1, value); else if (knob == fKnobXover2) d_setParameterValue(ZaMultiCompX2Plugin::paramXover2, value); } void ZaMultiCompX2UI::imageToggleClicked(ImageToggle* toggle, int) { float v = toggle->getValue(); if (toggle == fToggleBypass1) { d_setParameterValue(ZaMultiCompX2Plugin::paramToggle1, v); fBypass[0] = v; } else if (toggle == fToggleBypass2) { d_setParameterValue(ZaMultiCompX2Plugin::paramToggle2, v); fBypass[1] = v; } else if (toggle == fToggleBypass3) { d_setParameterValue(ZaMultiCompX2Plugin::paramToggle3, v); fBypass[2] = v; } else if (toggle == fToggleListen1) d_setParameterValue(ZaMultiCompX2Plugin::paramListen1, v); else if (toggle == fToggleListen2) d_setParameterValue(ZaMultiCompX2Plugin::paramListen2, v); else if (toggle == fToggleListen3) d_setParameterValue(ZaMultiCompX2Plugin::paramListen3, v); else if (toggle == fToggleStereo) d_setParameterValue(ZaMultiCompX2Plugin::paramStereoDet, v); } void ZaMultiCompX2UI::onDisplay() { fImgBackground.draw(); d_setState("stateMeterReset", ""); // draw leds static const float sLedSpacing = 15.5f; static const int sLedInitialX = 343; static const int sYellowLedStaticYL = 254.5; static const int sYellowLedStaticYR = 269.5; static const int sRedLed1StaticY = 215; static const int sRedLed2StaticY = 164; static const int sRedLed3StaticY = 113; int numRedLeds1; int numRedLeds2; int numRedLeds3; int numYellowLedsL; int numYellowLedsR; if (fLedRedValue1 >= 40.f) numRedLeds1 = 12; else if (fLedRedValue1 >= 30.f) numRedLeds1 = 11; else if (fLedRedValue1 >= 20.f) numRedLeds1 = 10; else if (fLedRedValue1 >= 15.f) numRedLeds1 = 9; else if (fLedRedValue1 >= 10.f) numRedLeds1 = 8; else if (fLedRedValue1 >= 8.f) numRedLeds1 = 7; else if (fLedRedValue1 >= 6.f) numRedLeds1 = 6; else if (fLedRedValue1 >= 5.f) numRedLeds1 = 5; else if (fLedRedValue1 >= 4.f) numRedLeds1 = 4; else if (fLedRedValue1 >= 3.f) numRedLeds1 = 3; else if (fLedRedValue1 >= 2.f) numRedLeds1 = 2; else if (fLedRedValue1 >= 1.f) numRedLeds1 = 1; else numRedLeds1 = 0; if (fLedRedValue2 >= 40.f) numRedLeds2 = 12; else if (fLedRedValue2 >= 30.f) numRedLeds2 = 11; else if (fLedRedValue2 >= 20.f) numRedLeds2 = 10; else if (fLedRedValue2 >= 15.f) numRedLeds2 = 9; else if (fLedRedValue2 >= 10.f) numRedLeds2 = 8; else if (fLedRedValue2 >= 8.f) numRedLeds2 = 7; else if (fLedRedValue2 >= 6.f) numRedLeds2 = 6; else if (fLedRedValue2 >= 5.f) numRedLeds2 = 5; else if (fLedRedValue2 >= 4.f) numRedLeds2 = 4; else if (fLedRedValue2 >= 3.f) numRedLeds2 = 3; else if (fLedRedValue2 >= 2.f) numRedLeds2 = 2; else if (fLedRedValue2 >= 1.f) numRedLeds2 = 1; else numRedLeds2 = 0; if (fLedRedValue3 >= 40.f) numRedLeds3 = 12; else if (fLedRedValue3 >= 30.f) numRedLeds3 = 11; else if (fLedRedValue3 >= 20.f) numRedLeds3 = 10; else if (fLedRedValue3 >= 15.f) numRedLeds3 = 9; else if (fLedRedValue3 >= 10.f) numRedLeds3 = 8; else if (fLedRedValue3 >= 8.f) numRedLeds3 = 7; else if (fLedRedValue3 >= 6.f) numRedLeds3 = 6; else if (fLedRedValue3 >= 5.f) numRedLeds3 = 5; else if (fLedRedValue3 >= 4.f) numRedLeds3 = 4; else if (fLedRedValue3 >= 3.f) numRedLeds3 = 3; else if (fLedRedValue3 >= 2.f) numRedLeds3 = 2; else if (fLedRedValue3 >= 1.f) numRedLeds3 = 1; else numRedLeds3 = 0; for (int i=numRedLeds1; i>0; --i) fLedRedImg.drawAt(sLedInitialX + (12 - i)*sLedSpacing, sRedLed1StaticY); for (int i=numRedLeds2; i>0; --i) fLedRedImg.drawAt(sLedInitialX + (12 - i)*sLedSpacing, sRedLed2StaticY); for (int i=numRedLeds3; i>0; --i) fLedRedImg.drawAt(sLedInitialX + (12 - i)*sLedSpacing, sRedLed3StaticY); 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= 20.f) numYellowLedsR = 19; else if (fLedYellowValueR >= 10.f) numYellowLedsR = 18; else if (fLedYellowValueR >= 8.f) numYellowLedsR = 17; else if (fLedYellowValueR >= 4.f) numYellowLedsR = 16; else if (fLedYellowValueR >= 2.f) numYellowLedsR = 15; else if (fLedYellowValueR >= 1.f) numYellowLedsR = 14; else if (fLedYellowValueR >= 0.f) numYellowLedsR = 13; else if (fLedYellowValueR >= -1.f) numYellowLedsR = 12; else if (fLedYellowValueR >= -2.f) numYellowLedsR = 11; else if (fLedYellowValueR >= -3.f) numYellowLedsR = 10; else if (fLedYellowValueR >= -4.f) numYellowLedsR = 9; else if (fLedYellowValueR >= -5.f) numYellowLedsR = 8; else if (fLedYellowValueR >= -6.f) numYellowLedsR = 7; else if (fLedYellowValueR >= -8.f) numYellowLedsR = 6; else if (fLedYellowValueR >= -10.f) numYellowLedsR = 5; else if (fLedYellowValueR >= -15.f) numYellowLedsR = 4; else if (fLedYellowValueR >= -20.f) numYellowLedsR = 3; else if (fLedYellowValueR >= -30.f) numYellowLedsR = 2; else if (fLedYellowValueR >= -40.f) numYellowLedsR = 1; else numYellowLedsR = 0; if (numYellowLedsR > 12) { for (int i=12; i 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(); } } // reset color glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } // ----------------------------------------------------------------------- UI* createUI() { return new ZaMultiCompX2UI(); } // ----------------------------------------------------------------------- END_NAMESPACE_DISTRHO