aboutsummaryrefslogtreecommitdiffstats
path: root/src/mdaSpecMeter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mdaSpecMeter.cpp')
-rw-r--r--src/mdaSpecMeter.cpp503
1 files changed, 0 insertions, 503 deletions
diff --git a/src/mdaSpecMeter.cpp b/src/mdaSpecMeter.cpp
deleted file mode 100644
index 100724b..0000000
--- a/src/mdaSpecMeter.cpp
+++ /dev/null
@@ -1,503 +0,0 @@
-/*
- Copyright 2008-2011 David Robillard <http://drobilla.net>
- Copyright 2002 Paul Kellett (Maxim Digital Audio)
-
- This 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 (at your option) any later version.
-
- This software 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.
-
- You should have received a copy of the GNU General Public License
- along with this software. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <stdio.h>
-#include <string.h>
-#include <float.h>
-#include <math.h>
-
-#include "mdaSpecMeter.h"
-//#include "mdaSpecMeterGUI.h"
-//#include "AEffEditor.hpp"
-
-AudioEffect *
-createEffectInstance (audioMasterCallback audioMaster)
-{
- return new mdaSpecMeter (audioMaster);
-}
-
-mdaSpecMeterProgram::mdaSpecMeterProgram ()
-{
- param[_PARAM0] = 0.5;
- //param[_PARAM1] = 0.5;
- //param[_PARAM2] = 0.75;
- strcpy (name, "default");
-}
-
-
-mdaSpecMeter::mdaSpecMeter (audioMasterCallback audioMaster):AudioEffectX (audioMaster, 1,
- NPARAMS)
-{
- //editor = new mdaSpecMeterGUI(this);
-
- programs = new mdaSpecMeterProgram[numPrograms];
- if (programs) {
- setProgram (0);
- }
-
- setNumInputs (2);
- setNumOutputs (2);
- DECLARE_LVZ_DEPRECATED (canMono) ();
- setUniqueID ("mdaSpecMeter");
- canProcessReplacing ();
-
- //initialise...
- K = counter = 0;
- kmax = 2048;
- topband = 11;
- iK = 1.0f / (float) kmax;
- den = 1.0e-8f;
-
- //buffer = new float[44100];
-
- suspend ();
-}
-
-bool
-mdaSpecMeter::getProductString (char *text)
-{
- strcpy (text, "MDA SpecMeter");
- return true;
-}
-
-bool
-mdaSpecMeter::getVendorString (char *text)
-{
- strcpy (text, "mda");
- return true;
-}
-
-bool
-mdaSpecMeter::getEffectName (char *name)
-{
- strcpy (name, "SpecMeter");
- return true;
-}
-
-void
-mdaSpecMeter::suspend ()
-{
- Lpeak = Rpeak = Lrms = Rrms = Corr = 0.0f;
- lpeak = rpeak = lrms = rrms = corr = 0.0f;
- Lhold = Rhold = 0.0f;
- Lmin = Rmin = 0.0000001f;
- for (LvzInt32 i = 0; i < 16; i++) {
- band[0][i] = band[1][i] = 0.0f;
- for (LvzInt32 j = 0; j < 6; j++)
- lpp[j][i] = rpp[j][i] = 0.0f;
- }
-
- //memset(buffer, 0, size * sizeof (float));
-}
-
-void
-mdaSpecMeter::setSampleRate(float sampleRate)
-{
- AudioEffectX::setSampleRate(sampleRate);
- if(sampleRate > 64000) { topband = 12; kmax = 4096; }
- else { topband = 11; kmax = 2048; }
- iK = 1.0f / (float)kmax;
-}
-
-mdaSpecMeter::~mdaSpecMeter ()
-{
- //if(buffer) delete [] buffer;
- if (programs)
- delete[]programs;
-}
-
-
-void
-mdaSpecMeter::setProgramName (char *name)
-{
- strcpy (programs[curProgram].name, name);
-}
-
-void
-mdaSpecMeter::getProgramName (char *name)
-{
- strcpy (name, programs[curProgram].name);
-}
-
-
-bool
-mdaSpecMeter::getProgramNameIndexed (LvzInt32 category, LvzInt32 index, char* name)
-{
- if ((unsigned int)index < NPROGS) {
- strcpy(name, programs[index].name);
- return true;
- }
- return false;
-}
-
-float
-mdaSpecMeter::getParameter (LvzInt32 index)
-{
- return programs[curProgram].param[index];
-}
-
-void
-mdaSpecMeter::setProgram (LvzInt32 program)
-{
- mdaSpecMeterProgram *p = &programs[program];
- curProgram = program;
- setProgramName (p->name);
- for (long i = 0; i < NPARAMS; i++)
- setParameter (i, p->param[i]);
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-
-void
-mdaSpecMeter::setParameter (LvzInt32 index, float value)
-{
- programs[curProgram].param[index] = value;
-
- switch (index) {
- case _PARAM0:
- gain = (float)pow(10.0f, 2.0f * programs[curProgram].param[index] - 1.0f);
- break;
-
- default:
- break;
- }
-
- //if(editor) editor->postUpdate();
-}
-
-
-void
-mdaSpecMeter::getParameterName (LvzInt32 index, char *label)
-{
- switch (index) {
- case _PARAM0:
- strcpy (label, "Gain");
- break;
- default:
- strcpy (label, "");
- }
-}
-
-
-void
-mdaSpecMeter::getParameterDisplay (LvzInt32 index, char *text)
-{
- char string[16];
- float * param = programs[curProgram].param;
-
- switch (index) {
- case _PARAM0:
- sprintf(string, "%.1f", 40.0f * param[index] - 20.0f);
- break;
- /*case _PARAM1:
- strcpy (string, "");
- break;*/
- default:
- sprintf(string, "%.0f", 100.0f * param[index]);
- }
- string[8] = 0;
- strcpy (text, (char *) string);
-}
-
-
-void
-mdaSpecMeter::getParameterLabel (LvzInt32 index, char *label)
-{
- switch (index) {
- case _PARAM0:
- strcpy (label, "");
- break;
- default:
- strcpy (label, "");
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-
-void
-mdaSpecMeter::process (float **inputs, float **outputs, LvzInt32 sampleFrames)
-{
- float *in1 = inputs[0];
- float *in2 = inputs[1];
- float *out1 = outputs[0];
- float *out2 = outputs[1];
-
- den = -den;
- float l, r, p, q, iN = iK;
- long k = K, j0 = topband, mask, j;
-
- while (--sampleFrames >= 0) {
- l = *in1++;
- r = *in2++;
- *out1++ += l;
- *out2++ += r;
-
- l += den; //anti-denormal
- r += den;
-
- lrms += l * l; //RMS integrate
- rrms += r * r;
-
- p = (float) fabs (l);
- if (p > lpeak)
- lpeak = p; //peak detect
- q = (float) fabs (r);
- if (q > rpeak)
- rpeak = q;
- /*
- if(p > 1.0e-8f && p < lmin) lmin = p; //'trough' detect
- if(q > 1.0e-8f && q < rmin) rmin = q;
- */
- if ((l * r) > 0.0f)
- corr += iN; //measure correlation
-
- j = j0;
- mask = k << 1;
-
- do { //polyphase filter bank
- p = lpp[0][j] + 0.208f * l;
- lpp[0][j] = lpp[1][j];
- lpp[1][j] = l - 0.208f * p;
-
- q = lpp[2][j] + lpp[4][j] * 0.682f;
- lpp[2][j] = lpp[3][j];
- lpp[3][j] = lpp[4][j] - 0.682f * q;
- lpp[4][j] = l;
- lpp[5][j] += (float) fabs (p - q); //top octave
- l = p + q; //lower octaves
-
- p = rpp[0][j] + 0.208f * r;
- rpp[0][j] = rpp[1][j];
- rpp[1][j] = r - 0.208f * p;
-
- q = rpp[2][j] + rpp[4][j] * 0.682f;
- rpp[2][j] = rpp[3][j];
- rpp[3][j] = rpp[4][j] - 0.682f * q;
- rpp[4][j] = r;
- rpp[5][j] += (float) fabs (p - q); //top octave
- r = p + q; //lower octaves
-
- j--;
- mask >>= 1;
- } while (mask & 1);
-
- if (++k == kmax) {
- k = 0;
- counter++; //editor waits for this to change
-
- if (lpeak == 0.0f)
- Lpeak = Lrms = 0.0f;
- else { ///add limits here!
- if (lpeak > 2.0f)
- lpeak = 2.0f;
- if (lpeak >= Lpeak) {
- Lpeak = lpeak;
- Lhold = 2.0f * Lpeak;
- } else {
- Lhold *= 0.95f;
- if (Lhold < Lpeak)
- Lpeak = Lhold;
- }
- Lmin = lmin;
- lmin *= 1.01f;
- Lrms += 0.2f * (iN * lrms - Lrms);
- }
-
- if (rpeak == 0.0f)
- Rpeak = Rrms = 0.0f;
- else {
- if (rpeak > 2.0f)
- rpeak = 2.0f;
- if (rpeak >= Rpeak) {
- Rpeak = rpeak;
- Rhold = 2.0f * Rpeak;
- } else {
- Rhold *= 0.95f;
- if (Rhold < Rpeak)
- Rpeak = Rhold;
- }
- Rmin = rmin;
- rmin *= 1.01f;
- Rrms += 0.2f * (iN * rrms - Rrms);
- }
-
- rpeak = lpeak = lrms = rrms = 0.0f;
- Corr += 0.1f * (corr - Corr); //correlation
- corr = SILENCE;
-
- float dec = 0.08f;
- for (j = 0; j < 13; j++) { //spectrum output
- band[0][j] += dec * (iN * lpp[5][j] - band[0][j]);
- if (band[0][j] > 2.0f)
- band[0][j] = 2.0f;
- else if (band[0][j] < 0.014f)
- band[0][j] = 0.014f;
-
- band[1][j] += dec * (iN * rpp[5][j] - band[1][j]);
- if (band[1][j] > 2.0f)
- band[1][j] = 2.0f;
- else if (band[1][j] < 0.014f)
- band[1][j] = 0.014f;
-
- rpp[5][j] = lpp[5][j] = SILENCE;
- dec = dec * 1.1f;
- }
- }
- }
-
- K = k;
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-
-void
-mdaSpecMeter::processReplacing (float **inputs, float **outputs,
- LvzInt32 sampleFrames)
-{
- float *in1 = inputs[0];
- float *in2 = inputs[1];
- float *out1 = outputs[0];
- float *out2 = outputs[1];
-
- den = -den;
- float l, r, p, q, iN = iK;
- long k = K, j0 = topband, mask, j;
-
- while (--sampleFrames >= 0) {
- l = *in1++;
- r = *in2++;
- *out1++ = l;
- *out2++ = r;
-
- l += den; //anti-denormal
- r += den;
-
- lrms += l * l; //RMS integrate
- rrms += r * r;
-
- p = (float) fabs (l);
- if (p > lpeak)
- lpeak = p; //peak detect
- q = (float) fabs (r);
- if (q > rpeak)
- rpeak = q;
- /*
- if(p > 1.0e-8f && p < lmin) lmin = p; //'trough' detect
- if(q > 1.0e-8f && q < rmin) rmin = q;
- */
- if ((l * r) > 0.0f)
- corr += iN; //measure correlation
-
- j = j0;
- mask = k << 1;
-
- do { //polyphase filter bank
- p = lpp[0][j] + 0.208f * l;
- lpp[0][j] = lpp[1][j];
- lpp[1][j] = l - 0.208f * p;
-
- q = lpp[2][j] + lpp[4][j] * 0.682f;
- lpp[2][j] = lpp[3][j];
- lpp[3][j] = lpp[4][j] - 0.682f * q;
- lpp[4][j] = l;
- lpp[5][j] += (float) fabs (p - q); //top octave
- l = p + q; //lower octaves
-
- p = rpp[0][j] + 0.208f * r;
- rpp[0][j] = rpp[1][j];
- rpp[1][j] = r - 0.208f * p;
-
- q = rpp[2][j] + rpp[4][j] * 0.682f;
- rpp[2][j] = rpp[3][j];
- rpp[3][j] = rpp[4][j] - 0.682f * q;
- rpp[4][j] = r;
- rpp[5][j] += (float) fabs (p - q); //top octave
- r = p + q; //lower octaves
-
- j--;
- mask >>= 1;
- } while (mask & 1);
-
- if (++k == kmax) {
- k = 0;
- //counter++; //editor waits for this to change
-
- if (lpeak == 0.0f)
- Lpeak = Lrms = 0.0f;
- else { ///add limits here!
- if (lpeak > 2.0f)
- lpeak = 2.0f;
- if (lpeak >= Lpeak) {
- Lpeak = lpeak;
- Lhold = 2.0f * Lpeak;
- } else {
- Lhold *= 0.95f;
- if (Lhold < Lpeak)
- Lpeak = Lhold;
- }
- Lmin = lmin;
- lmin *= 1.01f;
- Lrms += 0.2f * (iN * lrms - Lrms);
- }
-
- if (rpeak == 0.0f)
- Rpeak = Rrms = 0.0f;
- else {
- if (rpeak > 2.0f)
- rpeak = 2.0f;
- if (rpeak >= Rpeak) {
- Rpeak = rpeak;
- Rhold = 2.0f * Rpeak;
- } else {
- Rhold *= 0.95f;
- if (Rhold < Rpeak)
- Rpeak = Rhold;
- }
- Rmin = rmin;
- rmin *= 1.01f;
- Rrms += 0.2f * (iN * rrms - Rrms);
- }
-
- rpeak = lpeak = lrms = rrms = 0.0f;
- Corr += 0.1f * (corr - Corr); //correlation
- corr = SILENCE;
-
- float dec = 0.08f;
- for (j = 0; j < 13; j++) { //spectrum output
- band[0][j] += dec * (iN * lpp[5][j] - band[0][j]);
- if (band[0][j] > 2.0f)
- band[0][j] = 2.0f;
- else if (band[0][j] < 0.014f)
- band[0][j] = 0.014f;
-
- band[1][j] += dec * (iN * rpp[5][j] - band[1][j]);
- if (band[1][j] > 2.0f)
- band[1][j] = 2.0f;
- else if (band[1][j] < 0.014f)
- band[1][j] = 0.014f;
-
- rpp[5][j] = lpp[5][j] = SILENCE;
- dec = dec * 1.1f;
- }
-
- counter++; //editor waits for this to change
- }
- }
-
- K = k;
-}