2#include <Process/Dataflow/WidgetInlets.hpp>
3#include <Process/ProcessFlags.hpp>
4#include <Process/ProcessMetadata.hpp>
6#include <Dataflow/CurveInlet.hpp>
7#include <Engine/Node/CommonWidgets.hpp>
9#include <score/plugins/UuidKey.hpp>
11#include <ossia/dataflow/audio_port.hpp>
12#include <ossia/dataflow/port.hpp>
13#include <ossia/dataflow/safe_nodes/tick_policies.hpp>
15#include <boost/container/vector.hpp>
17#include <avnd/binding/ossia/qt.hpp>
18#include <avnd/binding/ossia/uuid.hpp>
19#include <avnd/common/concepts_polyfill.hpp>
20#include <avnd/common/struct_reflection.hpp>
21#include <avnd/concepts/audio_port.hpp>
22#include <avnd/concepts/channels.hpp>
23#include <avnd/concepts/curve.hpp>
24#include <avnd/concepts/gfx.hpp>
25#include <avnd/concepts/midi_port.hpp>
26#include <avnd/concepts/parameter.hpp>
27#include <avnd/introspection/input.hpp>
28#include <avnd/wrappers/metadatas.hpp>
29#include <avnd/wrappers/widgets.hpp>
36#define make_uuid(text) score::uuids::string_generator::compute((text))
40template <
typename Node,
typename FieldIndex>
41struct CustomFloatControl;
44template <
typename Node,
typename FieldIndex>
45struct is_custom_serialized<
oscr::CustomFloatControl<Node, FieldIndex>> : std::true_type
54 using Process::ControlInlet::ControlInlet;
59 : ControlInlet{name, id, parent}
61 displayHandledExplicitly =
true;
64 setDomain(ossia::make_domain(min, max));
67 auto getMin()
const noexcept {
return domain().get().template convert_min<float>(); }
68 auto getMax()
const noexcept {
return domain().get().template convert_max<float>(); }
70 void setupExecution(ossia::inlet& inl, QObject* exec_context)
const noexcept override
72 auto& port = **safe_cast<ossia::value_inlet*>(&inl);
73 port.type = ossia::val_type::FLOAT;
74 port.domain = domain().get();
78template <
typename Node,
typename FieldIndex>
81 using CustomFloatControlBase::CustomFloatControlBase;
83 static key_type static_concreteKey()
noexcept
85 return make_field_uuid<Node>(
true, FieldIndex{});
87 key_type concreteKey()
const noexcept override {
return static_concreteKey(); }
89 void serialize_impl(
const VisitorVariant& vis)
const noexcept override
91 score::serialize_dyn(vis, *
this);
98template <
typename Node,
typename FieldIndex>
110template <
typename Node,
typename FieldIndex>
125template <
typename Node,
typename T, std::
size_t N>
129 using value_type = as_type(T::value);
130 constexpr auto name = avnd::get_name<T>();
131 QString qname = QString::fromUtf8(name.data(), name.size());
133 constexpr auto widg = avnd::get_widget<T>();
137 if constexpr(avnd::curve_port<T>)
141 else if constexpr(widg.widget == avnd::widget_type::bang)
145 else if constexpr(widg.widget == avnd::widget_type::button)
149 else if constexpr(widg.widget == avnd::widget_type::toggle)
151 static constexpr auto c = avnd::get_range<T>();
152 if constexpr(
requires { c.values(); })
155 {c.values[0], c.values[1]}, c.init, qname, id, parent};
162 else if constexpr(widg.widget == avnd::widget_type::slider)
164 static constexpr auto c = avnd::get_range<T>();
165 if constexpr(std::is_integral_v<value_type>)
171 if constexpr(avnd::has_mapper<T>)
173 return new CustomFloatControl<Node, avnd::field_index<N>>{c.min, c.max, c.init,
182 else if constexpr(widg.widget == avnd::widget_type::log_slider)
184 static constexpr auto c = avnd::get_range<T>();
187 else if constexpr(widg.widget == avnd::widget_type::log_knob)
190 static constexpr auto c = avnd::get_range<T>();
193 else if constexpr(widg.widget == avnd::widget_type::time_chooser)
195 static constexpr auto c = avnd::get_range<T>();
198 else if constexpr(widg.widget == avnd::widget_type::folder)
200 if constexpr(avnd::has_range<T>) {
201 static constexpr auto c = avnd::get_range<T>();
203 auto init = std::begin(c.init);
204 if constexpr(std::is_same_v<std::decay_t<
decltype(init)>,
const char*>)
209 return new Process::FolderChooser{QString::fromUtf8(std::begin(c.init), std::size(c.init)), qname, id, parent};
215 else if constexpr(widg.widget == avnd::widget_type::range_slider)
217 static constexpr auto c = avnd::get_range<T>();
218 if constexpr(std::is_integral_v<value_type>)
220 auto [start, end] = c.init;
226 auto [start, end] = c.init;
231 else if constexpr(widg.widget == avnd::widget_type::range_spinbox)
233 static constexpr auto c = avnd::get_range<T>();
234 if constexpr(std::is_integral_v<value_type>)
236 auto [start, end] = c.init;
242 auto [start, end] = c.init;
247 else if constexpr(widg.widget == avnd::widget_type::multi_slider)
249 std::vector<ossia::value> init;
252 else if constexpr(widg.widget == avnd::widget_type::multi_slider_xy)
254 std::vector<ossia::value> init;
257 else if constexpr(widg.widget == avnd::widget_type::path_generator_xy)
259 std::vector<ossia::value> init;
262 else if constexpr(widg.widget == avnd::widget_type::spinbox)
264 static constexpr auto c = avnd::get_range<T>();
265 if constexpr(std::is_integral_v<value_type>)
274 else if constexpr(widg.widget == avnd::widget_type::knob)
276 static constexpr auto c = avnd::get_range<T>();
277 if constexpr(std::is_integral_v<value_type>)
284 if constexpr(avnd::has_mapper<T>)
286 return new CustomFloatControl<Node, avnd::field_index<N>>{c.min, c.max, c.init,
295 else if constexpr(widg.widget == avnd::widget_type::lineedit)
297 if constexpr(avnd::has_range<T>)
299 static constexpr auto c = avnd::get_range<T>();
300 if constexpr(avnd::program_parameter<T>)
303 p->language = T::language();
311 if constexpr(avnd::program_parameter<T>)
314 p->language = T::language();
321 else if constexpr(widg.widget == avnd::widget_type::combobox)
323 static constexpr auto c = avnd::get_range<T>();
324 using init_type = std::decay_t<
decltype(c.init)>;
326 if constexpr(std::is_integral_v<init_type> || std::is_enum_v<init_type>)
327 init =
static_cast<int>(c.init);
331 to_combobox_range(c.values), std::move(init), qname, id, parent};
333 else if constexpr(widg.widget == avnd::widget_type::choices)
335 static constexpr auto c = avnd::get_range<T>();
336 auto enums = avnd::to_enum_range(c.values);
338 std::is_integral_v<
decltype(c.init)> || std::is_enum_v<
decltype(c.init)>);
339 auto init = enums[
static_cast<int>(c.init)];
340 std::vector<QString> pixmaps;
341 if constexpr(avnd::has_pixmaps<T>)
343 for(std::string_view pix : avnd::get_pixmaps<T>())
345 pixmaps.push_back(QString::fromLatin1(pix.data(), pix.size()));
349 std::move(enums), pixmaps, std::move(init), qname, id, parent};
351 else if constexpr(widg.widget == avnd::widget_type::xy)
353 static constexpr auto c = avnd::get_range<T>();
354 if constexpr(
requires {
361 {c.min, c.min}, {c.max, c.max}, {c.init, c.init}, qname, id, parent};
365 auto [mx, my] = c.min;
366 auto [Mx, My] = c.max;
367 auto [ix, iy] = c.init;
371 else if constexpr(widg.widget == avnd::widget_type::xyz)
373 static constexpr auto c = avnd::get_range<T>();
374 if constexpr(
requires {
381 {c.min, c.min, c.min},
382 {c.max, c.max, c.max},
383 {c.init, c.init, c.init},
390 auto [mx, my, mz] = c.min;
391 auto [Mx, My, Mz] = c.max;
392 auto [ix, iy, iz] = c.init;
397 else if constexpr(widg.widget == avnd::widget_type::xy_spinbox)
399 using data_type = std::decay_t<
decltype(value_type{}.x)>;
400 static constexpr auto c = avnd::get_range<T>();
401 if constexpr(
requires {
411 std::is_integral_v<data_type>,
418 auto [mx, my] = c.min;
419 auto [Mx, My] = c.max;
420 auto [ix, iy] = c.init;
422 {mx, my}, {Mx, My}, {ix, iy}, std::is_integral_v<data_type>,
426 else if constexpr(widg.widget == avnd::widget_type::xyz_spinbox)
428 static constexpr auto c = avnd::get_range<T>();
429 if constexpr(
requires {
436 {c.min, c.min, c.min},
437 {c.max, c.max, c.max},
438 {c.init, c.init, c.init},
446 auto [mx, my, mz] = c.min;
447 auto [Mx, My, Mz] = c.max;
448 auto [ix, iy, iz] = c.init;
453 else if constexpr(widg.widget == avnd::widget_type::color)
455 static constexpr auto c = avnd::get_range<T>();
456 static constexpr auto i = c.init;
459 else if constexpr(widg.widget == avnd::widget_type::control)
463 else if constexpr(widg.widget == avnd::widget_type::no_control)
469 static_assert(T::is_not_a_valid_control);
473template <
typename T, std::
size_t N>
477 constexpr auto name = avnd::get_name<T>();
478 constexpr auto widg = avnd::get_widget<T>();
479 QString qname = QString::fromUtf8(name.data(), name.size());
483 if constexpr(widg.widget == avnd::widget_type::bargraph)
485 static constexpr auto c = avnd::get_range<T>();
488 else if constexpr(widg.widget == avnd::widget_type::control)
492 else if constexpr(widg.widget == avnd::widget_type::no_control)
496 else if constexpr(avnd::fp_ish<
decltype(T::value)>)
498 static constexpr auto c = avnd::get_range<T>();
508static inline constexpr auto make_control_out(
const T& t)
510 return make_control_out<T>();
518 ossia::audio_vector* buffer{};
522 std::span<const double> operator[](std::size_t i)
const noexcept
524 auto& chan = (*buffer)[i];
525 int64_t min_dur = std::min(int64_t(chan.size()) - offset, duration);
529 return std::span<const double>{chan.data() + offset, std::size_t(min_dur)};
532 std::size_t channels()
const noexcept {
return buffer->size(); }
533 void resize(std::size_t i)
const noexcept {
return buffer->resize(i); }
534 void reserve(std::size_t channels, std::size_t bufferSize)
537 for(
auto& vec : *buffer)
538 vec.reserve(bufferSize);
544 ossia::audio_vector* buffer{};
548 std::span<double> operator[](std::size_t i)
const noexcept
550 auto& chan = (*buffer)[i];
551 int64_t min_dur = std::min(int64_t(chan.size()) - offset, duration);
555 return std::span<double>{chan.data() + offset, std::size_t(min_dur)};
558 std::size_t channels()
const noexcept {
return buffer->size(); }
559 void resize(std::size_t channels, std::size_t samples_to_write)
const noexcept
561 buffer->resize(channels);
562 for(
auto& c : *buffer)
563 c.resize(offset + samples_to_write);
566 void reserve(std::size_t channels, std::size_t bufferSize)
568 buffer->resize(channels);
569 for(
auto& c : *buffer)
570 c.reserve(bufferSize);
Definition VisitorInterface.hpp:53
Definition DataStreamVisitor.hpp:27
Definition DataStreamVisitor.hpp:202
Definition VisitorInterface.hpp:61
Definition JSONVisitor.hpp:52
Definition JSONVisitor.hpp:423
Definition UuidKey.hpp:345
The id_base_t class.
Definition Identifier.hpp:59
Definition Factories.hpp:19
Definition CurveInlet.hpp:47
Definition WidgetInlets.hpp:646
Definition WidgetInlets.hpp:335
Definition WidgetInlets.hpp:444
Definition WidgetInlets.hpp:464
Definition WidgetInlets.hpp:172
Definition WidgetInlets.hpp:233
Definition WidgetInlets.hpp:265
Definition WidgetInlets.hpp:158
Definition WidgetInlets.hpp:296
Definition WidgetInlets.hpp:393
Definition WidgetInlets.hpp:512
Definition WidgetInlets.hpp:217
Definition WidgetInlets.hpp:249
Definition WidgetInlets.hpp:202
Definition WidgetInlets.hpp:281
Definition WidgetInlets.hpp:349
Definition WidgetInlets.hpp:187
Definition WidgetInlets.hpp:601
Definition WidgetInlets.hpp:616
Definition WidgetInlets.hpp:630
Definition WidgetInlets.hpp:431
Definition WidgetInlets.hpp:310
Definition WidgetInlets.hpp:324
Definition WidgetInlets.hpp:525
Definition WidgetInlets.hpp:559
Definition WidgetInlets.hpp:542
Definition WidgetInlets.hpp:583
Definition VisitorInterface.hpp:13
The VisitorVariant struct.
Definition VisitorInterface.hpp:26
Definition Concepts.hpp:53
Definition Concepts.hpp:80
Definition Concepts.hpp:517
Definition Concepts.hpp:543