|
- /*
- * ZamEQ2 2 band parametric equaliser
- * Copyright (C) 2014 Damien Zammit <damien@zamaudio.com>
- *
- * 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 "ZamEQ2UI.hpp"
-
- using DGL::Point;
-
- START_NAMESPACE_DISTRHO
-
- // -----------------------------------------------------------------------
-
- ZamEQ2UI::ZamEQ2UI()
- : UI()
- {
- // background
- fImgBackground = Image(ZamEQ2Artwork::zameq2Data, ZamEQ2Artwork::zameq2Width, ZamEQ2Artwork::zameq2Height, GL_BGR);
-
- // toggle image
- Image sliderImage(ZamEQ2Artwork::togglesliderData, ZamEQ2Artwork::togglesliderWidth, ZamEQ2Artwork::togglesliderHeight);
-
- // knob
- Image knobImage(ZamEQ2Artwork::knobData, ZamEQ2Artwork::knobWidth, ZamEQ2Artwork::knobHeight);
-
- // knob
- fKnobGain1 = new ImageKnob(this, knobImage);
- fKnobGain1->setPos(91, 172);
- fKnobGain1->setRange(-50.f, 20.0f);
- fKnobGain1->setRotationAngle(240);
- //fKnobGain1->setDefault(0.0f);
- fKnobGain1->setCallback(this);
-
- fKnobQ1 = new ImageKnob(this, knobImage);
- fKnobQ1->setPos(91, 122);
- fKnobQ1->setRange(0.1f, 6.0f);
- //fKnobQ1->setLogScale(true);
- fKnobQ1->setRotationAngle(240);
- //fKnobQ1->setDefault(1.0f);
- fKnobQ1->setCallback(this);
-
- fKnobFreq1 = new ImageKnob(this, knobImage);
- fKnobFreq1->setPos(23, 144);
- fKnobFreq1->setRange(20.f, 14000.0f);
- //fKnobFreq1->setLogScale(true);
- fKnobFreq1->setRotationAngle(240);
- //fKnobFreq1->setDefault(500.0f);
- fKnobFreq1->setCallback(this);
-
- fKnobGain2 = new ImageKnob(this, knobImage);
- fKnobGain2->setPos(567, 172);
- fKnobGain2->setRange(-50.f, 20.0f);
- fKnobGain2->setRotationAngle(240);
- //fKnobGain2->setDefault(0.0f);
- fKnobGain2->setCallback(this);
-
- fKnobQ2 = new ImageKnob(this, knobImage);
- fKnobQ2->setPos(567, 122);
- fKnobQ2->setRange(0.1f, 6.0f);
- //fKnobQ2->setLogScale(true);
- fKnobQ2->setRotationAngle(240);
- //fKnobQ2->setDefault(1.0f);
- fKnobQ2->setCallback(this);
-
- fKnobFreq2 = new ImageKnob(this, knobImage);
- fKnobFreq2->setPos(499, 144);
- fKnobFreq2->setRange(20.f, 14000.0f);
- //fKnobFreq2->setLogScale(true);
- fKnobFreq2->setRotationAngle(240);
- //fKnobFreq2->setDefault(3000.0f);
- fKnobFreq2->setCallback(this);
-
- fKnobGainL = new ImageKnob(this, knobImage);
- fKnobGainL->setPos(91, 52);
- fKnobGainL->setRange(-50.f, 20.0f);
- fKnobGainL->setRotationAngle(240);
- //fKnobGainL->setDefault(0.0f);
- fKnobGainL->setCallback(this);
-
- fKnobFreqL = new ImageKnob(this, knobImage);
- fKnobFreqL->setPos(23, 23);
- fKnobFreqL->setRange(20.f, 14000.0f);
- //fKnobFreqL->setLogScale(true);
- fKnobFreqL->setRotationAngle(240);
- //fKnobFreqL->setDefault(250.0f);
- fKnobFreqL->setCallback(this);
-
- fKnobGainH = new ImageKnob(this, knobImage);
- fKnobGainH->setPos(567, 53);
- fKnobGainH->setRange(-50.f, 20.0f);
- fKnobGainH->setRotationAngle(240);
- //fKnobGainH->setDefault(0.0f);
- fKnobGainH->setCallback(this);
-
- fKnobFreqH = new ImageKnob(this, knobImage);
- fKnobFreqH->setPos(499, 24);
- fKnobFreqH->setRange(20.f, 14000.0f);
- //fKnobFreqH->setLogScale(true);
- fKnobFreqH->setRotationAngle(240);
- //fKnobFreqH->setDefault(8000.0f);
- fKnobFreqH->setCallback(this);
-
- Point<int> masterPosStart(211,204);
- Point<int> masterPosEnd(288,204);
-
- fSliderMaster = new ImageSlider(this, sliderImage);
- fSliderMaster->setStartPos(masterPosStart);
- fSliderMaster->setEndPos(masterPosEnd);
- fSliderMaster->setRange(-12.f,12.f);
- fSliderMaster->setValue(0.f);
- fSliderMaster->setStep(6.f);
- fSliderMaster->setCallback(this);
-
- fCanvasArea.setPos(165,10);
- fCanvasArea.setSize(305,180);
- }
-
- ZamEQ2UI::~ZamEQ2UI()
- {
- delete fKnobGain1;
- delete fKnobQ1;
- delete fKnobFreq1;
- delete fKnobGain2;
- delete fKnobQ2;
- delete fKnobFreq2;
- delete fKnobGainL;
- delete fKnobFreqL;
- delete fKnobGainH;
- delete fKnobFreqH;
- delete fSliderMaster;
- }
-
- // -----------------------------------------------------------------------
- // DSP Callbacks
-
- void ZamEQ2UI::d_parameterChanged(uint32_t index, float value)
- {
- switch (index)
- {
- case ZamEQ2Plugin::paramGain1:
- fKnobGain1->setValue(value);
- break;
- case ZamEQ2Plugin::paramQ1:
- fKnobQ1->setValue(value);
- break;
- case ZamEQ2Plugin::paramFreq1:
- fKnobFreq1->setValue(value);
- break;
- case ZamEQ2Plugin::paramGain2:
- fKnobGain2->setValue(value);
- break;
- case ZamEQ2Plugin::paramQ2:
- fKnobQ2->setValue(value);
- break;
- case ZamEQ2Plugin::paramFreq2:
- fKnobFreq2->setValue(value);
- break;
- case ZamEQ2Plugin::paramGainL:
- fKnobGainL->setValue(value);
- break;
- case ZamEQ2Plugin::paramFreqL:
- fKnobFreqL->setValue(value);
- break;
- case ZamEQ2Plugin::paramGainH:
- fKnobGainH->setValue(value);
- break;
- case ZamEQ2Plugin::paramFreqH:
- fKnobFreqH->setValue(value);
- break;
- case ZamEQ2Plugin::paramMaster:
- fSliderMaster->setValue(value);
- break;
- }
- }
-
- void ZamEQ2UI::d_programChanged(uint32_t index)
- {
- if (index != 0)
- return;
-
- // Default values
- /*
- fKnobGain1->resetDefault();
- fKnobQ1->resetDefault();
- fKnobFreq1->resetDefault();
- fKnobGain2->resetDefault();
- fKnobQ2->resetDefault();
- fKnobFreq2->resetDefault();
- fKnobGainL->resetDefault();
- fKnobFreqL->resetDefault();
- fKnobGainH->resetDefault();
- fKnobFreqH->resetDefault();
- */
- fSliderMaster->setValue(0.f);
- }
-
- // -----------------------------------------------------------------------
- // Widget Callbacks
-
- void ZamEQ2UI::imageKnobDragStarted(ImageKnob* knob)
- {
- if (knob == fKnobGain1)
- d_editParameter(ZamEQ2Plugin::paramGain1, true);
- else if (knob == fKnobQ1)
- d_editParameter(ZamEQ2Plugin::paramQ1, true);
- else if (knob == fKnobFreq1)
- d_editParameter(ZamEQ2Plugin::paramFreq1, true);
- else if (knob == fKnobGain2)
- d_editParameter(ZamEQ2Plugin::paramGain2, true);
- else if (knob == fKnobQ2)
- d_editParameter(ZamEQ2Plugin::paramQ2, true);
- else if (knob == fKnobFreq2)
- d_editParameter(ZamEQ2Plugin::paramFreq2, true);
- else if (knob == fKnobGainL)
- d_editParameter(ZamEQ2Plugin::paramGainL, true);
- else if (knob == fKnobFreqL)
- d_editParameter(ZamEQ2Plugin::paramFreqL, true);
- else if (knob == fKnobGainH)
- d_editParameter(ZamEQ2Plugin::paramGainH, true);
- else if (knob == fKnobFreqH)
- d_editParameter(ZamEQ2Plugin::paramFreqH, true);
- }
-
- void ZamEQ2UI::imageKnobDragFinished(ImageKnob* knob)
- {
- if (knob == fKnobGain1)
- d_editParameter(ZamEQ2Plugin::paramGain1, false);
- else if (knob == fKnobQ1)
- d_editParameter(ZamEQ2Plugin::paramQ1, false);
- else if (knob == fKnobFreq1)
- d_editParameter(ZamEQ2Plugin::paramFreq1, false);
- else if (knob == fKnobGain2)
- d_editParameter(ZamEQ2Plugin::paramGain2, false);
- else if (knob == fKnobQ2)
- d_editParameter(ZamEQ2Plugin::paramQ2, false);
- else if (knob == fKnobFreq2)
- d_editParameter(ZamEQ2Plugin::paramFreq2, false);
- else if (knob == fKnobGainL)
- d_editParameter(ZamEQ2Plugin::paramGainL, false);
- else if (knob == fKnobFreqL)
- d_editParameter(ZamEQ2Plugin::paramFreqL, false);
- else if (knob == fKnobGainH)
- d_editParameter(ZamEQ2Plugin::paramGainH, false);
- else if (knob == fKnobFreqH)
- d_editParameter(ZamEQ2Plugin::paramFreqH, false);
- }
-
- void ZamEQ2UI::imageKnobValueChanged(ImageKnob* knob, float value)
- {
- if (knob == fKnobGain1)
- d_setParameterValue(ZamEQ2Plugin::paramGain1, value);
- else if (knob == fKnobQ1)
- d_setParameterValue(ZamEQ2Plugin::paramQ1, value);
- else if (knob == fKnobFreq1)
- d_setParameterValue(ZamEQ2Plugin::paramFreq1, value);
- else if (knob == fKnobGain2)
- d_setParameterValue(ZamEQ2Plugin::paramGain2, value);
- else if (knob == fKnobQ2)
- d_setParameterValue(ZamEQ2Plugin::paramQ2, value);
- else if (knob == fKnobFreq2)
- d_setParameterValue(ZamEQ2Plugin::paramFreq2, value);
- else if (knob == fKnobGainL)
- d_setParameterValue(ZamEQ2Plugin::paramGainL, value);
- else if (knob == fKnobFreqL)
- d_setParameterValue(ZamEQ2Plugin::paramFreqL, value);
- else if (knob == fKnobGainH)
- d_setParameterValue(ZamEQ2Plugin::paramGainH, value);
- else if (knob == fKnobFreqH)
- d_setParameterValue(ZamEQ2Plugin::paramFreqH, value);
- }
-
- void ZamEQ2UI::imageSliderDragStarted(ImageSlider* slider)
- {
- if (slider == fSliderMaster)
- d_editParameter(ZamEQ2Plugin::paramMaster, true);
- }
-
- void ZamEQ2UI::imageSliderDragFinished(ImageSlider* slider)
- {
- if (slider == fSliderMaster)
- d_editParameter(ZamEQ2Plugin::paramMaster, false);
- }
-
- void ZamEQ2UI::imageSliderValueChanged(ImageSlider* slider, float value)
- {
- if (slider == fSliderMaster)
- d_setParameterValue(ZamEQ2Plugin::paramMaster, value);
- }
-
- void ZamEQ2UI::lowshelf(int i, int ch, float srate, float fc, float g)
- {
- float k, v0;
-
- k = tanf(M_PI * fc / srate);
- v0 = powf(10., g / 20.);
-
- if (g < 0.f) {
- // LF cut
- float denom = v0 + sqrt(2. * v0)*k + k*k;
- b0[ch][i] = v0 * (1. + sqrt(2.)*k + k*k) / denom;
- b1[ch][i] = 2. * v0*(k*k - 1.) / denom;
- b2[ch][i] = v0 * (1. - sqrt(2.)*k + k*k) / denom;
- a1[ch][i] = 2. * (k*k - v0) / denom;
- a2[ch][i] = (v0 - sqrt(2. * v0)*k + k*k) / denom;
- } else {
- // LF boost
- float denom = 1. + sqrt(2.)*k + k*k;
- b0[ch][i] = (1. + sqrt(2. * v0)*k + v0*k*k) / denom;
- b1[ch][i] = 2. * (v0*k*k - 1.) / denom;
- b2[ch][i] = (1. - sqrt(2. * v0)*k + v0*k*k) / denom;
- a1[ch][i] = 2. * (k*k - 1.) / denom;
- a2[ch][i] = (1. - sqrt(2.)*k + k*k) / denom;
- }
- }
-
- void ZamEQ2UI::highshelf(int i, int ch, float srate, float fc, float g)
- {
- float k, v0;
-
- k = tanf(M_PI * fc / srate);
- v0 = powf(10., g / 20.);
-
- if (g < 0.f) {
- // HF cut
- float denom = 1. + sqrt(2. * v0)*k + v0*k*k;
- b0[ch][i] = v0*(1. + sqrt(2.)*k + k*k) / denom;
- b1[ch][i] = 2. * v0*(k*k - 1.) / denom;
- b2[ch][i] = v0*(1. - sqrt(2.)*k + k*k) / denom;
- a1[ch][i] = 2. * (v0*k*k - 1.) / denom;
- a2[ch][i] = (1. - sqrt(2. * v0)*k + v0*k*k) / denom;
- } else {
- // HF boost
- float denom = 1. + sqrt(2.)*k + k*k;
- b0[ch][i] = (v0 + sqrt(2. * v0)*k + k*k) / denom;
- b1[ch][i] = 2. * (k*k - v0) / denom;
- b2[ch][i] = (v0 - sqrt(2. * v0)*k + k*k) / denom;
- a1[ch][i] = 2. * (k*k - 1.) / denom;
- a2[ch][i] = (1. - sqrt(2.)*k + k*k) / denom;
- }
- }
-
- void ZamEQ2UI::peq(int i, int ch, float srate, float fc, float g, float bw)
- {
- float k, v0, q;
-
- k = tanf(M_PI * fc / srate);
- v0 = powf(10., g / 20.);
- q = powf(2., 1./bw)/(powf(2., bw) - 1.); //q from octave bw
-
- if (g < 0.f) {
- // cut
- float denom = 1. + k/(v0*q) + k*k;
- b0[ch][i] = (1. + k/q + k*k) / denom;
- b1[ch][i] = 2. * (k*k - 1.) / denom;
- b2[ch][i] = (1. - k/q + k*k) / denom;
- a1[ch][i] = b1[ch][i];
- a2[ch][i] = (1. - k/(v0*q) + k*k) / denom;
- } else {
- // boost
- float denom = 1. + k/q + k*k;
- b0[ch][i] = (1. + k*v0/q + k*k) / denom;
- b1[ch][i] = 2. * (k*k - 1.) / denom;
- b2[ch][i] = (1. - k*v0/q + k*k) / denom;
- a1[ch][i] = b1[ch][i];
- a2[ch][i] = (1. - k/q + k*k) / denom;
- }
- }
-
- void ZamEQ2UI::calceqcurve(float x[], float y[])
- {
- float SR = d_getSampleRate();
- float p1 = 10000.;
- float p2 = 5000.;
- float c2 = log10(1.+SR);
- float c1 = (1.+p1/SR)/(EQPOINTS*(p2/SR)*(p2/SR));
-
- double bw1 = fKnobQ1->getValue();
- double boost1 = fKnobGain1->getValue();
- double freq1 = fKnobFreq1->getValue();
-
- double bw2 = fKnobQ2->getValue();
- double boost2 = fKnobGain2->getValue();
- double freq2 = fKnobFreq2->getValue();
-
- double boostl = fKnobGainL->getValue();
- double freql = fKnobFreqL->getValue();
-
- double boosth = fKnobGainH->getValue();
- double freqh = fKnobFreqH->getValue();
-
- for (uint32_t i = 0; i < EQPOINTS; ++i) {
- x[i] = 1.5*log10(1.+i+c1)/c2;
-
- std::complex<double> H;
- double theta = -(i+0.005)*M_PI/EQPOINTS*20./(SR/1000.);
- std::complex<double> expiw = std::polar(1.0, theta);
- std::complex<double> exp2iw = std::polar(1.0, 2.0*theta);
- double freqH; //phaseH;
-
- lowshelf(0, 0, SR, freql, boostl);
- peq(1, 0, SR, freq1, boost1, bw1);
- peq(2, 0, SR, freq2, boost2, bw2);
- highshelf(3, 0, SR, freqh, boosth);
-
- H = (1. + a1[0][0]*expiw + a2[0][0]*exp2iw)/(b0[0][0] + b1[0][0]*expiw + b2[0][0]*exp2iw);
- H += (1. + a1[0][1]*expiw + a2[0][1]*exp2iw)/(b0[0][1] + b1[0][1]*expiw + b2[0][1]*exp2iw);
- H += (1. + a1[0][2]*expiw + a2[0][2]*exp2iw)/(b0[0][2] + b1[0][2]*expiw + b2[0][2]*exp2iw);
- H += (1. + a1[0][3]*expiw + a2[0][3]*exp2iw)/(b0[0][3] + b1[0][3]*expiw + b2[0][3]*exp2iw);
-
- freqH = std::abs(H);
- y[i] = (to_dB(freqH/4.)/5.)-(fSliderMaster->getValue())/24.f+0.5;
- x[i] = fCanvasArea.getX() + x[i]*fCanvasArea.getWidth();
- y[i] = fCanvasArea.getY() + y[i]*fCanvasArea.getHeight();
- }
- }
-
-
- void ZamEQ2UI::onDisplay()
- {
- fImgBackground.draw();
-
- calceqcurve(eqx, eqy);
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_LINE_SMOOTH);
- glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
-
- glLineWidth(2);
- int i;
- glColor4f(1.f, 1.f, 0.235f, 1.0f);
- for (i = 1; i < EQPOINTS; ++i) {
- glBegin(GL_LINES);
- if (eqy[i-1] < fCanvasArea.getY() + fCanvasArea.getHeight()
- && eqy[i] < fCanvasArea.getY() + fCanvasArea.getHeight()
- && eqy[i-1] > fCanvasArea.getY()
- && eqy[i] > fCanvasArea.getY()) {
- glVertex2i(eqx[i-1], eqy[i-1]);
- glVertex2i(eqx[i], eqy[i]);
- }
- glEnd();
- }
- // reset color
- glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- }
-
- // -----------------------------------------------------------------------
-
- UI* createUI()
- {
- return new ZamEQ2UI();
- }
-
- // -----------------------------------------------------------------------
-
- END_NAMESPACE_DISTRHO
|