diff options
author | Damien Zammit <damien@zamaudio.com> | 2015-06-16 03:49:54 +1000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2015-06-16 03:49:54 +1000 |
commit | 9be730e568e102084ff013dbc424bd15058b5055 (patch) | |
tree | 5cde278b8868327a2ba44ed5832985876732fb47 /plugins/ZaMultiCompX2 | |
parent | 43fa19c5558b6e644b80f1b933d39eb1a747e8af (diff) |
Smooth moving blobs on multicomp
Signed-off-by: Damien Zammit <damien@zamaudio.com>
Diffstat (limited to 'plugins/ZaMultiCompX2')
-rw-r--r-- | plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp | 41 | ||||
-rw-r--r-- | plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp | 5 |
2 files changed, 42 insertions, 4 deletions
diff --git a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp index dedb004..35bb257 100644 --- a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp +++ b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp @@ -606,6 +606,14 @@ void ZaMultiCompX2Plugin::activate() } } maxL = maxR = 0.f; + for (i = 0; i < MAX_SAMPLES; i++) { + outlevelold[0][i] = 0.f; + outlevelold[1][i] = 0.f; + outlevelold[2][i] = 0.f; + } + pos[0] = 0; + pos[1] = 0; + pos[2] = 0; } float ZaMultiCompX2Plugin::run_filter(int i, int ch, float in) @@ -851,6 +859,26 @@ void ZaMultiCompX2Plugin::run_comp(int k, float inL, float inR, float *outL, flo old_yg[1][k] = Ryg; } +void ZaMultiCompX2Plugin::pushsample(float samples[], float sample, int k) +{ + ++pos[k]; + if (pos[k] >= MAX_SAMPLES) + pos[k] = 0; + samples[pos[k]] = sample; +} + +float ZaMultiCompX2Plugin::averageabs(float samples[]) +{ + int i; + float average = 0.f; + + for (i = 0; i < MAX_SAMPLES; i++) { + average += samples[i]*samples[i]; + } + average /= (float) MAX_SAMPLES; + return sqrt(average); +} + void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t frames) { float srate = getSampleRate(); @@ -900,8 +928,9 @@ void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t fr fil1[1] = run_filter(0, 1, inr); tmp1[0] = run_filter(1, 0, fil1[0]); tmp1[1] = run_filter(1, 1, fil1[1]); - outlevel[0] = to_dB(std::max(tmp1[0], tmp1[1])); - + pushsample(outlevelold[0], std::max(tmp1[0], tmp1[1]), 0); + outlevel[0] = averageabs(outlevelold[0]); + outlevel[0] = (outlevel[0] == 0.f) ? -45.0 : to_dB(outlevel[0]); if (tog1) run_comp(0, tmp1[0], tmp1[1], &outL[0], &outR[0]); @@ -916,7 +945,9 @@ void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t fr fil3[1] = run_filter(4, 1, tmp3[1]); tmp4[0] = run_filter(5, 0, fil3[0]); tmp4[1] = run_filter(5, 1, fil3[1]); - outlevel[1] = to_dB(std::max(tmp4[0], tmp4[1])); + pushsample(outlevelold[1], std::max(tmp4[0], tmp4[1]), 1); + outlevel[1] = averageabs(outlevelold[1]); + outlevel[1] = (outlevel[1] == 0.f) ? -45.0 : to_dB(outlevel[1]); if (tog2) run_comp(1, tmp4[0], tmp4[1], &outL[1], &outR[1]); @@ -928,7 +959,9 @@ void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t fr fil4[1] = run_filter(6, 1, inr); tmp5[0] = run_filter(7, 0, fil4[0]); tmp5[1] = run_filter(7, 1, fil4[1]); - outlevel[2] = to_dB(std::max(tmp5[0], tmp5[1])); + pushsample(outlevelold[2], std::max(tmp5[0], tmp5[1]), 2); + outlevel[2] = averageabs(outlevelold[2]); + outlevel[2] = (outlevel[2] == 0.f) ? -45.0 : to_dB(outlevel[2]); if (tog3) run_comp(2, tmp5[0], tmp5[1], &outL[2], &outR[2]); diff --git a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp index 90734d2..a4b9a6d 100644 --- a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp +++ b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp @@ -25,6 +25,7 @@ START_NAMESPACE_DISTRHO #define MAX_FILT 8 #define MAX_COMP 3 +#define MAX_SAMPLES 960 #define ONEOVERROOT2 0.7071068f #define ROOT2 1.4142135f #define STEREOLINK_MAX 1 @@ -156,6 +157,8 @@ protected: void activate() override; void run(const float** inputs, float** outputs, uint32_t frames) override; + void pushsample(float samples[], float sample, int k); + float averageabs(float samples[]); // ------------------------------------------------------------------- private: @@ -164,6 +167,8 @@ private: float old_yl[2][MAX_COMP], old_y1[2][MAX_COMP], old_yg[2][MAX_COMP]; float old_ll[2], old_l1[2]; float limit, outlevel[3]; + int pos[3]; + float outlevelold[3][MAX_SAMPLES]; bool resetl; bool resetr; // Crossover filter coefficients |