Loading...
Searching...
No Matches
score-plugin-faust/Faust/Utils.hpp
1#pragma once
2#include <Process/Dataflow/Port.hpp>
3#include <Process/Dataflow/WidgetInlets.hpp>
4
5#include <ossia/dataflow/graph_node.hpp>
6#include <ossia/dataflow/nodes/faust/faust_utils.hpp>
7#include <ossia/dataflow/port.hpp>
8#include <ossia/network/domain/domain.hpp>
9
10#include <QDebug>
11
12#include <faust/gui/MetaDataUI.h>
13
14#include <string_view>
15
16namespace Faust
17{
18
19template <typename Proc, bool Synth>
20struct UI
21 : ::UI
22 , MetaDataUI
23{
24 Proc& fx;
25
26 UI(Proc& sfx)
27 : fx{sfx}
28 {
29 }
30
31 void openTabBox(const char* label) override { }
32 void openHorizontalBox(const char* label) override { }
33 void openVerticalBox(const char* label) override { }
34 void closeBox() override { }
35 void declare(FAUSTFLOAT* zone, const char* key, const char* val) override
36 {
37 MetaDataUI::declare(zone, key, val);
38 }
39 void
40 addSoundfile(const char* label, const char* filename, Soundfile** sf_zone) override
41 {
42 }
43
44 void addButton(const char* label, FAUSTFLOAT* zone) override
45 {
46 if constexpr(Synth)
47 {
48 using namespace std::literals;
49 if(label == "Panic"sv || label == "gate"sv)
50 return;
51 }
52
53 auto inl = new Process::Button{label, getStrongId(fx.inlets()), &fx};
54 fx.inlets().push_back(inl);
55 }
56
57 void addCheckButton(const char* label, FAUSTFLOAT* zone) override
58 {
59 auto inl = new Process::Toggle{bool(*zone), label, getStrongId(fx.inlets()), &fx};
60 fx.inlets().push_back(inl);
61 }
62
63 void addVerticalSlider(
64 const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min,
65 FAUSTFLOAT max, FAUSTFLOAT step) override
66 {
67 using namespace std::literals;
68 if constexpr(Synth)
69 {
70 if(label == "gain"sv || label == "freq"sv || label == "sustain"sv)
71 return;
72 }
73
74 if(label == "0x00"sv)
75 label = "Control";
76
77 if(isKnob(zone))
78 {
79 auto inl = new Process::FloatKnob{
80 (float)min, (float)max, (float)init, label, getStrongId(fx.inlets()), &fx};
81 fx.inlets().push_back(inl);
82 }
83 else
84 {
85 auto inl = new Process::FloatSlider{
86 (float)min, (float)max, (float)init, label, getStrongId(fx.inlets()), &fx};
87 fx.inlets().push_back(inl);
88 }
89 }
90
91 void addHorizontalSlider(
92 const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min,
93 FAUSTFLOAT max, FAUSTFLOAT step) override
94 {
95 addVerticalSlider(label, zone, init, min, max, step);
96 }
97
98 void addNumEntry(
99 const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min,
100 FAUSTFLOAT max, FAUSTFLOAT step) override
101 {
102 // TODO spinbox ?
103 addVerticalSlider(label, zone, init, min, max, step);
104 }
105
106 void addHorizontalBargraph(
107 const char* label, FAUSTFLOAT* zone, FAUSTFLOAT min, FAUSTFLOAT max) override
108 {
109 auto inl = new Process::Bargraph{
110 (float)min, (float)max, (float)min, label, getStrongId(fx.outlets()), &fx};
111 fx.outlets().push_back(inl);
112 }
113
114 void addVerticalBargraph(
115 const char* label, FAUSTFLOAT* zone, FAUSTFLOAT min, FAUSTFLOAT max) override
116 {
117 addHorizontalBargraph(label, zone, min, max);
118 }
119};
120
121template <typename Proc, bool SetInit, bool Synth>
123 : ::UI
124 , MetaDataUI
125{
126 Proc& fx;
127 Process::Inlets& toRemove;
128 Process::Outlets& toRemoveO;
129 std::size_t i = 1;
130 std::size_t o = 1;
131
132 UpdateUI(Proc& sfx, Process::Inlets& toRemove, Process::Outlets& toRemoveO)
133 : fx{sfx}
134 , toRemove{toRemove}
135 , toRemoveO{toRemoveO}
136 {
137 }
138
139 void openTabBox(const char* label) override { }
140 void openHorizontalBox(const char* label) override { }
141 void openVerticalBox(const char* label) override { }
142 void closeBox() override { }
143 void declare(FAUSTFLOAT* zone, const char* key, const char* val) override
144 {
145 MetaDataUI::declare(zone, key, val);
146 }
147 void
148 addSoundfile(const char* label, const char* filename, Soundfile** sf_zone) override
149 {
150 }
151
152 void replace(Process::Inlet*& oldinl, Process::Inlet* newinl)
153 {
154 toRemove.push_back(oldinl);
155 oldinl = newinl;
156 }
157
158 void replace(Process::Outlet*& oldoutl, Process::Outlet* newoutl)
159 {
160 toRemoveO.push_back(oldoutl);
161 oldoutl = newoutl;
162 }
163
164 void addButton(const char* label, FAUSTFLOAT* zone) override
165 {
166 if constexpr(Synth)
167 {
168 using namespace std::literals;
169 if(label == "Panic"sv || label == "gate"sv)
170 return;
171 }
172
173 if(i < fx.inlets().size())
174 {
175 if(auto inlet = dynamic_cast<Process::Button*>(fx.inlets()[i]))
176 {
177 inlet->setName(label);
178 }
179 else
180 {
181 auto id = fx.inlets()[i]->id();
182 replace(fx.inlets()[i], new Process::Button{label, id, &fx});
183 }
184 }
185 else
186 {
187 auto inl = new Process::Button{label, getStrongId(fx.inlets()), &fx};
188 fx.inlets().push_back(inl);
189 fx.controlAdded(inl->id());
190 }
191 i++;
192 }
193
194 void addCheckButton(const char* label, FAUSTFLOAT* zone) override
195 {
196 if(i < fx.inlets().size())
197 {
198 if(auto inlet = dynamic_cast<Process::Toggle*>(fx.inlets()[i]))
199 {
200 inlet->setName(label);
201 if constexpr(SetInit)
202 inlet->setValue(bool(*zone));
203 }
204 else
205 {
206 auto id = fx.inlets()[i]->id();
207 replace(fx.inlets()[i], new Process::Toggle{bool(*zone), label, id, &fx});
208 }
209 }
210 else
211 {
212 auto inl = new Process::Toggle{bool(*zone), label, getStrongId(fx.inlets()), &fx};
213 fx.inlets().push_back(inl);
214 fx.controlAdded(inl->id());
215 }
216 i++;
217 }
218
219 void addVerticalSlider(
220 const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min,
221 FAUSTFLOAT max, FAUSTFLOAT step) override
222 {
223 using namespace std::literals;
224 if constexpr(Synth)
225 {
226 if(label == "gain"sv || label == "freq"sv || label == "sustain"sv)
227 return;
228 }
229
230 if(label == "0x00"sv)
231 label = "Control";
232
233 if(i < fx.inlets().size())
234 {
235 if(Process::FloatSlider
236 * slider{dynamic_cast<Process::FloatSlider*>(fx.inlets()[i])})
237 {
238 if(isKnob(zone))
239 {
240 auto id = fx.inlets()[i]->id();
241 auto inl = new Process::FloatKnob{
242 (float)min, (float)max, (float)init, label, getStrongId(fx.inlets()), &fx};
243 replace(fx.inlets()[i], inl);
244 }
245 else
246 {
247 slider->setName(label);
248 slider->setDomain(ossia::make_domain(min, max));
249 if constexpr(SetInit)
250 slider->setValue(init);
251 }
252 }
253 else if(
254 Process::FloatKnob * knob{dynamic_cast<Process::FloatKnob*>(fx.inlets()[i])})
255 {
256 if(isKnob(zone))
257 {
258 knob->setName(label);
259 knob->setDomain(ossia::make_domain(min, max));
260 if constexpr(SetInit)
261 knob->setValue(init);
262 }
263 else
264 {
265 auto id = fx.inlets()[i]->id();
266 auto inl = new Process::FloatSlider{
267 (float)min, (float)max, (float)init, label, getStrongId(fx.inlets()), &fx};
268 replace(fx.inlets()[i], inl);
269 }
270 }
271 else
272 {
273 auto id = fx.inlets()[i]->id();
274 if(isKnob(zone))
275 {
276 auto inl = new Process::FloatKnob{
277 (float)min, (float)max, (float)init, label, getStrongId(fx.inlets()), &fx};
278 replace(fx.inlets()[i], inl);
279 }
280 else
281 {
282 auto inl = new Process::FloatSlider{
283 (float)min, (float)max, (float)init, label, getStrongId(fx.inlets()), &fx};
284 replace(fx.inlets()[i], inl);
285 }
286 }
287 }
288 else
289 {
290 if(isKnob(zone))
291 {
292 auto inl = new Process::FloatKnob{
293 (float)min, (float)max, (float)init, label, getStrongId(fx.inlets()), &fx};
294 fx.inlets().push_back(inl);
295 fx.controlAdded(inl->id());
296 }
297 else
298 {
299 auto inl = new Process::FloatSlider{
300 (float)min, (float)max, (float)init, label, getStrongId(fx.inlets()), &fx};
301 fx.inlets().push_back(inl);
302 fx.controlAdded(inl->id());
303 }
304 }
305
306 i++;
307 }
308
309 void addHorizontalSlider(
310 const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min,
311 FAUSTFLOAT max, FAUSTFLOAT step) override
312 {
313 addVerticalSlider(label, zone, init, min, max, step);
314 }
315
316 void addNumEntry(
317 const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min,
318 FAUSTFLOAT max, FAUSTFLOAT step) override
319 {
320 addVerticalSlider(label, zone, init, min, max, step);
321 }
322
323 void addHorizontalBargraph(
324 const char* label, FAUSTFLOAT* zone, FAUSTFLOAT min, FAUSTFLOAT max) override
325 {
326 if(o < fx.outlets().size())
327 {
328 if(auto outlet = dynamic_cast<Process::Bargraph*>(fx.outlets()[o]))
329 {
330 outlet->setName(label);
331 outlet->setDomain(ossia::make_domain(min, max));
332 }
333 else
334 {
335 auto id = fx.outlets()[o]->id();
336 auto inl
337 = new Process::Bargraph{(float)min, (float)max, (float)min, label, id, &fx};
338 replace(fx.outlets()[o], inl);
339 }
340 }
341 else
342 {
343 auto inl = new Process::Bargraph{
344 (float)min, (float)max, (float)min, label, getStrongId(fx.outlets()), &fx};
345 fx.outlets().push_back(inl);
346 fx.controlAdded(inl->id());
347 }
348 o++;
349 }
350
351 void addVerticalBargraph(
352 const char* label, FAUSTFLOAT* zone, FAUSTFLOAT min, FAUSTFLOAT max) override
353 {
354 addHorizontalBargraph(label, zone, min, max);
355 }
356};
357}
Definition Port.hpp:177
Definition Port.hpp:273
Definition score-plugin-faust/Faust/Utils.hpp:23
Definition score-plugin-faust/Faust/Utils.hpp:125
Definition PortForward.hpp:23
Definition PortForward.hpp:27