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