From e360047054117d63fb579ec9231e9dc77c99f12a Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 8 Aug 2008 22:45:58 +0000 Subject: Add preliminary (library side only) LV2 port of MDA (open-sourced VST plugins). git-svn-id: http://svn.drobilla.net/lad/mda-lv2@1321 a436a847-0d15-0410-975c-d299462d15a1 --- src/mdaSpecMeterGUI.cpp | 179 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 src/mdaSpecMeterGUI.cpp (limited to 'src/mdaSpecMeterGUI.cpp') diff --git a/src/mdaSpecMeterGUI.cpp b/src/mdaSpecMeterGUI.cpp new file mode 100644 index 0000000..08bc5a3 --- /dev/null +++ b/src/mdaSpecMeterGUI.cpp @@ -0,0 +1,179 @@ +#include "mdaSpecMeterGUI.h" +#include "mdaSpecMeter.h" + +#include + + +mdaSpecMeterGUI::mdaSpecMeterGUI(AudioEffect *effect) : AEffGUIEditor(effect) +{ + background = new CBitmap(128); + + rect.left = 0; + rect.top = 0; + rect.right = (LvzInt16)background->getWidth(); + rect.bottom = (LvzInt16)background->getHeight(); +} + + +mdaSpecMeterGUI::~mdaSpecMeterGUI() +{ + delete background; +} + + +bool mdaSpecMeterGUI::open(void *ptr) +{ + AEffGUIEditor::open(ptr); + + CPoint offs(0, 0); + CRect size(0, 0, background->getWidth(), background->getHeight()); + frame = new CFrame(size, ptr, this); + + size.offset(0, 0); + draw = new CDraw(size, 0.0f, background); + frame->addView(draw); + + return true; +} + + +void mdaSpecMeterGUI::close() +{ + delete frame; + frame = 0; +} + + +void mdaSpecMeterGUI::idle() +{ + long xnow = ((mdaSpecMeter *)effect)->counter; + if(xnow != xtimer) + { + xtimer = xnow; + + //if(draw) temp = draw->temp; + //if(label) label->setLabel(xtimer); + + if(draw) //copy data from effect (this can't be the best way!) + { + draw->Lpeak = ((mdaSpecMeter *)effect)->Lpeak; + draw->Lmin = ((mdaSpecMeter *)effect)->Lmin; + draw->Lrms = ((mdaSpecMeter *)effect)->Lrms; + draw->Rpeak = ((mdaSpecMeter *)effect)->Rpeak; + draw->Rmin = ((mdaSpecMeter *)effect)->Rmin; + draw->Rrms = ((mdaSpecMeter *)effect)->Rrms; + draw->Corr = ((mdaSpecMeter *)effect)->Corr; + for(long i=0; i<13; i++) + { + draw->band[0][i] = ((mdaSpecMeter *)effect)->band[0][i]; + draw->band[1][i] = ((mdaSpecMeter *)effect)->band[1][i]; + } + draw->setDirty(true); //trigger redraw + } + } + + AEffGUIEditor::idle(); +} + + +CDraw::CDraw(CRect &size, float value, CBitmap *background) : CControl(size) +{ + bitmap = background; + + Lpeak = Lmin = Lrms = Rpeak = Rmin = Rrms = Corr = 0.0f; + for(long i=0; i<16; i++) band[0][i] = band[1][i] = 0.0f; + + setValue(value); +} + +CDraw::~CDraw() +{ + +} + +void CDraw::draw(CDrawContext *pContext) +{ + long r, p; + CRect block; + CRect rect(0, 0, bitmap->getWidth(), bitmap->getHeight()); + + bitmap->draw(pContext, rect); +/* + pContext->setFillColor(kGreenCColor); + + p = x2pix(Lmin); + block(p - 3, 10, p - 1, 18); + pContext->fillRect(block); + + p = x2pix(Rmin); + block(p - 3, 18, p - 1, 26); + pContext->fillRect(block); +*/ + pContext->setFillColor(kBlackCColor); + + r = x22pix(Lrms); if(r > 454) r = 454; + p = x2pix(Lpeak); if(p > 454) p = 454; + block = CRect(r - 1, 10, p - 1, 18); + pContext->fillRect(block); + block = CRect(p - 1, 10, 478, 18); + if(p < 454) pContext->fillRect(block); + + r = x22pix(Rrms); if(r > 454) r = 454; + p = x2pix(Rpeak); if(p > 454) p = 454; + block = CRect(r - 1, 18, p - 1, 26); + pContext->fillRect(block); + block = CRect(p - 1, 18, 478, 26); + if(p < 454) pContext->fillRect(block); + + //block(x2pix(Rpeak), 18, 478, 26); + //buf->fillRect(block); + + block = CRect(235, 42, 244, 134 - (long)(90 * Corr)); + pContext->fillRect(block); + + long i, x1=2, x2=256; //octave bands + float dB; + for(i=0; i<13; i++) + { + dB = band[0][i]; + block = CRect(x1, 42, x1+18, 49 - (long)(20.0 * log(dB))); + pContext->fillRect(block); + x1 += 17; + + dB = band[1][i]; + block = CRect(x2, 42, x2+18, 49 - (long)(20.0 * log(dB))); + pContext->fillRect(block); + x2 += 17; + } +} + + +long CDraw::x2pix(float x) +{ + float dB = x; + long p = 478; + + if(x > 0.00000005f) dB = 8.6858896f * (float)log(x); else dB = -146.0f; + if(dB < -20.0) + p = 293 + (long)(2.0f * dB); + else + p = 453 + (long)(10.0f * dB); + + return p; +} + + +long CDraw::x22pix(float x) //power version for squared summed +{ + float dB = x; + long p = 478; + + if(x > 0.00000005f) dB = 4.3429448f * (float)log(x); else dB = -146.0f; + if(dB < -20.0) + p = 293 + (long)(2.0f * dB); + else + if(dB < 0.0f) p = 453 + (long)(10.0f * dB); + + return p; +} + -- cgit v1.2.1