Zrythm v2.0.0-DEV
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_wrapper.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 ArrangerObjectRegistry &object_registry,
60 dsp::FileAudioSourceRegistry &file_audio_source_registry,
61 GlobalMusicalModeGetter musical_mode_getter,
62 QObject * parent = nullptr) noexcept;
63
64 // ========================================================================
65 // QML Interface
66 // ========================================================================
67
68 MusicalMode musicalMode () const { return musical_mode_; }
69 Q_INVOKABLE bool effectivelyInMusicalMode () const;
70 void setMusicalMode (MusicalMode musical_mode)
71 {
72 if (musical_mode_ != musical_mode)
73 {
74 musical_mode_ = musical_mode;
75 Q_EMIT musicalModeChanged (musical_mode);
76 }
77 }
78 Q_SIGNAL void musicalModeChanged (MusicalMode musical_mode);
79
80 float gain () const { return gain_.load (); }
81 void setGain (float gain)
82 {
83 gain = std::clamp (gain, 0.f, 2.f);
84 if (qFuzzyCompare (gain_, gain))
85 return;
86 gain_.store (gain);
87 Q_EMIT gainChanged (gain);
88 }
89 Q_SIGNAL void gainChanged (float gain);
90
91 // ========================================================================
92
98 void set_source (const ArrangerObjectUuidReference &source);
99
100 juce::PositionableAudioSource &get_audio_source () const;
101
102 std::string
103 get_field_name_for_serialization (const AudioSourceObject *) const override
104 {
105 return "audioSources";
106 }
107
108private:
109 friend void init_from (
110 AudioRegion &obj,
111 const AudioRegion &other,
112 utils::ObjectCloneType clone_type);
113
114 static constexpr auto kGainKey = "gain"sv;
115 static constexpr auto kMusicalModeKey = "musicalMode"sv;
116 friend void to_json (nlohmann::json &j, const AudioRegion &region)
117 {
118 to_json (j, static_cast<const ArrangerObject &> (region));
119 to_json (j, static_cast<const ArrangerObjectOwner &> (region));
120 j[kGainKey] = region.gain_.load ();
121 j[kMusicalModeKey] = region.musical_mode_;
122 }
123 friend void from_json (const nlohmann::json &j, AudioRegion &region)
124 {
125 from_json (j, static_cast<ArrangerObject &> (region));
126 from_json (j, static_cast<ArrangerObjectOwner &> (region));
127 float gain{};
128 j.at (kGainKey).get_to (gain);
129 region.gain_.store (gain);
130 j.at (kMusicalModeKey).get_to (region.musical_mode_);
131 }
132
133private:
134 dsp::FileAudioSourceRegistry &file_audio_source_registry_;
135
137 std::atomic<float> gain_ = 1.0f;
138
140 MusicalMode musical_mode_{};
141
142 GlobalMusicalModeGetter global_musical_mode_getter_;
143
144 BOOST_DESCRIBE_CLASS (
145 AudioRegion,
147 (),
148 (),
149 (gain_, musical_mode_))
150};
151}
152
153DEFINE_ENUM_FORMATTER (
154 zrythm::structure::arrangement::AudioRegion::MusicalMode,
155 MusicalMode,
156 QT_TRANSLATE_NOOP_UTF8 ("MusicalMode", "Inherit"),
157 QT_TRANSLATE_NOOP_UTF8 ("MusicalMode", "Off"),
158 QT_TRANSLATE_NOOP_UTF8 ("MusicalMode", "On"));
Base class for all objects in the arranger.
ArrangerObject(Type type, const dsp::TempoMap &tempo_map, ArrangerObjectFeatures features, QObject *parent=nullptr) noexcept
Construct a new ArrangerObject.
A region for playing back audio samples.
void set_source(const ArrangerObjectUuidReference &source)
Set the AudioSourceObject to the region.