| 
							- /*
 -  * Vector Juice Plugin
 -  * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, 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.
 -  */
 - 
 - #ifndef VECTORJUICEPLUGIN_HPP_INCLUDED
 - #define VECTORJUICEPLUGIN_HPP_INCLUDED
 - 
 - #include "DistrhoPlugin.hpp"
 - 
 - START_NAMESPACE_DISTRHO
 - 
 - // -----------------------------------------------------------------------
 - 
 - class VectorJuicePlugin : public Plugin
 - {
 - public:
 -     enum Parameters
 -     {
 -         paramX = 0,
 -         paramY,
 -         paramOrbitSizeX,
 -         paramOrbitSizeY,
 -         paramOrbitSpeedX,
 -         paramOrbitSpeedY,
 -         paramSubOrbitSize,
 -         paramSubOrbitSpeed,
 -         paramSubOrbitSmooth,
 -         paramOrbitWaveX,
 -         paramOrbitWaveY,
 -         paramOrbitPhaseX,
 -         paramOrbitPhaseY,
 -         paramOrbitOutX,
 -         paramOrbitOutY,
 -         paramSubOrbitOutX,
 -         paramSubOrbitOutY,
 -         paramCount
 -     };
 - 
 -     float smoothParameter(float in, int axis) {
 -         sZ[axis] = (in * sB[axis]) + (sZ[axis] * sA[axis]);
 -         return sZ[axis];
 -     }
 - 
 -     float getSinePhase(float x) {
 -         return (-std::sin(x));
 -     }
 -     float getSawPhase(float x) {
 -         return (-(2/M_PI *std::atan(1/std::tan(x/2))));
 -     }
 -     float getRevSawPhase(float x) {
 -         return ((2/M_PI *std::atan(1/std::tan(x/2))));
 -     }
 -     float getSquarePhase(float x) {
 -         return (std::round((std::sin(x)+1)/2)-0.5)*2;
 -     }
 - 
 -     //saw, sqr, sin, revSaw
 -     float getBlendedPhase(float x, float wave)
 -     {
 -         //wave = 2;
 -         if (wave>=1 && wave<2) {
 -             /* saw vs sqr */
 -             waveBlend = wave-1;
 -             return (getSawPhase(x)*(1-waveBlend) + getSquarePhase(x)*waveBlend);
 -         } else if (wave>=2 && wave<3) {
 -             /* sqr vs sin */
 -             waveBlend = wave-2;
 -             return (getSquarePhase(x)*(1-waveBlend) + getSinePhase(x)*waveBlend);
 -         } else if (wave>=3 && wave<=4) {
 -             /* sin vs revSaw */
 -             waveBlend = wave-3;
 -             return (getSinePhase(x)*(1-waveBlend) + getRevSawPhase(x)*waveBlend);
 -         } else {
 -             return 0.0f;
 -         }
 -     }
 - 
 -     float tN(float x)
 -     {
 -         if (x>0) return x;
 -         else return 0;
 -     }
 - 
 -     void animate()
 -     {
 -         //sync orbit with frame, bpm
 -         const TimePosition& time(getTimePosition());
 -         bar = ((120.0/(time.bbt.valid ? time.bbt.beatsPerMinute : 120.0))*(getSampleRate()));
 - 
 -         int multiplier = 16;//2000*4;
 -         tickX = bar/(std::round(orbitSpeedX))*multiplier;
 -         tickY = bar/(std::round(orbitSpeedY))*multiplier;
 -         tick = bar/(std::round(subOrbitSpeed))*multiplier;
 - 
 -         if (time.playing)
 -         {
 -             /* if rolling then sync to timepos */
 -             tickOffsetX = time.frame-std::floor(time.frame/tickX)*tickX;
 -             tickOffsetY = time.frame-std::floor(time.frame/tickY)*tickY;
 -             tickOffset = time.frame-std::floor(time.frame/tick)*tick;
 -             percentageX = tickOffsetX/tickX;
 -             percentageY = tickOffsetY/tickY;
 -             percentage = tickOffset/tick;
 -             sinePosX = (M_PI*2)*percentageX;
 -             sinePosY = (M_PI*2)*percentageY;
 -             sinePos = (M_PI*2)*percentage;
 -         } else {
 -             /* else just keep on wobblin' */
 -             sinePosX += (2*M_PI)/(tickX);
 -             sinePosY += (2*M_PI)/(tickY);
 -             sinePos += (M_PI)/(tick);
 -             if (sinePosX>2*M_PI) {
 -                 sinePosX = 0;
 -             }
 -             if (sinePosY>2*M_PI) {
 -                 sinePosY = 0;
 -             }
 -             if (sinePos>2*M_PI) {
 -                 sinePos = 0;
 -             }
 -         }
 - 
 -         //0..1
 -         //0..3
 -         //0, 1, 2, 3
 -         //* 0.25
 -         //0, 0.25, 0.5, 0.75
 - 
 -         float tempPhaseX = std::round(orbitPhaseX)*0.25-0.25;
 -         float tempPhaseY = std::round(orbitPhaseY)*0.25-0.25;
 - 
 -         orbitX = x+getBlendedPhase(sinePosX + tempPhaseX*(2*M_PI), std::round(orbitWaveX))*(orbitSizeX/2);
 -         orbitY = y+getBlendedPhase(sinePosY+M_PI/2 + tempPhaseY*(2*M_PI), std::round(orbitWaveY))*(orbitSizeY/2);
 -         subOrbitX = smoothParameter(orbitX+getBlendedPhase(sinePos, 3)*(subOrbitSize/3), 0);
 -         subOrbitY = smoothParameter(orbitY+getBlendedPhase(sinePos+M_PI/2, 3)*(subOrbitSize/3), 1);
 -         if (orbitX<0) orbitX=0;
 -         if (orbitX>1) orbitX=1;
 -         if (orbitY<0) orbitY=0;
 -         if (orbitY>1) orbitY=1;
 - 
 -         if (subOrbitX<0) subOrbitX=0;
 -         if (subOrbitX>1) subOrbitX=1;
 -         if (subOrbitY<0) subOrbitY=0;
 -         if (subOrbitY>1) subOrbitY=1;
 -     }
 - 
 -     VectorJuicePlugin();
 - 
 - protected:
 -     // -------------------------------------------------------------------
 -     // Information
 - 
 -     const char* getLabel() const noexcept override
 -     {
 -         return "VectorJuice";
 -     }
 - 
 -     const char* getMaker() const noexcept override
 -     {
 -         return "Andre Sklenar";
 -     }
 - 
 -     const char* getLicense() const noexcept override
 -     {
 -         return "GPL v2+";
 -     }
 - 
 -     uint32_t getVersion() const noexcept override
 -     {
 -         return 0x1000;
 -     }
 - 
 -     int64_t getUniqueId() const noexcept override
 -     {
 -         return d_cconst('V', 'e', 'c', 'J');
 -     }
 - 
 -     // -------------------------------------------------------------------
 -     // Init
 - 
 -     void initParameter(uint32_t index, Parameter& parameter) override;
 -     void initProgramName(uint32_t index, String& programName) override;
 - 
 -     // -------------------------------------------------------------------
 -     // Internal data
 - 
 -     float getParameterValue(uint32_t index) const override;
 -     void  setParameterValue(uint32_t index, float value) override;
 -     void  loadProgram(uint32_t index) override;
 - 
 -     // -------------------------------------------------------------------
 -     // Process
 - 
 -     void activate() override;
 -     void run(const float** inputs, float** outputs, uint32_t frames) override;
 - 
 -     // -------------------------------------------------------------------
 - 
 - private:
 -     float x, y;
 -     float orbitX, orbitY;
 -     float orbitTX, orbitTY; //targetX and targetY for interpolation
 -     float subOrbitX, subOrbitY;
 -     float subOrbitTX, subOrbitTY;
 -     float subOrbitSpeed, subOrbitSize, orbitSpeedX, orbitSpeedY;
 -     float orbitSizeX, orbitSizeY;
 -     float interpolationDivider;
 - 
 -     float bar, tickX, tickY, percentageX, percentageY, tickOffsetX, tickOffsetY;
 -     float sinePosX, sinePosY, tick, percentage, tickOffset, sinePos;
 - 
 -     float orbitWaveX, orbitWaveY, subOrbitSmooth, waveBlend;
 -     float orbitPhaseX, orbitPhaseY;
 - 
 -     //parameter smoothing, for subOrbitX and subOrbitY
 -     float sA[2], sB[2], sZ[2];
 - };
 - 
 - // -----------------------------------------------------------------------
 - 
 - END_NAMESPACE_DISTRHO
 - 
 - #endif  // VECTORJUICE_HPP_INCLUDED
 
 
  |