Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
arranger_object_fwd.h
1// SPDX-FileCopyrightText: © 2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "utils/debug.h"
7#include "utils/units.h"
8#include "utils/uuid_identifiable_object.h"
9
10namespace zrythm::structure::arrangement
11{
12class ArrangerObject;
14class MidiNote;
15class MidiRegion;
16class AudioRegion;
18class ChordRegion;
19class ChordObject;
20class ScaleObject;
21class AutomationPoint;
22class Marker;
24class TempoObject;
26
27template <typename T>
28concept RegionObject =
29 std::is_same_v<T, AudioRegion> || std::is_same_v<T, MidiRegion>
30 || std::is_same_v<T, AutomationRegion> || std::is_same_v<T, ChordRegion>;
31
32template <typename T>
34 RegionObject<T> || std::is_same_v<T, ScaleObject> || std::is_same_v<T, Marker>
35 || std::is_same_v<T, TempoObject> || std::is_same_v<T, TimeSignatureObject>;
36
37template <typename T>
39 std::is_same_v<T, MidiRegion> || std::is_same_v<T, AudioRegion>;
40
41template <typename T>
42concept FadeableObject = std::is_same_v<T, AudioRegion>;
43
44template <typename T>
45concept NamedObject = RegionObject<T> || std::is_same_v<T, Marker>;
46
47template <typename T>
48concept BoundedObject = RegionObject<T> || std::is_same_v<T, MidiNote>;
49
50template <typename T>
51concept EditorObject =
52 std::is_same_v<T, MidiControlEvent> || std::is_same_v<T, MidiNote>
53 || std::is_same_v<T, AutomationPoint> || std::is_same_v<T, ChordObject>;
54
55using ArrangerObjectVariant = std::variant<
64 Marker,
69using ArrangerObjectPtrVariant =
71
73
86template <TimelineObject ObjectT>
87[[gnu::hot]] units::sample_t
88timeline_frames_to_local (
89 const ObjectT &obj,
90 units::sample_t timeline_frames,
91 bool normalize)
92{
93 const auto object_position_frames =
94 units::samples (obj.position ()->samples ());
95 if constexpr (RegionObject<ObjectT>)
96 {
97 if (normalize)
98 {
99 auto diff_frames = timeline_frames - object_position_frames;
100
101 /* special case: timeline frames is exactly at the end of the region */
102 if (timeline_frames == obj.bounds ()->get_end_position_samples (true))
103 return diff_frames;
104
105 const auto loop_end_frames =
106 units::samples (obj.loopRange ()->loopEndPosition ()->samples ());
107 const auto clip_start_frames =
108 units::samples (obj.loopRange ()->clipStartPosition ()->samples ());
109 const auto loop_size = obj.loopRange ()->get_loop_length_in_frames ();
110 assert (loop_size > units::samples (0));
111
112 diff_frames += clip_start_frames;
113
114 while (diff_frames >= loop_end_frames)
115 {
116 diff_frames -= loop_size;
117 }
118
119 return diff_frames;
120 }
121 }
122
123 return timeline_frames - object_position_frames;
124}
125
126template <BoundedObject ObjectT>
127inline auto *
128get_object_bounds (const ObjectT &obj)
129{
130 return obj.bounds ();
131}
132} // namespace zrythm::structure::arrangement
133
134DEFINE_UUID_HASH_SPECIALIZATION (
135 zrythm::structure::arrangement::ArrangerObjectUuid)
Base class for all objects in the arranger.
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
typename to_pointer_variant_impl< Variant >::type to_pointer_variant
Converts a variant to a variant of pointers.