2 #include <Process/Dataflow/Port.hpp>
3 #include <Process/Dataflow/PortFactory.hpp>
4 #include <Process/Process.hpp>
5 #include <Process/ProcessFactory.hpp>
6 #include <Process/ProcessMetadata.hpp>
8 #include <score/application/ApplicationComponents.hpp>
9 #include <score/model/EntityMapSerialization.hpp>
10 #include <score/plugins/DeserializeKnownSubType.hpp>
11 #include <score/plugins/SerializableHelpers.hpp>
13 #include <ossia/dataflow/safe_nodes/node.hpp>
14 #include <ossia/detail/algorithms.hpp>
15 #include <ossia/detail/for_each.hpp>
16 #include <ossia/detail/for_each_in_tuple.hpp>
24 template <
typename Info,
typename = is_control>
27 template <
typename Info>
30 static Q_DECL_RELAXED_CONSTEXPR
auto get() {
return Info::Metadata::prettyName; }
32 template <
typename Info>
35 static Q_DECL_RELAXED_CONSTEXPR
auto get() {
return Info::Metadata::category; }
37 template <
typename Info>
40 static QStringList get()
43 for(
auto str : Info::Metadata::tags)
49 template <
typename Info>
52 static std::vector<Process::PortType> inletDescription()
54 std::vector<Process::PortType> port;
55 for(std::size_t i = 0; i < std::size(Info::Metadata::audio_ins); i++)
57 port.push_back(Process::PortType::Audio);
59 for(std::size_t i = 0; i < std::size(Info::Metadata::midi_ins); i++)
61 port.push_back(Process::PortType::Midi);
63 for(std::size_t i = 0; i < std::size(Info::Metadata::value_ins); i++)
65 port.push_back(Process::PortType::Message);
67 for(std::size_t i = 0; i < std::size(Info::Metadata::address_ins); i++)
69 port.push_back(Process::PortType::Message);
71 for(std::size_t i = 0; i < std::tuple_size_v<decltype(Info::Metadata::controls)>;
73 port.push_back(Process::PortType::Message);
76 static std::vector<Process::PortType> outletDescription()
78 std::vector<Process::PortType> port;
79 for(std::size_t i = 0; i < std::size(Info::Metadata::audio_outs); i++)
81 port.push_back(Process::PortType::Audio);
83 for(std::size_t i = 0; i < std::size(Info::Metadata::midi_outs); i++)
85 port.push_back(Process::PortType::Midi);
87 for(std::size_t i = 0; i < std::size(Info::Metadata::value_outs); i++)
89 port.push_back(Process::PortType::Message);
96 Info::Metadata::prettyName,
97 (Process::ProcessCategory)Info::Metadata::kind,
98 Info::Metadata::category,
99 Info::Metadata::description,
100 Info::Metadata::author,
103 outletDescription()};
107 template <
typename Info>
115 template <
typename Info>
118 static Q_DECL_RELAXED_CONSTEXPR
auto get() noexcept
120 return Info::Metadata::objectKey;
123 template <
typename Info>
124 struct Metadata<ConcreteKey_k, Control::ControlProcess<Info>>
128 return Info::Metadata::uuid;
137 template <
typename Node_T,
typename T>
138 static void init(T&
self)
140 auto& ins =
self.m_inlets;
141 auto& outs =
self.m_outlets;
143 for(
const auto& in : Node_T::Metadata::audio_ins)
146 p->setName(QString::fromUtf8(in.name.data(), in.name.size()));
149 for(
const auto& in : Node_T::Metadata::midi_ins)
152 p->setName(QString::fromUtf8(in.name.data(), in.name.size()));
155 for(
const auto& in : Node_T::Metadata::value_ins)
158 p->setName(QString::fromUtf8(in.name.data(), in.name.size()));
161 for(
const auto& in : Node_T::Metadata::address_ins)
164 p->setName(QString::fromUtf8(in.name.data(), in.name.size()));
167 ossia::for_each_in_tuple(Node_T::Metadata::controls, [&](
const auto& ctrl) {
176 for(
const auto& out : Node_T::Metadata::audio_outs)
179 p->setName(QString::fromUtf8(out.name.data(), out.name.size()));
181 p->setPropagate(
true);
184 for(
const auto& out : Node_T::Metadata::midi_outs)
187 p->setName(QString::fromUtf8(out.name.data(), out.name.size()));
190 for(
const auto& out : Node_T::Metadata::value_outs)
193 p->setName(QString::fromUtf8(out.name.data(), out.name.size()));
196 ossia::for_each_in_tuple(Node_T::Metadata::control_outs, [&](
const auto& ctrl) {
205 template <
typename Node_T,
typename T>
208 auto& ins =
self.m_inlets;
209 auto& outs =
self.m_outlets;
210 for([[maybe_unused]]
const auto& in : Node_T::Metadata::audio_ins)
212 ins.push_back(deserialize_known_interface<Process::AudioInlet>(s, &
self));
214 for([[maybe_unused]]
const auto& in : Node_T::Metadata::midi_ins)
216 ins.push_back(deserialize_known_interface<Process::MidiInlet>(s, &
self));
218 for([[maybe_unused]]
const auto& in : Node_T::Metadata::value_ins)
220 ins.push_back(deserialize_known_interface<Process::ValueInlet>(s, &
self));
222 for([[maybe_unused]]
const auto& in : Node_T::Metadata::address_ins)
224 ins.push_back(deserialize_known_interface<Process::ValueInlet>(s, &
self));
226 ossia::for_each_in_tuple(Node_T::Metadata::controls, [&](
const auto& ctrl) {
227 if(
auto p = ctrl.create_inlet(s, &
self))
234 for([[maybe_unused]]
const auto& out : Node_T::Metadata::audio_outs)
236 outs.push_back(deserialize_known_interface<Process::AudioOutlet>(s, &
self));
238 for([[maybe_unused]]
const auto& out : Node_T::Metadata::midi_outs)
240 outs.push_back(deserialize_known_interface<Process::MidiOutlet>(s, &
self));
242 for([[maybe_unused]]
const auto& out : Node_T::Metadata::value_outs)
244 outs.push_back(deserialize_known_interface<Process::ValueOutlet>(s, &
self));
246 ossia::for_each_in_tuple(Node_T::Metadata::control_outs, [&](
const auto& ctrl) {
247 if(
auto p = ctrl.create_outlet(s, &
self))
255 template <
typename Node_T,
typename T>
257 const rapidjson::Value::ConstArray& inlets,
258 const rapidjson::Value::ConstArray& outlets, T&
self)
260 auto& ins =
self.m_inlets;
261 auto& outs =
self.m_outlets;
263 for([[maybe_unused]]
const auto& in : Node_T::Metadata::audio_ins)
265 ins.push_back(deserialize_known_interface<Process::AudioInlet>(
268 for([[maybe_unused]]
const auto& in : Node_T::Metadata::midi_ins)
270 ins.push_back(deserialize_known_interface<Process::MidiInlet>(
273 for([[maybe_unused]]
const auto& in : Node_T::Metadata::value_ins)
275 ins.push_back(deserialize_known_interface<Process::ValueInlet>(
278 for([[maybe_unused]]
const auto& in : Node_T::Metadata::address_ins)
280 ins.push_back(deserialize_known_interface<Process::ValueInlet>(
283 ossia::for_each_in_tuple(Node_T::Metadata::controls, [&](
const auto& ctrl) {
284 if(
auto p = ctrl.create_inlet(
JSONWriter{inlets[inlet++]}, &
self))
292 for([[maybe_unused]]
const auto& out : Node_T::Metadata::audio_outs)
294 outs.push_back(deserialize_known_interface<Process::AudioOutlet>(
297 for([[maybe_unused]]
const auto& out : Node_T::Metadata::midi_outs)
299 outs.push_back(deserialize_known_interface<Process::MidiOutlet>(
302 for([[maybe_unused]]
const auto& out : Node_T::Metadata::value_outs)
304 outs.push_back(deserialize_known_interface<Process::ValueOutlet>(
307 ossia::for_each_in_tuple(Node_T::Metadata::control_outs, [&](
const auto& ctrl) {
308 if(
auto p = ctrl.create_outlet(
JSONWriter{outlets[outlet++]}, &
self))
317 template <
typename Info,
typename>
320 SCORE_SERIALIZE_FRIENDS
323 friend struct
TSerializer<JSONObject, Control::ControlProcess<Info>>;
327 ossia::value control(std::size_t i) const
329 static_assert(ossia::safe_nodes::info_functions<Info>::control_count != 0);
330 constexpr
auto start = ossia::safe_nodes::info_functions<Info>::control_start;
335 void setControl(std::size_t i, ossia::value v)
337 static_assert(ossia::safe_nodes::info_functions<Info>::control_count != 0);
338 constexpr
auto start = ossia::safe_nodes::info_functions<Info>::control_start;
341 ->setExecutionValue(std::move(v));
344 ossia::value controlOut(std::size_t i)
const
346 static_assert(ossia::safe_nodes::info_functions<Info>::control_out_count != 0);
347 constexpr
auto start = ossia::safe_nodes::info_functions<Info>::control_out_start;
352 void setControlOut(std::size_t i, ossia::value v)
354 static_assert(ossia::safe_nodes::info_functions<Info>::control_out_count != 0);
355 constexpr
auto start = ossia::safe_nodes::info_functions<Info>::control_out_start;
358 ->setExecutionValue(std::move(v));
366 metadata().setInstanceName(*
this);
368 Control::PortSetup::init<Info>(*
this);
370 if constexpr(requires { Info::Metadata::loops_by_default; })
376 template <
typename Impl>
387 template <
typename Info>
388 struct is_custom_serialized<Control::ControlProcess<Info>> : std::true_type
392 template <
template <
typename,
typename>
class Model,
typename Info>
395 using model_type = Model<Info, Control::is_control>;
398 using namespace Control;
399 for(
auto obj : obj.inlets())
404 for(
auto obj : obj.outlets())
413 using namespace Control;
415 Control::PortSetup::load<Info>(s, obj);
420 template <
template <
typename,
typename>
class Model,
typename Info>
423 using model_type = Model<Info, Control::is_control>;
426 using namespace Control;
427 Process::readPorts(s, obj.inlets(), obj.outlets());
432 using namespace Control;
434 const auto& inlets = s.obj[
"Inlets"].toArray();
435 const auto& outlets = s.obj[
"Outlets"].toArray();
437 Control::PortSetup::load<Info>(inlets, outlets, obj);
Metadata to categorize objects: curves, audio, etc.
Definition: lib/score/tools/Metadata.hpp:61
Definition: score-plugin-engine/Engine/Node/Process.hpp:319
Definition: VisitorInterface.hpp:53
Definition: DataStreamVisitor.hpp:27
Definition: DataStreamVisitor.hpp:202
Definition: VisitorInterface.hpp:61
Definition: JSONVisitor.hpp:52
Definition: JSONVisitor.hpp:423
Metadata to get the key part of ObjectIdentifier.
Definition: lib/score/tools/Metadata.hpp:36
Metadata to get the name that will be shown in the user interface.
Definition: lib/score/tools/Metadata.hpp:42
Definition: score-lib-process/Process/Dataflow/Port.hpp:290
Definition: score-lib-process/Process/Dataflow/Port.hpp:313
Definition: score-lib-process/Process/Dataflow/Port.hpp:202
Definition: score-lib-process/Process/Dataflow/Port.hpp:415
Definition: score-lib-process/Process/Dataflow/Port.hpp:369
Definition: score-lib-process/Process/Dataflow/Port.hpp:392
The Process class.
Definition: score-lib-process/Process/Process.hpp:61
Definition: score-lib-process/Process/Dataflow/Port.hpp:481
Definition: score-lib-process/Process/Dataflow/Port.hpp:504
Metadata to retrieve the ProcessFlags of a process.
The id_base_t class.
Definition: Identifier.hpp:57
Base classes and tools to implement processes and layers.
Definition: JSONVisitor.hpp:1324
ProcessFlags
Various settings for processes.
Definition: ProcessFlags.hpp:17
Definition: score-plugin-engine/Engine/Node/Process.hpp:136
Definition: score-plugin-engine/Engine/Node/Process.hpp:22
Definition: score-lib-process/Process/ProcessMetadata.hpp:36
Definition: VisitorInterface.hpp:13
Definition: TimeValue.hpp:21