9#include "dsp/processor_base.h"
10#include "utils/icloneable.h"
12namespace zrythm::structure::arrangement
18namespace zrythm::structure::tracks
36 using StereoPortPair = std::pair<std::span<float>, std::span<float>>;
37 using ConstStereoPortPair =
38 std::pair<std::span<const float>, std::span<const float>>;
51 std::optional<StereoPortPair> stereo_ports)>;
62 units::sample_t timeline_position,
65 std::optional<ConstStereoPortPair> stereo_ports)>;
97 enum class Capabilities : uint8_t
105 enum class MonitorMode : uint8_t
112 using MidiEventProviderProcessFunc = std::function<void (
116 enum class ActiveMidiEventProviders : uint8_t
119 ClipLauncher = 1 << 1,
125 enum class ActiveAudioProviders : uint8_t
128 ClipLauncher = 1 << 1,
139 const dsp::TempoMap &tempo_map,
140 dsp::PortType signal_type,
141 TrackNameProvider track_name_provider,
143 Capabilities capabilities,
145 std::optional<FillEventsCallback> fill_events_cb = std::nullopt,
146 std::optional<TransformMidiInputsFunc> transform_midi_inputs_func =
148 std::optional<AppendMidiInputsToOutputsFunc>
149 append_midi_inputs_to_outputs_func = std::nullopt,
155 std::optional<ConstStereoPortPair>) { },
156 QObject * parent =
nullptr);
159 bool is_audio ()
const {
return is_audio_; }
161 constexpr bool is_midi ()
const {
return is_midi_; }
185 const dsp::TempoMap &tempo_map)
noexcept override;
187 void custom_prepare_for_processing (
189 units::sample_rate_t sample_rate,
190 units::sample_u32_t max_block_length)
override;
192 void custom_release_resources ()
override;
198 assert (is_audio ());
199 return *get_input_ports ().front ().get_object_as<
dsp::AudioPort> ();
203 assert (is_audio ());
204 return *get_output_ports ().front ().get_object_as<
dsp::AudioPort> ();
213 bool is_recording_armed ()
const;
214 bool is_recording_armed_rt () const noexcept [[clang::nonblocking]];
215 void set_recording_armed (
bool armed);
223 dsp::ProcessorParameter &
237 return *get_input_ports ().front ().get_object_as<
dsp::MidiPort> ();
246 return *get_output_ports ().front ().get_object_as<
dsp::MidiPort> ();
257 return *get_input_ports ().at (1).get_object_as<
dsp::MidiPort> ();
274 ActiveMidiEventProviders event_providers,
319 StereoPortPair stereo_ports);
322 friend void to_json (nlohmann::json &j,
const TrackProcessor &tp);
323 friend void from_json (
const nlohmann::json &j,
TrackProcessor &tp);
325 friend void init_from (
333 [[gnu::hot]]
void add_events_from_midi_cc_control_ports (
335 units::sample_u32_t local_offset);
340 void set_param_id_caches ();
344 void set_midi_mappings ();
349 const bool is_audio_;
350 const Capabilities capabilities_;
353 const TrackNameProvider track_name_provider_;
356 std::unique_ptr<Impl> impl_;
361 zrythm::structure::tracks::TrackProcessor::ActiveMidiEventProviders);
362ENUM_ENABLE_BITSET (zrythm::structure::tracks::TrackProcessor::Capabilities);
A lock-free thread-safe vector of MidiEvents.
A base class for ports used for connecting processors in the DSP graph.
A base class for processors in the DSP graph.
Processor parameter that accepts automation and modulation sources and integrates with QML and the DS...
Represents a node in a DSP graph.
Audio-specific timeline data provider.
MIDI-specific timeline data provider.
Track containing AudioRegion's.
Event provider for clip launcher-based MIDI and audio events.
A TrackProcessor is a standalone processor that is used as the first step when processing a track in ...
dsp::MidiPort & get_piano_roll_port() const
MIDI input for receiving MIDI signals from the piano roll (i.e., MIDI notes inside regions) or other ...
std::function< void( const dsp::ITransport &transport, const dsp::graph::ProcessBlockInfo &time_nfo, dsp::MidiEventVector * midi_events, std::optional< StereoPortPair > stereo_ports)> FillEventsCallback
Function called during processing to fill events.
dsp::MidiPort & get_midi_out_port() const
MIDI out port, if MIDI.
void fill_midi_events(const dsp::graph::ProcessBlockInfo &time_nfo, const dsp::ITransport &transport, dsp::MidiEventVector &midi_events)
Wrapper for MIDI/instrument/chord tracks to fill in MidiEvents from the timeline data.
void fill_audio_events(const dsp::graph::ProcessBlockInfo &time_nfo, const dsp::ITransport &transport, StereoPortPair stereo_ports)
Wrapper for audio tracks to fill in StereoPorts from the timeline data.
TrackProcessor(const dsp::TempoMap &tempo_map, dsp::PortType signal_type, TrackNameProvider track_name_provider, EnabledProvider enabled_provider, Capabilities capabilities, 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, RecordingCallbackRT recording_cb=[](units::sample_t, const dsp::ITransport &, const dsp::MidiEventVector *, std::optional< ConstStereoPortPair >) { }, QObject *parent=nullptr)
Creates a new track processor for the given track.
void set_audio_providers_active(ActiveAudioProviders audio_providers, bool active)
Used to enable or disable audio providers.
std::function< void( units::sample_t timeline_position, const dsp::ITransport &transport, const dsp::MidiEventVector * midi_events, std::optional< ConstStereoPortPair > stereo_ports)> RecordingCallbackRT
Callback to record the given audio or MIDI data.
dsp::ProcessorParameter & get_midi_cc_param(midi_byte_t channel, midi_byte_t control_no)
std::function< void(dsp::MidiEventVector &)> TransformMidiInputsFunc
Function to transform the given MIDI inputs.
void set_midi_providers_active(ActiveMidiEventProviders event_providers, bool active)
Used to enable or disable MIDI event providers.
void set_custom_midi_event_provider(MidiEventProviderProcessFunc process_func)
Replaces the "Custom" MIDI event provider.
std::function< bool()> EnabledProvider
Function that returns if the track for this processor is enabled.
void custom_process_block(dsp::graph::ProcessBlockInfo time_nfo, const dsp::ITransport &transport, const dsp::TempoMap &tempo_map) noexcept override
Process the TrackProcessor.
dsp::MidiPort & get_midi_in_port() const
MIDI in Port.
std::function< void( dsp::MidiEventVector &out_events, const dsp::MidiEventVector &in_events, const dsp::graph::ProcessBlockInfo &time_nfo)> AppendMidiInputsToOutputsFunc
Custom logic to use when appending the MIDI input events to the output events.
Lightweight UTF-8 string wrapper with safe conversions.
std::uint8_t midi_byte_t
MIDI byte.
Common struct to pass around during processing to avoid repeating the data in function arguments.