2 #include <AvndProcesses/AddressTools.hpp>
9 halp_meta(name,
"Pattern combiner")
10 halp_meta(author,
"ossia team")
11 halp_meta(category,
"Control/Data processing")
12 halp_meta(description,
"Apply an operation to all inputs matching a pattern")
13 halp_meta(c_name,
"avnd_pattern_combine")
14 halp_meta(uuid,
"18efe965-9acc-4703-9af3-3cef658b301a")
22 halp__enum(
"Mode", List, List, Average, Sum, Min, Max);
29 halp::val_port<
"Output", ossia::value> output;
32 std::vector<ossia::value> current_values;
39 current_values.clear();
40 if(inputs.pattern.devices_dirty)
41 inputs.pattern.reprocess();
42 for(
auto in : this->roots)
44 if(
auto p = in->get_parameter())
45 current_values.push_back(p->value());
48 if(current_values.empty())
53 using mode = decltype(inputs.mode)::enum_type;
57 outputs.output.value = current_values;
61 for(
const auto& val : current_values)
63 res += ossia::convert<double>(val);
65 res /= current_values.size();
66 outputs.output.value = float(res);
71 for(
const auto& val : current_values)
73 res += ossia::convert<double>(val);
75 outputs.output.value = float(res);
79 double res = ossia::convert<double>(current_values[0]);
80 for(std::size_t i = 1; i < current_values.size(); i++)
82 res = std::min(res, ossia::convert<double>(current_values[i]));
84 outputs.output.value = float(res);
88 double res = ossia::convert<double>(current_values[0]);
89 for(std::size_t i = 1; i < current_values.size(); i++)
91 res = std::max(res, ossia::convert<double>(current_values[i]));
93 outputs.output.value = float(res);