Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
track_factory.h
1// SPDX-FileCopyrightText: © 2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "structure/tracks/track_all.h"
7
8namespace zrythm::structure::tracks
9{
10
14class TrackFactory
15{
16public:
17 TrackFactory (FinalTrackDependencies track_deps)
18 : track_deps_ (std::move (track_deps))
19 {
20 }
21
22 template <typename TrackT> class Builder
23 {
24 friend class TrackFactory;
25
26 private:
27 explicit Builder (FinalTrackDependencies track_deps)
28 : track_deps_ (std::move (track_deps))
29 {
30 }
31
32 public:
33 std::unique_ptr<TrackT> build_for_deserialization () const
34 {
35 return std::make_unique<TrackT> (track_deps_);
36 }
37
38 auto build ()
39 {
40 auto obj_ref =
41 track_deps_.track_registry_.create_object<TrackT> (track_deps_);
42 auto * track = obj_ref.template get_object_as<TrackT> ();
43 track->setName (format_qstr (QObject::tr ("{} Track"), track->type ()));
44 return obj_ref;
45 }
46
47 private:
48 FinalTrackDependencies track_deps_;
49 };
50
51 template <typename TrackT> auto get_builder () const
52 {
53 auto builder = Builder<TrackT> (track_deps_);
54 return builder;
55 }
56
57 template <FinalTrackSubclass TrackT>
58 TrackUuidReference create_empty_track () const
59 {
60 auto obj_ref = get_builder<TrackT> ().build ();
61 return obj_ref;
62 }
63
64 TrackUuidReference create_empty_track (Track::Type type) const
65 {
66 switch (type)
67 {
69 return create_empty_track<AudioTrack> ();
71 return create_empty_track<MidiTrack> ();
73 return create_empty_track<MidiGroupTrack> ();
75 return create_empty_track<FolderTrack> ();
77 return create_empty_track<InstrumentTrack> ();
79 return create_empty_track<MasterTrack> ();
81 return create_empty_track<ChordTrack> ();
83 return create_empty_track<MarkerTrack> ();
85 return create_empty_track<ModulatorTrack> ();
87 return create_empty_track<AudioBusTrack> ();
89 return create_empty_track<MidiBusTrack> ();
91 return create_empty_track<AudioGroupTrack> ();
92 }
93
94 throw std::invalid_argument ("invalid track type");
95 }
96
97 template <typename TrackT>
98 auto clone_new_object_identity (const TrackT &other) const
99 {
100 return track_deps_.plugin_registry_.clone_object (
101 other, track_deps_.plugin_registry_);
102 }
103
104 template <typename TrackT>
105 auto clone_object_snapshot (const TrackT &other, QObject &owner) const
106 {
107 TrackT * new_obj{};
108
109 new_obj = other.clone_qobject (
110 &owner, utils::ObjectCloneType::Snapshot, track_deps_.plugin_registry_);
111 return new_obj;
112 }
113
114private:
115 FinalTrackDependencies track_deps_;
116};
117
118} // namespace zrythm::structure::tracks
@ Marker
Marker Track's contain named markers at specific Position's in the song.
Definition track.h:115
@ AudioGroup
Group Tracks are used for grouping audio signals, for example routing multiple drum tracks to a "Drum...
Definition track.h:134
@ AudioBus
Buses are channels that receive audio input and have effects on their channel strip.
Definition track.h:127
@ Modulator
Special track to contain global Modulator's.
Definition track.h:120
@ Midi
Midi tracks can only have MIDI effects in the strip and produce MIDI output that can be routed to ins...
Definition track.h:140
@ Instrument
Instrument tracks must have an Instrument plugin at the first slot and they produce audio output.
Definition track.h:93
@ Folder
Foldable track used for visual grouping.
Definition track.h:149
@ Audio
Audio tracks can record and contain audio clips.
Definition track.h:99
@ MidiGroup
Same with audio group but for MIDI signals.
Definition track.h:146
@ MidiBus
Same with audio bus but for MIDI signals.
Definition track.h:143
@ Chord
The chord track contains chords that can be used to modify midi in real time or to color the piano ro...
Definition track.h:110
@ Master
The master track is a special type of group track.
Definition track.h:104
@ Snapshot
Creates a snapshot of the object with the same identity.
Definition icloneable.h:23