6#include "utils/debug.h"
7#include "utils/units.h"
8#include "utils/uuid_identifiable_object.h"
10namespace zrythm::structure::arrangement
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>;
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>;
38 std::is_same_v<T, MidiRegion> || std::is_same_v<T, AudioRegion>;
49using ArrangerObjectVariant = std::variant<
62using ArrangerObjectPtrVariant = to_pointer_variant<ArrangerObjectVariant>;
78template <TimelineObject ObjectT>
79[[gnu::hot]] units::sample_t
80timeline_frames_to_local (
82 units::sample_t timeline_frames,
85 const auto object_position_frames =
86 units::samples (obj.position ()->samples ());
91 auto diff_frames = timeline_frames - object_position_frames;
94 if (timeline_frames == obj.bounds ()->get_end_position_samples (
true))
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));
104 diff_frames += clip_start_frames;
106 while (diff_frames >= loop_end_frames)
108 diff_frames -= loop_size;
115 return timeline_frames - object_position_frames;
118template <BoundedObject ObjectT>
120get_object_bounds (
const ObjectT &obj)
122 return obj.bounds ();
126DEFINE_UUID_HASH_SPECIALIZATION (
127 zrythm::structure::arrangement::ArrangerObjectUuid)
Base class for all objects in the arranger.
A region for playing back audio samples.
Audio source for an AudioRegion.
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.
A MIDI note inside a Region shown in the piano roll.
A Region containing MIDI events.