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_; }
183 void custom_prepare_for_processing (
185 units::sample_rate_t sample_rate,
188 void custom_release_resources ()
override;
194 assert (is_audio ());
195 return *get_input_ports ().front ().get_object_as<
dsp::AudioPort> ();
199 assert (is_audio ());
200 return *get_output_ports ().front ().get_object_as<
dsp::AudioPort> ();
205 return *std::get<dsp::ProcessorParameter *> (
206 dependencies ().param_registry_.find_by_id_or_throw (*mono_id_));
210 return *std::get<dsp::ProcessorParameter *> (
211 dependencies ().param_registry_.find_by_id_or_throw (*input_gain_id_));
215 return *std::get<dsp::ProcessorParameter *> (
216 dependencies ().param_registry_.find_by_id_or_throw (*output_gain_id_));
218 dsp::ProcessorParameter &get_monitor_audio_param ()
const
220 return *std::get<dsp::ProcessorParameter *> (
221 dependencies ().param_registry_.find_by_id_or_throw (*monitor_audio_id_));
230 dsp::ProcessorParameter &
233 assert (has_midi_cc_);
234 return *std::get<dsp::ProcessorParameter *> (
235 dependencies ().param_registry_.find_by_id_or_throw (
236 midi_cc_caches_->midi_cc_ids_.at ((channel * 128) + control_no)));
250 return *get_input_ports ().front ().get_object_as<
dsp::MidiPort> ();
259 return *get_output_ports ().front ().get_object_as<
dsp::MidiPort> ();
270 return *get_input_ports ().at (1).get_object_as<
dsp::MidiPort> ();
273 auto &timeline_audio_data_provider ()
275 return *timeline_audio_data_provider_;
277 auto &timeline_midi_data_provider () {
return *timeline_midi_data_provider_; }
279 auto &clip_playback_data_provider () {
return *clip_playback_data_provider_; }
290 ActiveMidiEventProviders event_providers,
335 StereoPortPair stereo_ports);
342 friend void from_json (
const nlohmann::json &j,
TrackProcessor &tp);
344 friend void init_from (
353 void handle_recording (
360 [[gnu::hot]]
void add_events_from_midi_cc_control_ports (
367 void set_param_id_caches ();
371 void set_midi_mappings ();
376 const bool is_audio_;
377 const bool has_piano_roll_port_;
378 const bool has_midi_cc_;
381 const TrackNameProvider track_name_provider_;
383 std::optional<FillEventsCallback> fill_events_cb_;
384 std::optional<HandleRecordingCallback> handle_recording_cb_;
386 std::optional<TransformMidiInputsFunc> transform_midi_inputs_func_;
389 std::optional<dsp::ProcessorParameter::Uuid> mono_id_;
392 std::optional<dsp::ProcessorParameter::Uuid> input_gain_id_;
399 std::optional<dsp::ProcessorParameter::Uuid> output_gain_id_;
410 std::optional<dsp::ProcessorParameter::Uuid> monitor_audio_id_;
414 std::unique_ptr<engine::session::MidiMappings> cc_mappings_;
423 std::array<dsp::ProcessorParameter::Uuid, 16_zu * 128> midi_cc_ids_;
425 using SixteenPortUuidArray = std::array<dsp::ProcessorParameter::Uuid, 16>;
428 SixteenPortUuidArray pitch_bend_ids_;
439 SixteenPortUuidArray poly_key_pressure_ids_;
447 SixteenPortUuidArray channel_pressure_ids_;
458 std::unique_ptr<MidiCcCaches> midi_cc_caches_;
461 std::unique_ptr<TrackProcessorProcessingCaches> processing_caches_;
466 std::unique_ptr<arrangement::MidiTimelineDataProvider>
467 timeline_midi_data_provider_;
472 std::unique_ptr<arrangement::AudioTimelineDataProvider>
473 timeline_audio_data_provider_;
475 std::unique_ptr<ClipPlaybackDataProvider> clip_playback_data_provider_;
479 farbot::RealtimeObject<
480 std::optional<MidiEventProviderProcessFunc>,
481 farbot::RealtimeObjectOptions::nonRealtimeMutatable>
482 custom_midi_event_provider_;
484 std::atomic<ActiveMidiEventProviders> active_midi_event_providers_;
485 std::atomic<ActiveAudioProviders> active_audio_providers_;
487 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.