LMMS
Loading...
Searching...
No Matches
VectorJuicePlugin.cpp
Go to the documentation of this file.
1/*
2 * Vector Juice Plugin
3 * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of
8 * the License, or any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * For a full copy of the GNU General Public License see the doc/GPL.txt file.
16 */
17
18#include "VectorJuicePlugin.hpp"
19
21
22// -----------------------------------------------------------------------
23
24VectorJuicePlugin::VectorJuicePlugin()
25 : Plugin(paramCount, 1, 0) // 1 program, 0 states
26{
27 // set default values
28 loadProgram(0);
29}
30
31// -----------------------------------------------------------------------
32// Init
33
34void VectorJuicePlugin::initParameter(uint32_t index, Parameter& parameter)
35{
36 switch (index)
37 {
38 case paramX:
39 parameter.hints = kParameterIsAutomatable;
40 parameter.name = "X";
41 parameter.symbol = "x";
42 parameter.ranges.def = 0.5f;
43 parameter.ranges.min = 0.0f;
44 parameter.ranges.max = 1.0f;
45 break;
46
47 case paramY:
48 parameter.hints = kParameterIsAutomatable;
49 parameter.name = "Y";
50 parameter.symbol = "y";
51 parameter.ranges.def = 0.5f;
52 parameter.ranges.min = 0.0f;
53 parameter.ranges.max = 1.0f;
54 break;
55
56 case paramOrbitSizeX:
57 parameter.hints = kParameterIsAutomatable;
58 parameter.name = "Orbit Size X";
59 parameter.symbol = "sizex";
60 parameter.ranges.def = 0.5f;
61 parameter.ranges.min = 0.0f;
62 parameter.ranges.max = 1.0f;
63 break;
64
65 case paramOrbitSizeY:
66 parameter.hints = kParameterIsAutomatable;
67 parameter.name = "Orbit Size Y";
68 parameter.symbol = "sizey";
69 parameter.ranges.def = 0.5f;
70 parameter.ranges.min = 0.0f;
71 parameter.ranges.max = 1.0f;
72 break;
73
74 case paramOrbitSpeedX:
75 parameter.hints = kParameterIsAutomatable|kParameterIsInteger;
76 parameter.name = "Orbit Speed X";
77 parameter.symbol = "speedx";
78 parameter.ranges.def = 4.0f;
79 parameter.ranges.min = 1.0f;
80 parameter.ranges.max = 128.0f;
81 break;
82
83 case paramOrbitSpeedY:
84 parameter.hints = kParameterIsAutomatable|kParameterIsInteger;
85 parameter.name = "Orbit Speed Y";
86 parameter.symbol = "speedy";
87 parameter.ranges.def = 4.0f;
88 parameter.ranges.min = 1.0f;
89 parameter.ranges.max = 128.0f;
90 break;
91
92 case paramSubOrbitSize:
93 parameter.hints = kParameterIsAutomatable;
94 parameter.name = "SubOrbit Size";
95 parameter.symbol = "subsize";
96 parameter.ranges.def = 0.5f;
97 parameter.ranges.min = 0.0f;
98 parameter.ranges.max = 1.0f;
99 break;
100
101 case paramSubOrbitSpeed:
102 parameter.hints = kParameterIsAutomatable;
103 parameter.name = "SubOrbit Speed";
104 parameter.symbol = "subspeed";
105 parameter.ranges.def = 32.0f;
106 parameter.ranges.min = 1.0f;
107 parameter.ranges.max = 128.0f;
108 break;
109
110 case paramSubOrbitSmooth:
111 parameter.hints = kParameterIsAutomatable;
112 parameter.name = "SubOrbit Wave";
113 parameter.symbol = "subwave";
114 parameter.ranges.def = 0.5f;
115 parameter.ranges.min = 0.0f;
116 parameter.ranges.max = 1.0f;
117 break;
118
119 case paramOrbitWaveX:
120 parameter.hints = kParameterIsAutomatable|kParameterIsInteger;
121 parameter.name = "Orbit Wave X";
122 parameter.symbol = "wavex";
123 parameter.ranges.def = 3.0f;
124 parameter.ranges.min = 1.0f;
125 parameter.ranges.max = 4.0f;
126 break;
127
128 case paramOrbitWaveY:
129 parameter.hints = kParameterIsAutomatable|kParameterIsInteger;
130 parameter.name = "Orbit Wave Y";
131 parameter.symbol = "wavey";
132 parameter.ranges.def = 3.0f;
133 parameter.ranges.min = 1.0f;
134 parameter.ranges.max = 4.0f;
135 break;
136
137 case paramOrbitPhaseX:
138 parameter.hints = kParameterIsAutomatable|kParameterIsInteger;
139 parameter.name = "Orbit Phase X";
140 parameter.symbol = "phasex";
141 parameter.ranges.def = 1.0f;
142 parameter.ranges.min = 1.0f;
143 parameter.ranges.max = 4.0f;
144 break;
145
146 case paramOrbitPhaseY:
147 parameter.hints = kParameterIsAutomatable|kParameterIsInteger;
148 parameter.name = "Orbit Phase Y";
149 parameter.symbol = "phasey";
150 parameter.ranges.def = 1.0f;
151 parameter.ranges.min = 1.0f;
152 parameter.ranges.max = 4.0f;
153 break;
154
155 case paramOrbitOutX:
156 parameter.hints = kParameterIsOutput;
157 parameter.name = "Orbit X";
158 parameter.symbol = "orx";
159 parameter.ranges.def = 0.5f;
160 parameter.ranges.min = 0.0f;
161 parameter.ranges.max = 1.0f;
162 break;
163
164 case paramOrbitOutY:
165 parameter.hints = kParameterIsOutput;
166 parameter.name = "Orbit Y";
167 parameter.symbol = "ory";
168 parameter.ranges.def = 0.5f;
169 parameter.ranges.min = 0.0f;
170 parameter.ranges.max = 1.0f;
171 break;
172
173 case paramSubOrbitOutX:
174 parameter.hints = kParameterIsOutput;
175 parameter.name = "SubOrbit X";
176 parameter.symbol = "sorx";
177 parameter.ranges.def = 0.5f;
178 parameter.ranges.min = 0.0f;
179 parameter.ranges.max = 1.0f;
180 break;
181
182 case paramSubOrbitOutY:
183 parameter.hints = kParameterIsOutput;
184 parameter.name = "SubOrbit Y";
185 parameter.symbol = "sory";
186 parameter.ranges.def = 0.5f;
187 parameter.ranges.min = 0.0f;
188 parameter.ranges.max = 1.0f;
189 break;
190 }
191}
192
193void VectorJuicePlugin::initProgramName(uint32_t index, String& programName)
194{
195 if (index != 0)
196 return;
197
198 programName = "Default";
199}
200
201// -----------------------------------------------------------------------
202// Internal data
203
204float VectorJuicePlugin::getParameterValue(uint32_t index) const
205{
206 switch (index)
207 {
208 case paramX:
209 return x;
210 case paramY:
211 return y;
212 case paramOrbitSizeX:
213 return orbitSizeX;
214 case paramOrbitSizeY:
215 return orbitSizeY;
216 case paramOrbitSpeedX:
217 return orbitSpeedX;
218 case paramOrbitSpeedY:
219 return orbitSpeedY;
220 case paramSubOrbitSize:
221 return subOrbitSize;
222 case paramSubOrbitSpeed:
223 return subOrbitSpeed;
224 case paramSubOrbitSmooth:
225 return subOrbitSmooth;
226 case paramOrbitWaveX:
227 return orbitWaveX;
228 case paramOrbitWaveY:
229 return orbitWaveY;
230 case paramOrbitPhaseX:
231 return orbitPhaseY;
232 case paramOrbitPhaseY:
233 return orbitPhaseY;
234 case paramOrbitOutX:
235 return orbitX;
236 case paramOrbitOutY:
237 return orbitY;
238 case paramSubOrbitOutX:
239 return subOrbitX;
240 case paramSubOrbitOutY:
241 return subOrbitY;
242 default:
243 return 0.0f;
244 }
245}
246
247void VectorJuicePlugin::setParameterValue(uint32_t index, float value)
248{
249 bool resetPhase = false;
250
251 switch (index)
252 {
253 case paramX:
254 x = value;
255 break;
256 case paramY:
257 y = value;
258 break;
259 case paramOrbitSizeX:
260 orbitSizeX = value;
261 break;
262 case paramOrbitSizeY:
263 orbitSizeY = value;
264 break;
265 case paramOrbitSpeedX:
266 orbitSpeedX = value;
267 resetPhase = true;
268 break;
269 case paramOrbitSpeedY:
270 orbitSpeedY = value;
271 resetPhase = true;
272 break;
273 case paramSubOrbitSize:
274 subOrbitSize = value;
275 break;
276 case paramSubOrbitSpeed:
277 subOrbitSpeed = value;
278 resetPhase = true;
279 break;
280 case paramSubOrbitSmooth:
281 subOrbitSmooth = value;
282 break;
283 case paramOrbitWaveX:
284 orbitWaveX = value;
285 break;
286 case paramOrbitWaveY:
287 orbitWaveY = value;
288 break;
289 case paramOrbitPhaseX:
290 orbitPhaseX = value;
291 resetPhase = true;
292 break;
293 case paramOrbitPhaseY:
294 orbitPhaseY = value;
295 resetPhase = true;
296 break;
297 }
298
299 if (resetPhase)
300 {
301 sinePosX = 0;
302 sinePosY = 0;
303 sinePos = 0;
304 }
305}
306
307void VectorJuicePlugin::loadProgram(uint32_t index)
308{
309 if (index != 0)
310 return;
311
312 /* Default parameter values */
313 x = 0.5f;
314 y = 0.5f;
315 orbitSizeX = 0.5f;
316 orbitSizeY = 0.5f;
317 orbitSpeedX = 4.0f;
318 orbitSpeedY = 4.0f;
319 subOrbitSize = 0.5f;
320 subOrbitSpeed = 32.0f;
321 subOrbitSmooth = 0.5f;
322 orbitWaveX = 3.0f;
323 orbitWaveY = 3.0f;
324 orbitPhaseX = 1.0f;
325 orbitPhaseY = 1.0f;
326
327 /* reset filter values */
328 activate();
329}
330
331// -----------------------------------------------------------------------
332// Process
333
334void VectorJuicePlugin::activate()
335{
336 /* Default variable values */
337 orbitX=orbitY=orbitTX=orbitTY=0.5;
338 subOrbitX=subOrbitY=subOrbitTX=subOrbitTY=0;
339 interpolationDivider=200;
340 bar=tickX=tickY=percentageX=percentageY=tickOffsetX=0;
341 tickOffsetY=sinePosX=sinePosY=tick=percentage=tickOffset=sinePos=0;
342 waveBlend=0;
343
344 //parameter smoothing
345 for (int i=0; i<2; i++) {
346 sA[i] = 0.99f;
347 sB[i] = 1.f - sA[i];
348 sZ[i] = 0;
349 }
350}
351
352void VectorJuicePlugin::run(const float** inputs, float** outputs, uint32_t frames)
353{
354 float out1, out2, tX, tY;
355
356 for (uint32_t i=0; i<frames; i++) {
357 //1.41421 -> 1
358 //<0 = 0
359
360 animate();
361
362 tX = subOrbitX;
363 tY = subOrbitY;
364
365 out1 = inputs[0][i]*tN(1-std::sqrt((tX*tX)+(tY*tY)));
366 out2 = inputs[1][i]*tN(1-std::sqrt((tX*tX)+(tY*tY)));
367
368 out1 += inputs[2][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+(tY*tY)));
369 out2 += inputs[3][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+(tY*tY)));
370
371 out1 += inputs[4][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+((1-tY)*(1-tY))));
372 out2 += inputs[5][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+((1-tY)*(1-tY))));
373
374 out1 += inputs[6][i]*tN(1-std::sqrt((tX*tX)+((1-tY)*(1-tY))));
375 out2 += inputs[7][i]*tN(1-std::sqrt((tX*tX)+((1-tY)*(1-tY))));
376
377 outputs[0][i] = out1;
378 outputs[1][i] = out2;
379 }
380}
381
382// -----------------------------------------------------------------------
383
385{
386 return new VectorJuicePlugin();
387}
388
389// -----------------------------------------------------------------------
390
#define END_NAMESPACE_DISTRHO
Definition DistrhoDefines.h:191
#define START_NAMESPACE_DISTRHO
Definition DistrhoDefines.h:190
Plugin * createPlugin()
Definition VectorJuicePlugin.cpp:384
Definition basics.h:174
Definition String.h:48
int y
Definition inflate.c:1588
register unsigned i
Definition inflate.c:1575
unsigned x[BMAX+1]
Definition inflate.c:1586
static PuglViewHint int value
Definition pugl.h:1708
unsigned int uint32_t
Definition mid.cpp:100