1 namespace barkgraphiceq {
2 
3 #include "bark_freq_grid.h"
4 
5 #include <iostream>
6 
7 class Dsp: public PluginLV2 {
8 private:
9 	int fSamplingFreq;
10 
11 	//First elements in both arrays are common gains
12 	float* fslider[BARK_NUMBER_OF_BANDS];
13 	float* fbargraph[BARK_NUMBER_OF_BANDS];
14 	//EQ's, first used for indication, second - for audio signal processing
15 	orfanidis_eq::eq1* p_eq1;
16 	orfanidis_eq::eq2* p_eq2;
17 
18 	void connect(uint32_t port,void* data);
19 	void clear_state_f();
20 	void init(uint32_t samplingFreq);
21 	void compute(int count, FAUSTFLOAT *input0, FAUSTFLOAT *output0);
22 
23 	static void clear_state_f_static(PluginLV2*);
24 	static void init_static(uint32_t samplingFreq, PluginLV2*);
25 	static void compute_static(int count, FAUSTFLOAT *input0, FAUSTFLOAT *output0, PluginLV2*);
26 	static void del_instance(PluginLV2 *p);
27 	static void connect_static(uint32_t port,void* data, PluginLV2 *p);
28 
29 public:
30 	Dsp();
31 	~Dsp();
32 };
33 
Dsp()34 Dsp::Dsp()
35 	: PluginLV2() {
36 
37 	version = PLUGINLV2_VERSION;
38 	id = "barkgraphiceq";
39 	name = N_("Bark Grid EQ");
40 	mono_audio = compute_static;
41 	stereo_audio = 0;
42 	set_samplerate = init_static;
43 	activate_plugin = 0;
44 	connect_ports = connect_static;
45 	clear_state = clear_state_f_static;
46 	delete_instance = del_instance;
47 
48 	p_eq1 = NULL;
49 	p_eq2 = NULL;
50 
51 	clear_state_f();
52 
53 }
54 
~Dsp()55 Dsp::~Dsp() {
56 }
57 
clear_state_f()58 inline void Dsp::clear_state_f()
59 {
60 	for(unsigned int i = 0; i < BARK_NUMBER_OF_BANDS; i++)
61 	{
62 		fslider[i] = 0;
63 		fbargraph[i] = 0;
64 	}
65 }
66 
clear_state_f_static(PluginLV2 * p)67 void Dsp::clear_state_f_static(PluginLV2 *p)
68 {
69 	static_cast<Dsp*>(p)->clear_state_f();
70 }
71 
init(unsigned int samplingFreq)72 inline void Dsp::init(unsigned int samplingFreq)
73 {
74 	fSamplingFreq = samplingFreq;
75 
76 	orfanidis_eq::freq_grid fg;
77 
78 	//Apply Bark frequency grid
79 	for (unsigned int i = 0; i < BARK_NUMBER_OF_BANDS; i++)
80 		fg.add_band(bark_center_freqs[i], bark_bands_widths[i]);
81 
82 	//Create Butterworth EQ object's
83 	p_eq1 = new orfanidis_eq::eq1(fg, orfanidis_eq::butterworth);
84 	p_eq2 = new orfanidis_eq::eq2(fg, orfanidis_eq::butterworth);
85 
86 	clear_state_f();
87 }
88 
init_static(unsigned int samplingFreq,PluginLV2 * p)89 void Dsp::init_static(unsigned int samplingFreq, PluginLV2 *p)
90 {
91 	static_cast<Dsp*>(p)->init(samplingFreq);
92 }
93 
compute(int count,FAUSTFLOAT * input0,FAUSTFLOAT * output0)94 void always_inline Dsp::compute(int count, FAUSTFLOAT *input0, FAUSTFLOAT *output0)
95 {
96 	//Set params
97 	for(unsigned int j = 0; j < BARK_NUMBER_OF_BANDS; j++) {
98 		p_eq1->change_band_gain_db(j, *fslider[j]);
99 		p_eq2->change_band_gain_db(j, *fslider[j]);
100 	}
101 
102 	//Process audio
103 	double aver_out = 0;
104 	for (int i=0; i<count; i++) {
105 		double input = input0[i];
106 		double out = 0;
107 		p_eq2->sbs_process(&input, &out);
108 		output0[i] = out;
109 		aver_out += out*out;
110 	}
111 
112 	//Update bars
113 	for(unsigned int j = 0; j < BARK_NUMBER_OF_BANDS; j++) {
114 		double input = aver_out/count;
115 		double band_out = 0;
116 		p_eq1->sbs_process_band(j, &input, &band_out);
117 		*fbargraph[j] = BARK_NUMBER_OF_BANDS*band_out;
118 	}
119 }
120 
compute_static(int count,FAUSTFLOAT * input0,FAUSTFLOAT * output0,PluginLV2 * p)121 void __rt_func Dsp::compute_static(int count, FAUSTFLOAT *input0, FAUSTFLOAT *output0, PluginLV2 *p)
122 {
123 	static_cast<Dsp*>(p)->compute(count, input0, output0);
124 }
125 
connect(uint32_t port,void * data)126 void Dsp::connect(uint32_t port,void* data)
127 {
128 	switch ((PortIndex)port)
129 	{
130 	case G1:
131 		fslider[0] = (float*)data;
132 		break;
133 	case G2:
134 		fslider[1] = (float*)data;
135 		break;
136 	case G3:
137 		fslider[2] = (float*)data;
138 		break;
139 	case G4:
140 		fslider[3] = (float*)data;
141 		break;
142 	case G5:
143 		fslider[4] = (float*)data;
144 		break;
145 	case G6:
146 		fslider[5] = (float*)data;
147 		break;
148 	case G7:
149 		fslider[6] = (float*)data;
150 		break;
151 	case G8:
152 		fslider[7] = (float*)data;
153 		break;
154 	case G9:
155 		fslider[8] = (float*)data;
156 		break;
157 	case G10:
158 		fslider[9] = (float*)data;
159 		break;
160 	case G11:
161 		fslider[10] = (float*)data;
162 		break;
163 	case G12:
164 		fslider[11] = (float*)data;
165 		break;
166 	case G13:
167 		fslider[12] = (float*)data;
168 		break;
169 	case G14:
170 		fslider[13] = (float*)data;
171 		break;
172 	case G15:
173 		fslider[14] = (float*)data;
174 		break;
175 	case G16:
176 		fslider[15] = (float*)data;
177 		break;
178 	case G17:
179 		fslider[16] = (float*)data;
180 		break;
181 	case G18:
182 		fslider[17] = (float*)data;
183 		break;
184 	case G19:
185 		fslider[18] = (float*)data;
186 		break;
187 	case G20:
188 		fslider[19] = (float*)data;
189 		break;
190 	case G21:
191 		fslider[20] = (float*)data;
192 		break;
193 	case G22:
194 		fslider[21] = (float*)data;
195 		break;
196 	case G23:
197 		fslider[22] = (float*)data;
198 		break;
199 	case G24:
200 		fslider[23] = (float*)data;
201 		break;
202 
203 	case V1:
204 		fbargraph[0] = (float*)data;
205 		break;
206 	case V2:
207 		fbargraph[1] = (float*)data;
208 		break;
209 	case V3:
210 		fbargraph[2] = (float*)data;
211 		break;
212 	case V4:
213 		fbargraph[3] = (float*)data;
214 		break;
215 	case V5:
216 		fbargraph[4] = (float*)data;
217 		break;
218 	case V6:
219 		fbargraph[5] = (float*)data;
220 		break;
221 	case V7:
222 		fbargraph[6] = (float*)data;
223 		break;
224 	case V8:
225 		fbargraph[7] = (float*)data;
226 		break;
227 	case V9:
228 		fbargraph[8] = (float*)data;
229 		break;
230 	case V10:
231 		fbargraph[9] = (float*)data;
232 		break;
233 	case V11:
234 		fbargraph[10] = (float*)data;
235 		break;
236 	case V12:
237 		fbargraph[11] = (float*)data;
238 		break;
239 	case V13:
240 		fbargraph[12] = (float*)data;
241 		break;
242 	case V14:
243 		fbargraph[13] = (float*)data;
244 		break;
245 	case V15:
246 		fbargraph[14] = (float*)data;
247 		break;
248 	case V16:
249 		fbargraph[15] = (float*)data;
250 		break;
251 	case V17:
252 		fbargraph[16] = (float*)data;
253 		break;
254 	case V18:
255 		fbargraph[17] = (float*)data;
256 		break;
257 	case V19:
258 		fbargraph[18] = (float*)data;
259 		break;
260 	case V20:
261 		fbargraph[19] = (float*)data;
262 		break;
263 	case V21:
264 		fbargraph[20] = (float*)data;
265 		break;
266 	case V22:
267 		fbargraph[21] = (float*)data;
268 		break;
269 	case V23:
270 		fbargraph[22] = (float*)data;
271 		break;
272 	case V24:
273 		fbargraph[23] = (float*)data;
274 		break;
275 
276 	default:
277 		break;
278 	}
279 }
280 
connect_static(uint32_t port,void * data,PluginLV2 * p)281 void Dsp::connect_static(uint32_t port,void* data, PluginLV2 *p)
282 {
283 	static_cast<Dsp*>(p)->connect(port, data);
284 }
285 
plugin()286 PluginLV2 *plugin() {
287 	return new Dsp();
288 }
289 
del_instance(PluginLV2 * p)290 void Dsp::del_instance(PluginLV2 *p)
291 {
292 	//Delete eq's
293 	delete static_cast<Dsp*>(p)->p_eq1;
294 	delete static_cast<Dsp*>(p)->p_eq2;
295 	delete static_cast<Dsp*>(p);
296 }
297 
298 } // end namespace barkgraphiceq
299 
300