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;
249 bool is_audio ()
const {
return signal_type_ == dsp::PortType::Audio; }
250 bool is_midi ()
const {
return signal_type_ == dsp::PortType::Midi; }
252 bool hard_limiting_enabled ()
const {
return hard_limit_output_; }
259 return *std::get<dsp::ProcessorParameter *> (
260 dependencies ().param_registry_.find_by_id_or_throw (*amp_id_));
262 dsp::ProcessorParameter &get_balance_param ()
const
264 return *std::get<dsp::ProcessorParameter *> (
265 dependencies ().param_registry_.find_by_id_or_throw (*balance_id_));
267 dsp::ProcessorParameter &get_mute_param ()
const
269 return *std::get<dsp::ProcessorParameter *> (
270 dependencies ().param_registry_.find_by_id_or_throw (*mute_id_));
272 dsp::ProcessorParameter &get_solo_param ()
const
274 return *std::get<dsp::ProcessorParameter *> (
275 dependencies ().param_registry_.find_by_id_or_throw (*solo_id_));
277 dsp::ProcessorParameter &get_listen_param ()
const
279 return *std::get<dsp::ProcessorParameter *> (
280 dependencies ().param_registry_.find_by_id_or_throw (*listen_id_));
282 dsp::ProcessorParameter &get_mono_compat_enabled_param ()
const
284 return *std::get<dsp::ProcessorParameter *> (
285 dependencies ().param_registry_.find_by_id_or_throw (
286 *mono_compat_enabled_id_));
288 dsp::ProcessorParameter &get_swap_phase_param ()
const
290 return *std::get<dsp::ProcessorParameter *> (
291 dependencies ().param_registry_.find_by_id_or_throw (*swap_phase_id_));
293 dsp::AudioPort &get_stereo_in_port ()
const
297 throw std::runtime_error (
"Not an audio fader");
299 return *get_input_ports ().at (0).get_object_as<dsp::AudioPort> ();
301 dsp::AudioPort &get_stereo_out_port ()
const
305 throw std::runtime_error (
"Not an audio fader");
307 return *get_output_ports ().at (0).get_object_as<dsp::AudioPort> ();
309 dsp::MidiPort &get_midi_in_port ()
const
311 return *get_input_ports ().front ().get_object_as<dsp::MidiPort> ();
313 dsp::MidiPort &get_midi_out_port ()
const
315 return *get_output_ports ().front ().get_object_as<dsp::MidiPort> ();
318 auto currently_soloed_rt () const noexcept [[clang::nonblocking]]
320 return processing_caches_->solo_param_->range ().is_toggled (
321 processing_caches_->solo_param_->currentValue ());
324 bool currently_listened_rt () const noexcept [[clang::nonblocking]]
326 const auto &listened_param = processing_caches_->listen_param_;
327 return listened_param->range ().is_toggled (listened_param->currentValue ());
331 static constexpr auto kMidiModeKey =
"midiMode"sv;
332 friend void to_json (nlohmann::json &j,
const Fader &fader)
334 to_json (j,
static_cast<const dsp::ProcessorBase &
> (fader));
335 j[kMidiModeKey] = fader.midi_mode_;
337 friend void from_json (
const nlohmann::json &j,
Fader &fader);
345 void init_param_caches ();
351 float calculate_target_gain_rt ()
const;
353 bool effectively_muted ()
const
358 bool effectively_muted_rt ()
const
360 const auto currently_muted_rt = [
this] () {
361 return processing_caches_->mute_param_->range ().is_toggled (
362 processing_caches_->mute_param_->currentValue ());
365 return currently_muted_rt () || should_be_muted_cb_ (currently_soloed_rt ());
369 dsp::PortType signal_type_;
371 bool hard_limit_output_{};
380 float last_cc_volume_ = 0.f;
385 std::optional<dsp::ProcessorParameter::Uuid> amp_id_;
388 std::optional<dsp::ProcessorParameter::Uuid> balance_id_;
393 std::optional<dsp::ProcessorParameter::Uuid> mute_id_;
396 std::optional<dsp::ProcessorParameter::Uuid> solo_id_;
399 std::optional<dsp::ProcessorParameter::Uuid> listen_id_;
402 std::optional<dsp::ProcessorParameter::Uuid> mono_compat_enabled_id_;
405 std::optional<dsp::ProcessorParameter::Uuid> swap_phase_id_;
417 juce::SmoothedValue<float> current_gain_{ 0.f };
421 std::optional<PreProcessAudioCallback> preprocess_audio_cb_;
426 std::unique_ptr<FaderProcessingCaches> processing_caches_;