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>>;
39 static constexpr auto midi_in_symbol =
40 std::string_view (
"track_processor_midi_in");
53 std::optional<StereoPortPair> stereo_ports)>;
64 units::sample_t timeline_position,
66 std::optional<std::span<const dsp::MidiEvent>> midi_events,
67 std::optional<ConstStereoPortPair> stereo_ports,
68 units::sample_u32_t nframes)>;
100 enum class Capabilities : uint8_t
107 enum class MonitorMode : uint8_t
114 using MidiEventProviderProcessFunc = std::function<void (
118 enum class ActiveMidiEventProviders : uint8_t
121 ClipLauncher = 1 << 1,
127 enum class ActiveAudioProviders : uint8_t
130 ClipLauncher = 1 << 1,
141 const dsp::TempoMap &tempo_map,
142 dsp::PortType signal_type,
143 TrackNameProvider track_name_provider,
145 Capabilities capabilities,
147 std::optional<FillEventsCallback> fill_events_cb = std::nullopt,
148 std::optional<TransformMidiInputsFunc> transform_midi_inputs_func =
150 std::optional<AppendMidiInputsToOutputsFunc>
151 append_midi_inputs_to_outputs_func = std::nullopt,
156 std::optional<std::span<const dsp::MidiEvent>>,
157 std::optional<ConstStereoPortPair>,
158 units::sample_u32_t) { },
159 QObject * parent =
nullptr);
162 bool is_audio ()
const {
return is_audio_; }
164 constexpr bool is_midi ()
const {
return is_midi_; }
188 const dsp::TempoMap &tempo_map)
noexcept override;
190 void custom_prepare_for_processing (
192 units::sample_rate_t sample_rate,
193 units::sample_u32_t max_block_length)
override;
195 void custom_release_resources ()
override;
201 assert (is_audio ());
202 return *get_input_ports ().front ().get_object_as<
dsp::AudioPort> ();
206 assert (is_audio ());
207 return *get_output_ports ().front ().get_object_as<
dsp::AudioPort> ();
216 bool is_recording_armed ()
const;
217 bool is_recording_armed_rt () const noexcept [[clang::nonblocking]];
218 void set_recording_armed (
bool armed);
231 return *get_input_ports ().front ().get_object_as<
dsp::MidiPort> ();
240 return *get_output_ports ().front ().get_object_as<
dsp::MidiPort> ();
287 ActiveMidiEventProviders event_providers,
332 StereoPortPair stereo_ports);
335 friend void to_json (nlohmann::json &j,
const TrackProcessor &tp);
336 friend void from_json (
const nlohmann::json &j,
TrackProcessor &tp);
338 friend void init_from (
346 void set_param_id_caches ();
350 const bool is_audio_;
351 const Capabilities capabilities_;
354 const TrackNameProvider track_name_provider_;
357 std::unique_ptr<Impl> impl_;
362 zrythm::structure::tracks::TrackProcessor::ActiveMidiEventProviders);
363ENUM_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.
TrackProcessor(const dsp::TempoMap &tempo_map, dsp::PortType signal_type, TrackNameProvider track_name_provider, EnabledProvider enabled_provider, Capabilities capabilities, utils::IObjectRegistry ®istry, 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 &, std::optional< std::span< const dsp::MidiEvent > >, std::optional< ConstStereoPortPair >, units::sample_u32_t) { }, QObject *parent=nullptr)
Creates a new track processor for the given track.
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.
void set_audio_providers_active(ActiveAudioProviders audio_providers, bool active)
Used to enable or disable audio providers.
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_hw_midi_in_port() const
Hardware MIDI input port.
void set_hw_midi_channel(int channel)
Sets the hardware MIDI input channel filter for this processor.
dsp::MidiPort & get_midi_in_port() const
MIDI in Port.
std::function< void( units::sample_t timeline_position, const dsp::ITransport &transport, std::optional< std::span< const dsp::MidiEvent > > midi_events, std::optional< ConstStereoPortPair > stereo_ports, units::sample_u32_t nframes)> RecordingCallbackRT
Callback to record the given audio or MIDI data.
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.
Abstract interface for a UUID-keyed object registry.
Lightweight UTF-8 string wrapper with safe conversions.
Common struct to pass around during processing to avoid repeating the data in function arguments.