Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
audio_region.h
1// SPDX-FileCopyrightText: © 2019-2022, 2024-2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "structure/arrangement/arranger_object.h"
7#include "structure/arrangement/arranger_object_owner.h"
8#include "structure/arrangement/audio_source_object.h"
9#include "structure/arrangement/fadeable_object.h"
10
11#include <juce_audio_basics/juce_audio_basics.h>
12
13namespace zrythm::structure::arrangement
14{
15
19class AudioRegion final
20 : public ArrangerObject,
21 public ArrangerObjectOwner<AudioSourceObject>
22{
23 Q_OBJECT
24 Q_PROPERTY (
25 AudioRegion::MusicalMode musicalMode READ musicalMode WRITE setMusicalMode
26 NOTIFY musicalModeChanged)
27 Q_PROPERTY (float gain READ gain WRITE setGain NOTIFY gainChanged)
28 DEFINE_ARRANGER_OBJECT_OWNER_QML_PROPERTIES (
29 AudioRegion,
30 audioSources,
32 QML_ELEMENT
33 QML_UNCREATABLE ("")
34
35public:
39 enum class MusicalMode : std::uint8_t
40 {
42 Inherit,
44 Off,
46 On,
47 };
48
49 using GlobalMusicalModeGetter = std::function<bool ()>;
50
54 static constexpr int BUILTIN_FADE_FRAMES = 10;
55
56public:
57 AudioRegion (
58 const dsp::TempoMap &tempo_map,
59 utils::IObjectRegistry &object_registry,
60 GlobalMusicalModeGetter musical_mode_getter,
61 QObject * parent = nullptr) noexcept;
62
63 // ========================================================================
64 // QML Interface
65 // ========================================================================
66
67 MusicalMode musicalMode () const { return musical_mode_; }
68 Q_INVOKABLE bool effectivelyInMusicalMode () const;
69 void setMusicalMode (MusicalMode musical_mode)
70 {
71 if (musical_mode_ != musical_mode)
72 {
73 musical_mode_ = musical_mode;
74 Q_EMIT musicalModeChanged (musical_mode);
75 }
76 }
77 Q_SIGNAL void musicalModeChanged (MusicalMode musical_mode);
78
79 float gain () const { return gain_.load (); }
80 void setGain (float gain)
81 {
82 gain = std::clamp (gain, 0.f, 2.f);
83 if (qFuzzyCompare (gain_, gain))
84 return;
85 gain_.store (gain);
86 Q_EMIT gainChanged (gain);
87 }
88 Q_SIGNAL void gainChanged (float gain);
89
90 // ========================================================================
91
97 void set_source (const ArrangerObjectUuidReference &source);
98
99 juce::PositionableAudioSource &get_audio_source () const;
100
101 std::string
102 get_field_name_for_serialization (const AudioSourceObject *) const override
103 {
104 return "audioSources";
105 }
106
107 std::vector<ArrangerObjectListModel *> get_child_list_models () const override
108 {
109 return { ArrangerObjectOwner<AudioSourceObject>::get_model () };
110 }
111
112private:
113 friend void init_from (
114 AudioRegion &obj,
115 const AudioRegion &other,
116 utils::ObjectCloneType clone_type);
117
118 static constexpr auto kGainKey = "gain"sv;
119 static constexpr auto kMusicalModeKey = "musicalMode"sv;
120 friend void to_json (nlohmann::json &j, const AudioRegion &region);
121 friend void from_json (const nlohmann::json &j, AudioRegion &region);
122
123private:
125 std::atomic<float> gain_ = 1.0f;
126
128 MusicalMode musical_mode_{};
129
130 GlobalMusicalModeGetter global_musical_mode_getter_;
131
132 BOOST_DESCRIBE_CLASS (
133 AudioRegion,
135 (),
136 (),
137 (gain_, musical_mode_))
138};
139}
140
141DEFINE_ENUM_FORMATTER (
142 zrythm::structure::arrangement::AudioRegion::MusicalMode,
143 MusicalMode,
144 QT_TRANSLATE_NOOP_UTF8 ("MusicalMode", "Inherit"),
145 QT_TRANSLATE_NOOP_UTF8 ("MusicalMode", "Off"),
146 QT_TRANSLATE_NOOP_UTF8 ("MusicalMode", "On"));
ArrangerObject(Type type, const dsp::TempoMap &tempo_map, ArrangerObjectFeatures features, QObject *parent=nullptr) noexcept
Construct a new ArrangerObject.
void set_source(const ArrangerObjectUuidReference &source)
Set the AudioSourceObject to the region.
Abstract interface for a UUID-keyed object registry.