/* * Vector Juice Plugin * Copyright (C) 2014 Andre Sklenar , www.juicelab.cz * * 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 "GrooveJuicePlugin.hpp" START_NAMESPACE_DISTRHO // ----------------------------------------------------------------------- GrooveJuicePlugin::GrooveJuicePlugin() : Plugin(paramCount, 1, 0) // 1 program, 0 states { // set default values d_setProgram(0); // reset d_deactivate(); } // ----------------------------------------------------------------------- // Init void GrooveJuicePlugin::d_initParameter(uint32_t index, Parameter& parameter) { switch (index) { case paramX: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "X"; parameter.symbol = "x"; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramY: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Y"; parameter.symbol = "y"; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramOrbitSpeedX: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Orbit Speed X"; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 4.0f; parameter.ranges.min = 1.0f; parameter.ranges.max = 128.0f; break; case paramOrbitSpeedY: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Orbit Speed Y"; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 4.0f; parameter.ranges.min = 1.0f; parameter.ranges.max = 128.0f; break; case paramOrbitSizeX: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Orbit Size X"; parameter.symbol = "osl"; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramOrbitSizeY: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Orbit Size Y"; parameter.symbol = "osr"; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramSubOrbitSpeed: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "SubOrbit Speed"; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 32.0f; parameter.ranges.min = 1.0f; parameter.ranges.max = 128.0f; break; case paramSubOrbitSize: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "SubOrbit Size"; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramSubOrbitSmooth: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "SubOrbit Wave"; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramOrbitWaveX: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Orbit Wave X"; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 3.0f; parameter.ranges.min = 1.0f; parameter.ranges.max = 4.0f; break; case paramOrbitPhaseX: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Orbit Phase X"; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.0f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramOrbitPhaseY: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Orbit Phase Y"; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.0f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramOrbitWaveY: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Orbit Wave Y"; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 3.0f; parameter.ranges.min = 1.0f; parameter.ranges.max = 4.0f; break; case paramOrbitOutX: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = "Orbit X"; parameter.symbol = "orx"; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramOrbitOutY: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = "Orbit Y"; parameter.symbol = "ory"; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramSubOrbitOutX: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = "SubOrbit X"; parameter.symbol = "sorx"; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramSubOrbitOutY: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = "SubOrbit Y"; parameter.symbol = "sory"; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramW1Out: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = ""; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramW2Out: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = ""; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramMOut: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = ""; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramCOut: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = ""; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramROut: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = ""; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramSOut: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = ""; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramReOut: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = ""; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; case paramShOut: parameter.hints = PARAMETER_IS_OUTPUT; parameter.name = ""; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; } if (index>=17 && index<17+64) { //int x = (index-17)%8; //int y = (x+1)/(index-17) parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "synth"; parameter.symbol = ""; parameter.unit = ""; parameter.ranges.def = 0.5f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; } } void GrooveJuicePlugin::d_initProgramName(uint32_t index, d_string& programName) { if (index != 0) return; programName = "Default"; } // ----------------------------------------------------------------------- // Internal data float GrooveJuicePlugin::d_getParameterValue(uint32_t index) const { if (index<17 || index>=17+64) { switch (index) { case paramX: return x; case paramY: return y; case paramOrbitSizeX: return orbitSizeX; case paramOrbitSizeY: return orbitSizeY; case paramOrbitSpeedX: return orbitSpeedX; case paramOrbitSpeedY: return orbitSpeedY; case paramSubOrbitSpeed: return subOrbitSpeed; case paramSubOrbitSize: return subOrbitSize; case paramOrbitOutX: return orbitX; case paramOrbitOutY: return orbitY; case paramSubOrbitOutX: return subOrbitX; case paramSubOrbitOutY: return subOrbitY; case paramSubOrbitSmooth: return subOrbitSmooth; case paramOrbitWaveX: return orbitWaveX; case paramOrbitWaveY: return orbitWaveY; case paramOrbitPhaseX: return orbitPhaseY; case paramOrbitPhaseY: return orbitPhaseY; case paramW1Out: return synthSound[0]; case paramW2Out: return synthSound[1]; case paramMOut: return synthSound[2]; case paramCOut: return synthSound[3]; case paramROut: return synthSound[4]; case paramSOut: return synthSound[5]; case paramReOut: return synthSound[6]; case paramShOut: return synthSound[7]; default: return 0.0f; } } else { int num = (index-17); //synth params begin on #17 int x = num%8; //synth param //synth page int y = (num-(num%8))/8; return synthData[x][y]; } } void GrooveJuicePlugin::d_setParameterValue(uint32_t index, float value) { if (index<17) { switch (index) { case paramX: x = value; break; case paramY: y = value; break; case paramOrbitSpeedX: orbitSpeedX = value; resetPhase(); break; case paramOrbitSpeedY: orbitSpeedY = value; resetPhase(); break; case paramOrbitSizeX: orbitSizeX = value; break; case paramOrbitSizeY: orbitSizeY = value; break; case paramSubOrbitSpeed: subOrbitSpeed = value; resetPhase(); break; case paramSubOrbitSize: subOrbitSize = value; break; case paramSubOrbitSmooth: subOrbitSmooth = value; break; case paramOrbitWaveX: orbitWaveX = value; break; case paramOrbitWaveY: orbitWaveY = value; break; case paramOrbitPhaseX: orbitPhaseX = value; resetPhase(); break; case paramOrbitPhaseY: orbitPhaseY = value; resetPhase(); break; } } else { int num = (index-17); //synth params begin on #17 int x = num%8; //synth param //synth page int y = (num-(num%8))/8; synthData[x][y] = value; } } void GrooveJuicePlugin::d_setProgram(uint32_t index) { if (index != 0) return; /* Default parameter values */ x = 0.5f; y = 0.5f; orbitSpeedX = 4.0f; orbitSpeedY = 4.0f; orbitSizeX = 0.5f; orbitSizeY = 0.5f; subOrbitSize = 0.5f; subOrbitSpeed = 32.0f; orbitWaveX = 3.0f; orbitWaveY = 3.0f; subOrbitSmooth = 0.5f; orbitPhaseX = 0.0f; orbitPhaseY = 0.0f; /* Default variable values */ orbitX=orbitY=orbitTX=orbitTY=0.5; subOrbitX=subOrbitY=subOrbitTX=subOrbitTY=0; interpolationDivider=200; bar=tickX=tickY=percentageX=percentageY=tickOffsetX=0; tickOffsetY=sinePosX=sinePosY=tick=percentage=tickOffset=sinePos=0; waveBlend=0; synthL.setSampleRate(d_getSampleRate()); synthR.setSampleRate(d_getSampleRate()); //parameter smoothing for (int i=0; i<2; i++) { sA[i] = 0.99f; sB[i] = 1.f - sA[i]; sZ[i] = 0; } for (int x=0; x<8; x++) for (int y=0; y<8; y++) synthData[x][y] = 0.5; /* reset filter values */ d_activate(); } // ----------------------------------------------------------------------- // Process void GrooveJuicePlugin::d_activate() { //sinePos = 0; } void GrooveJuicePlugin::d_deactivate() { // all values to zero } void GrooveJuicePlugin::d_run(const float**, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) { float out1, out2, tX, tY; /* out1 = inputs[0][i]*tN(1-std::sqrt((tX*tX)+(tY*tY))); out2 = inputs[1][i]*tN(1-std::sqrt((tX*tX)+(tY*tY))); out1 += inputs[2][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+(tY*tY))); out2 += inputs[3][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+(tY*tY))); out1 += inputs[4][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+((1-tY)*(1-tY)))); out2 += inputs[5][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+((1-tY)*(1-tY)))); out1 += inputs[6][i]*tN(1-std::sqrt((tX*tX)+((1-tY)*(1-tY)))); out2 += inputs[7][i]*tN(1-std::sqrt((tX*tX)+((1-tY)*(1-tY)))); */ for (uint32_t i = 0; i