1 /* Calf DSP Library
2  * Audio module (plugin) metadata - header file
3  *
4  * Copyright (C) 2007-2008 Krzysztof Foltman
5  * Copyright (C) 2008 Thor Harald Johansen <thj@thj.no>
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General
18  * Public License along with this program; if not, write to the
19  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02111-1307, USA.
21  */
22 
23 #ifndef __CALF_METADATA_H
24 #define __CALF_METADATA_H
25 
26 #include "giface.h"
27 
28 #define MONO_VU_METER_PARAMS param_meter_in, param_meter_out, param_clip_in, param_clip_out
29 #define STEREO_VU_METER_PARAMS param_meter_inL, param_meter_inR, param_meter_outL, param_meter_outR, param_clip_inL, param_clip_inR, param_clip_outL, param_clip_outR
30 
31 namespace calf_plugins {
32 
33 struct flanger_metadata: public plugin_metadata<flanger_metadata>
34 {
35 public:
36     enum { par_delay, par_depth, par_rate, par_fb, par_stereo, par_reset, par_amount, par_dryamount, param_count };
37     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
38     PLUGIN_NAME_ID_LABEL("flanger", "flanger", "Flanger")
39 };
40 
41 struct phaser_metadata: public plugin_metadata<phaser_metadata>
42 {
43     enum { par_freq, par_depth, par_rate, par_fb, par_stages, par_stereo, par_reset, par_amount, par_dryamount, param_count };
44     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
45     PLUGIN_NAME_ID_LABEL("phaser", "phaser", "Phaser")
46 };
47 
48 struct filter_metadata: public plugin_metadata<filter_metadata>
49 {
50     enum { par_cutoff, par_resonance, par_mode, par_inertia, param_count };
51     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, rt_capable = true, require_midi = false, support_midi = false };
52     PLUGIN_NAME_ID_LABEL("filter", "filter", "Filter")
53     /// do not export mode and inertia as CVs, as those are settings and not parameters
is_cvfilter_metadata54     bool is_cv(int param_no) { return param_no != par_mode && param_no != par_inertia; }
55 };
56 
57 /// Filterclavier - metadata
58 struct filterclavier_metadata: public plugin_metadata<filterclavier_metadata>
59 {
60     enum { par_transpose, par_detune, par_max_resonance, par_mode, par_inertia,  param_count };
61     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, rt_capable = true, require_midi = true, support_midi = true };
62     PLUGIN_NAME_ID_LABEL("filterclavier", "filterclavier", "Filterclavier")
63     /// do not export mode and inertia as CVs, as those are settings and not parameters
is_cvfilterclavier_metadata64     bool is_cv(int param_no) { return param_no != par_mode && param_no != par_inertia; }
65 };
66 
67 struct reverb_metadata: public plugin_metadata<reverb_metadata>
68 {
69     enum { par_clip, par_meter_wet, par_meter_out, par_decay, par_hfdamp, par_roomsize, par_diffusion, par_amount, par_dry, par_predelay, par_basscut, par_treblecut, param_count };
70     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
71     PLUGIN_NAME_ID_LABEL("reverb", "reverb", "Reverb")
72 };
73 
74 struct vintage_delay_metadata: public plugin_metadata<vintage_delay_metadata>
75 {
76     enum { par_bpm, par_divide, par_time_l, par_time_r, par_feedback, par_amount, par_mixmode, par_medium, par_dryamount, par_width, param_count };
77     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, rt_capable = true, support_midi = false, require_midi = false };
78     PLUGIN_NAME_ID_LABEL("vintage_delay", "vintagedelay", "Vintage Delay")
79 };
80 
81 struct rotary_speaker_metadata: public plugin_metadata<rotary_speaker_metadata>
82 {
83 public:
84     enum { par_speed, par_spacing, par_shift, par_moddepth, par_treblespeed, par_bassspeed, par_micdistance, par_reflection, par_am_depth, par_test, par_meter_l, par_meter_h, param_count };
85     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = false, rt_capable = true };
86     PLUGIN_NAME_ID_LABEL("rotary_speaker", "rotaryspeaker", "Rotary Speaker")
87 };
88 
89 /// A multitap stereo chorus thing - metadata
90 struct multichorus_metadata: public plugin_metadata<multichorus_metadata>
91 {
92 public:
93     enum { par_delay, par_depth, par_rate, par_stereo, par_voices, par_vphase, par_amount, par_dryamount, par_freq, par_freq2, par_q, par_overlap, param_count };
94     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, rt_capable = true, support_midi = false, require_midi = false };
95     PLUGIN_NAME_ID_LABEL("multichorus", "multichorus", "Multi Chorus")
96 };
97 
98 enum CalfEqMode {
99     MODE12DB,
100     MODE24DB,
101     MODE36DB
102 };
103 
104 /// Monosynth - metadata
105 struct monosynth_metadata: public plugin_metadata<monosynth_metadata>
106 {
107     enum { wave_saw, wave_sqr, wave_pulse, wave_sine, wave_triangle, wave_varistep, wave_skewsaw, wave_skewsqr, wave_test1, wave_test2, wave_test3, wave_test4, wave_test5, wave_test6, wave_test7, wave_test8, wave_count };
108     enum { flt_lp12, flt_lp24, flt_2lp12, flt_hp12, flt_lpbr, flt_hpbr, flt_bp6, flt_2bp6 };
109     enum { par_wave1, par_wave2, par_pw1, par_pw2, par_detune, par_osc2xpose, par_oscmode, par_oscmix, par_filtertype, par_cutoff, par_resonance, par_cutoffsep, par_env1tocutoff, par_env1tores, par_env1toamp,
110         par_env1attack, par_env1decay, par_env1sustain, par_env1fade, par_env1release,
111         par_keyfollow, par_legato, par_portamento, par_vel2filter, par_vel2amp, par_master, par_pwhlrange,
112         par_lforate, par_lfodelay, par_lfofilter, par_lfopitch, par_lfopw, par_mwhl_lfo, par_scaledetune,
113         par_env2tocutoff, par_env2tores, par_env2toamp,
114         par_env2attack, par_env2decay, par_env2sustain, par_env2fade, par_env2release,
115         par_stretch1, par_window1,
116         par_lfo1trig, par_lfo2trig,
117         par_lfo2rate, par_lfo2delay,
118         param_count };
119     enum { in_count = 0, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = true, rt_capable = true };
120     enum { step_size = 64, step_shift = 6 };
121     enum { mod_matrix_slots = 10 };
122     enum {
123         modsrc_none,
124         modsrc_velocity,
125         modsrc_pressure,
126         modsrc_modwheel,
127         modsrc_env1,
128         modsrc_env2,
129         modsrc_lfo1,
130         modsrc_lfo2,
131         modsrc_count,
132     };
133     enum {
134         moddest_none,
135         moddest_attenuation,
136         moddest_oscmix,
137         moddest_cutoff,
138         moddest_resonance,
139         moddest_o1detune,
140         moddest_o2detune,
141         moddest_o1pw,
142         moddest_o2pw,
143         moddest_o1stretch,
144         moddest_count,
145     };
146     PLUGIN_NAME_ID_LABEL("monosynth", "monosynth", "Monosynth")
147 
148     mod_matrix_metadata mm_metadata;
149 
150     monosynth_metadata();
151     /// Lookup of table edit interface
get_table_metadata_ifacemonosynth_metadata152     virtual const table_metadata_iface *get_table_metadata_iface(const char *key) const { if (!strcmp(key, "mod_matrix")) return &mm_metadata; else return NULL; }
153     const char *const *get_configure_vars() const;
154 };
155 
156 /// Thor's compressor - metadata
157 /// Added some meters and stripped the weighting part
158 struct compressor_metadata: public plugin_metadata<compressor_metadata>
159 {
160     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
161     enum { param_bypass, param_level_in, MONO_VU_METER_PARAMS,
162            param_threshold, param_ratio, param_attack, param_release, param_makeup, param_knee, param_detection, param_stereo_link, param_compression,
163            param_count };
164     PLUGIN_NAME_ID_LABEL("compressor", "compressor", "Compressor")
165 };
166 
167 /// Markus's sidechain compressor - metadata
168 struct sidechaincompressor_metadata: public plugin_metadata<sidechaincompressor_metadata>
169 {
170     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
171     enum { param_bypass, param_level_in, MONO_VU_METER_PARAMS,
172            param_threshold, param_ratio, param_attack, param_release, param_makeup, param_knee, param_detection, param_stereo_link, param_compression,
173            param_sc_mode, param_f1_freq, param_f2_freq, param_f1_level, param_f2_level,
174            param_sc_listen, param_f1_active, param_f2_active, param_sc_route, param_sc_level, param_count };
175     PLUGIN_NAME_ID_LABEL("sidechaincompressor", "sidechaincompressor", "Sidechain Compressor")
176 };
177 
178 /// Markus's multibandcompressor - metadata
179 struct multibandcompressor_metadata: public plugin_metadata<multibandcompressor_metadata>
180 {
181     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
182     enum { param_bypass, param_level_in, param_level_out,
183            STEREO_VU_METER_PARAMS,
184            param_freq0, param_freq1, param_freq2,
185            param_sep0, param_sep1, param_sep2,
186            param_q0, param_q1, param_q2,
187            param_mode,
188            param_threshold0, param_ratio0, param_attack0, param_release0, param_makeup0, param_knee0,
189            param_detection0, param_compression0, param_output0, param_bypass0, param_solo0,
190            param_threshold1, param_ratio1, param_attack1, param_release1, param_makeup1, param_knee1,
191            param_detection1, param_compression1, param_output1, param_bypass1, param_solo1,
192            param_threshold2, param_ratio2, param_attack2, param_release2, param_makeup2, param_knee2,
193            param_detection2, param_compression2, param_output2, param_bypass2, param_solo2,
194            param_threshold3, param_ratio3, param_attack3, param_release3, param_makeup3, param_knee3,
195            param_detection3, param_compression3, param_output3, param_bypass3, param_solo3,
196            param_count };
197     PLUGIN_NAME_ID_LABEL("multiband_compressor", "multibandcompressor", "Multiband Compressor")
198 };
199 
200 /// Markus's deesser - metadata
201 struct deesser_metadata: public plugin_metadata<deesser_metadata>
202 {
203     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
204     enum { param_bypass, param_detected, param_compression, param_detected_led, param_clip_out,
205            param_detection, param_mode,
206            param_threshold, param_ratio, param_laxity, param_makeup,
207            param_f1_freq, param_f2_freq, param_f1_level, param_f2_level, param_f2_q,
208            param_sc_listen, param_count };
209     PLUGIN_NAME_ID_LABEL("deesser", "deesser", "Deesser")
210 };
211 
212 /// Damiens' Gate - metadata
213 /// Added some meters and stripped the weighting part
214 struct gate_metadata: public plugin_metadata<gate_metadata>
215 {
216     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
217     enum { param_bypass, param_level_in, MONO_VU_METER_PARAMS,
218            param_range, param_threshold, param_ratio, param_attack, param_release, param_makeup, param_knee, param_detection, param_stereo_link, param_gating,
219            param_count };
220     PLUGIN_NAME_ID_LABEL("gate", "gate", "Gate")
221 };
222 
223 /// Markus's sidechain gate - metadata
224 struct sidechaingate_metadata: public plugin_metadata<sidechaingate_metadata>
225 {
226     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
227     enum { param_bypass, param_level_in, MONO_VU_METER_PARAMS,
228            param_range, param_threshold, param_ratio, param_attack, param_release, param_makeup, param_knee, param_detection, param_stereo_link, param_gating,
229            param_sc_mode, param_f1_freq, param_f2_freq, param_f1_level, param_f2_level,
230            param_sc_listen, param_f1_active, param_f2_active, param_sc_route, param_sc_level, param_count };
231     PLUGIN_NAME_ID_LABEL("sidechaingate", "sidechaingate", "Sidechain Gate")
232 };
233 
234 /// Markus's multiband gate - metadata
235 struct multibandgate_metadata: public plugin_metadata<multibandgate_metadata>
236 {
237     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
238     enum { param_bypass, param_level_in, param_level_out,
239            STEREO_VU_METER_PARAMS,
240            param_freq0, param_freq1, param_freq2,
241            param_sep0, param_sep1, param_sep2,
242            param_q0, param_q1, param_q2,
243            param_mode,
244            param_range0, param_threshold0, param_ratio0, param_attack0, param_release0, param_makeup0, param_knee0,
245            param_detection0, param_gating0, param_output0, param_bypass0, param_solo0,
246            param_range1, param_threshold1, param_ratio1, param_attack1, param_release1, param_makeup1, param_knee1,
247            param_detection1, param_gating1, param_output1, param_bypass1, param_solo1,
248            param_range2, param_threshold2, param_ratio2, param_attack2, param_release2, param_makeup2, param_knee2,
249            param_detection2, param_gating2, param_output2, param_bypass2, param_solo2,
250            param_range3, param_threshold3, param_ratio3, param_attack3, param_release3, param_makeup3, param_knee3,
251            param_detection3, param_gating3, param_output3, param_bypass3, param_solo3,
252            param_count };
253     PLUGIN_NAME_ID_LABEL("multiband_gate", "multibandgate", "Multiband Gate")
254 };
255 
256 /// Markus's limiter - metadata
257 struct limiter_metadata: public plugin_metadata<limiter_metadata>
258 {
259     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
260     enum { param_bypass, param_level_in, param_level_out,
261            STEREO_VU_METER_PARAMS,
262            param_limit, param_attack, param_release,
263            param_att,
264            param_asc, param_asc_led, param_asc_coeff,
265            param_count };
266     PLUGIN_NAME_ID_LABEL("limiter", "limiter", "Limiter")
267 };
268 
269 /// Markus's multibandlimiter - metadata
270 struct multibandlimiter_metadata: public plugin_metadata<multibandlimiter_metadata>
271 {
272     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
273     enum { param_bypass, param_level_in, param_level_out,
274            STEREO_VU_METER_PARAMS,
275            param_freq0, param_freq1, param_freq2,
276            param_sep0, param_sep1, param_sep2,
277            param_q0, param_q1, param_q2,
278            param_mode,
279            param_limit, param_attack, param_release, param_minrel,
280            param_att0, param_att1, param_att2, param_att3,
281            param_weight0, param_weight1, param_weight2, param_weight3,
282            param_release0, param_release1, param_release2, param_release3,
283            param_solo0, param_solo1, param_solo2, param_solo3,
284            param_effrelease0, param_effrelease1, param_effrelease2, param_effrelease3,
285            param_asc, param_asc_led, param_asc_coeff,
286            param_count };
287     PLUGIN_NAME_ID_LABEL("multiband_limiter", "multibandlimiter", "Multiband Limiter")
288 };
289 
290 /// Markus's 5-band EQ - metadata
291 struct equalizer5band_metadata: public plugin_metadata<equalizer5band_metadata>
292 {
293     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
294     enum { param_bypass, param_level_in, param_level_out, STEREO_VU_METER_PARAMS,
295            param_ls_active, param_ls_level, param_ls_freq,
296            param_hs_active, param_hs_level, param_hs_freq,
297            param_p1_active, param_p1_level, param_p1_freq, param_p1_q,
298            param_p2_active, param_p2_level, param_p2_freq, param_p2_q,
299            param_p3_active, param_p3_level, param_p3_freq, param_p3_q,
300            param_count };
301     // dummy parameter numbers, shouldn't be used EVER, they're only there to avoid pushing LP/HP filters to a separate class
302     // and potentially making inlining and optimization harder for the compiler
303     enum { param_lp_active = 0xDEADBEEF, param_hp_active, param_hp_mode, param_lp_mode, param_hp_freq, param_lp_freq };
304     enum { PeakBands = 3, first_graph_param = param_ls_active, last_graph_param = param_p3_q };
305     PLUGIN_NAME_ID_LABEL("equalizer5band", "eq5", "Equalizer 5 Band")
306 };
307 /// Markus's 8-band EQ - metadata
308 struct equalizer8band_metadata: public plugin_metadata<equalizer8band_metadata>
309 {
310     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
311     enum { param_bypass, param_level_in, param_level_out,
312            STEREO_VU_METER_PARAMS,
313            param_hp_active, param_hp_freq, param_hp_mode,
314            param_lp_active, param_lp_freq, param_lp_mode,
315            param_ls_active, param_ls_level, param_ls_freq,
316            param_hs_active, param_hs_level, param_hs_freq,
317            param_p1_active, param_p1_level, param_p1_freq, param_p1_q,
318            param_p2_active, param_p2_level, param_p2_freq, param_p2_q,
319            param_p3_active, param_p3_level, param_p3_freq, param_p3_q,
320            param_p4_active, param_p4_level, param_p4_freq, param_p4_q,
321            param_count };
322     enum { PeakBands = 4, first_graph_param = param_hp_active, last_graph_param = param_p4_q };
323     PLUGIN_NAME_ID_LABEL("equalizer8band", "eq8", "Equalizer 8 Band")
324 };
325 /// Markus's 12-band EQ - metadata
326 struct equalizer12band_metadata: public plugin_metadata<equalizer12band_metadata>
327 {
328     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
329     enum { param_bypass, param_level_in, param_level_out,
330            STEREO_VU_METER_PARAMS,
331            param_hp_active, param_hp_freq, param_hp_mode,
332            param_lp_active, param_lp_freq, param_lp_mode,
333            param_ls_active, param_ls_level, param_ls_freq,
334            param_hs_active, param_hs_level, param_hs_freq,
335            param_p1_active, param_p1_level, param_p1_freq, param_p1_q,
336            param_p2_active, param_p2_level, param_p2_freq, param_p2_q,
337            param_p3_active, param_p3_level, param_p3_freq, param_p3_q,
338            param_p4_active, param_p4_level, param_p4_freq, param_p4_q,
339            param_p5_active, param_p5_level, param_p5_freq, param_p5_q,
340            param_p6_active, param_p6_level, param_p6_freq, param_p6_q,
341            param_p7_active, param_p7_level, param_p7_freq, param_p7_q,
342            param_p8_active, param_p8_level, param_p8_freq, param_p8_q,
343            param_count };
344     enum { PeakBands = 8, first_graph_param = param_hp_active, last_graph_param = param_p8_q };
345     PLUGIN_NAME_ID_LABEL("equalizer12band", "eq12", "Equalizer 12 Band")
346 };
347 
348 /// Markus's Pulsator - metadata
349 struct pulsator_metadata: public plugin_metadata<pulsator_metadata>
350 {
351     enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
352     enum { param_bypass, param_level_in, param_level_out, STEREO_VU_METER_PARAMS,
353            param_mode, param_freq, param_amount, param_offset, param_mono, param_reset, param_count };
354     PLUGIN_NAME_ID_LABEL("pulsator", "pulsator", "Pulsator")
355 };
356 
357 /// Markus's Saturator - metadata
358 struct saturator_metadata: public plugin_metadata<saturator_metadata>
359 {
360     enum { in_count = 2, out_count = 2, ins_optional = 1, outs_optional = 1, support_midi = false, require_midi = false, rt_capable = true };
361     enum { param_bypass, param_level_in, param_level_out, param_mix, MONO_VU_METER_PARAMS, param_drive, param_blend, param_meter_drive,
362            param_lp_pre_freq, param_hp_pre_freq, param_lp_post_freq, param_hp_post_freq,
363            param_p_freq, param_p_level, param_p_q, param_count };
364     PLUGIN_NAME_ID_LABEL("saturator", "saturator", "Saturator")
365 };
366 /// Markus's Exciter - metadata
367 struct exciter_metadata: public plugin_metadata<exciter_metadata>
368 {
369     enum { in_count = 2, out_count = 2, ins_optional = 1, outs_optional = 1, support_midi = false, require_midi = false, rt_capable = true };
370     enum { param_bypass, param_level_in, param_level_out, param_amount, MONO_VU_METER_PARAMS, param_drive, param_blend, param_meter_drive,
371            param_freq, param_listen, param_ceil_active, param_ceil, param_count };
372     PLUGIN_NAME_ID_LABEL("exciter", "exciter", "Exciter")
373 };
374 /// Markus's Bass Enhancer - metadata
375 struct bassenhancer_metadata: public plugin_metadata<bassenhancer_metadata>
376 {
377     enum { in_count = 2, out_count = 2, ins_optional = 1, outs_optional = 1, support_midi = false, require_midi = false, rt_capable = true };
378     enum { param_bypass, param_level_in, param_level_out, param_amount, MONO_VU_METER_PARAMS, param_drive, param_blend, param_meter_drive,
379            param_freq, param_listen, param_floor_active, param_floor, param_count };
380     PLUGIN_NAME_ID_LABEL("bassenhancer", "bassenhancer", "Bass Enhancer")
381 };
382 /// Markus's Mono Module - metadata
383 struct stereo_metadata: public plugin_metadata<stereo_metadata>
384 {
385     enum { in_count = 2, out_count = 2, ins_optional = 1, outs_optional = 1, support_midi = false, require_midi = false, rt_capable = true };
386     enum { param_bypass, param_level_in, param_level_out,
387            STEREO_VU_METER_PARAMS, param_balance_in, param_balance_out, param_softclip,
388            param_mute_l, param_mute_r, param_phase_l, param_phase_r,
389            param_mode, param_slev, param_sbal, param_mlev, param_mpan,
390            param_widener, param_delay,
391            param_meter_phase,
392            param_count };
393     PLUGIN_NAME_ID_LABEL("stereo", "stereo", "Stereo Tools")
394 };
395 /// Markus's Mono Module - metadata
396 struct mono_metadata: public plugin_metadata<mono_metadata>
397 {
398     enum { in_count = 1, out_count = 2, ins_optional = 1, outs_optional = 1, support_midi = false, require_midi = false, rt_capable = true };
399     enum { param_bypass, param_level_in, param_level_out,
400            param_meter_in, param_meter_outL, param_meter_outR, param_clip_in,param_clip_outL, param_clip_outR,
401            param_balance_out, param_softclip,
402            param_mute_l, param_mute_r, param_phase_l, param_phase_r,
403            param_delay,
404            param_count };
405     PLUGIN_NAME_ID_LABEL("mono", "mono", "Mono Input")
406 };
407 
408 /// Organ - enums for parameter IDs etc. (this mess is caused by organ split between plugin and generic class - which was
409 /// a bad design decision and should be sorted out some day) XXXKF @todo
410 struct organ_enums
411 {
412     enum {
413         par_drawbar1, par_drawbar2, par_drawbar3, par_drawbar4, par_drawbar5, par_drawbar6, par_drawbar7, par_drawbar8, par_drawbar9,
414         par_frequency1, par_frequency2, par_frequency3, par_frequency4, par_frequency5, par_frequency6, par_frequency7, par_frequency8, par_frequency9,
415         par_waveform1, par_waveform2, par_waveform3, par_waveform4, par_waveform5, par_waveform6, par_waveform7, par_waveform8, par_waveform9,
416         par_detune1, par_detune2, par_detune3, par_detune4, par_detune5, par_detune6, par_detune7, par_detune8, par_detune9,
417         par_phase1, par_phase2, par_phase3, par_phase4, par_phase5, par_phase6, par_phase7, par_phase8, par_phase9,
418         par_pan1, par_pan2, par_pan3, par_pan4, par_pan5, par_pan6, par_pan7, par_pan8, par_pan9,
419         par_routing1, par_routing2, par_routing3, par_routing4, par_routing5, par_routing6, par_routing7, par_routing8, par_routing9,
420         par_foldover,
421         par_percdecay, par_perclevel, par_percwave, par_percharm, par_percvel2amp,
422         par_percfmdecay, par_percfmdepth, par_percfmwave, par_percfmharm, par_percvel2fm,
423         par_perctrigger, par_percstereo,
424         par_filterchain,
425         par_filter1type,
426         par_master,
427         par_f1cutoff, par_f1res, par_f1env1, par_f1env2, par_f1env3, par_f1keyf,
428         par_f2cutoff, par_f2res, par_f2env1, par_f2env2, par_f2env3, par_f2keyf,
429         par_eg1attack, par_eg1decay, par_eg1sustain, par_eg1release, par_eg1velscl, par_eg1ampctl,
430         par_eg2attack, par_eg2decay, par_eg2sustain, par_eg2release, par_eg2velscl, par_eg2ampctl,
431         par_eg3attack, par_eg3decay, par_eg3sustain, par_eg3release, par_eg3velscl, par_eg3ampctl,
432         par_lforate, par_lfoamt, par_lfowet, par_lfophase, par_lfomode, par_lfotype,
433         par_transpose, par_detune,
434         par_polyphony,
435         par_quadenv,
436         par_pwhlrange,
437         par_bassfreq,
438         par_bassgain,
439         par_treblefreq,
440         par_treblegain,
441         param_count
442     };
443     enum organ_waveform {
444         wave_sine,
445         wave_sinepl1, wave_sinepl2, wave_sinepl3,
446         wave_ssaw, wave_ssqr, wave_spls, wave_saw, wave_sqr, wave_pulse, wave_sinepl05, wave_sqr05, wave_halfsin, wave_clvg, wave_bell, wave_bell2,
447         wave_w1, wave_w2, wave_w3, wave_w4, wave_w5, wave_w6, wave_w7, wave_w8, wave_w9,
448         wave_dsaw, wave_dsqr, wave_dpls,
449         wave_count_small,
450         wave_strings = wave_count_small,
451         wave_strings2,
452         wave_sinepad,
453         wave_bellpad,
454         wave_space,
455         wave_choir,
456         wave_choir2,
457         wave_choir3,
458         wave_count,
459         wave_count_big = wave_count - wave_count_small
460     };
461     enum {
462         ampctl_none,
463         ampctl_direct,
464         ampctl_f1,
465         ampctl_f2,
466         ampctl_all,
467         ampctl_count
468     };
469     enum {
470         lfotype_allpass = 0,
471         lfotype_cv1,
472         lfotype_cv2,
473         lfotype_cv3,
474         lfotype_cvfull,
475         lfotype_count
476     };
477     enum {
478         lfomode_off = 0,
479         lfomode_direct,
480         lfomode_filter1,
481         lfomode_filter2,
482         lfomode_voice,
483         lfomode_global,
484         lfomode_count
485     };
486     enum {
487         perctrig_first = 0,
488         perctrig_each,
489         perctrig_eachplus,
490         perctrig_polyphonic,
491         perctrig_count
492     };
493 };
494 
495 /// Organ - metadata
496 struct organ_metadata: public organ_enums, public plugin_metadata<organ_metadata>
497 {
498     enum { in_count = 0, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = true, rt_capable = true };
499     PLUGIN_NAME_ID_LABEL("organ", "organ", "Organ")
500 
501 public:
502     plugin_command_info *get_commands();
503     const char *const *get_configure_vars() const;
504 };
505 
506 /// FluidSynth - metadata
507 struct fluidsynth_metadata: public plugin_metadata<fluidsynth_metadata>
508 {
509     enum { par_master, par_interpolation, par_reverb, par_chorus, param_count };
510     enum { in_count = 0, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = true, rt_capable = false };
511     PLUGIN_NAME_ID_LABEL("fluidsynth", "fluidsynth", "Fluidsynth")
512 
513 public:
514     const char *const *get_configure_vars() const;
515 };
516 
517 /// Wavetable - metadata
518 struct wavetable_metadata: public plugin_metadata<wavetable_metadata>
519 {
520     enum {
521         wt_fmshiny,
522         wt_fmshiny2,
523         wt_rezo,
524         wt_metal,
525         wt_bell,
526         wt_blah,
527         wt_pluck,
528         wt_stretch,
529         wt_stretch2,
530         wt_hardsync,
531         wt_hardsync2,
532         wt_softsync,
533         wt_bell2,
534         wt_bell3,
535         wt_tine,
536         wt_tine2,
537         wt_clav,
538         wt_clav2,
539         wt_gtr,
540         wt_gtr2,
541         wt_gtr3,
542         wt_gtr4,
543         wt_gtr5,
544         wt_reed,
545         wt_reed2,
546         wt_silver,
547         wt_brass,
548         wt_multi,
549         wt_multi2,
550         wt_count
551     };
552     enum {
553         modsrc_none,
554         modsrc_velocity,
555         modsrc_pressure,
556         modsrc_modwheel,
557         modsrc_env1,
558         modsrc_env2,
559         modsrc_env3,
560         modsrc_count,
561     };
562     enum {
563         moddest_none,
564         moddest_attenuation,
565         moddest_oscmix,
566         moddest_cutoff,
567         moddest_resonance,
568         moddest_o1shift,
569         moddest_o2shift,
570         moddest_o1detune,
571         moddest_o2detune,
572         moddest_count,
573     };
574     enum {
575         par_o1wave, par_o1offset, par_o1transpose, par_o1detune, par_o1level,
576         par_o2wave, par_o2offset, par_o2transpose, par_o2detune, par_o2level,
577         par_eg1attack, par_eg1decay, par_eg1sustain, par_eg1fade, par_eg1release, par_eg1velscl,
578         par_eg2attack, par_eg2decay, par_eg2sustain, par_eg2fade, par_eg2release, par_eg2velscl,
579         par_eg3attack, par_eg3decay, par_eg3sustain, par_eg3fade, par_eg3release, par_eg3velscl,
580         par_pwhlrange,
581         param_count };
582     enum { in_count = 0, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = true, rt_capable = true };
583     enum { mod_matrix_slots = 10 };
584     enum { step_size = 64 };
585     PLUGIN_NAME_ID_LABEL("wavetable", "wavetable", "Wavetable")
586     mod_matrix_metadata mm_metadata;
587 
588     wavetable_metadata();
589     /// Lookup of table edit interface
get_table_metadata_ifacewavetable_metadata590     virtual const table_metadata_iface *get_table_metadata_iface(const char *key) const { if (!strcmp(key, "mod_matrix")) return &mm_metadata; else return NULL; }
591 };
592 
593 };
594 
595 #endif
596