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: 25 апр. 2019 г.
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 <metadata/plugins.h>
23 #include <metadata/ports.h>
24 #include <metadata/developers.h>
25 
26 namespace lsp
27 {
28     static const port_item_t rb_fft_rank[] =
29     {
30         { "512",    NULL },
31         { "1024",   NULL },
32         { "2048",   NULL },
33         { "4096",   NULL },
34         { "8192",   NULL },
35         { "16384",  NULL },
36         { "32768",  NULL },
37         { "65536",  NULL },
38         { NULL, NULL }
39     };
40 
41     static const port_item_t rb_view[] =
42     {
43         { "Room browser",   "room_bld.room_browser" },
44         { "Sample 0",       "sampler.samp.0" },
45         { "Sample 1",       "sampler.samp.1" },
46         { "Sample 2",       "sampler.samp.2" },
47         { "Sample 3",       "sampler.samp.3" },
48         { "Sample 4",       "sampler.samp.4" },
49         { "Sample 5",       "sampler.samp.5" },
50         { "Sample 6",       "sampler.samp.6" },
51         { "Sample 7",       "sampler.samp.7" },
52         { NULL, NULL }
53     };
54 
55     static const port_item_t rb_samples[] =
56     {
57         { "None",           "sampler.samp.none" },
58         { "Sample 0",       "sampler.samp.0" },
59         { "Sample 1",       "sampler.samp.1" },
60         { "Sample 2",       "sampler.samp.2" },
61         { "Sample 3",       "sampler.samp.3" },
62         { "Sample 4",       "sampler.samp.4" },
63         { "Sample 5",       "sampler.samp.5" },
64         { "Sample 6",       "sampler.samp.6" },
65         { "Sample 7",       "sampler.samp.7" },
66         { NULL, NULL }
67     };
68 
69     static const port_item_t rb_tracks[] =
70     {
71         { "Left",           "file.left" },
72         { "Right",          "file.right" },
73         { NULL, NULL }
74     };
75 
76     static const port_item_t filter_slope[] =
77     {
78         { "off",            "eq.slope.off" },
79         { "6 dB/oct",       "eq.slope.6dbo" },
80         { "12 dB/oct",      "eq.slope.12dbo" },
81         { "18 dB/oct",      "eq.slope.18dbo" },
82         { NULL, NULL }
83     };
84 
85     static const port_item_t rb_editor[] =
86     {
87         { "Source editor",      "room_bld.ed.source" },
88         { "Capture editor",     "room_bld.ed.capture" },
89         { "Object editor",      "room_bld.ed.object" },
90         { "Material editor",    "room_bld.ed.material" },
91         { NULL, NULL }
92     };
93 
94     static const port_item_t rb_processors[] =
95     {
96         { "Convolvers",         "room_bld.convolvers" },
97         { "IR Equalizer",       "room_bld.ir_eq" },
98         { NULL, NULL }
99     };
100 
101     static const port_item_t rb_ssel[] =
102     {
103         { "0", NULL },
104         { "1", NULL },
105         { "2", NULL },
106         { "3", NULL },
107         { "4", NULL },
108         { "5", NULL },
109         { "6", NULL },
110         { "7", NULL },
111         { NULL, NULL }
112     };
113 
114     static const port_item_t rb_csel[] =
115     {
116         { "0", NULL },
117         { "1", NULL },
118         { "2", NULL },
119         { "3", NULL },
120         { "4", NULL },
121         { "5", NULL },
122         { "6", NULL },
123         { "7", NULL },
124         { NULL, NULL }
125     };
126 
127     static const port_item_t rb_source_mode[] =
128     {
129         { "Triangle",           "room_bld.src.tri" },
130         { "Tetrahedron",        "room_bld.src.tetra" },
131         { "Octahedron",         "room_bld.src.octa" },
132         { "Box",                "room_bld.src.box" },
133         { "Icosahedron",        "room_bld.src.ico" },
134         { "Cylinder",           "room_bld.src.cyl" },
135         { "Cone",               "room_bld.src.cone" },
136         { "Octasphere",         "room_bld.src.octa_s" },
137         { "Icosphere",          "room_bld.src.ico_s" },
138         { "Flat spot",          "room_bld.src.flat_s" },
139         { "Cylindrical spot",   "room_bld.src.cyl_s" },
140         { "Spherical spot",     "room_bld.src.sphe_s" },
141         { NULL, NULL }
142     };
143 
144     static const port_item_t rb_capture_config[] =
145     {
146         { "Mono",               "room_bld.capt.mono" },
147         { "XY",                 "room_bld.capt.xy" },
148         { "AB",                 "room_bld.capt.ab" },
149         { "ORTF",               "room_bld.capt.ortf" },
150         { "MS",                 "room_bld.capt.ms" },
151         { NULL, NULL }
152     };
153 
154     static const port_item_t rb_capture_direction[] =
155     {
156         { "Cardioid",           "room_bld.dir.cardio" },
157         { "Supercardioid",      "room_bld.dir.superc" },
158         { "Hypercardioid",      "room_bld.dir.hyperc" },
159         { "Bidirectional",      "room_bld.dir.bi" },
160         { "8-directional",      "room_bld.dir.eight" },
161         { "Omnidirectional",    "room_bld.dir.omni" },
162         { NULL, NULL }
163     };
164 
165     static const port_item_t rb_capture_side_direction[] =
166     {
167         { "Bidirectional",      "room_bld.dir.bi" },
168         { "8-directional",      "room_bld.dir.eight" },
169         { NULL, NULL }
170     };
171 
172     static const port_item_t rb_reflection[] =
173     {
174         { "Any",                "room_bld.refl_any" },
175         { "0", NULL },
176         { "1", NULL },
177         { "2", NULL },
178         { "3", NULL },
179         { "4", NULL },
180         { "5", NULL },
181         { "6", NULL },
182         { "7", NULL },
183         { "8", NULL },
184         { "9", NULL },
185         { "10", NULL },
186         { "11", NULL },
187         { "12", NULL },
188         { "13", NULL },
189         { "14", NULL },
190         { "15", NULL },
191         { NULL, NULL }
192     };
193 
194     static const port_item_t rb_orientation[] =
195     {
196         { "+X forward, +Y up",  "room_bld.orient.+x+y" },
197         { "+X forward, +Z up",  "room_bld.orient.+x+z" },
198         { "+X forward, -Y up",  "room_bld.orient.+x-y" },
199         { "+X forward, -Z up",  "room_bld.orient.+x-z" },
200         { "-X forward, +Y up",  "room_bld.orient.-x+y" },
201         { "-X forward, +Z up",  "room_bld.orient.-x+z" },
202         { "-X forward, -Y up",  "room_bld.orient.-x-y" },
203         { "-X forward, -Z up",  "room_bld.orient.-x-z" },
204 
205         { "+Y forward, +X up",  "room_bld.orient.+y+x" },
206         { "+Y forward, +Z up",  "room_bld.orient.+y+z" },
207         { "+Y forward, -X up",  "room_bld.orient.+y-x" },
208         { "+Y forward, -Z up",  "room_bld.orient.+y-z" },
209         { "-Y forward, +X up",  "room_bld.orient.-y+x" },
210         { "-Y forward, +Z up",  "room_bld.orient.-y+z" },
211         { "-Y forward, -X up",  "room_bld.orient.-y-x" },
212         { "-Y forward, -Z up",  "room_bld.orient.-y-z" },
213 
214         { "+Z forward, +X up",  "room_bld.orient.+z+x" },
215         { "+Z forward, +Y up",  "room_bld.orient.+z+y" },
216         { "+Z forward, -X up",  "room_bld.orient.+z-x" },
217         { "+Z forward, -Y up",  "room_bld.orient.+z-y" },
218         { "-Z forward, +X up",  "room_bld.orient.-z+x" },
219         { "-Z forward, +Y up",  "room_bld.orient.-z+y" },
220         { "-Z forward, -X up",  "room_bld.orient.-z-x" },
221         { "-Z forward, -Y up",  "room_bld.orient.-z-y" },
222 
223         { NULL, NULL }
224     };
225 
226     #define RB_PAN_MONO \
227         PAN_CTL("p", "Panorama", 0.0f)
228 
229     #define RB_PAN_STEREO \
230         PAN_CTL("pl", "Left channel panorama", -100.0f), \
231         PAN_CTL("pr", "Right channel panorama", 100.0f)
232 
233     #define RB_COMMON(pan) \
234         BYPASS, \
235         COMBO("view", "Current view", 0, rb_view),              \
236         COMBO("editor", "Current editor", 0, rb_editor),        \
237         COMBO("signal", "Current signal processor", 0, rb_processors),  \
238         COMBO("fft", "FFT size", room_builder_base_metadata::FFT_RANK_DEFAULT, rb_fft_rank), \
239         CONTROL("pd", "Pre-delay", U_MSEC, room_builder_base_metadata::PREDELAY), \
240         pan, \
241         AMP_GAIN1000("dry", "Dry amount", 1.0f), \
242         AMP_GAIN1000("wet", "Wet amount", 1.0f), \
243         OUT_GAIN, \
244         CONTROL("threads", "Number of threads for processing", U_NONE, room_builder_base_metadata::THREADS), \
245         PERCENTS("quality", "Quality factor", 50.0f, 0.1f), \
246         STATUS("status", "Render status"), \
247         OUT_PERCENTS("prog", "Rendering progress"), \
248         SWITCH("normal", "Normalize rendered samples", 1.0f), \
249         TRIGGER("render", "Launch/Stop rendering process"), \
250         PATH("ifn", "Input 3D model file name"),    \
251         STATUS("ifs", "Input 3D model load status"), \
252         METER_PERCENT("ifp", "File loading progress"), \
253         COMBO("ifo", "Input 3D model orientation", 9, rb_orientation), \
254         CONTROL("xscale", "Scene X scale", U_PERCENT, room_builder_base_metadata::OSIZE), \
255         CONTROL("yscale", "Scene Y scale", U_PERCENT, room_builder_base_metadata::OSIZE), \
256         CONTROL("zscale", "Scene Z scale", U_PERCENT, room_builder_base_metadata::OSIZE), \
257         CONTROL_DFL("cposx", "Camera X position", U_M, room_builder_base_metadata::POSITION, 1.0f), \
258         CONTROL_DFL("cposy", "Camera Y position", U_M, room_builder_base_metadata::POSITION, -0.2f), \
259         CONTROL_DFL("cposz", "Camera Z position", U_M, room_builder_base_metadata::POSITION, 0.5f), \
260         { "cyaw", "Camera Yaw angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_CYCLIC, 0, 360, 80.0f, 0.1f, NULL, NULL }, \
261         { "cpitch", "Camera Pitch angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP, -89.0f, 89.0f, -25.0f, 0.1f, NULL, NULL }
262 
263 
264     #define RB_SOURCE(id, label, x, total, ena) \
265         SWITCH("sse" id, "Source " label " enable", ena), \
266         COMBO("sscf" id, "Source " label " type", 4, rb_source_mode), \
267         SWITCH("ssph" id, "Source " label " phase invert", 0), \
268         CONTROL_DFL("sspx" id, "Source " label " X position", U_M, room_builder_base_metadata::POSITION, 0.0f), \
269         CONTROL_DFL("sspy" id, "Source " label " Y position", U_M, room_builder_base_metadata::POSITION, -1.0f), \
270         CONTROL_DFL("sspz" id, "Source " label " Z position", U_M, room_builder_base_metadata::POSITION, 0.0f), \
271         { "ssay" id , "Source " label " Yaw angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_CYCLIC, 0.0f, 360, 90.0f, 0.1f, NULL, NULL }, \
272         { "ssap" id , "Source " label " Pitch angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP, -90.0f, 90.0f, 0, 0.1f, NULL, NULL }, \
273         { "ssar" id , "Source " label " Roll angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_CYCLIC, 0, 360, 0, 0.1f, NULL, NULL }, \
274         CONTROL("sss" id, "Source " label " size", U_CM, room_builder_base_metadata::SOURCE), \
275         CONTROL("shh" id, "Source " label " height", U_CM, room_builder_base_metadata::HEIGHT), \
276         PERCENTS("ssa" id, "Source " label " angle", 50.0f, 0.025f), \
277         PERCENTS("sscv" id, "Source " label " curvature", 100.0f, 0.05f), \
278         { "ssh" id, "Source " label " hue", 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     }
279 
280     #define RB_CAPTURE(id, label, x, total, ena) \
281         SWITCH("sce" id, "Capture " label " enable", ena), \
282         COMBO("scf" id, "Capture " label " first reflection order", 2, rb_reflection), \
283         COMBO("scl" id, "Capture " label " last reflection order", 0, rb_reflection), \
284         CONTROL_DFL("scpx" id, "Capture " label " X position", U_M, room_builder_base_metadata::POSITION, 0.0f), \
285         CONTROL_DFL("scpy" id, "Capture " label " Y position", U_M, room_builder_base_metadata::POSITION, 1.0f), \
286         CONTROL_DFL("scpz" id, "Capture " label " Z position", U_M, room_builder_base_metadata::POSITION, 0.0f), \
287         { "scay" id , "Capture " label " Yaw angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_CYCLIC, 0, 360, 270, 0.1f, NULL, NULL }, \
288         { "scap" id , "Capture " label " Pitch angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP, -90.0f, 90.0f, 0, 0.1f, NULL, NULL }, \
289         { "scar" id , "Capture " label " Roll angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_CYCLIC, 0, 360, 0, 0.1f, NULL, NULL }, \
290         CONTROL("sccs" id, "Capture " label " capsule size", U_CM, room_builder_base_metadata::CAPSULE), \
291         COMBO("sccf" id, "Capture " label " configuration", 1, rb_capture_config),      \
292         CONTROL("sca" id, "Capture " label " angle", U_DEG, room_builder_base_metadata::ANGLE),      \
293         CONTROL("scab" id, "Capture " label " AB distance", U_M, room_builder_base_metadata::DISTANCE),      \
294         COMBO("scmd" id, "Capture " label " microphone direction", 0, rb_capture_direction),      \
295         COMBO("scsd" id, "Capture " label " side microphone direction", 0, rb_capture_side_direction), \
296         \
297         CONTROL("ihc" id, "Head cut" label, U_MSEC, room_builder_base_metadata::CONV_LENGTH), \
298         CONTROL("itc" id, "Tail cut" label, U_MSEC, room_builder_base_metadata::CONV_LENGTH), \
299         CONTROL("ifi" id, "Fade in" label, U_MSEC, room_builder_base_metadata::CONV_LENGTH), \
300         CONTROL("ifo" id, "Fade out" label, U_MSEC, room_builder_base_metadata::CONV_LENGTH), \
301         TRIGGER("ils" id, "Impulse listen" label), \
302         SWITCH("irv" id, "Impulse reverse" label, 0.0f), \
303         AMP_GAIN_RANGE("imkp" id, "Impulse makeup gain" label, 1.0f, 0.001f, 1000.0f), \
304         STATUS("ifs" id, "Impulse status" label), \
305         METER("ifl" id, "Impulse length" label, U_MSEC, room_builder_base_metadata::CONV_LENGTH), \
306         METER("sdur" id, "Impulse current duration" label, U_MSEC, room_builder_base_metadata::DURATION), \
307         METER("smdur" id, "Impulse max duration" label, U_MSEC, room_builder_base_metadata::DURATION), \
308         MESH("ifd" id, "Impulse file contents" label, room_builder_base_metadata::TRACKS_MAX, room_builder_base_metadata::MESH_SIZE), \
309         PATH("ofn" id, "Sample file name" label), \
310         TRIGGER("ofc" id , "Sample save command" label), \
311         STATUS("ofs" id, "Sample saving status" label), \
312         METER_PERCENT("ofp" id, "Sample saving progress" label), \
313         \
314         { "sch" id, "Capture " label " hue", 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     }
315 
316     #define RB_CONVOLVER_MONO(id, label, track, mix) \
317         COMBO("csf" id, "Channel source sample" label, 0, rb_samples), \
318         COMBO("cst" id, "Channel source track" label, track, rb_tracks), \
319         AMP_GAIN100("mk" id, "Makeup gain" label, 1.0f), \
320         SWITCH("cam" id, "Channel mute" label, 0.0f), \
321         BLINK("ca" id, "Channel activity" label), \
322         CONTROL("pd" id, "Channel pre-delay" label, U_MSEC, impulse_reverb_base_metadata::PREDELAY), \
323         PAN_CTL("com" id, "Channel Left/Right output mix" label, mix)
324 
325     #define RB_CONVOLVER_STEREO(id, label, track, in_mix, out_mix) \
326         PAN_CTL("cim" id, "Left/Right input mix" label, in_mix), \
327         RB_CONVOLVER_MONO(id, label, track, out_mix)
328 
329     #define RB_EQ_BAND(id, freq)    \
330         CONTROL("eq_" #id, "Band " freq "Hz gain", U_GAIN_AMP, room_builder_base_metadata::BA)
331 
332     #define RB_EQUALIZER    \
333         SWITCH("wpp", "Wet post-process", 0),    \
334         COMBO("lcm", "Low-cut mode", 0, filter_slope),      \
335         CONTROL("lcf", "Low-cut frequency", U_HZ, room_builder_base_metadata::LCF),   \
336         RB_EQ_BAND(0, "50"), \
337         RB_EQ_BAND(1, "107"), \
338         RB_EQ_BAND(2, "227"), \
339         RB_EQ_BAND(3, "484"), \
340         RB_EQ_BAND(4, "1 k"), \
341         RB_EQ_BAND(5, "2.2 k"), \
342         RB_EQ_BAND(6, "4.7 k"), \
343         RB_EQ_BAND(7, "10 k"), \
344         COMBO("hcm", "High-cut mode", 0, filter_slope),      \
345         CONTROL("hcf", "High-cut frequency", U_HZ, room_builder_base_metadata::HCF)
346 
347     static const port_t room_builder_mono_ports[] =
348     {
349         // Input audio ports
350         AUDIO_INPUT_MONO,
351         AUDIO_OUTPUT_LEFT,
352         AUDIO_OUTPUT_RIGHT,
353         RB_COMMON(RB_PAN_MONO),
354 
355         COMBO("ssel", "Source selector", 0, rb_ssel),
356         RB_SOURCE("_0", "0", 0, 8, 1),
357         RB_SOURCE("_1", "1", 1, 8, 0),
358         RB_SOURCE("_2", "2", 2, 8, 0),
359         RB_SOURCE("_3", "3", 3, 8, 0),
360         RB_SOURCE("_4", "4", 4, 8, 0),
361         RB_SOURCE("_5", "5", 5, 8, 0),
362         RB_SOURCE("_6", "6", 6, 8, 0),
363         RB_SOURCE("_7", "7", 7, 8, 0),
364 
365         COMBO("csel", "Capture selector", 0, rb_csel),
366         RB_CAPTURE("_0", "0", 0, 8, 1),
367         RB_CAPTURE("_1", "1", 1, 8, 0),
368         RB_CAPTURE("_2", "2", 2, 8, 0),
369         RB_CAPTURE("_3", "3", 3, 8, 0),
370         RB_CAPTURE("_4", "4", 4, 8, 0),
371         RB_CAPTURE("_5", "5", 5, 8, 0),
372         RB_CAPTURE("_6", "6", 6, 8, 0),
373         RB_CAPTURE("_7", "7", 7, 8, 0),
374 
375         RB_CONVOLVER_MONO("0", " 0", 0, -100.0f),
376         RB_CONVOLVER_MONO("1", " 1", 1, +100.0f),
377         RB_CONVOLVER_MONO("2", " 2", 0, -100.0f),
378         RB_CONVOLVER_MONO("3", " 3", 1, +100.0f),
379 
380         RB_EQUALIZER,
381 
382         PORTS_END
383     };
384 
385     static const port_t room_builder_stereo_ports[] =
386     {
387         // Input audio ports
388         PORTS_STEREO_PLUGIN,
389         RB_COMMON(RB_PAN_STEREO),
390 
391         COMBO("ssel", "Source selector", 0, rb_ssel),
392         RB_SOURCE("_0", "0", 0, 8, 1),
393         RB_SOURCE("_1", "1", 1, 8, 0),
394         RB_SOURCE("_2", "2", 2, 8, 0),
395         RB_SOURCE("_3", "3", 3, 8, 0),
396         RB_SOURCE("_4", "4", 4, 8, 0),
397         RB_SOURCE("_5", "5", 5, 8, 0),
398         RB_SOURCE("_6", "6", 6, 8, 0),
399         RB_SOURCE("_7", "7", 7, 8, 0),
400 
401         COMBO("csel", "Capture selector", 0, rb_csel),
402         RB_CAPTURE("_0", "0", 0, 8, 1),
403         RB_CAPTURE("_1", "1", 1, 8, 0),
404         RB_CAPTURE("_2", "2", 2, 8, 0),
405         RB_CAPTURE("_3", "3", 3, 8, 0),
406         RB_CAPTURE("_4", "4", 4, 8, 0),
407         RB_CAPTURE("_5", "5", 5, 8, 0),
408         RB_CAPTURE("_6", "6", 6, 8, 0),
409         RB_CAPTURE("_7", "7", 7, 8, 0),
410 
411         RB_CONVOLVER_STEREO("0", " 0", 0, -100.0f, -100.0f),
412         RB_CONVOLVER_STEREO("1", " 1", 1, -100.0f, +100.0f),
413         RB_CONVOLVER_STEREO("2", " 2", 0, +100.0f, -100.0f),
414         RB_CONVOLVER_STEREO("3", " 3", 1, +100.0f, +100.0f),
415 
416         RB_EQUALIZER,
417 
418         PORTS_END
419     };
420 
421     static const int room_builder_classes[] = { C_REVERB, -1 };
422 
423     const port_t room_builder_base_metadata::kvt_ports[] =
424     {
425         COMBO("kvt:oid", "Selected object index", 0, NULL),
426         SWITCH("kvt:enabled", "Object enable", 0),
427         CONTROL_DFL("kvt:xpos", "Object position X", U_M, room_builder_base_metadata::POSITION, 0.0f),
428         CONTROL_DFL("kvt:ypos", "Object position Y", U_M, room_builder_base_metadata::POSITION, 0.0f),
429         CONTROL_DFL("kvt:zpos", "Object position Z", U_M, room_builder_base_metadata::POSITION, 0.0f),
430         { "kvt:yaw", "Object Yaw angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_CYCLIC, 0.0f, 360, 0.0f, 0.1f, NULL, NULL },
431         { "kvt:pitch", "Object Pitch angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP, -90.0f, 90.0f, 0, 0.1f, NULL, NULL },
432         { "kvt:roll", "Object Roll angle", U_DEG, R_CONTROL, F_IN | F_LOWER | F_UPPER | F_STEP | F_CYCLIC, 0, 360, 0, 0.1f, NULL, NULL },
433         CONTROL("kvt:xscale", "Object scaling X", U_PERCENT, room_builder_base_metadata::OSIZE),
434         CONTROL("kvt:yscale", "Object scaling Y", U_PERCENT, room_builder_base_metadata::OSIZE),
435         CONTROL("kvt:zscale", "Object scaling Z", U_PERCENT, room_builder_base_metadata::OSIZE),
436         { "kvt:hue", "Object hue", U_NONE, R_CONTROL, F_IN | F_UPPER | F_LOWER | F_STEP | F_CYCLIC, 0.0f, 1.0f, 0.0f, 0.25f/360.0f, NULL     },
437         LOG_CONTROL("kvt:oabs", "Outer absorption", U_PERCENT, room_builder_base_metadata::MAT_ABSORPTION),
438         LOG_CONTROL("kvt:iabs", "Inner absorption", U_PERCENT, room_builder_base_metadata::MAT_ABSORPTION),
439         SWITCH("kvt:labs", "Link absorption parameters", 1.0f),
440         LOG_CONTROL("kvt:odisp", "Refracted wave outer dispersion", U_NONE, room_builder_base_metadata::MAT_DISPERSION),
441         LOG_CONTROL("kvt:idisp", "Refracted wave inner dispersion", U_NONE, room_builder_base_metadata::MAT_DISPERSION),
442         SWITCH("kvt:ldisp", "Link refracted wave dispersion parameters", 1.0f),
443         LOG_CONTROL("kvt:odiff", "Reflected wave outer diffusion", U_NONE, room_builder_base_metadata::MAT_DISPERSION),
444         LOG_CONTROL("kvt:idiff", "Reflected wave inner diffusion", U_NONE, room_builder_base_metadata::MAT_DISPERSION),
445         SWITCH("kvt:ldiff", "Link reflected wave inner diffusion parameters", 1.0f),
446         CONTROL("kvt:otransp", "Material outer transparency", U_NONE, room_builder_base_metadata::MAT_TRANSPARENCY),
447         CONTROL("kvt:itransp", "Material inner transparency", U_NONE, room_builder_base_metadata::MAT_TRANSPARENCY),
448         SWITCH("kvt:ltransp", "Link material transparency parameters", 1.0f),
449         CONTROL("kvt:speed", "Sound speed in material", U_MPS, room_builder_base_metadata::MAT_SOUND_SPEED)
450     };
451 
452     const room_material_t room_builder_base_metadata::materials[] =
453     {
454         { "Alder",          "room_bld.mat.alder",           5060.0f,    6.0f    },
455         { "Aluminum",       "room_bld.mat.aluminium",       5080.0f,    0.0f    },
456         { "Ash",            "room_bld.mat.ash",             5065.0f,    6.0f    },
457         { "Basalt Fiber",   "room_bld.mat.basalt_fiber",    340.29f,    95.0f   },
458         { "Birch",          "room_bld.mat.birch",           3625.0f,    8.0f    },
459         { "Brass",          "room_bld.mat.brass",           3490.0f,    0.0f    },
460         { "Brick",          "room_bld.mat.brick",           3600.0f,    3.2f    },
461         { "Cast Iron",      "room_bld.mat.cast_iron",       3850.0f,    0.1f    },
462         { "Concrete",       "room_bld.mat.concrete",        4250.0f,    1.5f    },
463         { "Copper",         "room_bld.mat.copper",          3710.0f,    0.0f    },
464         { "Corkwood",       "room_bld.mat.corkwood",        500.0f,     10.0f   },
465         { "Cotton",         "room_bld.mat.cotton",          340.29f,    17.0f   },
466         { "Fiberboard",     "room_bld.mat.fiberboard",      340.29f,    70.0f   },
467         { "Fiberglass",     "room_bld.mat.fiberglass",      340.29f,    75.0f   },
468         { "Fir",            "room_bld.mat.fir",             4600.0f,    6.0f    },
469         { "Fresh Water",    "room_bld.mat.fresh_water",     1493.0f,    0.0f    },
470         { "Glass",          "room_bld.mat.glass",           5370.0f,    3.0f    },
471         { "Granite",        "room_bld.mat.granite",         3950.0f,    1.5f    },
472         { "Gypsum",         "room_bld.mat.gypsum",          4970.0f,    6.2f    },
473         { "Ice",            "room_bld.mat.ice",             3280.0f,    0.0f    },
474         { "Iron",           "room_bld.mat.iron",            5170.0f,    0.0f    },
475         { "Lead",           "room_bld.mat.lead",            1200.0f,    0.2f    },
476         { "Maple",          "room_bld.mat.maple",           4450.0f,    6.0f    },
477         { "Marble",         "room_bld.mat.marble",          6150.0f,    1.3f    },
478         { "Mineral Wool",   "room_bld.mat.mineral_wool",    340.29f,    87.0f   },
479         { "Nickel",         "room_bld.mat.nickel",          4785.0f,    0.0f    },
480         { "Nickel Silver",  "room_bld.mat.nickel_silver",   3580.0f,    0.0f    },
481         { "Oak",            "room_bld.mat.oak",             4050.0f,    7.0f    },
482         { "Pine",           "room_bld.mat.pine",            5030.0f,    6.0f    },
483         { "Plexiglass",     "room_bld.mat.plexiglass",      2670.0f,    15.0f   },
484         { "Polystyrene",    "room_bld.mat.polystyrene",     2350.0f,    4.0f    },
485         { "Rubber",         "room_bld.mat.rubber",          1600.0f,    6.0f    },
486         { "Sea Water",      "room_bld.mat.sea_water",       1533.0f,    0.0f    },
487         { "Silicon",        "room_bld.mat.silocon",         3770.0f,    2.0f    },
488         { "Slate",          "room_bld.mat.slate",           4510.0f,    1.9f    },
489         { "Steel",          "room_bld.mat.steel",           5050.0f,    0.0f    },
490         { "Tin",            "room_bld.mat.tin",             2730.0f,    0.1f    },
491         { "Velvet",         "room_bld.mat.velvet",          340.29f,    45.0f   },
492         { NULL,             NULL,                           0.0f,       0.0f    }
493     };
494 
495     const plugin_metadata_t  room_builder_mono_metadata::metadata =
496     {
497         "Raumbaumeister Mono",
498         "Room Builder Mono",
499         "RB1M",
500         &developers::v_sadovnikov,
501         "room_builder_mono",
502         "cqbr",
503         0,
504         LSP_VERSION(1, 0, 1),
505         room_builder_classes,
506         E_3D_BACKEND | E_KVT_SYNC,
507         room_builder_mono_ports,
508         "simulation/room_builder/mono.xml",
509         "simulation/room_builder",
510         mono_to_stereo_plugin_port_groups
511     };
512 
513     const plugin_metadata_t  room_builder_stereo_metadata::metadata =
514     {
515         "Raumbaumeister Stereo",
516         "Room Builder Stereo",
517         "RB1S",
518         &developers::v_sadovnikov,
519         "room_builder_stereo",
520         "mprh",
521         0,
522         LSP_VERSION(1, 0, 1),
523         room_builder_classes,
524         E_3D_BACKEND | E_KVT_SYNC,
525         room_builder_stereo_ports,
526         "simulation/room_builder/stereo.xml",
527         "simulation/room_builder",
528         stereo_plugin_port_groups
529     };
530 }
531 
532 
533