Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
channel.h
1// SPDX-FileCopyrightText: © 2018-2022, 2024-2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "dsp/fader.h"
7#include "dsp/passthrough_processors.h"
8#include "plugins/plugin_group.h"
9#include "structure/tracks/channel_send.h"
10#include "utils/icloneable.h"
11#include "utils/object_registry.h"
12
13namespace zrythm::structure::tracks
14{
15
16class ChannelMidiPassthroughProcessor final
17 : public QObject,
19{
20 Q_OBJECT
21 QML_ELEMENT
22 QML_UNCREATABLE ("")
23
24public:
25 ChannelMidiPassthroughProcessor (
26 utils::IObjectRegistry &registry,
27 QObject * parent = nullptr);
28};
29
30class ChannelAudioPassthroughProcessor final
31 : public QObject,
33{
34 Q_OBJECT
35 QML_ELEMENT
36 QML_UNCREATABLE ("")
37
38public:
39 ChannelAudioPassthroughProcessor (
40 utils::IObjectRegistry &registry,
41 QObject * parent = nullptr);
42};
43
57class Channel : public QObject
58{
59 Q_OBJECT
60 QML_ELEMENT
61 Q_PROPERTY (zrythm::dsp::Fader * fader READ fader CONSTANT)
62 Q_PROPERTY (QVariant preFader READ preFader CONSTANT)
63 Q_PROPERTY (zrythm::dsp::AudioPort * audioOutPort READ audioOutPort CONSTANT)
64 Q_PROPERTY (zrythm::dsp::MidiPort * midiOut READ getMidiOut CONSTANT)
65 Q_PROPERTY (zrythm::plugins::PluginGroup * inserts READ inserts CONSTANT)
66 Q_PROPERTY (zrythm::plugins::PluginGroup * midiFx READ midiFx CONSTANT)
67 Q_PROPERTY (
68 zrythm::plugins::PluginGroup * instruments READ instruments CONSTANT)
69 QML_UNCREATABLE ("")
70
71public:
72 using PortType = zrythm::dsp::PortType;
73 using Plugin = plugins::Plugin;
74 using PluginDescriptor = zrythm::plugins::PluginDescriptor;
75 using PluginPtrVariant = plugins::PluginPtrVariant;
76 using PluginUuid = Plugin::Uuid;
77
78 using NameProvider = std::function<utils::Utf8String ()>;
79
80public:
81 explicit Channel (
82 utils::IObjectRegistry &registry,
83 dsp::PortType signal_type,
84 NameProvider name_provider,
85 bool hard_limit_fader_output,
86 dsp::Fader::ShouldBeMutedCallback should_be_muted_cb,
87 QObject * parent = nullptr);
88
89 // ============================================================================
90 // QML Interface
91 // ============================================================================
92
93 dsp::Fader * fader () const { return fader_.get (); }
94 QVariant preFader () const
95 {
96 return is_midi () ? QVariant::fromValue (midi_prefader_.get ())
97 : QVariant::fromValue (audio_prefader_.get ());
98 }
99 dsp::AudioPort * audioOutPort () const
100 {
101 return is_audio ()
102 ? std::addressof (audio_postfader_->get_audio_out_port ())
103 : nullptr;
104 }
105 dsp::MidiPort * getMidiOut () const
106 {
107 return is_midi () ? std::addressof (midi_postfader_->get_midi_out_port (0))
108 : nullptr;
109 }
110 plugins::PluginGroup * midiFx () const { return midi_fx_.get (); }
111 plugins::PluginGroup * inserts () const { return inserts_.get (); }
112 plugins::PluginGroup * instruments () const { return instruments_.get (); }
113
114 // ============================================================================
115
116 bool is_midi () const { return signal_type_ == PortType::Midi; }
117 bool is_audio () const { return signal_type_ == PortType::Audio; }
118
124 void get_plugins (std::vector<plugins::PluginUuidReference> &plugins) const;
125
132 plugins::PluginUuidReference remove_plugin (plugins::Plugin::Uuid id);
133
134 friend void init_from (
135 Channel &obj,
136 const Channel &other,
137 utils::ObjectCloneType clone_type);
138
139 dsp::Fader &get_fader () const { return *fader_; }
140 auto &get_midi_pre_fader () const { return *midi_prefader_; }
141 auto &get_audio_pre_fader () const { return *audio_prefader_; }
142 auto &get_midi_post_fader () const { return *midi_postfader_; }
143 auto &get_audio_post_fader () const { return *audio_postfader_; }
144
145 auto &pre_fader_sends () const { return prefader_sends_; }
146 auto &post_fader_sends () const { return postfader_sends_; }
147
148private:
149 static constexpr auto kMidiFxKey = "midiFx"sv;
150 static constexpr auto kInstrumentsKey = "instruments"sv;
151 static constexpr auto kInsertsKey = "inserts"sv;
152 static constexpr auto kPreFaderSendsKey = "preFaderSends"sv;
153 static constexpr auto kPostFaderSendsKey = "postFaderSends"sv;
154 static constexpr auto kFaderKey = "fader"sv;
155
156 friend void to_json (nlohmann::json &j, const Channel &c);
157 friend void from_json (const nlohmann::json &j, Channel &c);
158
159 utils::IObjectRegistry &registry () const { return registry_; }
160
161private:
162 utils::IObjectRegistry &registry_;
163
164 utils::QObjectUniquePtr<utils::ObjectRegistry> local_registry_;
165
166 NameProvider name_provider_;
167
168 dsp::PortType signal_type_;
169
170 bool hard_limit_fader_output_;
171
177 utils::QObjectUniquePtr<plugins::PluginGroup> midi_fx_;
178
180 utils::QObjectUniquePtr<plugins::PluginGroup> instruments_;
181
183 utils::QObjectUniquePtr<plugins::PluginGroup> inserts_;
184
185 std::vector<utils::QObjectUniquePtr<ChannelSend>> prefader_sends_;
186 std::vector<utils::QObjectUniquePtr<ChannelSend>> postfader_sends_;
187
189 utils::QObjectUniquePtr<dsp::Fader> fader_;
190
196 utils::QObjectUniquePtr<ChannelMidiPassthroughProcessor> midi_prefader_;
197 utils::QObjectUniquePtr<ChannelAudioPassthroughProcessor> audio_prefader_;
198
205 utils::QObjectUniquePtr<ChannelMidiPassthroughProcessor> midi_postfader_;
206 utils::QObjectUniquePtr<ChannelAudioPassthroughProcessor> audio_postfader_;
207};
208
209}; // namespace zrythm::structure::tracks
Audio port specifics.
Definition audio_port.h:25
A Fader is a processor that is used for volume controls and pan.
Definition fader.h:15
std::function< bool(bool fader_solo_status)> ShouldBeMutedCallback
A callback to check if the fader should be muted based on various external factors (such as solo stat...
Definition fader.h:65
Processor that processes MIDI signals (passthrough by default).
MIDI port specifics.
Definition midi_port.h:21
The PluginDescriptor class provides a set of static utility functions and member functions to work wi...
A flexible container for plugins and nested plugin groups.
DSP processing plugin.
Definition plugin.h:44
void get_plugins(std::vector< plugins::PluginUuidReference > &plugins) const
Returns all existing plugins in the channel.
plugins::PluginUuidReference remove_plugin(plugins::Plugin::Uuid id)
Removes the given plugin.
Abstract interface for a UUID-keyed object registry.
Lightweight UTF-8 string wrapper with safe conversions.
Definition utf8_string.h:37