2 #include <Engine/Node/SimpleApi.hpp>
4 #include <ossia/detail/config.hpp>
6 #include <Analysis/GistState.hpp>
8 #if defined(OSSIA_ENABLE_KFR)
9 #include <kfr/base.hpp>
10 #include <kfr/dsp.hpp>
20 static const constexpr
auto prettyName =
"Pitch detector";
21 static const constexpr
auto objectKey =
"Pitch";
22 static const constexpr
auto category =
"Analysis/Pitch";
23 static const constexpr
auto author =
"ossia score, Gist library";
24 static const constexpr
auto kind = Process::ProcessCategory::Analyzer;
25 static const constexpr
auto description =
"Get the pitch of a signal";
26 static const constexpr
auto tags = std::array<const char*, 0>{};
27 static const uuid_constexpr
auto uuid
28 = make_uuid(
"ed511605-8265-4b2c-8c4b-d3b189539b3b");
30 static const constexpr audio_in audio_ins[]{
"in"};
31 static const constexpr value_out value_outs[]{
"out"};
34 #if defined(OSSIA_ENABLE_KFR)
39 kfr::iir_highpass(kfr::butterworth<kfr::fbase>(12), 200, this->rate))}
43 void filter(ossia::audio_port& in)
45 while(hipass.size() < in.channels())
47 hipass.emplace_back(kfr::to_sos(
48 kfr::iir_highpass(kfr::butterworth<kfr::fbase>(12), 200, this->rate)));
52 for(ossia::audio_channel& chan : in)
54 hipass[c++].apply(chan.data(), chan.size());
58 using hipass_t = decltype(kfr::to_sos(
59 kfr::iir_highpass(kfr::zpk<kfr::fbase>{}, kfr::identity<kfr::fbase>{})));
60 std::vector<kfr::iir_filter<kfr::fbase>> hipass;
63 using State = GistState;
65 using control_policy = ossia::safe_nodes::last_tick;
68 run(
const ossia::audio_port& in, ossia::value_port& out, ossia::token_request tk,
69 ossia::exec_state_facade e,
State& st)
71 if(in.channels() == 0)
74 #if defined(OSSIA_ENABLE_KFR)
75 st.filter(
const_cast<ossia::audio_port&
>(in));
77 st.process<&Gist<double>::pitch>(in, out, tk, e);
Utilities for OSSIA data structures.
Definition: DeviceInterface.hpp:33
Definition: GistState.hpp:24