summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2015-07-11 03:17:13 +1000
committerDamien Zammit <damien@zamaudio.com>2015-07-11 03:17:13 +1000
commit579d989d66f621b640590abb4428d03e959dcba2 (patch)
treede7fb47913e089e98c1ed20fff6aa22d06413b46
parentc4da8b2e831afd1f228c8c409f8a4336beaca118 (diff)
Fixed ZaMaximX2 max level
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r--plugins/ZaMaximX2/ZaMaximX2Plugin.cpp65
-rw-r--r--plugins/ZaMaximX2/ZaMaximX2Plugin.hpp10
-rw-r--r--plugins/ZaMaximX2/ZaMaximX2UI.cpp14
3 files changed, 62 insertions, 27 deletions
diff --git a/plugins/ZaMaximX2/ZaMaximX2Plugin.cpp b/plugins/ZaMaximX2/ZaMaximX2Plugin.cpp
index 174346e..5c10d86 100644
--- a/plugins/ZaMaximX2/ZaMaximX2Plugin.cpp
+++ b/plugins/ZaMaximX2/ZaMaximX2Plugin.cpp
@@ -40,8 +40,8 @@ void ZaMaximX2Plugin::initParameter(uint32_t index, Parameter& parameter)
parameter.name = "Release";
parameter.symbol = "rel";
parameter.unit = "ms";
- parameter.ranges.def = 1.0f;
- parameter.ranges.min = 0.1f;
+ parameter.ranges.def = 10.0f;
+ parameter.ranges.min = 1.0f;
parameter.ranges.max = 100.0f;
break;
case paramCeiling:
@@ -49,8 +49,8 @@ void ZaMaximX2Plugin::initParameter(uint32_t index, Parameter& parameter)
parameter.name = "Output Ceiling";
parameter.symbol = "ceil";
parameter.unit = "dB";
- parameter.ranges.def = -6.0f;
- parameter.ranges.min = -40.0f;
+ parameter.ranges.def = -0.5f;
+ parameter.ranges.min = -30.0f;
parameter.ranges.max = 0.0f;
break;
case paramThresh:
@@ -59,7 +59,7 @@ void ZaMaximX2Plugin::initParameter(uint32_t index, Parameter& parameter)
parameter.symbol = "thresh";
parameter.unit = "dB";
parameter.ranges.def = 0.0f;
- parameter.ranges.min = -60.0f;
+ parameter.ranges.min = -30.0f;
parameter.ranges.max = 0.0f;
break;
case paramGainRed:
@@ -97,8 +97,8 @@ void ZaMaximX2Plugin::loadProgram(uint32_t index)
{
switch(index) {
case 0:
- release = 1.0;
- ceiling = -6.0;
+ release = 10.0;
+ ceiling = -0.5;
thresdb = 0.0;
gainred = 0.0;
outlevel = -45.0;
@@ -162,18 +162,42 @@ void ZaMaximX2Plugin::setParameterValue(uint32_t index, float value)
void ZaMaximX2Plugin::activate()
{
+ int i;
gainred = 0.0f;
outlevel = -45.0f;
+ leftpos = rightpos = 0;
+ for (i = 0; i < MAX_SAMPLES; i++) {
+ leftsamples[i] = rightsamples[i] = 0.f;
+ }
oldL_yl = oldL_y1 = oldR_yl = oldR_y1 = oldL_yg = oldR_yg = 0.f;
}
-float ZaMaximX2Plugin::normalise(float in)
+float ZaMaximX2Plugin::normalise(float in, float gainr)
{
if (ceiling < thresdb) {
- ceiling = thresdb;
return in;
}
- return from_dB(ceiling - thresdb) * in;
+ return from_dB(-(thresdb - ceiling + gainr)) * in;
+}
+
+void ZaMaximX2Plugin::pushsample(float in[], float sample, int *pos)
+{
+ (*pos)++;
+ if (*pos >= MAX_SAMPLES) {
+ *pos = 0;
+ }
+ in[*pos] = sample;
+}
+
+float ZaMaximX2Plugin::rmsdb(float in[])
+{
+ int i;
+ float rms = 0.f;
+ for (i = 0; i < MAX_SAMPLES; i++) {
+ rms += in[i] * in[i];
+ }
+ rms = sqrt(rms/MAX_SAMPLES);
+ return to_dB(rms);
}
void ZaMaximX2Plugin::run(const float** inputs, float** outputs, uint32_t frames)
@@ -181,7 +205,7 @@ void ZaMaximX2Plugin::run(const float** inputs, float** outputs, uint32_t frames
float srate = getSampleRate();
float width = 0.01;
float cdb=0.f;
- float attack_coeff = exp(-1000.f/(1.0 * srate));
+ float attack_coeff = exp(-1000.f/(0.01 * srate));
float release_coeff = exp(-1000.f/(release * srate));
float max = 0.f;
@@ -196,9 +220,9 @@ void ZaMaximX2Plugin::run(const float** inputs, float** outputs, uint32_t frames
for (i = 0; i < frames; i++) {
Lyg = Ryg = 0.f;
- Lxg = (inputs[0][i]==0.f) ? -160.f : to_dB(fabs(inputs[0][i]));
- Rxg = (inputs[1][i]==0.f) ? -160.f : to_dB(fabs(inputs[1][i]));
- Lxg = sanitize_denormal(Lxg);
+ Lxg = to_dB(fabsf(inputs[0][i]));
+ Rxg = to_dB(fabsf(inputs[1][i]));
+ Lxg = sanitize_denormal(Lxg);
Rxg = sanitize_denormal(Rxg);
Lyg = Lxg - (Lxg-thresdb+width/2.f)*(Lxg-thresdb+width/2.f)/(2.f*width);
@@ -246,11 +270,14 @@ void ZaMaximX2Plugin::run(const float** inputs, float** outputs, uint32_t frames
cdb = -Ryl;
Rgain = from_dB(cdb);
- lgaininp = inputs[0][i] * Lgain;
- rgaininp = inputs[1][i] * Rgain;
+ pushsample(&leftsamples[0], from_dB(Lgain), &leftpos);
+ pushsample(&rightsamples[0], from_dB(Rgain), &rightpos);
+
+ lgaininp = normalise(inputs[0][i] * Lgain, rmsdb(&leftsamples[0]));
+ rgaininp = normalise(inputs[1][i] * Rgain, rmsdb(&rightsamples[0]));
- outputs[0][i] = normalise(lgaininp);
- outputs[1][i] = normalise(rgaininp);
+ outputs[0][i] = lgaininp;
+ outputs[1][i] = rgaininp;
max = (fabsf(lgaininp) > max) ? fabsf(lgaininp) : sanitize_denormal(max);
max = (fabsf(rgaininp) > max) ? fabsf(rgaininp) : sanitize_denormal(max);
@@ -262,7 +289,7 @@ void ZaMaximX2Plugin::run(const float** inputs, float** outputs, uint32_t frames
oldL_yg = Lyg;
oldR_yg = Ryg;
}
- outlevel = (max == 0.f) ? -45.f : to_dB(max) - thresdb;
+ outlevel = (max == 0.f) ? -45.f : to_dB(max);
}
// -----------------------------------------------------------------------
diff --git a/plugins/ZaMaximX2/ZaMaximX2Plugin.hpp b/plugins/ZaMaximX2/ZaMaximX2Plugin.hpp
index a935c07..1e011a0 100644
--- a/plugins/ZaMaximX2/ZaMaximX2Plugin.hpp
+++ b/plugins/ZaMaximX2/ZaMaximX2Plugin.hpp
@@ -20,6 +20,8 @@
#include "DistrhoPlugin.hpp"
+#define MAX_SAMPLES 240
+
START_NAMESPACE_DISTRHO
// -----------------------------------------------------------------------
@@ -103,13 +105,19 @@ protected:
void activate() override;
void run(const float** inputs, float** outputs, uint32_t frames) override;
- float normalise(float in);
+ float normalise(float in, float gainr);
+ float clip(float in, float level);
+ float rmsdb(float in[]);
+ void pushsample(float in[], float sample, int *pos);
// -------------------------------------------------------------------
private:
float release,ceiling,thresdb,gainred,outlevel;//parameters
float oldL_yl, oldL_y1, oldR_yl, oldR_y1, oldL_yg, oldR_yg;
+ int leftpos, rightpos;
+ float leftsamples[MAX_SAMPLES];
+ float rightsamples[MAX_SAMPLES];
};
// -----------------------------------------------------------------------
diff --git a/plugins/ZaMaximX2/ZaMaximX2UI.cpp b/plugins/ZaMaximX2/ZaMaximX2UI.cpp
index af61251..e3b23ce 100644
--- a/plugins/ZaMaximX2/ZaMaximX2UI.cpp
+++ b/plugins/ZaMaximX2/ZaMaximX2UI.cpp
@@ -47,16 +47,16 @@ ZaMaximX2UI::ZaMaximX2UI()
fKnobRelease = new ImageKnob(this, knobImage);
fKnobRelease->setAbsolutePos(27, 46);
fKnobRelease->setId(ZaMaximX2Plugin::paramRelease);
- fKnobRelease->setRange(0.1f, 100.0f);
- fKnobRelease->setStep(0.1f);
- fKnobRelease->setDefault(1.0f);
+ fKnobRelease->setRange(1.0f, 100.0f);
+ fKnobRelease->setStep(1.0f);
+ fKnobRelease->setDefault(10.0f);
fKnobRelease->setRotationAngle(240);
fKnobRelease->setCallback(this);
fKnobThresh = new ImageKnob(this, knobImage);
fKnobThresh->setAbsolutePos(110, 46);
fKnobThresh->setId(ZaMaximX2Plugin::paramThresh);
- fKnobThresh->setRange(-60.0f, 0.0f);
+ fKnobThresh->setRange(-30.0f, 0.0f);
fKnobThresh->setStep(1.0f);
fKnobThresh->setDefault(0.0f);
fKnobThresh->setRotationAngle(240);
@@ -65,9 +65,9 @@ ZaMaximX2UI::ZaMaximX2UI()
fKnobCeiling = new ImageKnob(this, knobImage);
fKnobCeiling->setAbsolutePos(192, 46);
fKnobCeiling->setId(ZaMaximX2Plugin::paramCeiling);
- fKnobCeiling->setRange(-40.0f, 0.0f);
- fKnobCeiling->setStep(1.0f);
- fKnobCeiling->setDefault(-6.0f);
+ fKnobCeiling->setRange(-30.0f, 0.0f);
+ fKnobCeiling->setStep(0.1f);
+ fKnobCeiling->setDefault(-0.5f);
fKnobCeiling->setRotationAngle(240);
fKnobCeiling->setCallback(this);