9#include "dsp/processor_base.h"
10#include "utils/enum_utils.h"
11#include "utils/icloneable.h"
13namespace zrythm::structure::arrangement
19namespace zrythm::structure::tracks
37 using StereoPortPair = std::pair<std::span<float>, std::span<float>>;
38 using ConstStereoPortPair =
39 std::pair<std::span<const float>, std::span<const float>>;
40 static constexpr auto midi_in_symbol =
41 std::string_view (
"track_processor_midi_in");
54 std::optional<StereoPortPair> stereo_ports)>;
65 units::sample_t timeline_position,
68 std::optional<ConstStereoPortPair> stereo_ports,
69 units::sample_u32_t nframes)>;
101 enum class Capabilities : uint8_t
108 enum class MonitorMode : uint8_t
115 using MidiEventProviderProcessFunc = std::function<void (
119 enum class ActiveMidiEventProviders : uint8_t
122 ClipLauncher = 1 << 1,
128 enum class ActiveAudioProviders : uint8_t
131 ClipLauncher = 1 << 1,
142 const dsp::TempoMap &tempo_map,
143 dsp::PortType signal_type,
144 TrackNameProvider track_name_provider,
146 Capabilities capabilities,
148 std::optional<FillEventsCallback> fill_events_cb = std::nullopt,
149 std::optional<TransformMidiInputsFunc> transform_midi_inputs_func =
151 std::optional<AppendMidiInputsToOutputsFunc>
152 append_midi_inputs_to_outputs_func = std::nullopt,
158 std::optional<ConstStereoPortPair>,
159 units::sample_u32_t) { },
160 QObject * parent =
nullptr);
163 bool is_audio ()
const {
return is_audio_; }
165 constexpr bool is_midi ()
const {
return is_midi_; }
189 const dsp::TempoMap &tempo_map)
noexcept override;
191 void custom_prepare_for_processing (
193 units::sample_rate_t sample_rate,
194 units::sample_u32_t max_block_length)
override;
196 void custom_release_resources ()
override;
202 assert (is_audio ());
203 return *get_input_ports ().front ().get_object_as<
dsp::AudioPort> ();
207 assert (is_audio ());
208 return *get_output_ports ().front ().get_object_as<
dsp::AudioPort> ();
217 bool is_recording_armed ()
const;
218 bool is_recording_armed_rt () const noexcept [[clang::nonblocking]];
219 void set_recording_armed (
bool armed);
232 return *get_input_ports ().front ().get_object_as<
dsp::MidiPort> ();
241 return *get_output_ports ().front ().get_object_as<
dsp::MidiPort> ();
288 ActiveMidiEventProviders event_providers,
333 StereoPortPair stereo_ports);
336 friend void to_json (nlohmann::json &j,
const TrackProcessor &tp);
337 friend void from_json (
const nlohmann::json &j,
TrackProcessor &tp);
339 friend void init_from (
347 void set_param_id_caches ();
351 const bool is_audio_;
352 const Capabilities capabilities_;
355 const TrackNameProvider track_name_provider_;
358 std::unique_ptr<Impl> impl_;
363 zrythm::structure::tracks::TrackProcessor::ActiveMidiEventProviders);
365 zrythm::structure::tracks::TrackProcessor::ActiveAudioProviders);
366ENUM_ENABLE_BITSET (zrythm::structure::tracks::TrackProcessor::Capabilities);
Packed contiguous buffer for RT MIDI events.
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 AudioClip'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 clips) or other so...
dsp::MidiPort & get_midi_out_port() const
MIDI out port, if MIDI.
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::MidiEventBuffer &)> TransformMidiInputsFunc
Function to transform the given MIDI inputs.
std::function< void( const dsp::ITransport &transport, const dsp::graph::ProcessBlockInfo &time_nfo, dsp::MidiEventBuffer * midi_events, std::optional< StereoPortPair > stereo_ports)> FillEventsCallback
Function called during processing to fill events.
std::function< void( units::sample_t timeline_position, const dsp::ITransport &transport, const dsp::MidiEventBuffer * midi_events, std::optional< ConstStereoPortPair > stereo_ports, units::sample_u32_t nframes)> RecordingCallbackRT
Callback to record the given audio or MIDI 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 &, const dsp::MidiEventBuffer *, std::optional< ConstStereoPortPair >, units::sample_u32_t) { }, QObject *parent=nullptr)
Creates a new track processor for the given track.
void fill_midi_events(const dsp::graph::ProcessBlockInfo &time_nfo, const dsp::ITransport &transport, dsp::MidiEventBuffer &midi_events)
Wrapper for MIDI/instrument/chord tracks to fill in MidiEvents from the timeline data.
std::function< void( dsp::MidiEventBuffer &out_events, const dsp::MidiEventBuffer &in_events, const dsp::graph::ProcessBlockInfo &time_nfo)> AppendMidiInputsToOutputsFunc
Custom logic to use when appending the MIDI input events to the output events.
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.
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.