1 //-----------------------------------------------------
2 // name: "emptty"
3 // version: "0.01"
4 // author: "brummer"
5 // license: "BSD"
6 // copyright: "(c)brummer 2008"
7 //
8 // Code generated with Faust 0.9.9.4k-par (http://faust.grame.fr)
9 //-----------------------------------------------------
10 /* link with */
11 #include <math.h>
12 #include <math.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <stdio.h>
16
17 #include <stack>
18 #include <string>
19 #include <iostream>
20 #include <map>
21
22 #include "ladspa.h"
23
24
25 using namespace std;
26
27 struct Meta : map<const char*, const char*>
28 {
declareMeta29 void declare (const char* key, const char* value) { (*this)[key]=value; }
30 };
31
32
33 #define max(x,y) (((x)>(y)) ? (x) : (y))
34 #define min(x,y) (((x)<(y)) ? (x) : (y))
35
36 #define sym(name) xsym(name)
37 #define xsym(name) #name
38
39
40 // abs is now predefined
41 //template<typename T> T abs (T a) { return (a<T(0)) ? -a : a; }
42
43
lsr(int x,int n)44 inline int lsr (int x, int n) { return int(((unsigned int)x) >> n); }
45
int2pow2(int x)46 inline int int2pow2 (int x) { int r=0; while ((1<<r)<x) r++; return r; }
47
48
49
50 /******************************************************************************
51 *******************************************************************************
52
53 VECTOR INTRINSICS
54
55 *******************************************************************************
56 *******************************************************************************/
57
58 //inline void *aligned_calloc(size_t nmemb, size_t size) { return (void*)((unsigned)(calloc((nmemb*size)+15,sizeof(char)))+15 & 0xfffffff0); }
59 //inline void *aligned_calloc(size_t nmemb, size_t size) { return (void*)((size_t)(calloc((nmemb*size)+15,sizeof(char)))+15 & ~15); }
60
61
62
63
64
65
66
67 //---------------------Abstract User Interface--------------------
68 //
69 // Abstract definitdision of a User Interface to be passed to the
70 // buildUserInterface methoddis of a Faust Signal Processor
71 //
72 //----------------------------------------------------------------
73
74 class UI
75 {
76 bool fStopped;
77 public:
78
UI()79 UI() : fStopped(false) {}
~UI()80 virtual ~UI() {}
81
82 virtual void addButton(const char* label, float* zone) = 0;
83 virtual void addToggleButton(const char* label, float* zone) = 0;
84 virtual void addCheckButton(const char* label, float* zone) = 0;
85 virtual void addVerticalSlider(const char* label, float* zone, float initdis, float min, float max, float step) = 0;
86 virtual void addVerticalSlider1(const char* label, float* zone, float initdis, float min, float max, float step) = 0;
87 virtual void addVerticalSlider0(const char* label, float* zone, float initdis, float min, float max, float step) = 0;
88 virtual void addHorizontalSlider(const char* label, float* zone, float initdis, float min, float max, float step) = 0;
89 virtual void addNumEntry(const char* label, float* zone, float initdis, float min, float max, float step) = 0;
90
91 // -- passive widgets
92
93 virtual void addNumDisplay(const char* label, float* zone, int precision) = 0;
94 virtual void addTextDisplay(const char* label, float* zone, char* names[], float min, float max) = 0;
95 virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max) = 0;
96 virtual void addVerticalBargraph(const char* label, float* zone, float min, float max) = 0;
97
98 // -- frames and labels
99
100 virtual void openFrameBox(const char* label) = 0;
101 virtual void openTabBox(const char* label) = 0;
102 virtual void openHorizontalBox(const char* label) = 0;
103 virtual void openVerticalBox(const char* label) = 0;
104 virtual void closeBox() = 0;
105
106 virtual void show() = 0;
107 virtual void run() = 0;
108
stop()109 void stop() { fStopped = true; }
stopped()110 bool stopped() { return fStopped; }
111
declare(float * zone,const char * key,const char * value)112 virtual void declare(float* zone, const char* key, const char* value) {}
113 };
114
115
116
117 //------------------Abstract Signal Processor---------------------
118 //
119 // Abstract definitdision of a Faust Signal Processor
120 //
121 //----------------------------------------------------------------
122
123 class dsp {
124 protected:
125 int fSamplingFreq;
126 public:
dsp()127 dsp() {}
~dsp()128 virtual ~dsp() {}
129 virtual int getNumInputs() = 0;
130 virtual int getNumOutputs() = 0;
131 virtual void buildUserInterface(UI* interface) = 0;
132 virtual void initdis(int samplingRate) = 0;
133 virtual void compute(int len, float** inputs, float** outputs) = 0;
134 };
135
136
137 //----------------------------------------------------------------------------
138 // FAUST generated code
139 //----------------------------------------------------------------------------
140
141
142 class distdsp : public dsp {
143 private:
144 float drive;
145 float overdrive4;
146
147 float fslider5;
148 float fslider4;
149 float fVec5[2];
150 float fRec0[2];
151 float fslider6;
152 float fentry0;
153 float fConst0;
154 float fVec1[2];
155 float fRec3[2];
156 float fentry1;
157 float fcheckbox0;
158 float fslider0;
159 int IOTA;
160 float fVec0[4096];
161 float fslider1;
162 float fRec1[2];
163
164 float fConst1;
165 float fConst2;
166 float fVec2[2];
167 float fRec2[2];
168 float fslider2;
169 float fslider3;
170 float fVec3[2];
171 float fRec7[2];
172 float fVec4[2];
173 float fRec6[2];
174 float fRec5[3];
175 float fRec4[3];
176 float fcheckbox1;
177 float fRec8[2];
178 float fVec6[2];
179 float fRec12[2];
180 float fVec7[2];
181 float fRec11[2];
182 float fRec10[3];
183 float fRec9[3];
184 float fRecover0[2];
185
186 public:
metadata(Meta * m)187 static void metadata(Meta* m) {
188 m->declare("name", "distortion");
189 m->declare("version", "0.1");
190 m->declare("author", "brummer");
191 m->declare("license", "GPL");
192 }
193
getNumInputs()194 virtual int getNumInputs() { return 1; }
getNumOutputs()195 virtual int getNumOutputs() { return 1; }
classinitdis(int samplingFreq)196 static void classinitdis(int samplingFreq) {
197 }
instanceinitdis(int samplingFreq)198 virtual void instanceinitdis(int samplingFreq) {
199 fSamplingFreq = samplingFreq;
200 fslider0 = 0.12f;
201 IOTA = 0;
202 for (int i=0; i<4096; i++) fVec0[i] = 0;
203 fslider1 = 0.5f;
204 for (int i=0; i<2; i++) fRec1[i] = 0;
205 fentry0 = 5000.0f;
206 fConst0 = (3.141593f / fSamplingFreq);
207 for (int i=0; i<2; i++) fVec1[i] = 0;
208 for (int i=0; i<2; i++) fRec3[i] = 0;
209 fentry1 = 130.0f;
210 fConst1 = (3.141593f * fSamplingFreq);
211 fConst2 = (0.5f / fSamplingFreq);
212 for (int i=0; i<2; i++) fVec2[i] = 0;
213 for (int i=0; i<2; i++) fRec2[i] = 0;
214 fcheckbox0 = 1.0;
215 fslider2 = 5000.0f;
216 fslider3 = 130.0f;
217 for (int i=0; i<2; i++) fVec3[i] = 0;
218 for (int i=0; i<2; i++) fRec7[i] = 0;
219 for (int i=0; i<2; i++) fVec4[i] = 0;
220 for (int i=0; i<2; i++) fRec6[i] = 0;
221 for (int i=0; i<3; i++) fRec5[i] = 0;
222 for (int i=0; i<3; i++) fRec4[i] = 0;
223 fcheckbox1 = 1.0;
224 fslider4 = 0.0f;
225 fslider5 = 0.64f;
226 for (int i=0; i<2; i++) fVec5[i] = 0;
227 for (int i=0; i<2; i++) fRec0[i] = 0;
228 fslider6 = 0.0f;
229 for (int i=0; i<2; i++) fRec8[i] = 0;
230 for (int i=0; i<2; i++) fVec6[i] = 0;
231 for (int i=0; i<2; i++) fRec12[i] = 0;
232 for (int i=0; i<2; i++) fVec7[i] = 0;
233 for (int i=0; i<2; i++) fRec11[i] = 0;
234 for (int i=0; i<3; i++) fRec10[i] = 0;
235 for (int i=0; i<3; i++) fRec9[i] = 0;
236 drive = 0.0f;
237 overdrive4 = 0.0;
238 for (int i=0; i<2; i++) fRecover0[i] = 0;
239 }
initdis(int samplingFreq)240 virtual void initdis(int samplingFreq) {
241 classinitdis(samplingFreq);
242 instanceinitdis(samplingFreq);
243 }
buildUserInterface(UI * interface)244 virtual void buildUserInterface(UI* interface) {
245 interface->openHorizontalBox("distortion");
246 // interface->openVerticalBox("overdrive");
247 interface->addVerticalSlider("overdrive ", &drive, 0.0f, 1.0f, 20.0f, 0.1f);
248 interface->addToggleButton("driveover", &overdrive4);
249 // interface->closeBox();
250 interface->addVerticalSlider("drive", &fslider5, 0.64f, 0.0f, 1.0f, 0.01f);
251 interface->addVerticalSlider0("drivelevel", &fslider4, 0.0f, 0.0f, 1.0f, 0.01f);
252 interface->addVerticalSlider("drivegain", &fslider6, 0.0f, -20.0f, 20.0f, 0.1f);
253 //interface->openHorizontalBox("low/highpass");
254 //interface->openVerticalBox("");
255 interface->addHorizontalSlider("highpass", &fentry1, 130.0f, 8.0f, 1000.0f, 1.0f);
256 interface->addVerticalSlider("lowpass", &fentry0, 5000.0f, 1000.0f, 10000.0f, 1.0f);
257 //interface->closeBox();
258 interface->addCheckButton("low_highpass", &fcheckbox0);
259 //interface->closeBox();
260 //interface->openHorizontalBox("low/highcut");
261 interface->addVerticalSlider("highcut", &fslider2, 5000.0f, 1000.0f, 10000.0f, 1.0f);
262 interface->addHorizontalSlider("lowcut", &fslider3, 130.0f, 8.0f, 1000.0f, 1.0f);
263 interface->addCheckButton("low_highcut", &fcheckbox1);
264 //interface->closeBox();
265 //interface->openVerticalBox("resonanz");
266 interface->addVerticalSlider1("trigger", &fslider0, 1.0f, 0.0f, 1.0f,0.01f);
267 interface->addVerticalSlider1("vibrato", &fslider1, 0.5f, 0.01f, 1.0f, 0.01f);
268 //interface->closeBox();
269 interface->closeBox();
270 }
compute(int count,float ** input,float ** output)271 virtual void compute (int count, float** input, float** output) {
272 float fSlow0 = (1.0f - fslider0);
273 float fSlow1 = fslider1;
274 int iSlow2 = int((int((fSlow1 - 1)) & 4095));
275 int iSlow3 = int((int(fSlow1) & 4095));
276 float fSlow4 = (1.0f / tanf((fConst0 * fentry0)));
277 float fSlow5 = (fSlow4 - 1);
278 float fSlow6 = (1.0f / (1 + fSlow4));
279 float fSlow7 = (1.0f / tanf((fConst2 * (fConst1 - (6.283185f * fentry1)))));
280 float fSlow8 = (1 + fSlow7);
281 float fSlow9 = (1.0f / fSlow8);
282 float fSlow10 = (0 - ((fSlow7 - 1) / fSlow8));
283 int iSlow11 = int(fcheckbox0);
284 float fSlow12 = tanf((fConst0 * fslider2));
285 float fSlow13 = (2 * (1 - (1.0f / (fSlow12 * fSlow12))));
286 float fSlow14 = (1.0f / fSlow12);
287 float fSlow15 = (1 + ((fSlow14 - 0.765367f) / fSlow12));
288 float fSlow16 = (1.0f / (1 + ((0.765367f + fSlow14) / fSlow12)));
289 float fSlow17 = (1 + ((fSlow14 - 1.847759f) / fSlow12));
290 float fSlow18 = (1.0f / (1 + ((1.847759f + fSlow14) / fSlow12)));
291 float fSlow19 = (fConst0 * fslider3);
292 float fSlow20 = (1.0f / (1 + fSlow19));
293 float fSlow21 = (1 - fSlow19);
294 int iSlow22 = int(fcheckbox1);
295 float fSlow23 = fslider4;
296 float drivem1 = drive - 1.0f;
297 float fSlow24 = powf(10.0f, (2 * fslider5));
298 float fSlow25 = (9.999871e-04f * powf(10, (5.000000e-02f * (fslider6 - 10))));
299 float fSlowover0 = (9.999871e-04f * powf(10, (5.000000e-02f * (drive*-0.5))));
300 float* input0 = input[0];
301 float* output0 = output[0];
302 for (int i=0; i<count; i++) {
303 float S0[2];
304 float S1[2];
305 float S2[2];
306 float fTempi0 = input0[i];
307 if (overdrive4 == 1.0) // overdrive
308 {
309 float fTempdr0 = fTempi0 ;
310 float fTempdr1 = fabs(fTempdr0);
311 fRecover0[0] = (fSlowover0 + (0.999000f * fRecover0[1]));
312 fTempi0 = (fTempdr0*(fTempdr1 + drive)/(fTempdr0*fTempdr0 + drivem1*fTempdr1 + 1.0f))*fRecover0[0];
313 }
314 float fTemp0 = (fTempi0 + (fSlow0 * fRec1[1]));
315 fVec0[IOTA&4095] = fTemp0;
316 fRec1[0] = (0.5f * (fVec0[(IOTA-iSlow3)&4095] + fVec0[(IOTA-iSlow2)&4095]));
317 S2[0] = fRec1[0];
318 fVec1[0] = (fSlow6 * fRec1[0]);
319 fRec3[0] = (fVec1[1] + (fSlow6 * (fRec1[0] + (fSlow5 * fRec3[1]))));
320 float fTemp1 = (fSlow9 * fRec3[0]);
321 fVec2[0] = fTemp1;
322 fRec2[0] = ((fVec2[0] + (fSlow10 * fRec2[1])) - fVec2[1]);
323 S2[1] = fRec2[0];
324 float fTemp2 = S2[iSlow11];
325 S1[0] = fTemp2;
326 fVec3[0] = (fSlow20 * fTemp2);
327 fRec7[0] = ((fSlow20 * (fTemp2 + (fSlow21 * fRec7[1]))) - fVec3[1]);
328 fVec4[0] = (fSlow20 * fRec7[0]);
329 fRec6[0] = ((fSlow20 * (fRec7[0] + (fSlow21 * fRec6[1]))) - fVec4[1]);
330 fRec5[0] = (fRec6[0] - (fSlow18 * ((fSlow17 * fRec5[2]) + (fSlow13 * fRec5[1]))));
331 fRec4[0] = ((fSlow18 * (fRec5[2] + (fRec5[0] + (2 * fRec5[1])))) - (fSlow16 * ((fSlow15 * fRec4[2]) + (fSlow13 * fRec4[1]))));
332 S1[1] = (fSlow16 * (fRec4[2] + (fRec4[0] + (2 * fRec4[1]))));
333 float fTemp3 = max(-1, min(1, (fSlow24 * (fSlow23 + S1[iSlow22]))));
334 float fTemp4 = (fTemp3 * (1 - (0.333333f * (fTemp3 * fTemp3))));
335 fVec5[0] = fTemp4;
336 fRec0[0] = ((fVec5[0] + (0.995f * fRec0[1])) - fVec5[1]);
337 fRec8[0] = (fSlow25 + (0.999f * fRec8[1]));
338 float fTemp5 = (fRec8[0] * fRec0[0]);
339 S0[0] = fTemp5;
340 fVec6[0] = (fSlow20 * fTemp5);
341 fRec12[0] = ((fSlow20 * (fTemp5 + (fSlow21 * fRec12[1]))) - fVec6[1]);
342 fVec7[0] = (fSlow20 * fRec12[0]);
343 fRec11[0] = ((fSlow20 * (fRec12[0] + (fSlow21 * fRec11[1]))) - fVec7[1]);
344 fRec10[0] = (fRec11[0] - (fSlow18 * ((fSlow17 * fRec10[2]) + (fSlow13 * fRec10[1]))));
345 fRec9[0] = ((fSlow18 * (fRec10[2] + (fRec10[0] + (2 * fRec10[1])))) - (fSlow16 * ((fSlow15 * fRec9[2]) + (fSlow13 * fRec9[1]))));
346 S0[1] = (fSlow16 * (fRec9[2] + (fRec9[0] + (2 * fRec9[1]))));
347 output0[i] = S0[iSlow22];
348 // post processing
349 fRec9[2] = fRec9[1]; fRec9[1] = fRec9[0];
350 fRec10[2] = fRec10[1]; fRec10[1] = fRec10[0];
351 fRec11[1] = fRec11[0];
352 fVec7[1] = fVec7[0];
353 fRec12[1] = fRec12[0];
354 fVec6[1] = fVec6[0];
355 fRec8[1] = fRec8[0];
356 fRec0[1] = fRec0[0];
357 fVec5[1] = fVec5[0];
358 fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0];
359 fRec5[2] = fRec5[1]; fRec5[1] = fRec5[0];
360 fRec6[1] = fRec6[0];
361 fVec4[1] = fVec4[0];
362 fRec7[1] = fRec7[0];
363 fVec3[1] = fVec3[0];
364 fRec2[1] = fRec2[0];
365 fVec2[1] = fVec2[0];
366 fRec3[1] = fRec3[0];
367 fVec1[1] = fVec1[0];
368 fRec1[1] = fRec1[0];
369 fRecover0[1] = fRecover0[0];
370 IOTA = IOTA+1;
371 }
372 }
373 };
374
375
376
377
378
379
380
381 //-----------------------------------portCollectord--------------------------------------
382 //
383 // portCollectord is passed to the buildUserInterface methoddis of a dsp object
384 // in order to build a description of its inputs, outputs and control ports.
385 // This description is used to fill a LADSPA_Descriptor
386 //
387 //--------------------------------------------------------------------------------------
388
389
390
391 //--------------------------------useful constants--------------------------------------
392
393 #define MAXPORT 1024
394 static const int ICONTROL = LADSPA_PORT_INPUT|LADSPA_PORT_CONTROL;
395 static const int OCONTROL = LADSPA_PORT_OUTPUT|LADSPA_PORT_CONTROL;
396 static const int RANGE = LADSPA_PORT_INPUT|LADSPA_PORT_CONTROL;
397
398 static const char* inames[] = {
399 "input00", "input01", "input02", "input03", "input04",
400 "input05", "input06", "input07", "input08", "input09",
401 "input10", "input11", "input12", "input13", "input14",
402 "input15", "input16", "input17", "input18", "input19",
403 "input20", "input21", "input22", "input23", "input24",
404 "input25", "input26", "input27", "input28", "input29",
405 "input30", "input31", "input32", "input33", "input34",
406 "input35", "input36", "input37", "input38", "input39"
407 };
408
409 static const char* onames[] = {
410 "output00", "output01", "output02", "output03", "output04",
411 "output05", "output06", "output07", "output08", "output09",
412 "output10", "output11", "output12", "output13", "output14",
413 "output15", "output16", "output17", "output18", "output19",
414 "output20", "output21", "output22", "output23", "output24",
415 "output25", "output26", "output27", "output28", "output29",
416 "output30", "output31", "output32", "output33", "output34",
417 "output35", "output36", "output37", "output38", "output39"
418 };
419
420
421
422 class portCollectord : public UI
423 {
424 private:
425
426 //--------------------------------------------------------------------------------------
427
428 const int fInsCount; // number of audio input ports
429 const int fOutsCount; // number of audio output ports
430 int fCtrlCount; // number of control ports
431
432 LADSPA_PortDescriptor fPortDescs[MAXPORT]; // table of port descriptors to be used in a LADSPA_Descriptor
433 const char* fPortNames[MAXPORT]; // table of port names to be used in a LADSPA_Descriptor
434 LADSPA_PortRangeHint fPortHints[MAXPORT]; // table of port hints to be used in a LADSPA_Descriptor
435
436 string fPluginName; // toplevel prefix used as plugin name
437 stack<string> fPrefix; // current prefix for controls name
438
439
440 //--------------------------------------------------------------------------------------
simplify(const string & src)441 string simplify(const string& src)
442 {
443 int i=0;
444 int level=2;
445 string dst;
446
447 while (src[i] ) {
448
449 switch (level) {
450
451 case 0 :
452 case 1 :
453 case 2 :
454 // Skip the begin of the label "--foo-"
455 // until 3 '-' have been read
456 if (src[i]=='-') { level++; }
457 break;
458
459 case 3 :
460 // copy the content, but skip non alphnum
461 // and content in parenthesis
462 switch (src[i]) {
463 case '(' :
464 case '[' :
465 level++;
466 break;
467
468 case '-' :
469 dst += '-';
470 break;
471
472 default :
473 if (isalnum(src[i])) {
474 dst+= tolower(src[i]);
475 }
476
477 }
478 break;
479
480 default :
481 // here we are inside parenthesis and
482 // we skip the content until we are back to
483 // level 3
484 switch (src[i]) {
485
486 case '(' :
487 case '[' :
488 level++;
489 break;
490
491 case ')' :
492 case ']' :
493 level--;
494 break;
495
496 default :
497 break;
498 }
499
500 }
501 i++;
502 }
503 return (dst.size() > 0) ? dst :src;
504 }
505
addPortDescrdis(int type,const char * label,int hint,float min=0.0,float max=0.0)506 void addPortDescrdis(int type, const char* label, int hint, float min=0.0, float max=0.0)
507 {
508 string fullname = simplify(fPrefix.top() + "-" + label);
509 char * str = strdup(fullname.c_str());
510
511 fPortDescs[fInsCount + fOutsCount + fCtrlCount] = type;
512 fPortNames[fInsCount + fOutsCount + fCtrlCount] = str;
513 fPortHints[fInsCount + fOutsCount + fCtrlCount].HintDescriptor = hint;
514 fPortHints[fInsCount + fOutsCount + fCtrlCount].LowerBound = min;
515 fPortHints[fInsCount + fOutsCount + fCtrlCount].UpperBound = max;
516 fCtrlCount++;
517 }
518
openAnyBox(const char * label)519 void openAnyBox(const char* label)
520 {
521 if (fPrefix.size() == 0) {
522 // top level label is used as plugin name
523 fPluginName = label;
524 fPrefix.push(label);
525
526 } else {
527 string s;
528 if (label && label[0]) {
529 s = fPrefix.top() + "-" + label;
530 } else {
531 s = fPrefix.top();
532 }
533 fPrefix.push(s);
534 }
535
536 }
537
538
539
540 public:
541
542
543 //--------------------------------Collect the audio ports-------------------------------
544
portCollectord(int ins,int outs)545 portCollectord(int ins, int outs) : UI(), fInsCount(ins), fOutsCount(outs), fCtrlCount(0)
546 {
547 for (int i = 0; i < ins; i++) {
548 fPortDescs[i] = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO | LADSPA_HINT_DEFAULT_NONE;
549 fPortNames[i] = inames[i];
550 fPortHints[i].HintDescriptor = 0;
551 }
552 for (int j = 0; j < outs; j++) {
553 fPortDescs[ins + j] = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO | LADSPA_HINT_DEFAULT_NONE;
554 fPortNames[ins + j] = onames[j];
555 fPortHints[ins + j].HintDescriptor = 0;
556 }
557 };
558
~portCollectord()559 virtual ~portCollectord() {}
560
561
562
563 //------------------------------Collect the control ports-------------------------------
564
addButton(const char * label,float * zone)565 virtual void addButton(const char* label, float* zone) {
566 addPortDescrdis(ICONTROL, label, LADSPA_HINT_TOGGLED);
567 }
568
addToggleButton(const char * label,float * zone)569 virtual void addToggleButton(const char* label, float* zone) {
570 addPortDescrdis(ICONTROL, label, LADSPA_HINT_TOGGLED| LADSPA_HINT_DEFAULT_0 );
571 }
572
addCheckButton(const char * label,float * zone)573 virtual void addCheckButton(const char* label, float* zone) {
574 addPortDescrdis(ICONTROL, label, LADSPA_HINT_TOGGLED| LADSPA_HINT_DEFAULT_1 );
575 }
576
addVerticalSlider(const char * label,float * zone,float initdis,float min,float max,float step)577 virtual void addVerticalSlider(const char* label, float* zone, float initdis, float min, float max, float step) {
578 addPortDescrdis(ICONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MIDDLE , min, max);
579 }
580
addVerticalSlider0(const char * label,float * zone,float initdis,float min,float max,float step)581 virtual void addVerticalSlider0(const char* label, float* zone, float initdis, float min, float max, float step) {
582 addPortDescrdis(ICONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MINIMUM , min, max);
583 }
584
addVerticalSlider1(const char * label,float * zone,float initdis,float min,float max,float step)585 virtual void addVerticalSlider1(const char* label, float* zone, float initdis, float min, float max, float step) {
586 addPortDescrdis(ICONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MAXIMUM, min, max);
587 }
588
addHorizontalSlider(const char * label,float * zone,float initdis,float min,float max,float step)589 virtual void addHorizontalSlider(const char* label, float* zone, float initdis, float min, float max, float step) {
590 addPortDescrdis(ICONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_LOW, min, max);
591 }
592
addNumEntry(const char * label,float * zone,float initdis,float min,float max,float step)593 virtual void addNumEntry(const char* label, float* zone, float initdis, float min, float max, float step) {
594 addPortDescrdis(ICONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, min, max);
595 }
596
597 // -- passive widgets
598
addNumDisplay(const char * label,float * zone,int precision)599 virtual void addNumDisplay(const char* label, float* zone, int precision) {
600 addPortDescrdis(OCONTROL, label, 0, -10000, +10000);
601 }
addTextDisplay(const char * label,float * zone,char * names[],float min,float max)602 virtual void addTextDisplay(const char* label, float* zone, char* names[], float min, float max) {
603 addPortDescrdis(OCONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, min, max);
604 }
addHorizontalBargraph(const char * label,float * zone,float min,float max)605 virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max) {
606 addPortDescrdis(OCONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, min, max);
607 }
addVerticalBargraph(const char * label,float * zone,float min,float max)608 virtual void addVerticalBargraph(const char* label, float* zone, float min, float max){
609 addPortDescrdis(OCONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, min, max);
610 }
611
openFrameBox(const char * label)612 virtual void openFrameBox(const char* label) { openAnyBox(label); }
openTabBox(const char * label)613 virtual void openTabBox(const char* label) { openAnyBox(label); }
openHorizontalBox(const char * label)614 virtual void openHorizontalBox(const char* label) { openAnyBox(label); }
openVerticalBox(const char * label)615 virtual void openVerticalBox(const char* label) { openAnyBox(label); }
616
closeBox()617 virtual void closeBox() { fPrefix.pop(); }
618
show()619 virtual void show() {}
run()620 virtual void run() {}
621
622
623
624 //---------------------------------Fill the LADSPA descriptor---------------------------
625
626 // generate an ID from a plugin name
makeID(const char * s)627 int makeID (const char* s) {
628 int h = 0;
629 for (int i = 0; s[i]; i++) {
630 h = (h << 3) + (s[i] & 7);
631 }
632 return 1+h%1000;
633 }
634
635 // fill a ladspa descriptor with the information collected on ports
fillPortDescription(LADSPA_Descriptor * descriptor)636 void fillPortDescription (LADSPA_Descriptor * descriptor) {
637 const char* name = sym(distdsp);
638 descriptor->PortCount = fCtrlCount+fInsCount+fOutsCount;
639 descriptor->PortDescriptors = fPortDescs;
640 descriptor->PortNames = fPortNames;
641 descriptor->PortRangeHints = fPortHints;
642
643 descriptor->Label = "guitarix-distortion";
644 descriptor->UniqueID = 4061;
645 // descriptor->Label = strdup(fPluginName.c_str());
646 // descriptor->UniqueID = makeID(fPluginName.c_str());
647 descriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE;
648 descriptor->Name = name;
649 // descriptor->Name = strdup(fPluginName.c_str());
650 descriptor->Maker = "brummer";
651 descriptor->Copyright = "GPL";
652 }
653 };
654
655
656
657
658 //--------------------------------------portData----------------------------------------
659 //
660 // portData : a user interface used to associate the data buffers and the ports
661 //
662 //--------------------------------------------------------------------------------------
663
664
665 class portData : public UI
666 {
667
668
669 private:
670
671
672 //--------------------------------------------------------------------------------------
673
674 const int fInsCount; // number of audio input ports
675 const int fOutsCount; // number of audio output ports
676 int fCtrlCount; // number of control ports
677
678 float* fPortZone[MAXPORT]; //
679 float* fPortData[MAXPORT];
680
681
682 //--------------------------------------------------------------------------------------
683
addZone(float * zone)684 void addZone(float* zone)
685 {
686 fPortZone[fInsCount + fOutsCount + fCtrlCount] = zone;
687 fCtrlCount++;
688 }
689
690
691
692 public:
693
694
695 //--------------------------------Collect the audio ports-------------------------------
696
portData(int ins,int outs)697 portData(int ins, int outs) : UI(), fInsCount(ins), fOutsCount(outs), fCtrlCount(0) {};
~portData()698 virtual ~portData() {}
699
700
701 //------------------------------Collect the control zones-------------------------------
702
addButton(const char * label,float * zone)703 virtual void addButton(const char* label, float* zone) { addZone(zone); }
addToggleButton(const char * label,float * zone)704 virtual void addToggleButton(const char* label, float* zone) { addZone(zone); }
addCheckButton(const char * label,float * zone)705 virtual void addCheckButton(const char* label, float* zone) { addZone(zone); }
706
707
addVerticalSlider(const char * label,float * zone,float initdis,float min,float max,float step)708 virtual void addVerticalSlider(const char* label, float* zone, float initdis, float min, float max, float step) { addZone(zone); }
addVerticalSlider1(const char * label,float * zone,float initdis,float min,float max,float step)709 virtual void addVerticalSlider1(const char* label, float* zone, float initdis, float min, float max, float step) { addZone(zone); }
addVerticalSlider0(const char * label,float * zone,float initdis,float min,float max,float step)710 virtual void addVerticalSlider0(const char* label, float* zone, float initdis, float min, float max, float step) { addZone(zone); }
addHorizontalSlider(const char * label,float * zone,float initdis,float min,float max,float step)711 virtual void addHorizontalSlider(const char* label, float* zone, float initdis, float min, float max, float step) { addZone(zone); }
addNumEntry(const char * label,float * zone,float initdis,float min,float max,float step)712 virtual void addNumEntry(const char* label, float* zone, float initdis, float min, float max, float step) { addZone(zone); }
713
714 // -- passive widgets
715
addNumDisplay(const char * label,float * zone,int precision)716 virtual void addNumDisplay(const char* label, float* zone, int precision) { addZone(zone); }
addTextDisplay(const char * label,float * zone,char * names[],float min,float max)717 virtual void addTextDisplay(const char* label, float* zone, char* names[], float min, float max) { addZone(zone); }
addHorizontalBargraph(const char * label,float * zone,float min,float max)718 virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max) { addZone(zone); }
addVerticalBargraph(const char * label,float * zone,float min,float max)719 virtual void addVerticalBargraph(const char* label, float* zone, float min, float max) { addZone(zone); }
720
openFrameBox(const char * label)721 virtual void openFrameBox(const char* label) { }
openTabBox(const char * label)722 virtual void openTabBox(const char* label) { }
openHorizontalBox(const char * label)723 virtual void openHorizontalBox(const char* label) { }
openVerticalBox(const char * label)724 virtual void openVerticalBox(const char* label) { }
closeBox()725 virtual void closeBox() { }
726
show()727 virtual void show() {}
run()728 virtual void run() {}
729
730
731 //---------------------------------interaction with LADSPA------------------------------
732
setPortData(unsigned long port,LADSPA_Data * data)733 void setPortData (unsigned long port, LADSPA_Data* data) {
734 fPortData[port] = data;
735 }
736
updateCtrlZones()737 void updateCtrlZones() {
738 for (int i = fInsCount+fOutsCount; i < fInsCount+fOutsCount+fCtrlCount; i++) *fPortZone[i] = *fPortData[i];
739 }
740
getInputs()741 float** getInputs() {
742 return &fPortData[0];
743 }
744
getOutputs()745 float** getOutputs() {
746 return &fPortData[fInsCount];
747 }
748 };
749
750
751
752
753 //--------------------------------Faust-LADSPA plugin-----------------------------------
754 //
755 // Plugin structure, callbacks and LADSPA_descriptor(i) entry point
756 //
757 //--------------------------------------------------------------------------------------
758
759 LADSPA_Descriptor* gDescriptord = 0;
760
761 struct PLUGIN
762 {
763 unsigned long fSampleRate;
764 portData* fPortData;
765 dsp* fDsp;
766
PLUGINPLUGIN767 PLUGIN(unsigned long r, portData* d, dsp* p) : fSampleRate(r), fPortData(d), fDsp(p) {}
768 };
769
instantiate_methoddis(const struct _LADSPA_Descriptor * Descriptor,unsigned long SampleRate)770 LADSPA_Handle instantiate_methoddis (const struct _LADSPA_Descriptor * Descriptor, unsigned long SampleRate)
771 {
772 dsp* p = new distdsp();
773 portData* d = new portData(p->getNumInputs(), p->getNumOutputs());
774
775 p->buildUserInterface(d);
776 return new PLUGIN (SampleRate, d, p);
777 }
778
connect_methoddis(LADSPA_Handle Instance,unsigned long Port,LADSPA_Data * DataLocation)779 void connect_methoddis (LADSPA_Handle Instance, unsigned long Port, LADSPA_Data * DataLocation)
780 {
781 PLUGIN* p = (PLUGIN*) Instance;
782 p->fPortData->setPortData(Port, DataLocation);
783 }
784
activate_methoddis(LADSPA_Handle Instance)785 void activate_methoddis (LADSPA_Handle Instance)
786 {
787 PLUGIN* p = (PLUGIN*) Instance;
788 p->fDsp->initdis(p->fSampleRate);
789 }
790
run_methoddis(LADSPA_Handle Instance,unsigned long SampleCount)791 void run_methoddis (LADSPA_Handle Instance, unsigned long SampleCount)
792 {
793 PLUGIN* p = (PLUGIN*) Instance;
794 p->fPortData->updateCtrlZones();
795 p->fDsp->compute(SampleCount, p->fPortData->getInputs(), p->fPortData->getOutputs());
796 }
797
deactivate_methoddis(LADSPA_Handle Instance)798 void deactivate_methoddis (LADSPA_Handle Instance)
799 {
800 }
801
cleanup_methoddis(LADSPA_Handle Instance)802 void cleanup_methoddis (LADSPA_Handle Instance)
803 {
804 PLUGIN* p = (PLUGIN*) Instance;
805 delete p->fPortData;
806 delete p->fDsp;
807 delete p;
808 }
809
810
811 //--------------------------------------------------------------------------------------
812
initdis_descriptor(LADSPA_Descriptor * descriptor)813 void initdis_descriptor(LADSPA_Descriptor* descriptor)
814 {
815 descriptor->UniqueID = 4061;
816 descriptor->Label = "distortion";
817 descriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE;
818 descriptor->Name = "distortion";
819 descriptor->Maker = "brummer";
820 descriptor->Copyright = "GPL";
821
822 descriptor->ImplementationData = 0;
823
824 // description des methoddiss
825 descriptor->instantiate = instantiate_methoddis;
826 descriptor->connect_port = connect_methoddis;
827 descriptor->activate = activate_methoddis;
828 descriptor->run = run_methoddis;
829 descriptor->run_adding = 0;
830 descriptor->set_run_adding_gain = 0;
831 descriptor->deactivate = deactivate_methoddis;
832 descriptor->cleanup = cleanup_methoddis;
833 }
834
835
836
837 //--------------------------------------------------------------------------------------
838
ladspa_descriptor(unsigned long Index)839 const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index)
840 {
841 if (Index == 0) {
842 if (gDescriptord == 0)
843 {
844 // allocate temporaries dsp and portCollectord to build the plugin description
845 distdsp* p = new distdsp();
846 if (p) {
847 portCollectord* c=new portCollectord(p->getNumInputs(), p->getNumOutputs());
848 p->buildUserInterface(c);
849 gDescriptord = new LADSPA_Descriptor;
850 initdis_descriptor(gDescriptord);
851 c->fillPortDescription(gDescriptord);
852 delete p;
853 } else {
854 printf("Memory Error : unable to allocate the dsp object\n");
855 }
856 }
857 return gDescriptord;
858 } else {
859 return NULL;
860 }
861 }
862
863