18 MidiFaderMode midiMode READ midiMode WRITE setMidiMode NOTIFY midiModeChanged)
32 struct FaderProcessingCaches
41 std::vector<dsp::AudioPort *> audio_ins_rt_;
42 std::vector<dsp::AudioPort *> audio_outs_rt_;
83 std::pair<std::span<float>, std::span<float>> stereo_bufs,
97 dsp::PortType signal_type,
98 bool hard_limit_output,
99 bool make_params_automatable,
102 QObject * parent =
nullptr);
111 if (midi_mode_ == mode)
115 Q_EMIT midiModeChanged (mode);
121 if (amp_id_.has_value ())
123 return &get_amp_param ();
127 zrythm::dsp::ProcessorParameter * balance ()
const
129 if (balance_id_.has_value ())
131 return &get_balance_param ();
135 zrythm::dsp::ProcessorParameter * mute ()
const
137 if (mute_id_.has_value ())
139 return &get_mute_param ();
143 zrythm::dsp::ProcessorParameter * solo ()
const
145 if (solo_id_.has_value ())
147 return &get_solo_param ();
151 zrythm::dsp::ProcessorParameter * listen ()
const
153 if (listen_id_.has_value ())
155 return &get_listen_param ();
159 zrythm::dsp::ProcessorParameter * monoToggle ()
const
161 if (mono_compat_enabled_id_.has_value ())
163 return &get_mono_compat_enabled_param ();
167 zrythm::dsp::ProcessorParameter * swapPhaseToggle ()
const
169 if (swap_phase_id_.has_value ())
171 return &get_swap_phase_param ();
183 const auto &mute_param = get_mute_param ();
184 return mute_param.range ().is_toggled (mute_param.currentValue ());
192 const auto &solo_param = get_solo_param ();
193 return solo_param.range ().is_toggled (solo_param.currentValue ());
201 const auto &listened_param = get_listen_param ();
202 return listened_param.range ().is_toggled (listened_param.currentValue ());
210 const auto &_param = get_amp_param ();
211 return amp_param.range ().convertFrom0To1 (amp_param.currentValue ());
214 std::string db_string_getter ()
const;
218 mute_gain_cb_ = std::move (cb);
223 preprocess_audio_cb_ = std::move (cb);
230 void custom_prepare_for_processing (
231 const graph::GraphNode * node,
232 units::sample_rate_t sample_rate,
233 units::sample_u32_t max_block_length)
override;
235 void custom_release_resources ()
override;
240 const dsp::TempoMap &tempo_map)
noexcept override;
244 bool is_audio ()
const {
return signal_type_ == dsp::PortType::Audio; }
245 bool is_midi ()
const {
return signal_type_ == dsp::PortType::Midi; }
247 bool hard_limiting_enabled ()
const {
return hard_limit_output_; }
252 dsp::ProcessorParameter &get_amp_param ()
const
254 return *std::get<dsp::ProcessorParameter *> (
255 dependencies ().param_registry_.find_by_id_or_throw (*amp_id_));
257 dsp::ProcessorParameter &get_balance_param ()
const
259 return *std::get<dsp::ProcessorParameter *> (
260 dependencies ().param_registry_.find_by_id_or_throw (*balance_id_));
262 dsp::ProcessorParameter &get_mute_param ()
const
264 return *std::get<dsp::ProcessorParameter *> (
265 dependencies ().param_registry_.find_by_id_or_throw (*mute_id_));
267 dsp::ProcessorParameter &get_solo_param ()
const
269 return *std::get<dsp::ProcessorParameter *> (
270 dependencies ().param_registry_.find_by_id_or_throw (*solo_id_));
272 dsp::ProcessorParameter &get_listen_param ()
const
274 return *std::get<dsp::ProcessorParameter *> (
275 dependencies ().param_registry_.find_by_id_or_throw (*listen_id_));
277 dsp::ProcessorParameter &get_mono_compat_enabled_param ()
const
279 return *std::get<dsp::ProcessorParameter *> (
280 dependencies ().param_registry_.find_by_id_or_throw (
281 *mono_compat_enabled_id_));
283 dsp::ProcessorParameter &get_swap_phase_param ()
const
285 return *std::get<dsp::ProcessorParameter *> (
286 dependencies ().param_registry_.find_by_id_or_throw (*swap_phase_id_));
288 dsp::AudioPort &get_stereo_in_port ()
const
292 throw std::runtime_error (
"Not an audio fader");
294 return *get_input_ports ().at (0).get_object_as<dsp::AudioPort> ();
296 dsp::AudioPort &get_stereo_out_port ()
const
300 throw std::runtime_error (
"Not an audio fader");
302 return *get_output_ports ().at (0).get_object_as<dsp::AudioPort> ();
304 dsp::MidiPort &get_midi_in_port ()
const
306 return *get_input_ports ().front ().get_object_as<dsp::MidiPort> ();
308 dsp::MidiPort &get_midi_out_port ()
const
310 return *get_output_ports ().front ().get_object_as<dsp::MidiPort> ();
313 auto currently_soloed_rt () const noexcept [[clang::nonblocking]]
315 return processing_caches_->solo_param_->range ().is_toggled (
316 processing_caches_->solo_param_->currentValue ());
319 bool currently_listened_rt () const noexcept [[clang::nonblocking]]
321 const auto &listened_param = processing_caches_->listen_param_;
322 return listened_param->range ().is_toggled (listened_param->currentValue ());
326 static constexpr auto kMidiModeKey =
"midiMode"sv;
327 friend void to_json (nlohmann::json &j,
const Fader &fader);
328 friend void from_json (
const nlohmann::json &j,
Fader &fader);
336 void init_param_caches ();
342 float calculate_target_gain_rt ()
const;
344 bool effectively_muted ()
const
349 bool effectively_muted_rt ()
const
351 const auto currently_muted_rt = [
this] () {
352 return processing_caches_->mute_param_->range ().is_toggled (
353 processing_caches_->mute_param_->currentValue ());
356 return currently_muted_rt () || should_be_muted_cb_ (currently_soloed_rt ());
360 dsp::PortType signal_type_;
362 bool hard_limit_output_{};
371 float last_cc_volume_ = 0.f;
376 std::optional<dsp::ProcessorParameter::Uuid> amp_id_;
379 std::optional<dsp::ProcessorParameter::Uuid> balance_id_;
384 std::optional<dsp::ProcessorParameter::Uuid> mute_id_;
387 std::optional<dsp::ProcessorParameter::Uuid> solo_id_;
390 std::optional<dsp::ProcessorParameter::Uuid> listen_id_;
393 std::optional<dsp::ProcessorParameter::Uuid> mono_compat_enabled_id_;
396 std::optional<dsp::ProcessorParameter::Uuid> swap_phase_id_;
408 juce::SmoothedValue<float> current_gain_{ 0.f };
412 std::optional<PreProcessAudioCallback> preprocess_audio_cb_;
417 std::unique_ptr<FaderProcessingCaches> processing_caches_;