15 halp_meta(name,
"Envelope")
16 halp_meta(c_name,
"Envelope")
17 halp_meta(category,
"Audio")
18 halp_meta(author,
"ossia score")
19 halp_meta(manual_url,
"https://ossia.io/score-docs/processes/analysis.html#envelope")
20 halp_meta(description,
"Converts an audio signal into RMS and peak values")
21 halp_meta(uuid,
"95F44151-13EF-4537-8189-0CC243341269");
26 halp::dynamic_audio_bus<
"in", FP> audio;
30 halp::callback<
"rms", multichannel_output_type> rms;
31 halp::callback<
"peak", multichannel_output_type> peak;
34 halp_flag(deprecated);
36 static auto get(
const avnd::span<FP>& chan)
42 for(
auto sample : chan)
44 max = std::max(max, std::abs(sample));
45 rms += sample * sample;
47 rms = std::sqrt(rms / chan.size());
49 return std::make_pair(rms, max);
53 return std::make_pair(FP{}, FP{});
57 void operator()(
int d)
59 auto& audio = inputs.audio;
60 switch(audio.channels)
65 auto [rms, peak] = get(audio.channel(0, d));
71 multichannel_output_vector peak_vec;
72 peak_vec.reserve(audio.channels);
73 multichannel_output_vector rms_vec;
74 rms_vec.reserve(audio.channels);
75 for(
int i = 0; i < audio.channels; i++)
77 auto [rms, peak] = get(audio.channel(i, d));
78 rms_vec.push_back(rms);
79 peak_vec.push_back(peak);
82 outputs.peak(peak_vec);