Zrythm v2.0.0-DEV
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;
13class MidiNote;
14class MidiRegion;
15class AudioRegion;
17class ChordRegion;
18class ChordObject;
19class ScaleObject;
20class AutomationPoint;
21class Marker;
23class TempoObject;
25
26template <typename T>
27concept RegionObject =
28 std::is_same_v<T, AudioRegion> || std::is_same_v<T, MidiRegion>
29 || std::is_same_v<T, AutomationRegion> || std::is_same_v<T, ChordRegion>;
30
31template <typename T>
33 RegionObject<T> || std::is_same_v<T, ScaleObject> || std::is_same_v<T, Marker>
34 || std::is_same_v<T, TempoObject> || std::is_same_v<T, TimeSignatureObject>;
35
36template <typename T>
38 std::is_same_v<T, MidiRegion> || std::is_same_v<T, AudioRegion>;
39
40template <typename T>
41concept FadeableObject = std::is_same_v<T, AudioRegion>;
42
43template <typename T>
44concept NamedObject = RegionObject<T> || std::is_same_v<T, Marker>;
45
46template <typename T>
47concept BoundedObject = RegionObject<T> || std::is_same_v<T, MidiNote>;
48
49using ArrangerObjectVariant = std::variant<
58 Marker,
62using ArrangerObjectPtrVariant = to_pointer_variant<ArrangerObjectVariant>;
63
65
78template <TimelineObject ObjectT>
79[[gnu::hot]] units::sample_t
80timeline_frames_to_local (
81 const ObjectT &obj,
82 units::sample_t timeline_frames,
83 bool normalize)
84{
85 const auto object_position_frames =
86 units::samples (obj.position ()->samples ());
87 if constexpr (RegionObject<ObjectT>)
88 {
89 if (normalize)
90 {
91 auto diff_frames = timeline_frames - object_position_frames;
92
93 /* special case: timeline frames is exactly at the end of the region */
94 if (timeline_frames == obj.bounds ()->get_end_position_samples (true))
95 return diff_frames;
96
97 const auto loop_end_frames =
98 units::samples (obj.loopRange ()->loopEndPosition ()->samples ());
99 const auto clip_start_frames =
100 units::samples (obj.loopRange ()->clipStartPosition ()->samples ());
101 const auto loop_size = obj.loopRange ()->get_loop_length_in_frames ();
102 assert (loop_size > units::samples (0));
103
104 diff_frames += clip_start_frames;
105
106 while (diff_frames >= loop_end_frames)
107 {
108 diff_frames -= loop_size;
109 }
110
111 return diff_frames;
112 }
113 }
114
115 return timeline_frames - object_position_frames;
116}
117
118template <BoundedObject ObjectT>
119inline auto *
120get_object_bounds (const ObjectT &obj)
121{
122 return obj.bounds ();
123}
124} // namespace zrythm::structure::arrangement
125
126DEFINE_UUID_HASH_SPECIALIZATION (
127 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:16
A MIDI note inside a Region shown in the piano roll.
Definition midi_note.h:20
A Region containing MIDI events.
Definition midi_region.h:20