1 // generated from file '../src/plugins/ts9sim.dsp' by dsp2cc:
2 // Code generated with Faust (https://faust.grame.fr)
3
4 #include "gx_faust_support.h"
5 #include "gx_plugin.h"
6 #include "ts9nonlin.h"
7
8 namespace pluginlib {
9 namespace ts9sim {
10
11 class Dsp: public PluginDef {
12 private:
13 gx_resample::FixedRateResampler smp;
14 int sample_rate;
15 int fSampleRate;
16 double fConst1;
17 FAUSTFLOAT fHslider0;
18 double fVec0[2];
19 double fConst3;
20 double fConst4;
21 double fConst5;
22 FAUSTFLOAT fHslider1;
23 double fRec1[2];
24 double fVec1[2];
25 double fRec0[2];
26 FAUSTFLOAT fHslider2;
27 double fRec2[2];
28
29 void clear_state_f();
30 int load_ui_f(const UiBuilder& b, int form);
31 static const char *glade_def;
32 void init(unsigned int sample_rate);
33 void compute(int count, FAUSTFLOAT *input0, FAUSTFLOAT *output0);
34 int register_par(const ParamReg& reg);
35
36 static void clear_state_f_static(PluginDef*);
37 static int load_ui_f_static(const UiBuilder& b, int form);
38 static void init_static(unsigned int sample_rate, PluginDef*);
39 static void compute_static(int count, FAUSTFLOAT *input0, FAUSTFLOAT *output0, PluginDef*);
40 static int register_params_static(const ParamReg& reg);
41 static void del_instance(PluginDef *p);
42 public:
43 Dsp();
44 ~Dsp();
45 };
46
47
48
Dsp()49 Dsp::Dsp()
50 : PluginDef() {
51 version = PLUGINDEF_VERSION;
52 flags = 0;
53 id = "ts9sim";
54 name = N_("Tube Screamer");
55 groups = 0;
56 description = ""; // description (tooltip)
57 category = N_("Distortion"); // category
58 shortname = ""; // shortname
59 mono_audio = compute_static;
60 stereo_audio = 0;
61 set_samplerate = init_static;
62 activate_plugin = 0;
63 register_params = register_params_static;
64 load_ui = load_ui_f_static;
65 clear_state = clear_state_f_static;
66 delete_instance = del_instance;
67 }
68
~Dsp()69 Dsp::~Dsp() {
70 }
71
clear_state_f()72 inline void Dsp::clear_state_f()
73 {
74 for (int l0 = 0; (l0 < 2); l0 = (l0 + 1)) fVec0[l0] = 0.0;
75 for (int l1 = 0; (l1 < 2); l1 = (l1 + 1)) fRec1[l1] = 0.0;
76 for (int l2 = 0; (l2 < 2); l2 = (l2 + 1)) fVec1[l2] = 0.0;
77 for (int l3 = 0; (l3 < 2); l3 = (l3 + 1)) fRec0[l3] = 0.0;
78 for (int l4 = 0; (l4 < 2); l4 = (l4 + 1)) fRec2[l4] = 0.0;
79 }
80
clear_state_f_static(PluginDef * p)81 void Dsp::clear_state_f_static(PluginDef *p)
82 {
83 static_cast<Dsp*>(p)->clear_state_f();
84 }
85
init(unsigned int RsamplingFreq)86 inline void Dsp::init(unsigned int RsamplingFreq)
87 {
88 sample_rate = 96000;
89 smp.setup(RsamplingFreq, sample_rate);
90 fSampleRate = sample_rate;
91 double fConst0 = std::min<double>(192000.0, std::max<double>(1.0, double(fSampleRate)));
92 fConst1 = (3.1415926535897931 / fConst0);
93 double fConst2 = (0.00044179999999999995 * fConst0);
94 fConst3 = (1.0 / (fConst2 + 1.0));
95 fConst4 = (1.0 - fConst2);
96 fConst5 = (9.3999999999999995e-08 * fConst0);
97 clear_state_f();
98 }
99
init_static(unsigned int sample_rate,PluginDef * p)100 void Dsp::init_static(unsigned int sample_rate, PluginDef *p)
101 {
102 static_cast<Dsp*>(p)->init(sample_rate);
103 }
104
compute(int count,FAUSTFLOAT * input0,FAUSTFLOAT * output0)105 void always_inline Dsp::compute(int count, FAUSTFLOAT *input0, FAUSTFLOAT *output0)
106 {
107 FAUSTFLOAT buf[smp.max_out_count(count)];
108 int ReCount = smp.up(count, input0, buf);
109 double fSlow0 = (1.0 / std::tan((fConst1 * double(fHslider0))));
110 double fSlow1 = (1.0 / (fSlow0 + 1.0));
111 double fSlow2 = (1.0 - fSlow0);
112 double fSlow3 = (fConst5 * ((500000.0 * double(fHslider1)) + 55700.0));
113 double fSlow4 = (fSlow3 + 1.0);
114 double fSlow5 = (1.0 - fSlow3);
115 double fSlow6 = (0.0010000000000000009 * std::pow(10.0, (0.050000000000000003 * double(fHslider2))));
116 for (int i0 = 0; (i0 < ReCount); i0 = (i0 + 1)) {
117 double fTemp0 = double(buf[i0]);
118 fVec0[0] = fTemp0;
119 fRec1[0] = (0.0 - (fConst3 * ((fConst4 * fRec1[1]) - ((fSlow4 * fTemp0) + (fSlow5 * fVec0[1])))));
120 double fTemp1 = (fTemp0 - double(ts9nonlin(double((fRec1[0] - fTemp0)))));
121 fVec1[0] = fTemp1;
122 fRec0[0] = (0.0 - (fSlow1 * ((fSlow2 * fRec0[1]) - (fTemp1 + fVec1[1]))));
123 fRec2[0] = (fSlow6 + (0.999 * fRec2[1]));
124 buf[i0] = FAUSTFLOAT((fRec0[0] * fRec2[0]));
125 fVec0[1] = fVec0[0];
126 fRec1[1] = fRec1[0];
127 fVec1[1] = fVec1[0];
128 fRec0[1] = fRec0[0];
129 fRec2[1] = fRec2[0];
130 }
131 smp.down(buf, output0);
132 }
133
compute_static(int count,FAUSTFLOAT * input0,FAUSTFLOAT * output0,PluginDef * p)134 void __rt_func Dsp::compute_static(int count, FAUSTFLOAT *input0, FAUSTFLOAT *output0, PluginDef *p)
135 {
136 static_cast<Dsp*>(p)->compute(count, input0, output0);
137 }
138
register_par(const ParamReg & reg)139 int Dsp::register_par(const ParamReg& reg)
140 {
141 reg.registerFloatVar("ts9sim.drive",N_("Drive"),"S","",&fHslider1, 0.5, 0.0, 1.0, 0.01, 0);
142 reg.registerFloatVar("ts9sim.level",N_("Level"),"S","",&fHslider2, -16.0, -20.0, 4.0, 0.10000000000000001, 0);
143 reg.registerFloatVar("ts9sim.tone",N_("Tone"),"SL","",&fHslider0, 400.0, 100.0, 1000.0, 1.03, 0);
144 return 0;
145 }
146
register_params_static(const ParamReg & reg)147 int Dsp::register_params_static(const ParamReg& reg)
148 {
149 return static_cast<Dsp*>(reg.plugin)->register_par(reg);
150 }
151
152 const char *Dsp::glade_def = "\
153 <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
154 <!-- Generated with glade 3.22.1 -->\n\
155 <interface>\n\
156 <requires lib=\"gtk+\" version=\"3.20\"/>\n\
157 <requires lib=\"gxwidgets\" version=\"0.0\"/>\n\
158 <object class=\"GtkWindow\" id=\"window1\">\n\
159 <property name=\"can_focus\">False</property>\n\
160 <child>\n\
161 <placeholder/>\n\
162 </child>\n\
163 <child>\n\
164 <object class=\"GtkBox\" id=\"vbox1\">\n\
165 <property name=\"visible\">True</property>\n\
166 <property name=\"can_focus\">False</property>\n\
167 <property name=\"orientation\">vertical</property>\n\
168 <child>\n\
169 <object class=\"GtkBox\" id=\"rackbox\">\n\
170 <property name=\"visible\">True</property>\n\
171 <property name=\"can_focus\">False</property>\n\
172 <property name=\"spacing\">4</property>\n\
173 <child>\n\
174 <object class=\"GtkBox\" id=\"hbox1\">\n\
175 <property name=\"visible\">True</property>\n\
176 <property name=\"can_focus\">False</property>\n\
177 <property name=\"spacing\">10</property>\n\
178 <child>\n\
179 <object class=\"GtkBox\" id=\"vbox2\">\n\
180 <property name=\"visible\">True</property>\n\
181 <property name=\"can_focus\">False</property>\n\
182 <property name=\"orientation\">vertical</property>\n\
183 <child>\n\
184 <object class=\"GtkLabel\" id=\"label1:rack_label\">\n\
185 <property name=\"visible\">True</property>\n\
186 <property name=\"can_focus\">False</property>\n\
187 <property name=\"label\" translatable=\"yes\">label</property>\n\
188 </object>\n\
189 <packing>\n\
190 <property name=\"expand\">False</property>\n\
191 <property name=\"fill\">False</property>\n\
192 <property name=\"position\">0</property>\n\
193 </packing>\n\
194 </child>\n\
195 <child>\n\
196 <object class=\"GxSmallKnobR\" id=\"gxbigknob1\">\n\
197 <property name=\"visible\">True</property>\n\
198 <property name=\"can_focus\">True</property>\n\
199 <property name=\"receives_default\">True</property>\n\
200 <property name=\"var_id\">ts9sim.drive</property>\n\
201 <property name=\"label_ref\">label1:rack_label</property>\n\
202 </object>\n\
203 <packing>\n\
204 <property name=\"expand\">False</property>\n\
205 <property name=\"fill\">False</property>\n\
206 <property name=\"position\">1</property>\n\
207 </packing>\n\
208 </child>\n\
209 </object>\n\
210 <packing>\n\
211 <property name=\"expand\">False</property>\n\
212 <property name=\"fill\">False</property>\n\
213 <property name=\"position\">0</property>\n\
214 </packing>\n\
215 </child>\n\
216 <child>\n\
217 <object class=\"GtkBox\" id=\"vbox3\">\n\
218 <property name=\"visible\">True</property>\n\
219 <property name=\"can_focus\">False</property>\n\
220 <property name=\"orientation\">vertical</property>\n\
221 <child>\n\
222 <object class=\"GtkLabel\" id=\"label2:rack_label\">\n\
223 <property name=\"visible\">True</property>\n\
224 <property name=\"can_focus\">False</property>\n\
225 <property name=\"label\" translatable=\"yes\">label</property>\n\
226 </object>\n\
227 <packing>\n\
228 <property name=\"expand\">False</property>\n\
229 <property name=\"fill\">False</property>\n\
230 <property name=\"position\">0</property>\n\
231 </packing>\n\
232 </child>\n\
233 <child>\n\
234 <object class=\"GxMidKnob\" id=\"gxbigknob2\">\n\
235 <property name=\"visible\">True</property>\n\
236 <property name=\"can_focus\">True</property>\n\
237 <property name=\"receives_default\">True</property>\n\
238 <property name=\"var_id\">ts9sim.level</property>\n\
239 <property name=\"label_ref\">label2:rack_label</property>\n\
240 </object>\n\
241 <packing>\n\
242 <property name=\"expand\">False</property>\n\
243 <property name=\"fill\">False</property>\n\
244 <property name=\"position\">1</property>\n\
245 </packing>\n\
246 </child>\n\
247 </object>\n\
248 <packing>\n\
249 <property name=\"expand\">False</property>\n\
250 <property name=\"fill\">False</property>\n\
251 <property name=\"position\">1</property>\n\
252 </packing>\n\
253 </child>\n\
254 <child>\n\
255 <object class=\"GtkBox\" id=\"vbox4\">\n\
256 <property name=\"visible\">True</property>\n\
257 <property name=\"can_focus\">False</property>\n\
258 <property name=\"orientation\">vertical</property>\n\
259 <child>\n\
260 <object class=\"GtkLabel\" id=\"label3:rack_label\">\n\
261 <property name=\"visible\">True</property>\n\
262 <property name=\"can_focus\">False</property>\n\
263 <property name=\"label\" translatable=\"yes\">label</property>\n\
264 </object>\n\
265 <packing>\n\
266 <property name=\"expand\">False</property>\n\
267 <property name=\"fill\">False</property>\n\
268 <property name=\"position\">0</property>\n\
269 </packing>\n\
270 </child>\n\
271 <child>\n\
272 <object class=\"GxSmallKnobR\" id=\"gxbigknob3\">\n\
273 <property name=\"visible\">True</property>\n\
274 <property name=\"can_focus\">True</property>\n\
275 <property name=\"receives_default\">True</property>\n\
276 <property name=\"var_id\">ts9sim.tone</property>\n\
277 <property name=\"label_ref\">label3:rack_label</property>\n\
278 </object>\n\
279 <packing>\n\
280 <property name=\"expand\">False</property>\n\
281 <property name=\"fill\">False</property>\n\
282 <property name=\"position\">1</property>\n\
283 </packing>\n\
284 </child>\n\
285 </object>\n\
286 <packing>\n\
287 <property name=\"expand\">False</property>\n\
288 <property name=\"fill\">False</property>\n\
289 <property name=\"position\">2</property>\n\
290 </packing>\n\
291 </child>\n\
292 </object>\n\
293 <packing>\n\
294 <property name=\"expand\">True</property>\n\
295 <property name=\"fill\">False</property>\n\
296 <property name=\"pack_type\">end</property>\n\
297 <property name=\"position\">0</property>\n\
298 </packing>\n\
299 </child>\n\
300 </object>\n\
301 <packing>\n\
302 <property name=\"expand\">True</property>\n\
303 <property name=\"fill\">False</property>\n\
304 <property name=\"position\">0</property>\n\
305 </packing>\n\
306 </child>\n\
307 <child>\n\
308 <object class=\"GtkBox\" id=\"minibox\">\n\
309 <property name=\"visible\">True</property>\n\
310 <property name=\"can_focus\">False</property>\n\
311 <property name=\"spacing\">4</property>\n\
312 <child>\n\
313 <object class=\"GxHSlider\" id=\"gxhslider1\">\n\
314 <property name=\"visible\">True</property>\n\
315 <property name=\"can_focus\">True</property>\n\
316 <property name=\"receives_default\">True</property>\n\
317 <property name=\"round_digits\">0</property>\n\
318 <property name=\"var_id\">ts9sim.drive</property>\n\
319 <property name=\"show_value\">False</property>\n\
320 <property name=\"value_position\">right</property>\n\
321 <property name=\"value_xalign\">0.52000000000000002</property>\n\
322 <property name=\"label_ref\">label0:rack_label</property>\n\
323 </object>\n\
324 <packing>\n\
325 <property name=\"expand\">False</property>\n\
326 <property name=\"fill\">False</property>\n\
327 <property name=\"position\">0</property>\n\
328 </packing>\n\
329 </child>\n\
330 <child>\n\
331 <object class=\"GtkLabel\" id=\"label0:rack_label\">\n\
332 <property name=\"visible\">True</property>\n\
333 <property name=\"can_focus\">False</property>\n\
334 <property name=\"label\" translatable=\"yes\">Drive</property>\n\
335 <property name=\"xalign\">0</property>\n\
336 </object>\n\
337 <packing>\n\
338 <property name=\"expand\">False</property>\n\
339 <property name=\"fill\">False</property>\n\
340 <property name=\"position\">1</property>\n\
341 </packing>\n\
342 </child>\n\
343 </object>\n\
344 <packing>\n\
345 <property name=\"expand\">True</property>\n\
346 <property name=\"fill\">True</property>\n\
347 <property name=\"position\">1</property>\n\
348 </packing>\n\
349 </child>\n\
350 </object>\n\
351 </child>\n\
352 </object>\n\
353 </interface>\n\
354 ";
355
load_ui_f(const UiBuilder & b,int form)356 inline int Dsp::load_ui_f(const UiBuilder& b, int form)
357 {
358 if (form & UI_FORM_GLADE) {
359 b.load_glade(glade_def);
360 return 0;
361 }
362 if (form & UI_FORM_STACK) {
363 #define PARAM(p) ("ts9sim" "." p)
364 b.openHorizontalhideBox("");
365 b.create_master_slider(PARAM("drive"), "drive");
366 b.closeBox();
367 b.openHorizontalBox("");
368 b.insertSpacer();
369 b.create_small_rackknobr(PARAM("drive"), "drive");
370 b.create_small_rackknob(PARAM("level"), "level");
371 b.create_small_rackknob(PARAM("tone"), "tone");
372 b.insertSpacer();
373 b.closeBox();
374
375 #undef PARAM
376 return 0;
377 }
378 return -1;
379 }
380
load_ui_f_static(const UiBuilder & b,int form)381 int Dsp::load_ui_f_static(const UiBuilder& b, int form)
382 {
383 return static_cast<Dsp*>(b.plugin)->load_ui_f(b, form);
384 }
plugin()385 PluginDef *plugin() {
386 return new Dsp();
387 }
388
del_instance(PluginDef * p)389 void Dsp::del_instance(PluginDef *p)
390 {
391 delete static_cast<Dsp*>(p);
392 }
393
394 } // end namespace ts9sim
395 } // end namespace pluginlib
396