56 Q_PROPERTY (
Type type READ type CONSTANT)
59 automationTracklist CONSTANT)
60 Q_PROPERTY (QString name READ name WRITE setName NOTIFY nameChanged)
61 Q_PROPERTY (QColor color READ color WRITE setColor NOTIFY colorChanged)
63 QString comment READ comment WRITE setComment NOTIFY commentChanged)
64 Q_PROPERTY (QString icon READ icon WRITE setIcon NOTIFY iconChanged)
65 Q_PROPERTY (
bool visible READ visible WRITE setVisible NOTIFY visibleChanged)
66 Q_PROPERTY (
bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
67 Q_PROPERTY (
double height READ height WRITE setHeight NOTIFY heightChanged)
69 double fullVisibleHeight READ fullVisibleHeight NOTIFY
70 fullVisibleHeightChanged)
77 recordableTrackMixin CONSTANT)
80 pianoRollTrackMixin CONSTANT)
82 bool clipLauncherMode READ clipLauncherMode WRITE setClipLauncherMode NOTIFY
83 clipLauncherModeChanged)
88 using PluginUuid = Plugin::Uuid;
89 using PortType = dsp::PortType;
90 using PluginRegistry = plugins::PluginRegistry;
91 using PluginPtrVariant = PluginRegistry::VariantType;
94 using ArrangerObjectPtrVariant =
95 structure::arrangement::ArrangerObjectPtrVariant;
96 using ArrangerObjectRegistry = structure::arrangement::ArrangerObjectRegistry;
99 enum class Type : basic_enum_base_type_t
165 static constexpr int MIN_HEIGHT = 26;
166 static constexpr int DEF_HEIGHT = 52;
173 case ArrangerObject::Type::AudioRegion:
175 case ArrangerObject::Type::MidiRegion:
177 case ArrangerObject::Type::ChordRegion:
179 case ArrangerObject::Type::AutomationRegion:
182 throw std::runtime_error (
"Invalid region type");
186 static constexpr bool type_is_foldable (
Type type)
192 static constexpr bool type_is_copyable (
Type type)
203 return type_is_copyable (type);
206 static Type type_get_from_plugin_descriptor (
209 static consteval bool type_has_mono_compat_switch (
const Type tt)
217 static constexpr bool
254 static constexpr bool type_can_have_automation (
const Type type)
263 static constexpr bool type_can_have_lanes (
const Type type)
268 template <
typename T>
static consteval Type get_type_for_class ()
270 if constexpr (std::is_same_v<T, MidiTrack>)
272 else if constexpr (std::is_same_v<T, AudioTrack>)
274 else if constexpr (std::is_same_v<T, ChordTrack>)
276 else if constexpr (std::is_same_v<T, InstrumentTrack>)
278 else if constexpr (std::is_same_v<T, AudioBusTrack>)
280 else if constexpr (std::is_same_v<T, MidiBusTrack>)
282 else if constexpr (std::is_same_v<T, MasterTrack>)
284 else if constexpr (std::is_same_v<T, ModulatorTrack>)
286 else if constexpr (std::is_same_v<T, MarkerTrack>)
288 else if constexpr (std::is_same_v<T, FolderTrack>)
290 else if constexpr (std::is_same_v<T, AudioGroupTrack>)
292 else if constexpr (std::is_same_v<T, MidiGroupTrack>)
296 static_assert (dependent_false_v<T>,
"Unknown track type");
302 Z_DISABLE_COPY_MOVE (
Track)
305 enum class TrackFeatures : std::uint8_t
319 PortType in_signal_type,
320 PortType out_signal_type,
321 TrackFeatures enabled_features,
346 AutomationTracklist * automationTracklist ()
const
351 QString name ()
const {
return name_.to_qstring (); }
352 void setName (
const QString &name)
354 const auto name_str = utils::Utf8String::from_qstring (name);
355 if (
name_ == name_str)
359 Q_EMIT nameChanged (name);
361 Q_SIGNAL
void nameChanged (
const QString &name);
363 QColor color ()
const {
return color_.to_qcolor (); }
364 void setColor (
const QColor &color)
366 if (
color_.to_qcolor () == color)
370 Q_EMIT colorChanged (color);
372 Q_SIGNAL
void colorChanged (
const QColor &color);
374 QString comment ()
const {
return comment_.to_qstring (); }
375 void setComment (
const QString &comment)
377 const auto comment_str = utils::Utf8String::from_qstring (comment);
382 Q_EMIT commentChanged (comment);
384 Q_SIGNAL
void commentChanged (
const QString &comment);
386 bool visible ()
const {
return visible_; }
387 void setVisible (
bool visible)
393 Q_EMIT visibleChanged (visible);
395 Q_SIGNAL
void visibleChanged (
bool visible);
397 bool enabled ()
const {
return enabled_; }
398 void setEnabled (
bool enabled)
403 Q_EMIT enabledChanged (enabled);
405 Q_SIGNAL
void enabledChanged (
bool enabled);
408 void setHeight (
double height)
413 height = std::max (
static_cast<double> (Track::MIN_HEIGHT), height);
415 Q_EMIT heightChanged (height);
417 Q_SIGNAL
void heightChanged (
double height);
420 Q_SIGNAL
void fullVisibleHeightChanged ();
422 QString icon ()
const {
return icon_name_.to_qstring (); }
423 void setIcon (
const QString &icon)
425 const auto icon_str = utils::Utf8String::from_qstring (icon);
431 Q_EMIT iconChanged (icon);
433 Q_SIGNAL
void iconChanged (
const QString &icon);
435 Channel * channel ()
const {
return channel_.get (); }
437 plugins::PluginGroup * modulators ()
const {
return modulators_.get (); }
439 TrackLaneList * lanes ()
const {
return lanes_.get (); }
441 RecordableTrackMixin * recordableTrackMixin ()
const
443 return recordable_track_mixin_.get ();
446 PianoRollTrackMixin * pianoRollTrackMixin ()
const
448 return piano_roll_track_mixin_.get ();
451 bool clipLauncherMode ()
const {
return clip_launcher_mode_; }
452 void setClipLauncherMode (
bool mode);
453 Q_SIGNAL
void clipLauncherModeChanged (
bool mode);
469 bool is_copyable ()
const {
return type_is_copyable (
type_); }
470 bool has_automation ()
const {
return automationTracklist () !=
nullptr; }
478 bool multiply_heights (
double multiplier,
bool visible_only,
bool check_only);
482 template <arrangement::RegionObject RegionT>
483 auto generate_name_for_region (
484 const RegionT ®ion,
485 AutomationTrack * automation_track =
nullptr)
488 if constexpr (std::is_same_v<RegionT, arrangement::AutomationRegion>)
490 assert (automation_track !=
nullptr);
493 "{} - {}",
get_name (), automation_track->parameter ()->label ()));
502 std::vector<ArrangerObjectPtrVariant> &objects)
const;
504 bool contains_uninstantiated_plugin ()
const;
523 void collect_plugins (std::vector<plugins::PluginPtrVariant> &plugins)
const;
531 zrythm::plugins::PluginSlotType slot_type,
551 auto &get_plugin_registry ()
const
553 return base_dependencies_.plugin_registry_;
555 auto &get_plugin_registry () {
return base_dependencies_.plugin_registry_; }
556 auto &get_port_registry ()
const {
return base_dependencies_.port_registry_; }
557 auto &get_port_registry () {
return base_dependencies_.port_registry_; }
558 auto &get_param_registry ()
const
560 return base_dependencies_.param_registry_;
562 auto &get_param_registry () {
return base_dependencies_.param_registry_; }
563 auto &get_object_registry ()
const
565 return base_dependencies_.obj_registry_;
567 auto &get_object_registry () {
return base_dependencies_.obj_registry_; }
569 TrackProcessor * get_track_processor ()
const {
return processor_.get (); }
571 auto get_icon_name ()
const {
return icon_name_; }
584 void generate_automation_tracks_for_processor (
588 structure::tracks::generate_automation_tracks_for_processor (
589 ats, processor, base_dependencies_.tempo_map_,
590 base_dependencies_.file_audio_source_registry_,
591 base_dependencies_.obj_registry_);
598 std::optional<TrackProcessor::FillEventsCallback> fill_events_cb =
600 std::optional<TrackProcessor::TransformMidiInputsFunc>
601 transform_midi_inputs_func = std::nullopt,
602 std::optional<TrackProcessor::AppendMidiInputsToOutputsFunc>
603 append_midi_inputs_to_outputs_func = std::nullopt);
610 std::vector<ArrangerObjectPtrVariant> &objects)
const
615 static constexpr auto kTypeKey =
"type"sv;
616 static constexpr auto kNameKey =
"name"sv;
617 static constexpr auto kIconNameKey =
"iconName"sv;
618 static constexpr auto kVisibleKey =
"visible"sv;
619 static constexpr auto kMainHeightKey =
"mainHeight"sv;
620 static constexpr auto kEnabledKey =
"enabled"sv;
621 static constexpr auto kColorKey =
"color"sv;
622 static constexpr auto kInputSignalTypeKey =
"inSignalType"sv;
623 static constexpr auto kOutputSignalTypeKey =
"outSignalType"sv;
624 static constexpr auto kCommentKey =
"comment"sv;
625 static constexpr auto kFrozenClipIdKey =
"frozenClipId"sv;
626 static constexpr auto kProcessorKey =
"processor"sv;
627 static constexpr auto kAutomationTracklistKey =
"automationTracklist"sv;
628 static constexpr auto kChannelKey =
"channel"sv;
629 static constexpr auto kModulatorsKey =
"modulators"sv;
630 static constexpr auto kModulatorMacroProcessorsKey =
"modulatorMacros"sv;
631 static constexpr auto kTrackLanesKey =
"lanes"sv;
632 static constexpr auto kRecordableTrackMixinKey =
"recordableTrackMixin"sv;
633 static constexpr auto kPianoRollTrackMixinKey =
"pianoRollTrackMixin"sv;
634 friend void to_json (nlohmann::json &j,
const Track &track)
636 to_json (j,
static_cast<const UuidIdentifiableObject &
> (track));
637 j[kTypeKey] = track.
type_;
638 j[kNameKey] = track.
name_;
643 j[kColorKey] = track.
color_;
653 j[kTrackLanesKey] = track.lanes_;
654 j[kRecordableTrackMixinKey] = track.recordable_track_mixin_;
655 j[kPianoRollTrackMixinKey] = track.piano_roll_track_mixin_;
657 friend void from_json (
const nlohmann::json &j, Track &track);
660 make_automation_tracklist ();
666 make_recordable_track_mixin ();
668 make_piano_roll_track_mixin ();
676 TrackFeatures features_{};
749 std::vector<utils::QObjectUniquePtr<dsp::ModulatorMacroProcessor>>
764 bool clip_launcher_mode_{};
766 BOOST_DESCRIBE_CLASS (
785 recordable_track_mixin_,
786 piano_roll_track_mixin_,
787 clip_launcher_mode_),