score-plugin-fx/Fx/Gain.hpp
1 #pragma once
2 #include <Engine/Node/SimpleApi.hpp>
3 
4 namespace Nodes::Gain
5 {
6 struct Node
7 {
9  {
10  static const constexpr auto prettyName = "Gain";
11  static const constexpr auto objectKey = "Gain";
12  static const constexpr auto category = "Audio/Utilities";
13  static const constexpr auto author = "ossia score";
14  static const constexpr auto tags = std::array<const char*, 0>{};
15  static const constexpr auto kind = Process::ProcessCategory::AudioEffect;
16  static const constexpr auto description = "A simple volume control";
17  static const uuid_constexpr auto uuid
18  = make_uuid("6c158669-0f81-41c9-8cc6-45820dcda867");
19 
20  static const constexpr auto controls
21  = tuplet::make_tuple(Control::FloatSlider{"Gain", 0., 2., 1.});
22  static const constexpr audio_in audio_ins[]{"in"};
23  static const constexpr audio_out audio_outs[]{"out"};
24  };
25 
26  using control_policy = ossia::safe_nodes::last_tick;
27  static void
28  run(const ossia::audio_port& p1, float g, ossia::audio_port& p2,
29  ossia::token_request t, ossia::exec_state_facade st)
30  {
31  const auto chans = p1.channels();
32  p2.set_channels(chans);
33 
34  const auto [first_pos, N] = st.timings(t);
35 
36  const double gain = g;
37  for(std::size_t i = 0; i < chans; i++)
38  {
39  auto& in = p1.channel(i);
40  auto& out = p2.channel(i);
41 
42  const int64_t samples = in.size();
43  int64_t max = std::min(N, samples);
44 
45  out.resize(samples);
46 
47  for(int64_t j = first_pos; j < max; j++)
48  {
49  out[j] = in[j] * gain;
50  }
51  }
52  }
53 };
54 }
Definition: score-lib-process/Control/Widgets.hpp:77
Definition: SimpleApi.hpp:32
Definition: score-plugin-fx/Fx/Gain.hpp:9
Definition: score-plugin-fx/Fx/Gain.hpp:7