Loading...
Searching...
No Matches
InterpolateStates.hpp
1#pragma once
2#include <State/Address.hpp>
3
4#include <score_plugin_scenario_export.h>
5
6#include <Device/Address/AddressSettings.hpp>
7#include <Device/Node/DeviceNode.hpp>
8
9#include <Curve/CurveModel.hpp>
10
11#include <ossia/network/domain/domain.hpp>
12#include <ossia/network/value/value_conversion.hpp>
13
14#include <QList>
15
16namespace score
17{
18class CommandStackFacade;
19struct DocumentContext;
20}
21
22namespace Scenario
23{
24class IntervalModel;
25namespace Command
26{
27SCORE_PLUGIN_SCENARIO_TEST_EXPORT void InterpolateStates(
28 const std::vector<const IntervalModel*>&, const score::CommandStackFacade&);
29}
30
32{
33 template <std::size_t N>
34 std::size_t operator()(const std::array<float, N>& arr)
35 {
36 return N;
37 }
38
39 std::size_t operator()(const std::vector<ossia::value>& arr) { return arr.size(); }
40
41 std::size_t operator()() { return 0; }
42
43 template <typename T>
44 std::size_t operator()(const T& other)
45 {
46 throw std::runtime_error("invalid type, should not happen");
47 }
48};
49
52{
53 const ossia::destination_index& idx;
54 const ossia::domain& domain;
55
56 template <std::size_t N>
58 operator()(const std::array<float, N>& start, const std::array<float, N>& end)
59 {
60 SCORE_ASSERT(!idx.empty());
61 const auto i = idx[0];
62 Curve::CurveDomain d{start[i], end[i]};
63
64 if(auto dom = domain.v.target<ossia::vecf_domain<N>>())
65 {
66 if(auto min_v = dom->min[i])
67 d.min = std::min(d.min, (double)*min_v);
68 if(auto max_v = dom->max[i])
69 d.max = std::max(d.max, (double)*max_v);
70 }
71
72 return d;
73 }
74
75 Curve::CurveDomain operator()(
76 const std::vector<ossia::value>& start, const std::vector<ossia::value>& end)
77 {
78 SCORE_ASSERT(!idx.empty());
79 const auto i = (std::size_t)idx[0];
81 ossia::convert<double>(start[i]), ossia::convert<double>(end[i])};
82
83 if(auto dom = domain.v.target<ossia::vector_domain>())
84 {
85 if(dom->min.size() > i)
86 d.min = std::min(d.min, ossia::convert<double>(dom->min[i]));
87 if(dom->max.size() > i)
88 d.max = std::max(d.max, ossia::convert<double>(dom->max[i]));
89 }
90
91 return d;
92 }
93
95 operator()(const ossia::value_map_type& start, const ossia::value_map_type& end)
96 {
97 return {};
98 }
99
100 template <typename T>
101 Curve::CurveDomain operator()(const T& start, const T& end)
102 {
103 Curve::CurveDomain d{(double)start, (double)end};
104 if(domain)
105 d.refine(domain);
106 return d;
107 }
108
109 Curve::CurveDomain operator()(ossia::impulse start, ossia::impulse end) { return {}; }
110
111 Curve::CurveDomain operator()(const std::string& start, const std::string& end)
112 {
113 return {};
114 }
115
116 template <typename T, typename U>
117 Curve::CurveDomain operator()(const T& start, const U& end)
118 {
119 return {};
120 }
121};
122
124{
125 const ossia::destination_index& idx;
126
127 template <std::size_t N>
128 std::pair<double, double>
129 operator()(const std::array<float, N>& start, const std::array<float, N>& end)
130 {
131 SCORE_ASSERT(!idx.empty());
132 const auto i = idx[0];
133 return {(double)start[i], (double)end[i]};
134 }
135
136 std::pair<double, double> operator()(
137 const std::vector<ossia::value>& start, const std::vector<ossia::value>& end)
138 {
139 SCORE_ASSERT(!idx.empty());
140 const auto i = idx[0];
141 return {ossia::convert<double>(start[i]), ossia::convert<double>(end[i])};
142 }
143
144 template <typename T>
145 std::pair<double, double> operator()(const T& start, const T& end)
146 {
147 return {(double)start, (double)end};
148 }
149
150 std::pair<double, double> operator()(ossia::impulse start, ossia::impulse end)
151 {
152 return {0., 1.};
153 }
154
155 std::pair<double, double> operator()(const std::string& start, const std::string& end)
156 {
157 return {0., 1.};
158 }
159
160 template <typename T, typename U>
161 std::pair<double, double> operator()(const T& start, const U& end)
162 {
163 return {0., 1.};
164 }
165};
166}
A small abstraction layer over the score::CommandStack.
Definition CommandStackFacade.hpp:21
Main plug-in of score.
Definition ConnectionsList.hpp:22
Base toolkit upon which the software is built.
Definition Application.cpp:83
Definition CurveModel.hpp:127
Automation range between two values, widened to the target address's domain.
Definition InterpolateStates.hpp:52
Definition InterpolateStates.hpp:124
Definition InterpolateStates.hpp:32