diff options
Diffstat (limited to 'plugins/ZamHeadX2/ZamHeadX2Plugin.cpp')
-rw-r--r-- | plugins/ZamHeadX2/ZamHeadX2Plugin.cpp | 500 |
1 files changed, 500 insertions, 0 deletions
diff --git a/plugins/ZamHeadX2/ZamHeadX2Plugin.cpp b/plugins/ZamHeadX2/ZamHeadX2Plugin.cpp new file mode 100644 index 0000000..651225c --- /dev/null +++ b/plugins/ZamHeadX2/ZamHeadX2Plugin.cpp @@ -0,0 +1,500 @@ +/* + * ZamHeadX2 Stereo widener + * Copyright (C) 2014 Damien Zammit <damien@zamaudio.com> + * + * 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 2 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 doc/GPL.txt file. + */ + +#include "ZamHeadX2Plugin.hpp" + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- + +ZamHeadX2Plugin::ZamHeadX2Plugin() + : Plugin(paramCount, 1, 0) +{ + // set default values + loadProgram(0); +} + +ZamHeadX2Plugin::~ZamHeadX2Plugin() +{ +} + +// ----------------------------------------------------------------------- +// Init + +void ZamHeadX2Plugin::initParameter(uint32_t index, Parameter& parameter) +{ + switch (index) + { + case paramAzimuth: + parameter.hints = kParameterIsAutomable | kParameterIsInteger; + parameter.name = "Azimuth"; + parameter.symbol = "az"; + parameter.unit = " "; + parameter.ranges.def = 0.0f; + parameter.ranges.min = -90.0f; + parameter.ranges.max = 270.0f; + break; + case paramElevation: + parameter.hints = kParameterIsAutomable | kParameterIsInteger; + parameter.name = "Elevation"; + parameter.symbol = "elev"; + parameter.unit = " "; + parameter.ranges.def = 0.0f; + parameter.ranges.min = -45.0f; + parameter.ranges.max = 90.0f; + break; + } +} + + +void ZamHeadX2Plugin::initProgramName(uint32_t index, String& programName) +{ + switch(index) { + case 0: + programName = "Zero"; + break; + } +} + +void ZamHeadX2Plugin::loadProgram(uint32_t index) +{ + switch(index) { + case 0: + azimuth = 0.0; + elevation = 0.0; + break; + } + + activate(); +} + +// ----------------------------------------------------------------------- +// Internal data + +float ZamHeadX2Plugin::getParameterValue(uint32_t index) const +{ + switch (index) + { + case paramAzimuth: + return azimuth; + break; + case paramElevation: + return elevation; + break; + } + return 0.f; +} + +void ZamHeadX2Plugin::setParameterValue(uint32_t index, float value) +{ + switch (index) + { + case paramAzimuth: + azimuth = value; + break; + case paramElevation: + elevation = value; + break; + } +} + +// ----------------------------------------------------------------------- +// Process + +static const float fir_left[50][25][200] = { + { + #include "l1" + }, + { + #include "l2" + }, + { + #include "l3" + }, + { + #include "l4" + }, + { + #include "l5" + }, + { + #include "l6" + }, + { + #include "l7" + }, + { + #include "l8" + }, + { + #include "l9" + }, + { + #include "l10" + }, + { + #include "l11" + }, + { + #include "l12" + }, + { + #include "l13" + }, + { + #include "l14" + }, + { + #include "l15" + }, + { + #include "l16" + }, + { + #include "l17" + }, + { + #include "l18" + }, + { + #include "l19" + }, + { + #include "l20" + }, + { + #include "l21" + }, + { + #include "l22" + }, + { + #include "l23" + }, + { + #include "l24" + }, + { + #include "l25" + }, + { + #include "l26" + }, + { + #include "l27" + }, + { + #include "l28" + }, + { + #include "l29" + }, + { + #include "l30" + }, + { + #include "l31" + }, + { + #include "l32" + }, + { + #include "l33" + }, + { + #include "l34" + }, + { + #include "l35" + }, + { + #include "l36" + }, + { + #include "l37" + }, + { + #include "l38" + }, + { + #include "l39" + }, + { + #include "l40" + }, + { + #include "l41" + }, + { + #include "l42" + }, + { + #include "l43" + }, + { + #include "l44" + }, + { + #include "l45" + }, + { + #include "l46" + }, + { + #include "l47" + }, + { + #include "l48" + }, + { + #include "l49" + }, + { + #include "l50" + } +}; + +static const float fir_right[50][25][200] = { + { + #include "r1" + }, + { + #include "r2" + }, + { + #include "r3" + }, + { + #include "r4" + }, + { + #include "r5" + }, + { + #include "r6" + }, + { + #include "r7" + }, + { + #include "r8" + }, + { + #include "r9" + }, + { + #include "r10" + }, + { + #include "r11" + }, + { + #include "r12" + }, + { + #include "r13" + }, + { + #include "r14" + }, + { + #include "r15" + }, + { + #include "r16" + }, + { + #include "r17" + }, + { + #include "r18" + }, + { + #include "r19" + }, + { + #include "r20" + }, + { + #include "r21" + }, + { + #include "r22" + }, + { + #include "r23" + }, + { + #include "r24" + }, + { + #include "r25" + }, + { + #include "r26" + }, + { + #include "r27" + }, + { + #include "r28" + }, + { + #include "r29" + }, + { + #include "r30" + }, + { + #include "r31" + }, + { + #include "r32" + }, + { + #include "r33" + }, + { + #include "r34" + }, + { + #include "r35" + }, + { + #include "r36" + }, + { + #include "r37" + }, + { + #include "r38" + }, + { + #include "r39" + }, + { + #include "r40" + }, + { + #include "r41" + }, + { + #include "r42" + }, + { + #include "r43" + }, + { + #include "r44" + }, + { + #include "r45" + }, + { + #include "r46" + }, + { + #include "r47" + }, + { + #include "r48" + }, + { + #include "r49" + }, + { + #include "r50" + } +}; + +void ZamHeadX2Plugin::activate() +{ + int i; + for (i = 0; i < 6; i++) { + pos[i] = 0; + } + for (i = 0; i < 4096+200; i++) { + inbuf[0][i] = 0.f; + inbuf[1][i] = 0.f; + outbuf[0][i] = 0.f; + outbuf[1][i] = 0.f; + } + +} + +void ZamHeadX2Plugin::pushsample(float* buf, float val, int i, uint32_t maxframes) +{ + buf[pos[i]] = val; + pos[i]--; + if (pos[i] < 0) { + pos[i] = (int)maxframes; + } +} + +float ZamHeadX2Plugin::getsample(float *buf, int i, uint32_t maxframes) +{ + float val = buf[pos[i]]; + pos[i]++; + if (pos[i] >= (int)maxframes) { + pos[i] = 0; + } + return val; +} + +void ZamHeadX2Plugin::run(const float** inputs, float** outputs, uint32_t frames) +{ + uint32_t i; + int az, el; + + el = (int)((elevation + 45.) / 135. * 24.); + if (el >= 24) el = 24; + if (el < 0) el = 0; + az = (int)((azimuth + 90.) / 360. * 49.); + if (az >= 49) az = 49; + if (az < 0) az = 0; + if (az > 24) az = 49 - az; + + float ltmp = 0.f; + float rtmp = 0.f; + int k; + + for (i = 0; i < frames; i++) { + pushsample(&inbuf[0][0], inputs[0][i], 0, 200); + pushsample(&inbuf[1][0], inputs[1][i], 1, 200); + ltmp = 0.f; + rtmp = 0.f; + for (k = 0; k < 200; k++) { + ltmp += getsample(&inbuf[0][0], 0, 200) * + fir_left[el][az][(200-k+200)%200]; + rtmp += getsample(&inbuf[1][0], 1, 200) * + fir_right[el][az][(200-k+200)%200]; + } + outputs[0][i] = ltmp; + outputs[1][i] = rtmp; + } +} + +// ----------------------------------------------------------------------- + +Plugin* createPlugin() +{ + return new ZamHeadX2Plugin(); +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO |