31 using PortType = dsp::PortType;
32 using PortFlow = dsp::PortFlow;
34 struct TrackProcessorProcessingCaches
36 std::vector<dsp::AudioPort *> audio_ins_rt_;
37 std::vector<dsp::AudioPort *> audio_outs_rt_;
48 using StereoPortPair = std::pair<std::span<float>, std::span<float>>;
49 using ConstStereoPortPair =
50 std::pair<std::span<const float>, std::span<const float>>;
63 std::optional<StereoPortPair> stereo_ports)>;
74 std::optional<ConstStereoPortPair> stereo_ports)>;
106 using MidiEventProviderProcessFunc = std::function<void (
110 enum class ActiveMidiEventProviders : uint8_t
113 ClipLauncher = 1 << 1,
119 enum class ActiveAudioProviders : uint8_t
122 ClipLauncher = 1 << 1,
135 const dsp::TempoMap &tempo_map,
136 PortType signal_type,
137 TrackNameProvider track_name_provider,
139 bool generates_midi_events,
143 std::optional<FillEventsCallback> fill_events_cb = std::nullopt,
144 std::optional<TransformMidiInputsFunc> transform_midi_inputs_func =
146 std::optional<AppendMidiInputsToOutputsFunc>
147 append_midi_inputs_to_outputs_func = std::nullopt,
148 QObject * parent =
nullptr);
153 handle_recording_cb_ = std::move (handle_rec_cb);
156 bool is_audio ()
const {
return is_audio_; }
158 constexpr bool is_midi ()
const {
return is_midi_; }
182 const dsp::TempoMap &tempo_map)
noexcept override;
184 void custom_prepare_for_processing (
186 units::sample_rate_t sample_rate,
189 void custom_release_resources ()
override;
195 assert (is_audio ());
196 return *get_input_ports ().front ().get_object_as<
dsp::AudioPort> ();
200 assert (is_audio ());
201 return *get_output_ports ().front ().get_object_as<
dsp::AudioPort> ();
206 return *std::get<dsp::ProcessorParameter *> (
207 dependencies ().param_registry_.find_by_id_or_throw (*mono_id_));
211 return *std::get<dsp::ProcessorParameter *> (
212 dependencies ().param_registry_.find_by_id_or_throw (*input_gain_id_));
216 return *std::get<dsp::ProcessorParameter *> (
217 dependencies ().param_registry_.find_by_id_or_throw (*output_gain_id_));
219 dsp::ProcessorParameter &get_monitor_audio_param ()
const
221 return *std::get<dsp::ProcessorParameter *> (
222 dependencies ().param_registry_.find_by_id_or_throw (*monitor_audio_id_));
231 dsp::ProcessorParameter &
234 assert (has_midi_cc_);
235 return *std::get<dsp::ProcessorParameter *> (
236 dependencies ().param_registry_.find_by_id_or_throw (
237 midi_cc_caches_->midi_cc_ids_.at ((channel * 128) + control_no)));
251 return *get_input_ports ().front ().get_object_as<
dsp::MidiPort> ();
260 return *get_output_ports ().front ().get_object_as<
dsp::MidiPort> ();
271 return *get_input_ports ().at (1).get_object_as<
dsp::MidiPort> ();
274 auto &timeline_audio_data_provider ()
276 return *timeline_audio_data_provider_;
278 auto &timeline_midi_data_provider () {
return *timeline_midi_data_provider_; }
280 auto &clip_playback_data_provider () {
return *clip_playback_data_provider_; }
291 ActiveMidiEventProviders event_providers,
336 StereoPortPair stereo_ports);
339 friend void to_json (nlohmann::json &j,
const TrackProcessor &tp);
340 friend void from_json (
const nlohmann::json &j,
TrackProcessor &tp);
342 friend void init_from (
351 void handle_recording (
358 [[gnu::hot]]
void add_events_from_midi_cc_control_ports (
365 void set_param_id_caches ();
369 void set_midi_mappings ();
374 const bool is_audio_;
375 const bool has_piano_roll_port_;
376 const bool has_midi_cc_;
379 const TrackNameProvider track_name_provider_;
381 std::optional<FillEventsCallback> fill_events_cb_;
382 std::optional<HandleRecordingCallback> handle_recording_cb_;
384 std::optional<TransformMidiInputsFunc> transform_midi_inputs_func_;
387 std::optional<dsp::ProcessorParameter::Uuid> mono_id_;
390 std::optional<dsp::ProcessorParameter::Uuid> input_gain_id_;
397 std::optional<dsp::ProcessorParameter::Uuid> output_gain_id_;
408 std::optional<dsp::ProcessorParameter::Uuid> monitor_audio_id_;
412 std::unique_ptr<engine::session::MidiMappings> cc_mappings_;
421 std::array<dsp::ProcessorParameter::Uuid, 16_zu * 128> midi_cc_ids_;
423 using SixteenPortUuidArray = std::array<dsp::ProcessorParameter::Uuid, 16>;
426 SixteenPortUuidArray pitch_bend_ids_;
437 SixteenPortUuidArray poly_key_pressure_ids_;
445 SixteenPortUuidArray channel_pressure_ids_;
456 std::unique_ptr<MidiCcCaches> midi_cc_caches_;
459 std::unique_ptr<TrackProcessorProcessingCaches> processing_caches_;
464 std::unique_ptr<arrangement::MidiTimelineDataProvider>
465 timeline_midi_data_provider_;
470 std::unique_ptr<arrangement::AudioTimelineDataProvider>
471 timeline_audio_data_provider_;
473 std::unique_ptr<ClipPlaybackDataProvider> clip_playback_data_provider_;
477 farbot::RealtimeObject<
478 std::optional<MidiEventProviderProcessFunc>,
479 farbot::RealtimeObjectOptions::nonRealtimeMutatable>
480 custom_midi_event_provider_;
482 std::atomic<ActiveMidiEventProviders> active_midi_event_providers_;
483 std::atomic<ActiveAudioProviders> active_audio_providers_;
485 static_assert (
decltype (active_midi_event_providers_)::is_always_lock_free);
TrackProcessor(const dsp::TempoMap &tempo_map, PortType signal_type, TrackNameProvider track_name_provider, EnabledProvider enabled_provider, bool generates_midi_events, bool has_midi_cc, bool is_audio_track, ProcessorBaseDependencies dependencies, std::optional< FillEventsCallback > fill_events_cb=std::nullopt, std::optional< TransformMidiInputsFunc > transform_midi_inputs_func=std::nullopt, std::optional< AppendMidiInputsToOutputsFunc > append_midi_inputs_to_outputs_func=std::nullopt, QObject *parent=nullptr)
Creates a new track processor for the given track.