26 halp_meta(name,
"Easetanbul")
27 halp_meta(c_name,
"easetanbul")
28 halp_meta(category,
"Control/Mappings")
29 halp_meta(description,
"Easing function power tool")
30 halp_meta(manual_url,
"https://ossia.io/score-docs/processes/easetanbul.html")
31 halp_meta(author,
"Jean-Michaƫl Celerier")
32 halp_meta(uuid,
"8abb3061-7101-48d4-81b1-6b19208098bf")
96 struct : halp::val_port<
"Input", ossia::value>
100 self.m_previous = self.m_current;
101 self.m_current = value;
102 self.m_running =
true;
106 struct : halp::enum_t<Mode,
"Mode">
113 struct : halp::time_chooser<
"Delay", halp::range{0.001, 30., 0.2}>
115 void update(
Easetanbul& self) { self.m_duration = value * self.rate; }
123 halp::val_port<
"Output", ossia::value> output;
126 double rate = 48000.;
127 void prepare(halp::setup info)
noexcept { rate = info.rate; }
129 double ease01(
double value)
131 using ease_type = Mode;
135 case ease_type::Linear:
136 return ossia::easing::linear{}(value);
137 case ease_type::BackIn:
138 return ossia::easing::backIn{}(value);
139 case ease_type::BackOut:
140 return ossia::easing::backOut{}(value);
141 case ease_type::BackInOut:
142 return ossia::easing::backInOut{}(value);
143 case ease_type::BounceIn:
144 return ossia::easing::bounceIn{}(value);
145 case ease_type::BounceOut:
146 return ossia::easing::bounceOut{}(value);
147 case ease_type::BounceInOut:
148 return ossia::easing::bounceInOut{}(value);
149 case ease_type::QuadraticIn:
150 return ossia::easing::quadraticIn{}(value);
151 case ease_type::QuadraticOut:
152 return ossia::easing::quadraticOut{}(value);
153 case ease_type::QuadraticInOut:
154 return ossia::easing::quadraticInOut{}(value);
155 case ease_type::CubicIn:
156 return ossia::easing::cubicIn{}(value);
157 case ease_type::CubicOut:
158 return ossia::easing::cubicOut{}(value);
159 case ease_type::CubicInOut:
160 return ossia::easing::cubicInOut{}(value);
161 case ease_type::QuarticIn:
162 return ossia::easing::quarticIn{}(value);
163 case ease_type::QuarticOut:
164 return ossia::easing::quarticOut{}(value);
165 case ease_type::QuarticInOut:
166 return ossia::easing::quarticInOut{}(value);
167 case ease_type::QuinticIn:
168 return ossia::easing::quinticIn{}(value);
169 case ease_type::QuinticOut:
170 return ossia::easing::quinticOut{}(value);
171 case ease_type::QuinticInOut:
172 return ossia::easing::quinticInOut{}(value);
173 case ease_type::SineIn:
174 return ossia::easing::sineIn{}(value);
175 case ease_type::SineOut:
176 return ossia::easing::sineOut{}(value);
177 case ease_type::SineInOut:
178 return ossia::easing::sineInOut{}(value);
179 case ease_type::CircularIn:
180 return ossia::easing::circularIn{}(value);
181 case ease_type::CircularOut:
182 return ossia::easing::circularOut{}(value);
183 case ease_type::CircularInOut:
184 return ossia::easing::circularInOut{}(value);
185 case ease_type::ExponentialIn:
186 return ossia::easing::exponentialIn{}(value);
187 case ease_type::ExponentialOut:
188 return ossia::easing::exponentialOut{}(value);
189 case ease_type::ExponentialInOut:
190 return ossia::easing::exponentialInOut{}(value);
191 case ease_type::ElasticIn:
192 return ossia::easing::elasticIn{}(value);
193 case ease_type::ElasticOut:
194 return ossia::easing::elasticOut{}(value);
195 case ease_type::ElasticInOut:
196 return ossia::easing::elasticInOut{}(value);
197 case ease_type::PerlinInOut:
198 return ossia::easing::perlinInOut{}(value);
202 template <
typename T>
203 static constexpr T ease_scalar(T v0, T v1,
float t)
205 return ossia::easing::ease{}(v0, v1, t);
208 template <std::
size_t N>
209 static constexpr std::array<float, N>
210 ease_vector(
const std::array<float, N>& v0,
const std::array<float, N>& v1,
float t)
212 std::array<float, N> res;
213 for(
int i = 0; i < N; i++)
214 res[i] = ossia::easing::ease{}(v0[i], v1[i], t);
218 static std::vector<ossia::value> ease_vector(
219 const std::vector<ossia::value>& v0,
const std::vector<ossia::value>& v1,
float t)
221 const int max_size = std::min(v0.size(), v1.size());
223 std::vector<ossia::value> result;
224 result.reserve(max_size);
226 for(
int elem_idx = 0; elem_idx < max_size; ++elem_idx)
227 result.push_back(ease_values(v0[elem_idx], v1[elem_idx], t));
233 ease_values(
const ossia::value& v0,
const ossia::value& v1,
float weights)
239 const auto first_type = v0.get_type();
240 const auto second_type = v1.get_type();
241 const bool same_type = first_type == second_type;
248 case ossia::val_type::FLOAT: {
249 return ease_scalar(*v0.target<
float>(), *v1.target<
float>(), weights);
251 case ossia::val_type::INT: {
252 return static_cast<int>(
253 std::round(ease_scalar(*v0.target<
int>(), *v1.target<
int>(), weights)));
255 case ossia::val_type::BOOL: {
256 return ease_scalar(*v0.target<
bool>(), *v1.target<
bool>(), weights) >= 0.5f;
258 case ossia::val_type::VEC2F: {
260 *v0.target<ossia::vec2f>(), *v1.target<ossia::vec2f>(), weights);
262 case ossia::val_type::VEC3F: {
264 *v0.target<ossia::vec3f>(), *v1.target<ossia::vec3f>(), weights);
266 case ossia::val_type::VEC4F: {
268 *v0.target<ossia::vec4f>(), *v1.target<ossia::vec4f>(), weights);
270 case ossia::val_type::LIST: {
272 *v0.target<std::vector<ossia::value>>(),
273 *v1.target<std::vector<ossia::value>>(), weights);
280 void operator()(
int frames)
noexcept
282 double deltaTime = frames;
285 outputs.output = m_current;
289 m_elapsed += deltaTime;
291 if(m_elapsed >= m_duration)
293 outputs.output = m_current;
298 double t = m_elapsed / m_duration;
299 double easedT = ease01(t);
300 outputs.output = ease_values(m_previous, m_current, easedT);
304 ossia::value m_previous{};
305 ossia::value m_current{};
306 double m_duration{96000.};