1 /*
2  * Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
3  *           (C) 2020 Vladimir Sadovnikov <sadko4u@gmail.com>
4  *
5  * This file is part of lsp-plugins
6  * Created on: 30 мая 2016 г.
7  *
8  * lsp-plugins is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * any later version.
12  *
13  * lsp-plugins is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with lsp-plugins. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
22 #include <core/types.h>
23 #include <metadata/plugins.h>
24 #include <metadata/ports.h>
25 #include <metadata/developers.h>
26 
27 namespace lsp
28 {
29     //-------------------------------------------------------------------------
30     // Parametric Equalizer
31     static const int para_equalizer_classes[] = { C_PARA_EQ, -1 };
32 
33     static const port_item_t filter_slopes[] =
34     {
35         { "x1", "eq.slope.x1" },
36         { "x2", "eq.slope.x2" },
37         { "x3", "eq.slope.x3" },
38         { "x4", "eq.slope.x4" },
39         { NULL, NULL }
40     };
41 
42     static const port_item_t equalizer_eq_modes[] =
43     {
44         { "IIR",        "eq.type.iir" },
45         { "FIR",        "eq.type.fir" },
46         { "FFT",        "eq.type.fft" },
47         { "SPM",        "eq.type.spm" },
48         { NULL, NULL }
49     };
50 
51     static const port_item_t filter_types[] =
52     {
53         { "Off",            "eq.flt.off" },
54         { "Bell",           "eq.flt.bell" },
55         { "Hi-pass",        "eq.flt.hipass" },
56         { "Hi-shelf",       "eq.flt.hishelf" },
57         { "Lo-pass",        "eq.flt.lopass" },
58         { "Lo-shelf",       "eq.flt.loshelf" },
59         { "Notch",          "eq.flt.notch" },
60         { "Resonance",      "eq.flt.resonance" },
61         { "Allpass",        "eq.flt.allpass" },
62 
63         // Additional stuff
64 #ifndef LSP_NO_EXPERIMENTAL
65         { "Allpass2",       "eq.flt.allpass2" },
66         { "Ladder-pass",    "eq.flt.ladpass" },
67         { "Ladder-rej",     "eq.flt.ladrej" },
68         { "Envelope",       "eq.flt.envelope" },
69         { "Bandpass",       "eq.flt.bandpass" },
70 #endif /* LSP_NO_EXPERIMENTAL */
71         { NULL, NULL }
72     };
73 
74     static const port_item_t filter_modes[] =
75     {
76         { "RLC (BT)",       "eq.mode.rlc_bt" },
77         { "RLC (MT)",       "eq.mode.rlc_mt" },
78         { "BWC (BT)",       "eq.mode.bwc_bt" },
79         { "BWC (MT)",       "eq.mode.bwc_mt" },
80         { "LRX (BT)",       "eq.mode.lrx_bt" },
81         { "LRX (MT)",       "eq.mode.lrx_mt" },
82         { "APO (DR)",       "eq.mode.apo_dr" },
83         { NULL, NULL }
84     };
85 
86     static const port_item_t equalizer_fft_mode[] =
87     {
88         { "Off",        "metering.fft.off" },
89         { "Post-eq",    "metering.fft.post_eq" },
90         { "Pre-eq",     "metering.fft.pre_eq" },
91         { NULL, NULL }
92     };
93 
94     static const port_item_t filter_select_16[] =
95     {
96         { "Filters 0-7",            "para_eq.flt_0:7" },
97         { "Filters 8-15",           "para_eq.flt_8:15" },
98         { NULL, NULL }
99     };
100 
101     static const port_item_t filter_select_16lr[] =
102     {
103         { "Filters Left 0-7",       "para_eq.flt_l_0:7" },
104         { "Filters Right 0-7",      "para_eq.flt_r_0:7" },
105         { "Filters Left 8-15",      "para_eq.flt_l_8:15" },
106         { "Filters Right 8-15",     "para_eq.flt_r_8:15" },
107         { NULL, NULL }
108     };
109 
110     static const port_item_t filter_select_16ms[] =
111     {
112         { "Filters Middle 0-7",     "para_eq.flt_m_0:7" },
113         { "Filters Side 0-7",       "para_eq.flt_s_0:7" },
114         { "Filters Middle 8-15",    "para_eq.flt_m_8:15" },
115         { "Filters Side 8-15",      "para_eq.flt_s_8:15" },
116         { NULL, NULL }
117     };
118 
119     static const port_item_t filter_select_32[] =
120     {
121         { "Filters 0-7",            "para_eq.flt_0:7" },
122         { "Filters 8-15",           "para_eq.flt_8:15" },
123         { "Filters 16-23",          "para_eq.flt_16:23" },
124         { "Filters 24-31",          "para_eq.flt_24:31" },
125         { NULL, NULL }
126     };
127 
128     static const port_item_t filter_select_32lr[] =
129     {
130         { "Filters Left 0-7",       "para_eq.flt_l_0:7" },
131         { "Filters Right 0-7",      "para_eq.flt_r_0:7" },
132         { "Filters Left 8-15",      "para_eq.flt_l_8:15" },
133         { "Filters Right 8-15",     "para_eq.flt_r_8:15" },
134         { "Filters Left 16-23",     "para_eq.flt_l_16:23" },
135         { "Filters Right 16-23",    "para_eq.flt_r_16:23" },
136         { "Filters Left 24-31",     "para_eq.flt_l_24:31" },
137         { "Filters Right 24-31",    "para_eq.flt_r_24:31" },
138         { NULL, NULL }
139     };
140 
141     static const port_item_t filter_select_32ms[] =
142     {
143         { "Filters Middle 0-7",     "para_eq.flt_m_0:7" },
144         { "Filters Side 0-7",       "para_eq.flt_s_0:7" },
145         { "Filters Middle 8-15",    "para_eq.flt_m_8:15" },
146         { "Filters Side 8-15",      "para_eq.flt_s_8:15" },
147         { "Filters Mid 16-23",      "para_eq.flt_m_16:23" },
148         { "Filters Side 16-23",     "para_eq.flt_s_16:23" },
149         { "Filters Mid 24-31",      "para_eq.flt_m_24:31" },
150         { "Filters Side 24-31",     "para_eq.flt_s_24:31" },
151         { NULL, NULL }
152     };
153 
154     #define EQ_FILTER(id, label, x, total, f) \
155             COMBO("ft" id "_" #x, "Filter type " label #x, 0, filter_types), \
156             COMBO("fm" id "_" #x, "Filter mode " label #x, 0, filter_modes), \
157             COMBO("s" id "_" #x, "Filter slope " label #x, 0, filter_slopes), \
158             SWITCH("xs" id "_" #x, "Filter solo " label #x, 0.0f), \
159             SWITCH("xm" id "_" #x, "Filter mute " label #x, 0.0f), \
160             LOG_CONTROL_DFL("f" id "_" #x, "Frequency " label #x, U_HZ, para_equalizer_base_metadata::FREQ, f), \
161             { "g" id "_" #x, "Gain " label # x, U_GAIN_AMP, R_CONTROL, F_IN | F_LOG | F_UPPER | F_LOWER | F_STEP, GAIN_AMP_M_36_DB, GAIN_AMP_P_36_DB, GAIN_AMP_0_DB, 0.01, NULL, NULL }, \
162             { "q" id "_" #x, "Quality factor " label #x, U_NONE, R_CONTROL, F_IN | F_UPPER | F_LOWER | F_STEP, 0.0f, 100.0f, 0.0f, 0.025f, NULL        }, \
163             { "hue" id "_" #x, "Hue " label #x, U_NONE, R_CONTROL, F_IN | F_UPPER | F_LOWER | F_STEP | F_CYCLIC, 0.0f, 1.0f, (float(x) / float(total)), 0.25f/360.0f, NULL     }, \
164             BLINK("fv" id "_" #x, "Filter visibility " label #x), \
165             MESH("agf" id "_" #x, "Amplitude graph " label #x, 2, para_equalizer_base_metadata::FILTER_MESH_POINTS)
166 
167     #define EQ_FILTER_MONO(x, total, f)     EQ_FILTER("", "", x, total, f)
168     #define EQ_FILTER_STEREO(x, total, f)   EQ_FILTER("", "", x, total, f)
169     #define EQ_FILTER_LR(x, total, f)       EQ_FILTER("l", "Left ", x, total, f), EQ_FILTER("r", "Right ", x, total, f)
170     #define EQ_FILTER_MS(x, total, f)       EQ_FILTER("m", "Mid ", x, total, f), EQ_FILTER("s", "Side ", x, total, f)
171 
172     #define EQ_COMMON(fselect) \
173             BYPASS, \
174             AMP_GAIN("g_in", "Input gain", para_equalizer_base_metadata::IN_GAIN_DFL, 10.0f), \
175             AMP_GAIN("g_out", "Output gain", para_equalizer_base_metadata::OUT_GAIN_DFL, 10.0f), \
176             COMBO("mode", "Equalizer mode", 0, equalizer_eq_modes), \
177             COMBO("fft", "FFT analysis", 0, equalizer_fft_mode), \
178             LOG_CONTROL("react", "FFT reactivity", U_MSEC, para_equalizer_base_metadata::REACT_TIME), \
179             AMP_GAIN("shift", "Shift gain", 1.0f, 100.0f), \
180             LOG_CONTROL("zoom", "Graph zoom", U_GAIN_AMP, para_equalizer_base_metadata::ZOOM), \
181             COMBO("fsel", "Filter select", 0, fselect)
182 
183     #define EQ_MONO_PORTS \
184             MESH("ag", "Amplitude graph", 2, para_equalizer_base_metadata::MESH_POINTS), \
185             CONTROL("frqs", "Frequency shift", U_SEMITONES, para_equalizer_base_metadata::PITCH), \
186             METER_GAIN("im", "Input signal meter", GAIN_AMP_P_12_DB), \
187             METER_GAIN("sm", "Output signal meter", GAIN_AMP_P_12_DB), \
188             MESH("fftg", "FFT graph", 2, para_equalizer_base_metadata::MESH_POINTS)
189 
190     #define EQ_STEREO_PORTS \
191             PAN_CTL("bal", "Output balance", 0.0f), \
192             MESH("ag", "Amplitude graph", 2, para_equalizer_base_metadata::MESH_POINTS), \
193             CONTROL("frqs", "Frequency shift", U_SEMITONES, para_equalizer_base_metadata::PITCH), \
194             METER_GAIN("iml", "Input signal meter Left", GAIN_AMP_P_12_DB), \
195             METER_GAIN("sml", "Output signal meter Left", GAIN_AMP_P_12_DB), \
196             MESH("fftg_l", "FFT channel Left", 2, para_equalizer_base_metadata::MESH_POINTS), \
197             SWITCH("fftv_l", "FFT visibility Left", 1.0f), \
198             METER_GAIN("imr", "Input signal meter Right", GAIN_AMP_P_12_DB), \
199             METER_GAIN("smr", "Output signal meter Right", GAIN_AMP_P_12_DB), \
200             MESH("fftg_r", "FFT channel Right", 2, para_equalizer_base_metadata::MESH_POINTS), \
201             SWITCH("fftv_r", "FFT visibility Right", 1.0f) \
202 
203     #define EQ_LR_PORTS \
204             PAN_CTL("bal", "Output balance", 0.0f), \
205             MESH("ag_l", "Amplitude graph Left", 2, para_equalizer_base_metadata::MESH_POINTS), \
206             CONTROL("frqs_l", "Frequency shift Left", U_SEMITONES, para_equalizer_base_metadata::PITCH), \
207             METER_GAIN("iml", "Input signal meter Left", GAIN_AMP_P_12_DB), \
208             METER_GAIN("sml", "Output signal meter Left", GAIN_AMP_P_12_DB), \
209             MESH("fftg_l", "FFT channel Left", 2, para_equalizer_base_metadata::MESH_POINTS), \
210             SWITCH("fftv_l", "FFT visibility Left", 1.0f), \
211             MESH("ag_r", "Amplitude graph Right", 2, para_equalizer_base_metadata::MESH_POINTS), \
212             CONTROL("frqs_r", "Frequency shift Right", U_SEMITONES, para_equalizer_base_metadata::PITCH), \
213             METER_GAIN("imr", "Input signal meter Right", GAIN_AMP_P_12_DB), \
214             METER_GAIN("smr", "Output signal meter Right", GAIN_AMP_P_12_DB), \
215             MESH("fftg_r", "FFT channel Right", 2, para_equalizer_base_metadata::MESH_POINTS), \
216             SWITCH("fftv_r", "FFT visibility Right", 1.0f)
217 
218     #define EQ_MS_PORTS \
219             PAN_CTL("bal", "Output balance", 0.0f), \
220             SWITCH("lstn", "Mid/Side listen", 0.0f), \
221             AMP_GAIN100("gain_m", "Mid gain", GAIN_AMP_0_DB), \
222             AMP_GAIN100("gain_s", "Side gain", GAIN_AMP_0_DB), \
223             MESH("ag_m", "Amplitude graph Mid", 2, para_equalizer_base_metadata::MESH_POINTS), \
224             CONTROL("frqs_m", "Frequency shift Mid", U_SEMITONES, para_equalizer_base_metadata::PITCH), \
225             METER_GAIN("iml", "Input signal meter Left", GAIN_AMP_P_12_DB), \
226             METER_GAIN("sml", "Output signal meter Left", GAIN_AMP_P_12_DB), \
227             MESH("fftg_m", "FFT channel Mid", 2, para_equalizer_base_metadata::MESH_POINTS), \
228             SWITCH("fftv_m", "FFT visibility Mid", 1.0f), \
229             MESH("ag_s", "Amplitude graph Side", 2, para_equalizer_base_metadata::MESH_POINTS), \
230             CONTROL("frqs_s", "Frequency shift Side", U_SEMITONES, para_equalizer_base_metadata::PITCH), \
231             METER_GAIN("imr", "Input signal meter Right", GAIN_AMP_P_12_DB), \
232             METER_GAIN("smr", "Output signal meter Right", GAIN_AMP_P_12_DB), \
233             MESH("fftg_s", "FFT channel Side", 2, para_equalizer_base_metadata::MESH_POINTS), \
234             SWITCH("fftv_s", "FFT visibility Side", 1.0f)
235 
236     static const port_t para_equalizer_x16_mono_ports[] =
237     {
238         PORTS_MONO_PLUGIN,
239         EQ_COMMON(filter_select_16),
240         EQ_MONO_PORTS,
241         EQ_FILTER_MONO(0, 16, 16.0f),
242         EQ_FILTER_MONO(1, 16, 25.0f),
243         EQ_FILTER_MONO(2, 16, 40.0f),
244         EQ_FILTER_MONO(3, 16, 63.0f),
245         EQ_FILTER_MONO(4, 16, 100.0f),
246         EQ_FILTER_MONO(5, 16, 160.0f),
247         EQ_FILTER_MONO(6, 16, 250.0f),
248         EQ_FILTER_MONO(7, 16, 400.0f),
249         EQ_FILTER_MONO(8, 16, 630.0f),
250         EQ_FILTER_MONO(9, 16, 1000.0f),
251         EQ_FILTER_MONO(10, 16, 1600.0f),
252         EQ_FILTER_MONO(11, 16, 2500.0f),
253         EQ_FILTER_MONO(12, 16, 4000.0f),
254         EQ_FILTER_MONO(13, 16, 6300.0f),
255         EQ_FILTER_MONO(14, 16, 10000.0f),
256         EQ_FILTER_MONO(15, 16, 16000.0f),
257 
258         PORTS_END
259     };
260 
261     static const port_t para_equalizer_x32_mono_ports[] =
262     {
263         PORTS_MONO_PLUGIN,
264         EQ_COMMON(filter_select_32),
265         EQ_MONO_PORTS,
266         EQ_FILTER_MONO(0, 32, 16.0f),
267         EQ_FILTER_MONO(1, 32, 20.0f),
268         EQ_FILTER_MONO(2, 32, 25.0f),
269         EQ_FILTER_MONO(3, 32, 31.5f),
270         EQ_FILTER_MONO(4, 32, 40.0f),
271         EQ_FILTER_MONO(5, 32, 50.0f),
272         EQ_FILTER_MONO(6, 32, 63.0f),
273         EQ_FILTER_MONO(7, 32, 80.0f),
274         EQ_FILTER_MONO(8, 32, 100.0f),
275         EQ_FILTER_MONO(9, 32, 125.0f),
276         EQ_FILTER_MONO(10, 32, 160.0f),
277         EQ_FILTER_MONO(11, 32, 200.0f),
278         EQ_FILTER_MONO(12, 32, 250.0f),
279         EQ_FILTER_MONO(13, 32, 315.0f),
280         EQ_FILTER_MONO(14, 32, 400.0f),
281         EQ_FILTER_MONO(15, 32, 500.0f),
282         EQ_FILTER_MONO(16, 32, 630.0f),
283         EQ_FILTER_MONO(17, 32, 800.0f),
284         EQ_FILTER_MONO(18, 32, 1000.0f),
285         EQ_FILTER_MONO(19, 32, 1250.0f),
286         EQ_FILTER_MONO(20, 32, 1600.0f),
287         EQ_FILTER_MONO(21, 32, 2000.0f),
288         EQ_FILTER_MONO(22, 32, 2500.0f),
289         EQ_FILTER_MONO(23, 32, 3150.0f),
290         EQ_FILTER_MONO(24, 32, 4000.0f),
291         EQ_FILTER_MONO(25, 32, 5000.0f),
292         EQ_FILTER_MONO(26, 32, 6300.0f),
293         EQ_FILTER_MONO(27, 32, 8000.0f),
294         EQ_FILTER_MONO(28, 32, 10000.0f),
295         EQ_FILTER_MONO(29, 32, 12500.0f),
296         EQ_FILTER_MONO(30, 32, 16000.0f),
297         EQ_FILTER_MONO(31, 32, 20000.0f),
298 
299         PORTS_END
300     };
301 
302     static const port_t para_equalizer_x16_stereo_ports[] =
303     {
304         PORTS_STEREO_PLUGIN,
305         EQ_COMMON(filter_select_16),
306         EQ_STEREO_PORTS,
307         EQ_FILTER_STEREO(0, 16, 16.0f),
308         EQ_FILTER_STEREO(1, 16, 25.0f),
309         EQ_FILTER_STEREO(2, 16, 40.0f),
310         EQ_FILTER_STEREO(3, 16, 63.0f),
311         EQ_FILTER_STEREO(4, 16, 100.0f),
312         EQ_FILTER_STEREO(5, 16, 160.0f),
313         EQ_FILTER_STEREO(6, 16, 250.0f),
314         EQ_FILTER_STEREO(7, 16, 400.0f),
315         EQ_FILTER_STEREO(8, 16, 630.0f),
316         EQ_FILTER_STEREO(9, 16, 1000.0f),
317         EQ_FILTER_STEREO(10, 16, 1600.0f),
318         EQ_FILTER_STEREO(11, 16, 2500.0f),
319         EQ_FILTER_STEREO(12, 16, 4000.0f),
320         EQ_FILTER_STEREO(13, 16, 6300.0f),
321         EQ_FILTER_STEREO(14, 16, 10000.0f),
322         EQ_FILTER_STEREO(15, 16, 16000.0f),
323 
324         PORTS_END
325     };
326 
327     static const port_t para_equalizer_x32_stereo_ports[] =
328     {
329         PORTS_STEREO_PLUGIN,
330         EQ_COMMON(filter_select_32),
331         EQ_STEREO_PORTS,
332         EQ_FILTER_STEREO(0, 32, 16.0f),
333         EQ_FILTER_STEREO(1, 32, 20.0f),
334         EQ_FILTER_STEREO(2, 32, 25.0f),
335         EQ_FILTER_STEREO(3, 32, 31.5f),
336         EQ_FILTER_STEREO(4, 32, 40.0f),
337         EQ_FILTER_STEREO(5, 32, 50.0f),
338         EQ_FILTER_STEREO(6, 32, 63.0f),
339         EQ_FILTER_STEREO(7, 32, 80.0f),
340         EQ_FILTER_STEREO(8, 32, 100.0f),
341         EQ_FILTER_STEREO(9, 32, 125.0f),
342         EQ_FILTER_STEREO(10, 32, 160.0f),
343         EQ_FILTER_STEREO(11, 32, 200.0f),
344         EQ_FILTER_STEREO(12, 32, 250.0f),
345         EQ_FILTER_STEREO(13, 32, 315.0f),
346         EQ_FILTER_STEREO(14, 32, 400.0f),
347         EQ_FILTER_STEREO(15, 32, 500.0f),
348         EQ_FILTER_STEREO(16, 32, 630.0f),
349         EQ_FILTER_STEREO(17, 32, 800.0f),
350         EQ_FILTER_STEREO(18, 32, 1000.0f),
351         EQ_FILTER_STEREO(19, 32, 1250.0f),
352         EQ_FILTER_STEREO(20, 32, 1600.0f),
353         EQ_FILTER_STEREO(21, 32, 2000.0f),
354         EQ_FILTER_STEREO(22, 32, 2500.0f),
355         EQ_FILTER_STEREO(23, 32, 3150.0f),
356         EQ_FILTER_STEREO(24, 32, 4000.0f),
357         EQ_FILTER_STEREO(25, 32, 5000.0f),
358         EQ_FILTER_STEREO(26, 32, 6300.0f),
359         EQ_FILTER_STEREO(27, 32, 8000.0f),
360         EQ_FILTER_STEREO(28, 32, 10000.0f),
361         EQ_FILTER_STEREO(29, 32, 12500.0f),
362         EQ_FILTER_STEREO(30, 32, 16000.0f),
363         EQ_FILTER_STEREO(31, 32, 20000.0f),
364 
365         PORTS_END
366     };
367 
368     static const port_t para_equalizer_x16_lr_ports[] =
369     {
370         PORTS_STEREO_PLUGIN,
371         EQ_COMMON(filter_select_16lr),
372         EQ_LR_PORTS,
373         EQ_FILTER_LR(0, 16, 16.0f),
374         EQ_FILTER_LR(1, 16, 25.0f),
375         EQ_FILTER_LR(2, 16, 40.0f),
376         EQ_FILTER_LR(3, 16, 63.0f),
377         EQ_FILTER_LR(4, 16, 100.0f),
378         EQ_FILTER_LR(5, 16, 160.0f),
379         EQ_FILTER_LR(6, 16, 250.0f),
380         EQ_FILTER_LR(7, 16, 400.0f),
381         EQ_FILTER_LR(8, 16, 630.0f),
382         EQ_FILTER_LR(9, 16, 1000.0f),
383         EQ_FILTER_LR(10, 16, 1600.0f),
384         EQ_FILTER_LR(11, 16, 2500.0f),
385         EQ_FILTER_LR(12, 16, 4000.0f),
386         EQ_FILTER_LR(13, 16, 6300.0f),
387         EQ_FILTER_LR(14, 16, 10000.0f),
388         EQ_FILTER_LR(15, 16, 16000.0f),
389 
390         PORTS_END
391     };
392 
393     static const port_t para_equalizer_x32_lr_ports[] =
394     {
395         PORTS_STEREO_PLUGIN,
396         EQ_COMMON(filter_select_32lr),
397         EQ_LR_PORTS,
398         EQ_FILTER_LR(0, 32, 16.0f),
399         EQ_FILTER_LR(1, 32, 20.0f),
400         EQ_FILTER_LR(2, 32, 25.0f),
401         EQ_FILTER_LR(3, 32, 31.5f),
402         EQ_FILTER_LR(4, 32, 40.0f),
403         EQ_FILTER_LR(5, 32, 50.0f),
404         EQ_FILTER_LR(6, 32, 63.0f),
405         EQ_FILTER_LR(7, 32, 80.0f),
406         EQ_FILTER_LR(8, 32, 100.0f),
407         EQ_FILTER_LR(9, 32, 125.0f),
408         EQ_FILTER_LR(10, 32, 160.0f),
409         EQ_FILTER_LR(11, 32, 200.0f),
410         EQ_FILTER_LR(12, 32, 250.0f),
411         EQ_FILTER_LR(13, 32, 315.0f),
412         EQ_FILTER_LR(14, 32, 400.0f),
413         EQ_FILTER_LR(15, 32, 500.0f),
414         EQ_FILTER_LR(16, 32, 630.0f),
415         EQ_FILTER_LR(17, 32, 800.0f),
416         EQ_FILTER_LR(18, 32, 1000.0f),
417         EQ_FILTER_LR(19, 32, 1250.0f),
418         EQ_FILTER_LR(20, 32, 1600.0f),
419         EQ_FILTER_LR(21, 32, 2000.0f),
420         EQ_FILTER_LR(22, 32, 2500.0f),
421         EQ_FILTER_LR(23, 32, 3150.0f),
422         EQ_FILTER_LR(24, 32, 4000.0f),
423         EQ_FILTER_LR(25, 32, 5000.0f),
424         EQ_FILTER_LR(26, 32, 6300.0f),
425         EQ_FILTER_LR(27, 32, 8000.0f),
426         EQ_FILTER_LR(28, 32, 10000.0f),
427         EQ_FILTER_LR(29, 32, 12500.0f),
428         EQ_FILTER_LR(30, 32, 16000.0f),
429         EQ_FILTER_LR(31, 32, 20000.0f),
430 
431         PORTS_END
432     };
433 
434     static const port_t para_equalizer_x16_ms_ports[] =
435     {
436         PORTS_STEREO_PLUGIN,
437         EQ_COMMON(filter_select_16ms),
438         EQ_MS_PORTS,
439         EQ_FILTER_MS(0, 16, 16.0f),
440         EQ_FILTER_MS(1, 16, 25.0f),
441         EQ_FILTER_MS(2, 16, 40.0f),
442         EQ_FILTER_MS(3, 16, 63.0f),
443         EQ_FILTER_MS(4, 16, 100.0f),
444         EQ_FILTER_MS(5, 16, 160.0f),
445         EQ_FILTER_MS(6, 16, 250.0f),
446         EQ_FILTER_MS(7, 16, 400.0f),
447         EQ_FILTER_MS(8, 16, 630.0f),
448         EQ_FILTER_MS(9, 16, 1000.0f),
449         EQ_FILTER_MS(10, 16, 1600.0f),
450         EQ_FILTER_MS(11, 16, 2500.0f),
451         EQ_FILTER_MS(12, 16, 4000.0f),
452         EQ_FILTER_MS(13, 16, 6300.0f),
453         EQ_FILTER_MS(14, 16, 10000.0f),
454         EQ_FILTER_MS(15, 16, 16000.0f),
455 
456         PORTS_END
457     };
458 
459     static const port_t para_equalizer_x32_ms_ports[] =
460     {
461         PORTS_STEREO_PLUGIN,
462         EQ_COMMON(filter_select_32ms),
463         EQ_MS_PORTS,
464         EQ_FILTER_MS(0, 32, 16.0f),
465         EQ_FILTER_MS(1, 32, 20.0f),
466         EQ_FILTER_MS(2, 32, 25.0f),
467         EQ_FILTER_MS(3, 32, 31.5f),
468         EQ_FILTER_MS(4, 32, 40.0f),
469         EQ_FILTER_MS(5, 32, 50.0f),
470         EQ_FILTER_MS(6, 32, 63.0f),
471         EQ_FILTER_MS(7, 32, 80.0f),
472         EQ_FILTER_MS(8, 32, 100.0f),
473         EQ_FILTER_MS(9, 32, 125.0f),
474         EQ_FILTER_MS(10, 32, 160.0f),
475         EQ_FILTER_MS(11, 32, 200.0f),
476         EQ_FILTER_MS(12, 32, 250.0f),
477         EQ_FILTER_MS(13, 32, 315.0f),
478         EQ_FILTER_MS(14, 32, 400.0f),
479         EQ_FILTER_MS(15, 32, 500.0f),
480         EQ_FILTER_MS(16, 32, 630.0f),
481         EQ_FILTER_MS(17, 32, 800.0f),
482         EQ_FILTER_MS(18, 32, 1000.0f),
483         EQ_FILTER_MS(19, 32, 1250.0f),
484         EQ_FILTER_MS(20, 32, 1600.0f),
485         EQ_FILTER_MS(21, 32, 2000.0f),
486         EQ_FILTER_MS(22, 32, 2500.0f),
487         EQ_FILTER_MS(23, 32, 3150.0f),
488         EQ_FILTER_MS(24, 32, 4000.0f),
489         EQ_FILTER_MS(25, 32, 5000.0f),
490         EQ_FILTER_MS(26, 32, 6300.0f),
491         EQ_FILTER_MS(27, 32, 8000.0f),
492         EQ_FILTER_MS(28, 32, 10000.0f),
493         EQ_FILTER_MS(29, 32, 12500.0f),
494         EQ_FILTER_MS(30, 32, 16000.0f),
495         EQ_FILTER_MS(31, 32, 20000.0f),
496 
497         PORTS_END
498     };
499 
500     const plugin_metadata_t  para_equalizer_x16_mono_metadata::metadata =
501     {
502         "Parametrischer Entzerrer x16 Mono",
503         "Parametric Equalizer x16 Mono",
504         "PE16M",
505         &developers::v_sadovnikov,
506         "para_equalizer_x16_mono",
507         "dh3y",
508         LSP_PARA_EQUALIZER_BASE + 0,
509         LSP_VERSION(1, 0, 4),
510         para_equalizer_classes,
511         E_INLINE_DISPLAY,
512         para_equalizer_x16_mono_ports,
513         "equalizer/parametric/x16/mono.xml",
514         NULL,
515         mono_plugin_port_groups
516     };
517 
518     const plugin_metadata_t  para_equalizer_x32_mono_metadata::metadata =
519     {
520         "Parametrischer Entzerrer x32 Mono",
521         "Parametric Equalizer x32 Mono",
522         "PE32M",
523         &developers::v_sadovnikov,
524         "para_equalizer_x32_mono",
525         "i0px",
526         LSP_PARA_EQUALIZER_BASE + 1,
527         LSP_VERSION(1, 0, 4),
528         para_equalizer_classes,
529         E_INLINE_DISPLAY,
530         para_equalizer_x32_mono_ports,
531         "equalizer/parametric/x32/mono.xml",
532         NULL,
533         mono_plugin_port_groups
534     };
535 
536     const plugin_metadata_t  para_equalizer_x16_stereo_metadata::metadata =
537     {
538         "Parametrischer Entzerrer x16 Stereo",
539         "Parametric Equalizer x16 Stereo",
540         "PE16S",
541         &developers::v_sadovnikov,
542         "para_equalizer_x16_stereo",
543         "a5er",
544         LSP_PARA_EQUALIZER_BASE + 2,
545         LSP_VERSION(1, 0, 4),
546         para_equalizer_classes,
547         E_INLINE_DISPLAY,
548         para_equalizer_x16_stereo_ports,
549         "equalizer/parametric/x16/stereo.xml",
550         NULL,
551         stereo_plugin_port_groups
552     };
553 
554     const plugin_metadata_t  para_equalizer_x32_stereo_metadata::metadata =
555     {
556         "Parametrischer Entzerrer x32 Stereo",
557         "Parametric Equalizer x32 Stereo",
558         "PE32S",
559         &developers::v_sadovnikov,
560         "para_equalizer_x32_stereo",
561         "s2nz",
562         LSP_PARA_EQUALIZER_BASE + 3,
563         LSP_VERSION(1, 0, 4),
564         para_equalizer_classes,
565         E_INLINE_DISPLAY,
566         para_equalizer_x32_stereo_ports,
567         "equalizer/parametric/x32/stereo.xml",
568         NULL,
569         stereo_plugin_port_groups
570     };
571 
572     const plugin_metadata_t  para_equalizer_x16_lr_metadata::metadata =
573     {
574         "Parametrischer Entzerrer x16 LeftRight",
575         "Parametric Equalizer x16 LeftRight",
576         "PE16LR",
577         &developers::v_sadovnikov,
578         "para_equalizer_x16_lr",
579         "4kef",
580         LSP_PARA_EQUALIZER_BASE + 4,
581         LSP_VERSION(1, 0, 4),
582         para_equalizer_classes,
583         E_INLINE_DISPLAY,
584         para_equalizer_x16_lr_ports,
585         "equalizer/parametric/x16/lr.xml",
586         NULL,
587         stereo_plugin_port_groups
588     };
589 
590     const plugin_metadata_t  para_equalizer_x32_lr_metadata::metadata =
591     {
592         "Parametrischer Entzerrer x32 LeftRight",
593         "Parametric Equalizer x32 LeftRight",
594         "PE32LR",
595         &developers::v_sadovnikov,
596         "para_equalizer_x32_lr",
597         "ilqj",
598         LSP_PARA_EQUALIZER_BASE + 5,
599         LSP_VERSION(1, 0, 4),
600         para_equalizer_classes,
601         E_INLINE_DISPLAY,
602         para_equalizer_x32_lr_ports,
603         "equalizer/parametric/x32/lr.xml",
604         NULL,
605         stereo_plugin_port_groups
606     };
607 
608     const plugin_metadata_t  para_equalizer_x16_ms_metadata::metadata =
609     {
610         "Parametrischer Entzerrer x16 MidSide",
611         "Parametric Equalizer x16 MidSide",
612         "PE16MS",
613         &developers::v_sadovnikov,
614         "para_equalizer_x16_ms",
615         "opjs",
616         LSP_PARA_EQUALIZER_BASE + 6,
617         LSP_VERSION(1, 0, 4),
618         para_equalizer_classes,
619         E_INLINE_DISPLAY,
620         para_equalizer_x16_ms_ports,
621         "equalizer/parametric/x16/ms.xml",
622         NULL,
623         stereo_plugin_port_groups
624     };
625 
626     const plugin_metadata_t  para_equalizer_x32_ms_metadata::metadata =
627     {
628         "Parametrischer Entzerrer x32 MidSide",
629         "Parametric Equalizer x32 MidSide",
630         "PE32MS",
631         &developers::v_sadovnikov,
632         "para_equalizer_x32_ms",
633         "lgz9",
634         LSP_PARA_EQUALIZER_BASE + 7,
635         LSP_VERSION(1, 0, 4),
636         para_equalizer_classes,
637         E_INLINE_DISPLAY,
638         para_equalizer_x32_ms_ports,
639         "equalizer/parametric/x32/ms.xml",
640         NULL,
641         stereo_plugin_port_groups
642     };
643 }
644 
645 
646 
647