LMMS
Loading...
Searching...
No Matches
WobbleJuicePlugin.cpp
Go to the documentation of this file.
1/*
2 * Wobble 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 "WobbleJuicePlugin.hpp"
19
21
22// -----------------------------------------------------------------------
23
24WobbleJuicePlugin::WobbleJuicePlugin()
25 : Plugin(paramCount, 1, 0) // 1 program, 0 states
26{
27 // set default values
28 loadProgram(0);
29}
30
31// -----------------------------------------------------------------------
32// Init
33
34void WobbleJuicePlugin::initParameter(uint32_t index, Parameter& parameter)
35{
36 switch (index)
37 {
38 case paramDivision:
39 parameter.hints = kParameterIsAutomatable|kParameterIsInteger;
40 parameter.name = "Division";
41 parameter.symbol = "div";
42 parameter.unit = "x";
43 parameter.ranges.def = 4.0f;
44 parameter.ranges.min = 1.0f;
45 parameter.ranges.max = 16.0f;
46 break;
47 case paramReso:
48 parameter.hints = kParameterIsAutomatable;
49 parameter.name = "Resonance";
50 parameter.symbol = "reso";
51 parameter.unit = "";
52 parameter.ranges.def = 0.1f;
53 parameter.ranges.min = 0.0f;
54 parameter.ranges.max = 0.2f;
55 break;
56 case paramRange:
57 parameter.hints = kParameterIsAutomatable;
58 parameter.name = "Range";
59 parameter.symbol = "rng";
60 parameter.unit = "Hz";
61 parameter.ranges.def = 16000.0f;
62 parameter.ranges.min = 500.0f;
63 parameter.ranges.max = 16000.0f;
64 break;
65 case paramPhase:
66 parameter.hints = kParameterIsAutomatable;
67 parameter.name = "Phase";
68 parameter.symbol = "phs";
69 parameter.unit = "Deg";
70 parameter.ranges.def = 0.0f;
71 parameter.ranges.min = -1.0f;
72 parameter.ranges.max = 1.0f;
73 break;
74 case paramWave:
75 parameter.hints = kParameterIsAutomatable;
76 parameter.name = "Wave";
77 parameter.symbol = "wav";
78 parameter.unit = "";
79 parameter.ranges.def = 2.0f;
80 parameter.ranges.min = 1.0f;
81 parameter.ranges.max = 4.0f;
82 break;
83 case paramDrive:
84 parameter.hints = kParameterIsAutomatable;
85 parameter.name = "Drive";
86 parameter.symbol = "drv";
87 parameter.unit = "";
88 parameter.ranges.def = 0.5f;
89 parameter.ranges.min = 0.0f;
90 parameter.ranges.max = 1.0f;
91 break;
92 }
93}
94
95void WobbleJuicePlugin::initProgramName(uint32_t index, String& programName)
96{
97 if (index != 0)
98 return;
99
100 programName = "Default";
101}
102
103// -----------------------------------------------------------------------
104// Internal data
105
106float WobbleJuicePlugin::getParameterValue(uint32_t index) const
107{
108 switch (index)
109 {
110 case paramDivision:
111 return division;
112 case paramReso:
113 return reso;
114 case paramRange:
115 return range;
116 case paramPhase:
117 return phase;
118 case paramWave:
119 return wave;
120 case paramDrive:
121 return drive;
122 default:
123 return 0.0f;
124 }
125}
126
127void WobbleJuicePlugin::setParameterValue(uint32_t index, float value)
128{
129 switch (index)
130 {
131 case paramDivision:
132 division = value;
133 break;
134 case paramReso:
135 reso = value;
136 break;
137 case paramRange:
138 range = value;
139 break;
140 case paramPhase:
141 phase = value;
142 break;
143 case paramWave:
144 wave = value;
145 break;
146 case paramDrive:
147 drive = value;
148 break;
149 }
150}
151
152void WobbleJuicePlugin::loadProgram(uint32_t index)
153{
154 if (index != 0)
155 return;
156
157 /* Default parameter values */
158 division = 4.0f;
159 reso = 0.1f;
160 range = 16000.0f;
161 phase = 0.0f;
162 wave = 2.0f;
163 drive = 0.5f;
164
165 /* Default variable values */
166 bar=tick=tickOffset=percentage=phaseOffset=currentPhaseL=0.0f;
167 currentPhaseR=posL=posR=cutoffL=cutoffR=0.0f;
168 waveType=2.0f;
169
170 /* reset filter values */
171 activate();
172}
173
174// -----------------------------------------------------------------------
175// Process
176
177void WobbleJuicePlugin::activate()
178{
179 sinePos = 0.0;
180}
181
182void WobbleJuicePlugin::run(const float** inputs, float** outputs, uint32_t frames)
183{
184 //fetch the timepos struct from host;
185 const TimePosition& time(getTimePosition());
186
187 /* sample count for one bar */
188 bar = ((120.0/(time.bbt.valid ? time.bbt.beatsPerMinute : 120.0))*(getSampleRate())); //ONE, two, three, four
189 tick = bar/(std::round(division)); //size of one target wob
190 phaseOffset = phase*M_PI; //2pi = 1 whole cycle
191
192 /* if rolling then sync to timepos */
193 if (time.playing)
194 {
195 tickOffset = time.frame-std::floor(time.frame/tick)*tick; //how much after last tick
196
197 if (tickOffset!=0) {
198 //TODO: why do we need this??
199 percentage = tickOffset/tick;
200 } else {
201 percentage = 0;
202 }
203 sinePos = (M_PI*2)*percentage;
204
205 if (sinePos>2*M_PI) {
206 //TODO: can this ever happen??
207 sinePos = 0;
208 }
209 }
210 /* else just keep on wobblin' */
211 else
212 {
213 sinePos += (M_PI)/(tick/2000); //wtf, but works
214 if (sinePos>2*M_PI) {
215 sinePos = 0;
216 }
217 }
218
219 /* phase of 0..1 filter = 500..16k */
220 currentPhaseL = getBlendedPhase(sinePos+phaseOffset, wave);
221 currentPhaseR = getBlendedPhase(sinePos-phaseOffset, wave);
222
223 /* logarithmic */
224 cutoffL = std::exp((std::log(range)-std::log(500))*currentPhaseL+std::log(500));
225 cutoffR = std::exp((std::log(range)-std::log(500))*currentPhaseR+std::log(500));
226
227 //output filtered signal
228 filterL.recalc(cutoffL, reso*4, getSampleRate(), drive);
229 filterR.recalc(cutoffR, reso*4, getSampleRate(), drive);
230 filterL.process(frames, inputs[0], outputs[0]);
231 filterR.process(frames, inputs[1], outputs[1]);
232}
233
234// -----------------------------------------------------------------------
235
237{
238 return new WobbleJuicePlugin();
239}
240
241// -----------------------------------------------------------------------
242
#define END_NAMESPACE_DISTRHO
Definition DistrhoDefines.h:191
#define START_NAMESPACE_DISTRHO
Definition DistrhoDefines.h:190
Plugin * createPlugin()
Definition WobbleJuicePlugin.cpp:236
Definition basics.h:174
Definition String.h:48
#define M_PI
Definition compat.h:149
static PuglViewHint int value
Definition pugl.h:1708
virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate)=0
unsigned int uint32_t
Definition mid.cpp:100
const AbsTime * time
Definition PADnoteParameters.h:189