2 #include <Audio/Settings/Model.hpp>
4 #include <ossia/dataflow/audio_port.hpp>
5 #include <ossia/dataflow/graph_node.hpp>
6 #include <ossia/dataflow/token_request.hpp>
7 #include <ossia/dataflow/value_port.hpp>
8 #include <ossia/detail/flat_map.hpp>
9 #include <ossia/network/value/value.hpp>
15 namespace ossia::safe_nodes
18 using timed_vec = ossia::flat_map<int64_t, T>;
27 explicit GistState(
int bufferSize,
int rate)
28 : out_val{std::vector<ossia::value>{}}
29 , output{out_val.v.m_impl.m_value8}
30 , bufferSize{bufferSize}
35 gist.emplace_back(bufferSize, rate);
36 gist.emplace_back(bufferSize, rate);
40 :
GistState{settings.getBufferSize(), settings.getRate()}
51 void preprocess(
const ossia::audio_port& audio)
53 const auto N = audio.channels();
59 while(gist.size() < N)
60 gist.emplace_back(bufferSize, rate);
67 const ossia::audio_port& audio, ossia::value_port& out_port,
68 const ossia::token_request& tk,
const ossia::exec_state_facade& e)
71 auto& c0 = audio.get()[0];
74 const auto samples = std::ssize(c0);
77 if(g0.getAudioFrameSize() != samples)
78 g0.setAudioFrameSize(samples);
80 g0.processAudioFrame(c0.data(), samples);
85 const auto [tick_start, d] = e.timings(tk);
86 out_port.write_value(ret, tick_start);
91 const ossia::audio_port& audio, ossia::value_port& out_port,
92 const ossia::token_request& tk,
const ossia::exec_state_facade& e)
94 ossia::vec2f ret = {0.f, 0.f};
95 auto& c0 = audio.get()[0];
98 const auto samples = std::ssize(c0);
101 if(g0.getAudioFrameSize() != samples)
102 g0.setAudioFrameSize(samples);
104 g0.processAudioFrame(c0.data(), samples);
105 ret[0] = (g0.*Func)();
108 auto& c1 = audio.get()[1];
111 const auto samples = std::ssize(c1);
114 if(g1.getAudioFrameSize() != samples)
115 g1.setAudioFrameSize(samples);
117 g1.processAudioFrame(c0.data(), samples);
118 ret[1] = (g1.*Func)();
122 const auto [tick_start, d] = e.timings(tk);
123 out_port.write_value(ret, tick_start);
128 const ossia::audio_port& audio, ossia::value_port& out_port,
129 const ossia::token_request& tk,
const ossia::exec_state_facade& e)
131 auto it = output.begin();
132 auto git = gist.begin();
133 for(
auto& channel : audio.get())
135 const auto samples = std::ssize(channel);
138 if(git->getAudioFrameSize() != samples)
139 git->setAudioFrameSize(samples);
141 git->processAudioFrame(channel.data(), samples);
142 *it = float(((*git).*Func)());
152 const auto [tick_start, d] = e.timings(tk);
153 out_port.write_value(out_val, tick_start);
159 const ossia::audio_port& audio,
float gain,
float gate,
160 ossia::value_port& out_port,
const ossia::token_request& tk,
161 const ossia::exec_state_facade& e)
164 auto& c0 = audio.get()[0];
167 const auto samples = std::ssize(c0);
170 if(g0.getAudioFrameSize() != samples)
171 g0.setAudioFrameSize(samples);
173 g0.processAudioFrame(c0.data(), samples, gain, gate);
178 const auto [tick_start, d] = e.timings(tk);
179 out_port.write_value(ret, tick_start);
184 const ossia::audio_port& audio,
float gain,
float gate,
185 ossia::value_port& out_port,
const ossia::token_request& tk,
186 const ossia::exec_state_facade& e)
188 ossia::vec2f ret = {0.f, 0.f};
189 auto& c0 = audio.get()[0];
192 const auto samples = std::ssize(c0);
195 if(g0.getAudioFrameSize() != samples)
196 g0.setAudioFrameSize(samples);
198 g0.processAudioFrame(c0.data(), samples, gain, gate);
199 ret[0] = (g0.*Func)();
202 auto& c1 = audio.get()[1];
205 const auto samples = std::ssize(c1);
208 if(g1.getAudioFrameSize() != samples)
209 g1.setAudioFrameSize(samples);
211 g1.processAudioFrame(c0.data(), samples, gain, gate);
212 ret[1] = (g1.*Func)();
216 const auto [tick_start, d] = e.timings(tk);
217 out_port.write_value(ret, tick_start);
222 const ossia::audio_port& audio,
float gain,
float gate,
223 ossia::value_port& out_port,
const ossia::token_request& tk,
224 const ossia::exec_state_facade& e)
226 auto it = output.begin();
227 auto git = gist.begin();
228 for(
auto& channel : audio.get())
230 const auto samples = std::ssize(channel);
233 if(git->getAudioFrameSize() != samples)
234 git->setAudioFrameSize(samples);
236 git->processAudioFrame(channel.data(), samples, gain, gate);
238 *it = r = float(((*git).*Func)());
248 const auto [tick_start, d] = e.timings(tk);
249 out_port.write_value(out_val, tick_start);
255 const ossia::audio_port& audio,
float gain,
float gate,
256 ossia::value_port& out_port, ossia::value_port& pulse_port,
257 const ossia::token_request& tk,
const ossia::exec_state_facade& e)
260 auto& c0 = audio.get()[0];
263 const auto samples = std::ssize(c0);
266 if(g0.getAudioFrameSize() != samples)
267 g0.setAudioFrameSize(samples);
269 g0.processAudioFrame(c0.data(), samples, gain, gate);
274 const auto [tick_start, d] = e.timings(tk);
275 out_port.write_value(ret, tick_start);
278 pulse_port.write_value(ossia::impulse{}, tick_start);
283 const ossia::audio_port& audio,
float gain,
float gate,
284 ossia::value_port& out_port, ossia::value_port& pulse_port,
285 const ossia::token_request& tk,
const ossia::exec_state_facade& e)
287 ossia::vec2f ret = {0.f, 0.f};
288 auto& c0 = audio.get()[0];
291 const auto samples = std::ssize(c0);
294 if(g0.getAudioFrameSize() != samples)
295 g0.setAudioFrameSize(samples);
297 g0.processAudioFrame(c0.data(), samples, gain, gate);
298 ret[0] = (g0.*Func)();
301 auto& c1 = audio.get()[1];
304 const auto samples = std::ssize(c1);
307 if(g1.getAudioFrameSize() != samples)
308 g1.setAudioFrameSize(samples);
310 g1.processAudioFrame(c0.data(), samples, gain, gate);
311 ret[1] = (g1.*Func)();
315 const auto [tick_start, d] = e.timings(tk);
316 out_port.write_value(ret, tick_start);
317 if(ret[0] >= 1.f || ret[1] >= 1.f)
318 pulse_port.write_value(ossia::impulse{}, tick_start);
323 const ossia::audio_port& audio,
float gain,
float gate,
324 ossia::value_port& out_port, ossia::value_port& pulse_port,
325 const ossia::token_request& tk,
const ossia::exec_state_facade& e)
328 auto it = output.begin();
329 auto git = gist.begin();
330 for(
auto& channel : audio.get())
332 const auto samples = std::ssize(channel);
335 if(git->getAudioFrameSize() != samples)
336 git->setAudioFrameSize(samples);
338 git->processAudioFrame(channel.data(), samples, gain, gate);
340 *it = r = float(((*git).*Func)());
351 const auto [tick_start, d] = e.timings(tk);
352 out_port.write_value(out_val, tick_start);
355 pulse_port.write_value(ossia::impulse{}, tick_start);
359 template <
auto Func,
typename... Args>
360 void process(
const ossia::audio_port& audio, Args&&... args)
364 switch(audio.channels())
367 return process_mono<Func>(audio, args...);
370 return process_stereo<Func>(audio, args...);
373 return process_multi<Func>(audio, args...);
380 const ossia::audio_port& audio, ossia::audio_port& mfcc,
381 const ossia::token_request& tk,
const ossia::exec_state_facade& e)
383 while(gist.size() < audio.channels())
384 gist.emplace_back(bufferSize, rate);
386 mfcc.set_channels(audio.channels());
387 auto it = mfcc.get().begin();
388 auto git = gist.begin();
389 for(
auto& channel : audio.get())
391 const auto samples = std::ssize(channel);
394 if(git->getAudioFrameSize() != samples)
395 git->setAudioFrameSize(samples);
397 git->processAudioFrame(channel.data(), samples);
399 auto& res = ((*git).*Func)();
400 it->assign(res.begin(), res.end());
414 const ossia::audio_port& audio,
float gain,
float gate, ossia::audio_port& mfcc,
415 const ossia::token_request& tk,
const ossia::exec_state_facade& e)
417 while(gist.size() < audio.channels())
418 gist.emplace_back(bufferSize, rate);
420 mfcc.set_channels(audio.channels());
421 auto it = mfcc.get().begin();
422 auto git = gist.begin();
423 for(
auto& channel : audio.get())
425 const auto samples = std::ssize(channel);
428 if(git->getAudioFrameSize() != samples)
429 git->setAudioFrameSize(samples);
431 git->processAudioFrame(channel.data(), samples, gain, gate);
433 auto& res = ((*git).*Func)();
434 it->assign(res.begin(), res.end());
446 ossia::small_vector<Gist<double>, 2> gist;
447 ossia::value out_val;
448 std::vector<ossia::value>& output;
Definition: score-plugin-audio/Audio/Settings/Model.hpp:22
Definition: GistState.hpp:24
T & settings() const
Access a specific Settings model instance.
Definition: ApplicationContext.hpp:40