| 
							- /*
 -  * 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.
 -  */
 - 
 - #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<frames; i++) {
 - 	animate();	
 - 	tX = subOrbitX;
 - 	tY = subOrbitY;
 - 	//sum values
 - 	float c = 0.41421f; //mid segment
 - 	float d = c/1.41f; //side segments
 - 	float distances[8];
 - 	distances[0] = distance(d, 0, tX, tY);
 - 	distances[1] = distance(c+d, 0, tX, tY);
 - 	distances[2] = distance(1, d, tX, tY);
 - 	distances[3] = distance(1, c+d, tX, tY);
 - 	distances[4] = distance(d, 1, tX, tY);
 - 	distances[5] = distance(c+d, 1, tX, tY);
 - 	distances[6] = distance(0, d, tX, tY);
 - 	distances[7] = distance(0, c+d, tX, tY);
 - 	
 - 	//std::cout << distances[0] << " ";
 - 	//std::cout << tX << std::endl;
 - 	
 - 	for (int x=0; x<8; x++) {
 - 		float targetValue = 0;
 - 		for (int y=0; y<8; y++) {
 - 			targetValue += synthData[x][y]*(distances[y]);
 - 		}
 - 		synthSound[x] = tN(targetValue);
 - 	}
 - 	
 - 	//printf("wave1: %f\n", synthSound[0]);
 - 	
 - 	//std::cout << synthSound[0] << std::endl;
 - 	
 - 	synthL.setWave(0, synthSound[0]);
 - 	synthR.setWave(0, synthSound[0]);
 - 	synthL.setWave(1, synthSound[1]);
 - 	synthR.setWave(1, synthSound[1]);
 - 	synthL.setMix(synthSound[2]);
 - 	synthR.setMix(synthSound[2]);
 - 	//synthL.setCut(synthSound[3]);
 - 	//synthR.setCut(synthSound[3]);
 - 	//synthL.setReso(synthSound[4]);
 - 	//synthR.setReso(synthSound[4]);
 - 	//synthL.setDecay(synthSound[5]);
 - 	//synthR.setDecay(synthSound[5]);
 - 	synthL.setSustain(synthSound[5]);
 - 	synthR.setSustain(synthSound[5]);
 - 	synthL.setRelease(synthSound[6]);
 - 	synthR.setRelease(synthSound[6]);
 - 	synthL.setStereo(-0.5);
 - 	synthR.setStereo(0.5);
 - 	synthL.setShape(synthSound[7]);
 - 	synthR.setShape(synthSound[7]);
 - 	
 - 	float cutoff = std::exp((std::log(16000)-std::log(500))*synthSound[3]+std::log(500));
 - 	
 - 	filterL.recalc(cutoff, synthSound[4]*0.8, d_getSampleRate(), synthSound[7]);
 - 	filterR.recalc(cutoff, synthSound[4]*0.8, d_getSampleRate(), synthSound[7]);
 - 	
 - 	outputs[0][i] = filterL.process(synthL.run());
 - 	outputs[1][i] = filterR.process(synthL.run());
 - 
 -    }
 -    
 -    
 -    //outputs = buffer;
 -    
 -    for (uint32_t i = 0; i<midiEventCount; i++) {
 -         int mType = midiEvents[i].buf[0] & 0xF0;
 -         //int mChan = midiEvents[i].buf[0] & 0x0F;
 -         int mNum = midiEvents[i].buf[1];
 -         if (mType == 0x90) {
 -             //note on
 -             synthL.play(mNum);
 -             synthR.play(mNum);
 -         } else if (mType == 0x80) {
 -             //note off
 -             synthL.stop(mNum);
 -             synthR.stop(mNum);
 -         }
 -     }
 -    
 - }
 - 
 - // -----------------------------------------------------------------------
 - 
 - Plugin* createPlugin()
 - {
 -     return new GrooveJuicePlugin();
 - }
 - 
 - // -----------------------------------------------------------------------
 - 
 - END_NAMESPACE_DISTRHO
 
 
  |