Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
arranger_object_creator.h
1// SPDX-FileCopyrightText: © 2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <utility>
7
8#include "commands/add_arranger_object_command.h"
9#include "dsp/snap_grid.h"
10#include "structure/arrangement/arranger_object_all.h"
11#include "structure/arrangement/arranger_object_factory.h"
12#include "structure/arrangement/arranger_object_owner.h"
13#include "structure/arrangement/tempo_object_manager.h"
14#include "structure/scenes/clip_slot.h"
15#include "structure/tracks/track_all.h"
16#include "undo/undo_stack.h"
17
18namespace zrythm::actions
19{
20class ArrangerObjectCreator : public QObject
21{
22 Q_OBJECT
23 QML_ELEMENT
24 QML_UNCREATABLE ("One instance per project")
25
26public:
27 explicit ArrangerObjectCreator (
28 undo::UndoStack &undo_stack,
29 structure::arrangement::ArrangerObjectFactory &arranger_object_factory,
30 dsp::SnapGrid &snap_grid_timeline,
31 dsp::SnapGrid &snap_grid_editor,
32 QObject * parent = nullptr)
33 : QObject (parent), arranger_object_factory_ (arranger_object_factory),
34 snap_grid_timeline_ (snap_grid_timeline),
35 snap_grid_editor_ (snap_grid_editor), undo_stack_ (undo_stack)
36 {
37 }
38
39 Q_INVOKABLE structure::arrangement::Marker * addMarker (
42 const QString &name,
43 double startTicks);
44
45 Q_INVOKABLE structure::arrangement::TempoObject * addTempoObject (
47 double bpm,
48 structure::arrangement::TempoObject::CurveType curveType,
49 double startTicks);
50
52 addTimeSignatureObject (
54 int numerator,
55 int denominator,
56 double startTicks);
57
58 Q_INVOKABLE structure::arrangement::MidiRegion * addEmptyMidiRegion (
61 double startTicks);
62
63 Q_INVOKABLE structure::arrangement::MidiRegion * addEmptyMidiRegionToClip (
66
68 addEmptyChordRegion (structure::tracks::ChordTrack * track, double startTicks);
69
71 addEmptyAutomationRegion (
73 structure::tracks::AutomationTrack * automationTrack,
74 double startTicks);
75
87 dsp::FileAudioSourceUuidReference clip_id,
88 units::precise_tick_t start_ticks);
89
90 structure::arrangement::ScaleObject * add_scale_object (
93 units::precise_tick_t start_ticks);
94
95 structure::arrangement::ArrangerObjectUuidReference
96 add_audio_region_for_recording (
99 const utils::audio::AudioBuffer &initial_frames,
100 const utils::Utf8String &clip_name,
101 units::precise_tick_t start_ticks);
102
103 structure::arrangement::ArrangerObjectUuidReference
104 add_midi_region_for_recording (
107 units::precise_tick_t start_ticks);
108
109 structure::arrangement::MidiControlEvent * add_midi_control_event (
111 units::precise_tick_t startTicks,
112 structure::arrangement::MidiControlEvent::EventType type,
113 int channel,
114 int controller,
115 int value);
116
117 Q_INVOKABLE structure::arrangement::AudioRegion * addAudioRegionFromFile (
120 const QString &absPath,
121 double startTicks);
122
124 addAudioRegionToClipSlotFromFile (
127 const QString &absPath);
129 addMidiRegionToClipSlotFromFile (
132 const QString &absPath);
133
142 const dsp::ChordDescriptor &descr,
143 double startTicks);
144
156 const QString &absolutePath,
157 double startTicks,
158 int midiTrackIndex);
159
160 Q_INVOKABLE structure::arrangement::MidiNote * addMidiNote (
162 double startTicks,
163 int pitch);
164
165 Q_INVOKABLE structure::arrangement::AutomationPoint * addAutomationPoint (
167 double startTicks,
168 double value);
169
170 Q_INVOKABLE structure::arrangement::ChordObject * addChordObject (
172 double startTicks,
173 const int chordIndex);
174
175private:
179 void add_laned_object (
182 structure::arrangement::ArrangerObjectUuidReference obj_ref);
183
184 void add_object_to_clip_slot (
187 structure::arrangement::ArrangerObjectUuidReference obj_ref);
188
197 template <structure::arrangement::EditorObject ChildT>
198 auto add_editor_object (
200 units::precise_tick_t startTicks,
201 std::variant<int, double> value) -> ChildT *
202 {
203 auto obj_ref =
204 arranger_object_factory_.create_editor_object<ChildT> (startTicks, value);
205 undo_stack_.push (
206 new commands::AddArrangerObjectCommand<ChildT> (region, obj_ref));
207 auto obj = obj_ref.template get_object_as<ChildT> ();
208 return obj;
209 }
210
211private:
212 structure::arrangement::ArrangerObjectFactory &arranger_object_factory_;
213 dsp::SnapGrid &snap_grid_timeline_;
214 dsp::SnapGrid &snap_grid_editor_;
215 undo::UndoStack &undo_stack_;
216};
217} // namespace zrythm::actions
Q_INVOKABLE structure::arrangement::MidiRegion * addMidiRegionFromMidiFile(structure::tracks::Track *track, structure::tracks::TrackLane *lane, const QString &absolutePath, double startTicks, int midiTrackIndex)
Creates a MIDI region at lane from MIDI file path abs_path starting at startTicks.
Q_INVOKABLE structure::arrangement::MidiRegion * addMidiRegionFromChordDescriptor(structure::tracks::Track *track, structure::tracks::TrackLane *lane, const dsp::ChordDescriptor &descr, double startTicks)
Creates a MIDI region at lane from the given descr starting at startTicks.
structure::arrangement::AudioRegion * add_audio_region_with_clip(structure::tracks::Track &track, structure::tracks::TrackLane &lane, dsp::FileAudioSourceUuidReference clip_id, units::precise_tick_t start_ticks)
A ChordDescriptor describes a chord and is not linked to any specific object by itself.
Snap/grid information.
Definition snap_grid.h:23
A region for playing back audio samples.
An automation point inside an AutomationTrack.
Represents an automation region, which contains a collection of automation points.
The ChordObject class represents a chord inside the chord editor.
Marker for the MarkerTrack.
Definition marker.h:18
A MIDI note inside a Region shown in the piano roll.
Definition midi_note.h:23
A Region containing MIDI events.
Definition midi_region.h:24
Manages tempo and time signature objects for a project.
The ChordTrack class is responsible for managing the chord and scale information in the project.
Definition chord_track.h:21
A container of MIDI or Audio regions.
Definition track_lane.h:27
Represents a track in the project.
Definition track.h:60
A unique pointer for QObject objects that also works with QObject-based ownership.
Definition qt.h:36
Lightweight UTF-8 string wrapper with safe conversions.
Definition utf8_string.h:37