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
10#include <au/math.hh>
11
12namespace zrythm::structure::arrangement
13{
14class ArrangerObject;
15class Clip;
17class MidiNote;
18class MidiClip;
19class AudioClip;
20class AutomationClip;
21class ChordClip;
22class ChordObject;
23class ScaleObject;
24class AutomationPoint;
25class Marker;
27class TempoObject;
29
30template <typename T>
31concept ClipObject =
32 std::is_same_v<T, AudioClip> || std::is_same_v<T, MidiClip>
33 || std::is_same_v<T, AutomationClip> || std::is_same_v<T, ChordClip>;
34
35template <typename T>
37 ClipObject<T> || std::is_same_v<T, ScaleObject> || std::is_same_v<T, Marker>
38 || std::is_same_v<T, TempoObject> || std::is_same_v<T, TimeSignatureObject>;
39
40template <typename T>
42 std::is_same_v<T, MidiClip> || std::is_same_v<T, AudioClip>;
43
44template <typename T>
45concept FadeableObject = std::is_same_v<T, AudioClip>;
46
47template <typename T>
48concept NamedObject = ClipObject<T> || std::is_same_v<T, Marker>;
49
50template <typename T>
51concept BoundedObject = ClipObject<T> || std::is_same_v<T, MidiNote>;
52
53template <typename T>
54concept EditorObject =
55 std::is_same_v<T, MidiControlEvent> || std::is_same_v<T, MidiNote>
56 || std::is_same_v<T, AutomationPoint> || std::is_same_v<T, ChordObject>;
57
58using ArrangerObjectVariant = std::variant<
67 Marker,
72using ArrangerObjectPtrVariant =
74
76
89template <TimelineObject ObjectT>
90[[gnu::hot]] units::sample_t
91timeline_frames_to_local (
92 const ObjectT &obj,
93 units::sample_t timeline_frames,
94 bool normalize)
95{
96 const auto &tempo_map = obj.get_tempo_map ();
97 const auto object_position_frames =
98 tempo_map.tick_to_samples_rounded (obj.position ()->asTick ());
99 if constexpr (ClipObject<ObjectT>)
100 {
101 if (normalize)
102 {
103 auto diff_frames = timeline_frames - object_position_frames;
104
105 /* special case: timeline frames is exactly at the end of the clip */
106 if (timeline_frames == obj.get_end_position_samples (true))
107 return diff_frames;
108
109 const auto * warp = obj.contentWarp ();
110 const auto loop_end_frames =
111 warp->contentToTimelineSamples (obj.loopEndPosition ()->asTick ())
112 - object_position_frames;
113 const auto clip_start_frames =
114 warp->contentToTimelineSamples (obj.clipStartPosition ()->asTick ())
115 - object_position_frames;
116 const auto loop_start_frames =
117 warp->contentToTimelineSamples (obj.loopStartPosition ()->asTick ())
118 - object_position_frames;
119 const auto loop_size =
120 max (units::samples (0), loop_end_frames - loop_start_frames);
121 assert (loop_size > units::samples (0));
122
123 diff_frames += clip_start_frames;
124
125 while (diff_frames >= loop_end_frames)
126 {
127 diff_frames -= loop_size;
128 }
129
130 return diff_frames;
131 }
132 }
133
134 return timeline_frames - object_position_frames;
135}
136
137} // namespace zrythm::structure::arrangement
138
139DEFINE_UUID_HASH_SPECIALIZATION (
140 zrythm::structure::arrangement::ArrangerObjectUuid)
Base class for all objects in the arranger.
A clip for playing back audio samples.
Definition audio_clip.h:24
Represents an automation clip, which contains a collection of automation points.
An automation point inside an AutomationTrack.
A chord placed inside a ChordClip on the chord track.
Intermediate base class for all clip types.
Definition clip.h:37
Marker for the MarkerTrack.
Definition marker.h:18
A Clip containing MIDI events.
Definition midi_clip.h:26
A MIDI note inside a Clip shown in the piano roll.
Definition midi_note.h:23
typename to_pointer_variant_impl< Variant >::type to_pointer_variant
Converts a variant to a variant of pointers.