63 Q_PROPERTY (
Type type READ type CONSTANT)
66 automationTracklist CONSTANT)
67 Q_PROPERTY (QString name READ name WRITE setName NOTIFY nameChanged)
68 Q_PROPERTY (QColor color READ color WRITE setColor NOTIFY colorChanged)
70 QString comment READ comment WRITE setComment NOTIFY commentChanged)
71 Q_PROPERTY (QString icon READ icon WRITE setIcon NOTIFY iconChanged)
72 Q_PROPERTY (
bool visible READ visible WRITE setVisible NOTIFY visibleChanged)
73 Q_PROPERTY (
bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
74 Q_PROPERTY (
bool isDeletable READ is_deletable CONSTANT)
75 Q_PROPERTY (
double height READ height WRITE setHeight NOTIFY heightChanged)
77 double fullVisibleHeight READ fullVisibleHeight NOTIFY
78 fullVisibleHeightChanged)
89 pianoRollTrackMixin CONSTANT)
91 bool clipLauncherMode READ clipLauncherMode WRITE setClipLauncherMode NOTIFY
92 clipLauncherModeChanged)
95 playbackCacheActivityTracker READ playbackCacheActivityTracker CONSTANT)
99 using Plugin = plugins::Plugin;
100 using PluginUuid = Plugin::
Uuid;
101 using PortType = dsp::PortType;
102 using PluginRegistry = plugins::PluginRegistry;
103 using PluginPtrVariant = PluginRegistry::VariantType;
104 using ArrangerObject = structure::arrangement::ArrangerObject;
105 using ArrangerObjectPtrVariant =
106 structure::arrangement::ArrangerObjectPtrVariant;
107 using ArrangerObjectRegistry = structure::arrangement::ArrangerObjectRegistry;
110 enum class
Type : uint8_t
176 static constexpr int MIN_HEIGHT = 26;
177 static constexpr int DEF_HEIGHT = 52;
184 case ArrangerObject::Type::AudioRegion:
186 case ArrangerObject::Type::MidiRegion:
188 case ArrangerObject::Type::ChordRegion:
190 case ArrangerObject::Type::AutomationRegion:
193 throw std::runtime_error (
"Invalid region type");
197 static constexpr bool type_is_foldable (
Type type)
203 static constexpr bool type_is_copyable (
Type type)
214 return type_is_copyable (type);
217 static Type type_get_from_plugin_descriptor (
220 static consteval bool type_has_mono_compat_switch (
const Type tt)
228 static constexpr bool
265 static constexpr bool type_can_have_automation (
const Type type)
274 static constexpr bool type_can_have_lanes (
const Type type)
279 template <
typename T>
static consteval Type get_type_for_class ()
281 if constexpr (std::is_same_v<T, MidiTrack>)
283 else if constexpr (std::is_same_v<T, AudioTrack>)
285 else if constexpr (std::is_same_v<T, ChordTrack>)
287 else if constexpr (std::is_same_v<T, InstrumentTrack>)
289 else if constexpr (std::is_same_v<T, AudioBusTrack>)
291 else if constexpr (std::is_same_v<T, MidiBusTrack>)
293 else if constexpr (std::is_same_v<T, MasterTrack>)
295 else if constexpr (std::is_same_v<T, ModulatorTrack>)
297 else if constexpr (std::is_same_v<T, MarkerTrack>)
299 else if constexpr (std::is_same_v<T, FolderTrack>)
301 else if constexpr (std::is_same_v<T, AudioGroupTrack>)
303 else if constexpr (std::is_same_v<T, MidiGroupTrack>)
307 static_assert (dependent_false_v<T>,
"Unknown track type");
313 Q_DISABLE_COPY_MOVE (
Track)
316 enum class TrackFeatures : std::uint8_t
330 std::optional<PortType> in_signal_type,
331 std::optional<PortType> out_signal_type,
332 TrackFeatures enabled_features,
357 AutomationTracklist * automationTracklist ()
const
362 QString name ()
const {
return name_.to_qstring (); }
363 void setName (
const QString &name)
365 const auto name_str = utils::Utf8String::from_qstring (name);
366 if (
name_ == name_str)
370 Q_EMIT nameChanged (name);
372 Q_SIGNAL
void nameChanged (
const QString &name);
374 QColor color ()
const {
return color_.to_qcolor (); }
375 void setColor (
const QColor &color)
377 if (
color_.to_qcolor () == color)
381 Q_EMIT colorChanged (color);
383 Q_SIGNAL
void colorChanged (
const QColor &color);
385 QString comment ()
const {
return comment_.to_qstring (); }
386 void setComment (
const QString &comment)
388 const auto comment_str = utils::Utf8String::from_qstring (comment);
393 Q_EMIT commentChanged (comment);
395 Q_SIGNAL
void commentChanged (
const QString &comment);
397 bool visible ()
const {
return visible_; }
398 void setVisible (
bool visible)
404 Q_EMIT visibleChanged (visible);
406 Q_SIGNAL
void visibleChanged (
bool visible);
408 bool enabled ()
const {
return enabled_; }
409 void setEnabled (
bool enabled)
414 Q_EMIT enabledChanged (enabled);
416 Q_SIGNAL
void enabledChanged (
bool enabled);
419 void setHeight (
double height)
424 height = std::max (
static_cast<double> (Track::MIN_HEIGHT), height);
426 Q_EMIT heightChanged (height);
428 Q_SIGNAL
void heightChanged (
double height);
431 Q_SIGNAL
void fullVisibleHeightChanged ();
433 QString icon ()
const {
return icon_name_.to_qstring (); }
434 void setIcon (
const QString &icon)
436 const auto icon_str = utils::Utf8String::from_qstring (icon);
442 Q_EMIT iconChanged (icon);
444 Q_SIGNAL
void iconChanged (
const QString &icon);
446 Channel * channel ()
const {
return channel_.get (); }
448 plugins::PluginGroup * modulators ()
const {
return modulators_.get (); }
450 TrackLaneList * lanes ()
const {
return lanes_.get (); }
452 dsp::ProcessorParameter * recordingParam ()
const;
453 dsp::ProcessorParameter * monitorParam ()
const;
455 PianoRollTrackMixin * pianoRollTrackMixin ()
const
457 return piano_roll_track_mixin_.get ();
460 bool clipLauncherMode ()
const {
return clip_launcher_mode_; }
461 void setClipLauncherMode (
bool mode);
462 Q_SIGNAL
void clipLauncherModeChanged (
bool mode);
466 playbackCacheActivityTracker ()
const
468 return playback_cache_activity_tracker_.get ();
485 bool is_copyable ()
const {
return type_is_copyable (
type_); }
486 bool has_automation ()
const {
return automationTracklist () !=
nullptr; }
494 bool multiply_heights (
double multiplier,
bool visible_only,
bool check_only);
503 template <arrangement::RegionObject RegionT>
504 auto generate_name_for_region (
505 const RegionT ®ion,
509 if constexpr (std::is_same_v<RegionT, arrangement::AutomationRegion>)
511 assert (automation_track !=
nullptr);
514 "{} - {}",
get_name (), automation_track->parameter ()->label ()));
523 std::vector<ArrangerObjectPtrVariant> &objects)
const;
525 bool contains_uninstantiated_plugin ()
const;
539 uint8_t
get_midi_ch (
const arrangement::MidiRegion &midi_region)
const;
544 void collect_plugins (std::vector<plugins::PluginPtrVariant> &plugins)
const;
552 static bool is_plugin_descriptor_valid_for_slot_type (
554 zrythm::plugins::PluginSlotType slot_type,
569 auto &get_plugin_registry ()
const
571 return base_dependencies_.plugin_registry_;
573 auto &get_plugin_registry () {
return base_dependencies_.plugin_registry_; }
574 auto &get_port_registry ()
const {
return base_dependencies_.port_registry_; }
575 auto &get_port_registry () {
return base_dependencies_.port_registry_; }
576 auto &get_param_registry ()
const
578 return base_dependencies_.param_registry_;
580 auto &get_param_registry () {
return base_dependencies_.param_registry_; }
581 auto &get_object_registry ()
const
583 return base_dependencies_.obj_registry_;
585 auto &get_object_registry () {
return base_dependencies_.obj_registry_; }
587 TrackProcessor * get_track_processor ()
const {
return processor_.get (); }
589 auto get_icon_name ()
const {
return icon_name_; }
595 void generate_automation_tracks_for_processor (
599 structure::tracks::generate_automation_tracks_for_processor (
600 ats, processor, base_dependencies_.tempo_map_,
601 base_dependencies_.file_audio_source_registry_,
602 base_dependencies_.obj_registry_);
609 std::optional<TrackProcessor::FillEventsCallback> fill_events_cb =
611 std::optional<TrackProcessor::TransformMidiInputsFunc>
612 transform_midi_inputs_func = std::nullopt,
613 std::optional<TrackProcessor::AppendMidiInputsToOutputsFunc>
614 append_midi_inputs_to_outputs_func = std::nullopt);
621 std::vector<ArrangerObjectPtrVariant> &objects)
const
626 static constexpr auto kNameKey =
"name"sv;
627 static constexpr auto kIconNameKey =
"iconName"sv;
628 static constexpr auto kVisibleKey =
"visible"sv;
629 static constexpr auto kMainHeightKey =
"mainHeight"sv;
630 static constexpr auto kEnabledKey =
"enabled"sv;
631 static constexpr auto kColorKey =
"color"sv;
632 static constexpr auto kInputSignalTypeKey =
"inSignalType"sv;
633 static constexpr auto kOutputSignalTypeKey =
"outSignalType"sv;
634 static constexpr auto kCommentKey =
"comment"sv;
635 static constexpr auto kFrozenClipIdKey =
"frozenClipId"sv;
636 static constexpr auto kProcessorKey =
"processor"sv;
637 static constexpr auto kAutomationTracklistKey =
"automationTracklist"sv;
638 static constexpr auto kChannelKey =
"channel"sv;
639 static constexpr auto kModulatorsKey =
"modulators"sv;
640 static constexpr auto kModulatorMacroProcessorsKey =
641 "modulatorMacroProcessors"sv;
642 static constexpr auto kPianoRollKey =
"pianoRoll"sv;
643 static constexpr auto kClipLauncherModeKey =
"clipLauncherMode"sv;
644 friend void to_json (nlohmann::json &j,
const Track &track);
645 friend void from_json (
const nlohmann::json &j,
Track &track);
648 make_automation_tracklist ();
654 make_piano_roll_track_mixin ();
661 void init_cache_scheduler ();
678 TrackFeatures features_{};
751 std::vector<utils::QObjectUniquePtr<dsp::ModulatorMacroProcessor>>
764 bool clip_launcher_mode_{};
766 playback_cache_activity_tracker_;
768 BOOST_DESCRIBE_CLASS (
787 piano_roll_track_mixin_,
788 clip_launcher_mode_),