/* * DISTRHO MVerb, a DPF'ied MVerb. * Copyright (c) 2010 Martin Eastwood * Copyright (C) 2014 Filipe Coelho * * 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 3 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 LICENSE file. */ #include "DistrhoUIMVerb.hpp" #include "MVerb.h" #include "font/Kh-Kangrey.h" START_NAMESPACE_DISTRHO using DGL::Color; // ----------------------------------------------------------------------- DistrhoUIMVerb::DistrhoUIMVerb() : UI() { // set UI size setSize(DistrhoArtworkMVerb::backgroundWidth, DistrhoArtworkMVerb::backgroundHeight); // background fImgBackground = Image(DistrhoArtworkMVerb::backgroundData, DistrhoArtworkMVerb::backgroundWidth, DistrhoArtworkMVerb::backgroundHeight, GL_BGR); // text fNanoText.createFontMem("kh", (const uchar*)khkangrey_ttf, khkangrey_ttfSize, false); // knobs Image knobImage(DistrhoArtworkMVerb::knobData, DistrhoArtworkMVerb::knobWidth, DistrhoArtworkMVerb::knobHeight); { ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical)); knob->setId(MVerb::DAMPINGFREQ); knob->setAbsolutePos(56 + 7*40, 40); knob->setRange(0.0f, 100.0f); knob->setDefault(50.0f); knob->setCallback(this); fKnobs.push_back(knob); } { ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical)); knob->setId(MVerb::DENSITY); knob->setAbsolutePos(56 + 4*40, 40); knob->setRange(0.0f, 100.0f); knob->setDefault(50.0f); knob->setCallback(this); fKnobs.push_back(knob); } { ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical)); knob->setId(MVerb::BANDWIDTHFREQ); knob->setAbsolutePos(56 + 5*40, 40); knob->setRange(0.0f, 100.0f); knob->setDefault(50.0f); knob->setCallback(this); fKnobs.push_back(knob); } { ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical)); knob->setId(MVerb::DECAY); knob->setAbsolutePos(56 + 6*40, 40); knob->setRange(0.0f, 100.0f); knob->setDefault(50.0f); knob->setCallback(this); fKnobs.push_back(knob); } { ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical)); knob->setId(MVerb::PREDELAY); knob->setAbsolutePos(56 + 1*40, 40); knob->setRange(0.0f, 100.0f); knob->setDefault(50.0f); knob->setCallback(this); fKnobs.push_back(knob); } { ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical)); knob->setId(MVerb::SIZE); knob->setAbsolutePos(56 + 3*40, 40); knob->setRange(5.0f, 100.0f); knob->setDefault(100.0f); knob->setCallback(this); fKnobs.push_back(knob); } { ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical)); knob->setId(MVerb::GAIN); knob->setAbsolutePos(56 + 8*40, 40); knob->setRange(0.0f, 100.0f); knob->setDefault(75.0f); knob->setCallback(this); fKnobs.push_back(knob); } { ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical)); knob->setId(MVerb::MIX); knob->setAbsolutePos(56 + 0*40, 40); knob->setRange(0.0f, 100.0f); knob->setDefault(50.0f); knob->setCallback(this); fKnobs.push_back(knob); } { ImageKnob* const knob(new ImageKnob(this, knobImage, ImageKnob::Vertical)); knob->setId(MVerb::EARLYMIX); knob->setAbsolutePos(56 + 2*40, 40); knob->setRange(0.0f, 100.0f); knob->setDefault(50.0f); knob->setCallback(this); fKnobs.push_back(knob); } // set initial values d_programChanged(0); } DistrhoUIMVerb::~DistrhoUIMVerb() { for (std::vector::iterator it=fKnobs.begin(), end=fKnobs.end(); it != end; ++it) { ImageKnob* const knob(*it); delete knob; } fKnobs.clear(); } // ----------------------------------------------------------------------- // DSP Callbacks void DistrhoUIMVerb::d_parameterChanged(uint32_t index, float value) { fKnobs[index]->setValue(value); } void DistrhoUIMVerb::d_programChanged(uint32_t index) { switch(index) { case 0: fKnobs[MVerb::DAMPINGFREQ]->setValue(0.5f*100.0f); fKnobs[MVerb::DENSITY]->setValue(0.5f*100.0f); fKnobs[MVerb::BANDWIDTHFREQ]->setValue(0.5f*100.0f); fKnobs[MVerb::DECAY]->setValue(0.5f*100.0f); fKnobs[MVerb::PREDELAY]->setValue(0.5f*100.0f); fKnobs[MVerb::GAIN]->setValue(1.0f*100.0f); fKnobs[MVerb::MIX]->setValue(0.5f*100.0f); fKnobs[MVerb::EARLYMIX]->setValue(0.5f*100.0f); fKnobs[MVerb::SIZE]->setValue(0.75f*100.0f); break; case 1: fKnobs[MVerb::DAMPINGFREQ]->setValue(0.9f*100.0f); fKnobs[MVerb::DENSITY]->setValue(0.5f*100.0f); fKnobs[MVerb::BANDWIDTHFREQ]->setValue(0.1f*100.0f); fKnobs[MVerb::DECAY]->setValue(0.5f*100.0f); fKnobs[MVerb::PREDELAY]->setValue(0.0f*100.0f); fKnobs[MVerb::SIZE]->setValue(0.5f*100.0f); fKnobs[MVerb::GAIN]->setValue(1.0f*100.0f); fKnobs[MVerb::MIX]->setValue(0.5f*100.0f); fKnobs[MVerb::EARLYMIX]->setValue(0.75f*100.0f); break; case 2: fKnobs[MVerb::DAMPINGFREQ]->setValue(0.0f*100.0f); fKnobs[MVerb::DENSITY]->setValue(0.5f*100.0f); fKnobs[MVerb::BANDWIDTHFREQ]->setValue(1.0f*100.0f); fKnobs[MVerb::DECAY]->setValue(0.5f*100.0f); fKnobs[MVerb::PREDELAY]->setValue(0.0f*100.0f); fKnobs[MVerb::SIZE]->setValue(0.25f*100.0f); fKnobs[MVerb::GAIN]->setValue(1.0f*100.0f); fKnobs[MVerb::MIX]->setValue(0.35f*100.0f); fKnobs[MVerb::EARLYMIX]->setValue(0.75f*100.0f); break; case 3: fKnobs[MVerb::DAMPINGFREQ]->setValue(0.0f*100.0f); fKnobs[MVerb::DENSITY]->setValue(0.5f*100.0f); fKnobs[MVerb::BANDWIDTHFREQ]->setValue(1.0f*100.0f); fKnobs[MVerb::DECAY]->setValue(0.5f*100.0f); fKnobs[MVerb::PREDELAY]->setValue(0.0f*100.0f); fKnobs[MVerb::SIZE]->setValue(1.0f*100.0f); fKnobs[MVerb::GAIN]->setValue(1.0f*100.0f); fKnobs[MVerb::MIX]->setValue(0.35f*100.0f); fKnobs[MVerb::EARLYMIX]->setValue(0.75f*100.0f); break; case 4: fKnobs[MVerb::DAMPINGFREQ]->setValue(0.0f*100.0f); fKnobs[MVerb::DENSITY]->setValue(0.5f*100.0f); fKnobs[MVerb::BANDWIDTHFREQ]->setValue(1.0f*100.0f); fKnobs[MVerb::DECAY]->setValue(0.5f*100.0f); fKnobs[MVerb::PREDELAY]->setValue(0.0f*100.0f); fKnobs[MVerb::SIZE]->setValue(0.5f*100.0f); fKnobs[MVerb::GAIN]->setValue(1.0f*100.0f); fKnobs[MVerb::MIX]->setValue(0.15f*100.0f); fKnobs[MVerb::EARLYMIX]->setValue(0.75f*100.0f); break; } } // ----------------------------------------------------------------------- // Widget Callbacks void DistrhoUIMVerb::imageKnobDragStarted(ImageKnob* knob) { d_editParameter(knob->getId(), true); } void DistrhoUIMVerb::imageKnobDragFinished(ImageKnob* knob) { d_editParameter(knob->getId(), false); } void DistrhoUIMVerb::imageKnobValueChanged(ImageKnob* knob, float value) { d_setParameterValue(knob->getId(), value); } void DistrhoUIMVerb::onDisplay() { fImgBackground.draw(); // text display fNanoText.beginFrame(getWidth(), getHeight()); fNanoText.fontFace("kh"); fNanoText.fontSize(20); fNanoText.textAlign(NanoVG::Align(NanoVG::ALIGN_CENTER|NanoVG::ALIGN_TOP)); fNanoText.fillColor(Color(1.0f, 1.0f, 1.0f)); char strBuf[32+1]; strBuf[32] = '\0'; for (std::size_t i=0; i::NUM_PARAMS; ++i) { std::snprintf(strBuf, 32, "%i%%", int(fKnobs[i]->getValue())); fNanoText.textBox(58 + fKnobs[i]->getAbsoluteX()-56, 73, 30.0f, strBuf, nullptr); } fNanoText.endFrame(); // just in case glDisable(GL_CULL_FACE); } // ----------------------------------------------------------------------- UI* createUI() { return new DistrhoUIMVerb(); } // ----------------------------------------------------------------------- END_NAMESPACE_DISTRHO