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 ();
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 (
240 void custom_release_resources ()
override;
247 bool is_audio ()
const {
return signal_type_ == dsp::PortType::Audio; }
248 bool is_midi ()
const {
return signal_type_ == dsp::PortType::Midi; }
250 bool hard_limiting_enabled ()
const {
return hard_limit_output_; }
257 return *std::get<dsp::ProcessorParameter *> (
258 dependencies ().param_registry_.find_by_id_or_throw (*amp_id_));
262 return *std::get<dsp::ProcessorParameter *> (
263 dependencies ().param_registry_.find_by_id_or_throw (*balance_id_));
265 dsp::ProcessorParameter &get_mute_param ()
const
267 return *std::get<dsp::ProcessorParameter *> (
268 dependencies ().param_registry_.find_by_id_or_throw (*mute_id_));
270 dsp::ProcessorParameter &get_solo_param ()
const
272 return *std::get<dsp::ProcessorParameter *> (
273 dependencies ().param_registry_.find_by_id_or_throw (*solo_id_));
275 dsp::ProcessorParameter &get_listen_param ()
const
277 return *std::get<dsp::ProcessorParameter *> (
278 dependencies ().param_registry_.find_by_id_or_throw (*listen_id_));
280 dsp::ProcessorParameter &get_mono_compat_enabled_param ()
const
282 return *std::get<dsp::ProcessorParameter *> (
283 dependencies ().param_registry_.find_by_id_or_throw (
284 *mono_compat_enabled_id_));
286 dsp::ProcessorParameter &get_swap_phase_param ()
const
288 return *std::get<dsp::ProcessorParameter *> (
289 dependencies ().param_registry_.find_by_id_or_throw (*swap_phase_id_));
291 dsp::AudioPort &get_stereo_in_port ()
const
295 throw std::runtime_error (
"Not an audio fader");
297 return *get_input_ports ().at (0).get_object_as<dsp::AudioPort> ();
299 dsp::AudioPort &get_stereo_out_port ()
const
303 throw std::runtime_error (
"Not an audio fader");
305 return *get_output_ports ().at (0).get_object_as<dsp::AudioPort> ();
307 dsp::MidiPort &get_midi_in_port ()
const
309 return *get_input_ports ().front ().get_object_as<dsp::MidiPort> ();
311 dsp::MidiPort &get_midi_out_port ()
const
313 return *get_output_ports ().front ().get_object_as<dsp::MidiPort> ();
317 static constexpr auto kMidiModeKey =
"midiMode"sv;
318 friend void to_json (nlohmann::json &j,
const Fader &fader)
320 to_json (j,
static_cast<const dsp::ProcessorBase &
> (fader));
321 j[kMidiModeKey] = fader.midi_mode_;
323 friend void from_json (
const nlohmann::json &j,
Fader &fader);
331 void init_param_caches ();
337 float calculate_target_gain_rt ()
const;
339 bool effectively_muted ()
const
344 bool effectively_muted_rt ()
const
346 const auto currently_muted_rt = [
this] () {
347 return processing_caches_->mute_param_->range ().is_toggled (
348 processing_caches_->mute_param_->currentValue ());
350 const auto currently_soloed_rt = [
this] () {
351 return processing_caches_->solo_param_->range ().is_toggled (
352 processing_caches_->solo_param_->currentValue ());
355 return currently_muted_rt () || should_be_muted_cb_ (currently_soloed_rt ());
359 dsp::PortType signal_type_;
361 bool hard_limit_output_{};
370 float last_cc_volume_ = 0.f;
375 std::optional<dsp::ProcessorParameter::Uuid> amp_id_;
378 std::optional<dsp::ProcessorParameter::Uuid> balance_id_;
383 std::optional<dsp::ProcessorParameter::Uuid> mute_id_;
386 std::optional<dsp::ProcessorParameter::Uuid> solo_id_;
389 std::optional<dsp::ProcessorParameter::Uuid> listen_id_;
392 std::optional<dsp::ProcessorParameter::Uuid> mono_compat_enabled_id_;
395 std::optional<dsp::ProcessorParameter::Uuid> swap_phase_id_;
407 juce::SmoothedValue<float> current_gain_{ 0.f };
411 std::optional<PreProcessAudioCallback> preprocess_audio_cb_;
416 std::unique_ptr<FaderProcessingCaches> processing_caches_;