24 MidiFaderMode midiMode READ midiMode WRITE setMidiMode NOTIFY midiModeChanged)
38 struct FaderProcessingCaches
47 std::vector<dsp::AudioPort *> audio_ins_rt_;
48 std::vector<dsp::AudioPort *> audio_outs_rt_;
89 std::pair<std::span<float>, std::span<float>> stereo_bufs,
103 dsp::PortType signal_type,
104 bool hard_limit_output,
105 bool make_params_automatable,
108 QObject * parent =
nullptr);
117 if (midi_mode_ == mode)
121 Q_EMIT midiModeChanged (mode);
127 if (amp_id_.has_value ())
129 return &get_amp_param ();
133 zrythm::dsp::ProcessorParameter * balance ()
const
135 if (balance_id_.has_value ())
137 return &get_balance_param ();
141 zrythm::dsp::ProcessorParameter * mute ()
const
143 if (mute_id_.has_value ())
145 return &get_mute_param ();
149 zrythm::dsp::ProcessorParameter * solo ()
const
151 if (solo_id_.has_value ())
153 return &get_solo_param ();
157 zrythm::dsp::ProcessorParameter * listen ()
const
159 if (listen_id_.has_value ())
161 return &get_listen_param ();
165 zrythm::dsp::ProcessorParameter * monoToggle ()
const
167 if (mono_compat_enabled_id_.has_value ())
169 return &get_mono_compat_enabled_param ();
173 zrythm::dsp::ProcessorParameter * swapPhaseToggle ()
const
175 if (swap_phase_id_.has_value ())
177 return &get_swap_phase_param ();
189 const auto &mute_param = get_mute_param ();
190 return mute_param.range ().is_toggled (mute_param.currentValue ());
198 const auto &solo_param = get_solo_param ();
199 return solo_param.range ().is_toggled (solo_param.currentValue ());
207 const auto &listened_param = get_listen_param ();
208 return listened_param.range ().is_toggled (listened_param.currentValue ());
216 const auto &_param = get_amp_param ();
217 return amp_param.range ().convertFrom0To1 (amp_param.currentValue ());
220 std::string db_string_getter ()
const;
224 mute_gain_cb_ = std::move (cb);
229 preprocess_audio_cb_ = std::move (cb);
236 void custom_prepare_for_processing (
237 const graph::GraphNode * node,
238 units::sample_rate_t sample_rate,
241 void custom_release_resources ()
override;
246 const dsp::TempoMap &tempo_map)
noexcept override;
250 bool is_audio ()
const {
return signal_type_ == dsp::PortType::Audio; }
251 bool is_midi ()
const {
return signal_type_ == dsp::PortType::Midi; }
253 bool hard_limiting_enabled ()
const {
return hard_limit_output_; }
260 return *std::get<dsp::ProcessorParameter *> (
261 dependencies ().param_registry_.find_by_id_or_throw (*amp_id_));
263 dsp::ProcessorParameter &get_balance_param ()
const
265 return *std::get<dsp::ProcessorParameter *> (
266 dependencies ().param_registry_.find_by_id_or_throw (*balance_id_));
268 dsp::ProcessorParameter &get_mute_param ()
const
270 return *std::get<dsp::ProcessorParameter *> (
271 dependencies ().param_registry_.find_by_id_or_throw (*mute_id_));
273 dsp::ProcessorParameter &get_solo_param ()
const
275 return *std::get<dsp::ProcessorParameter *> (
276 dependencies ().param_registry_.find_by_id_or_throw (*solo_id_));
278 dsp::ProcessorParameter &get_listen_param ()
const
280 return *std::get<dsp::ProcessorParameter *> (
281 dependencies ().param_registry_.find_by_id_or_throw (*listen_id_));
283 dsp::ProcessorParameter &get_mono_compat_enabled_param ()
const
285 return *std::get<dsp::ProcessorParameter *> (
286 dependencies ().param_registry_.find_by_id_or_throw (
287 *mono_compat_enabled_id_));
289 dsp::ProcessorParameter &get_swap_phase_param ()
const
291 return *std::get<dsp::ProcessorParameter *> (
292 dependencies ().param_registry_.find_by_id_or_throw (*swap_phase_id_));
294 dsp::AudioPort &get_stereo_in_port ()
const
298 throw std::runtime_error (
"Not an audio fader");
300 return *get_input_ports ().at (0).get_object_as<dsp::AudioPort> ();
302 dsp::AudioPort &get_stereo_out_port ()
const
306 throw std::runtime_error (
"Not an audio fader");
308 return *get_output_ports ().at (0).get_object_as<dsp::AudioPort> ();
310 dsp::MidiPort &get_midi_in_port ()
const
312 return *get_input_ports ().front ().get_object_as<dsp::MidiPort> ();
314 dsp::MidiPort &get_midi_out_port ()
const
316 return *get_output_ports ().front ().get_object_as<dsp::MidiPort> ();
319 auto currently_soloed_rt () const noexcept [[clang::nonblocking]]
321 return processing_caches_->solo_param_->range ().is_toggled (
322 processing_caches_->solo_param_->currentValue ());
325 bool currently_listened_rt () const noexcept [[clang::nonblocking]]
327 const auto &listened_param = processing_caches_->listen_param_;
328 return listened_param->range ().is_toggled (listened_param->currentValue ());
332 static constexpr auto kMidiModeKey =
"midiMode"sv;
333 friend void to_json (nlohmann::json &j,
const Fader &fader);
334 friend void from_json (
const nlohmann::json &j,
Fader &fader);
342 void init_param_caches ();
348 float calculate_target_gain_rt ()
const;
350 bool effectively_muted ()
const
355 bool effectively_muted_rt ()
const
357 const auto currently_muted_rt = [
this] () {
358 return processing_caches_->mute_param_->range ().is_toggled (
359 processing_caches_->mute_param_->currentValue ());
362 return currently_muted_rt () || should_be_muted_cb_ (currently_soloed_rt ());
366 dsp::PortType signal_type_;
368 bool hard_limit_output_{};
377 float last_cc_volume_ = 0.f;
382 std::optional<dsp::ProcessorParameter::Uuid> amp_id_;
385 std::optional<dsp::ProcessorParameter::Uuid> balance_id_;
390 std::optional<dsp::ProcessorParameter::Uuid> mute_id_;
393 std::optional<dsp::ProcessorParameter::Uuid> solo_id_;
396 std::optional<dsp::ProcessorParameter::Uuid> listen_id_;
399 std::optional<dsp::ProcessorParameter::Uuid> mono_compat_enabled_id_;
402 std::optional<dsp::ProcessorParameter::Uuid> swap_phase_id_;
414 juce::SmoothedValue<float> current_gain_{ 0.f };
418 std::optional<PreProcessAudioCallback> preprocess_audio_cb_;
423 std::unique_ptr<FaderProcessingCaches> processing_caches_;