Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
fadeable_object.h
1// SPDX-FileCopyrightText: © 2024-2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "dsp/atomic_position_qml_adapter.h"
7#include "dsp/curve.h"
8#include "utils/icloneable.h"
9
10namespace zrythm::structure::arrangement
11{
12class ArrangerObjectFadeRange : public QObject
13{
14 Q_OBJECT
15 Q_PROPERTY (
16 zrythm::dsp::AtomicPositionQmlAdapter * startOffset READ startOffset CONSTANT)
17 Q_PROPERTY (
18 zrythm::dsp::AtomicPositionQmlAdapter * endOffset READ endOffset CONSTANT)
19 Q_PROPERTY (
20 zrythm::dsp::CurveOptionsQmlAdapter * fadeInCurveOpts READ fadeInCurveOpts
21 CONSTANT)
22 QML_ELEMENT
23 QML_UNCREATABLE ("")
24
25public:
26 ArrangerObjectFadeRange (
27 const dsp::AtomicPosition::TimeConversionFunctions &time_conversion_funcs,
28 QObject * parent = nullptr);
29
30 // ========================================================================
31 // QML Interface
32 // ========================================================================
33
34 dsp::AtomicPositionQmlAdapter * startOffset () const
35 {
36 return start_offset_adapter_.get ();
37 }
38 dsp::AtomicPositionQmlAdapter * endOffset () const
39 {
40 return end_offset_adapter_.get ();
41 }
42 dsp::CurveOptionsQmlAdapter * fadeInCurveOpts () const
43 {
44 return fade_in_opts_adapter_.get ();
45 }
46 dsp::CurveOptionsQmlAdapter * fadeOutCurveOpts () const
47 {
48 return fade_out_opts_adapter_.get ();
49 }
50
51 Q_SIGNAL void fadePropertiesChanged ();
52
53 // ========================================================================
54
58 * @param x Normalized x.
59 * @param fade_in True for in, false for out.
60 */
61 double get_normalized_y_for_fade (double x, bool fade_in) const
62 {
63 if (fade_in)
64 {
65 return fadeInCurveOpts ()->normalizedY (x, false);
66 }
67
68 return fadeOutCurveOpts ()->normalizedY (x, true);
69 }
70
71protected:
72 friend void init_from (
74 const ArrangerObjectFadeRange &other,
75 utils::ObjectCloneType clone_type)
76 {
77 obj.start_offset_adapter_->setTicks (other.start_offset_adapter_->ticks ());
78 obj.end_offset_adapter_->setTicks (other.end_offset_adapter_->ticks ());
79 obj.fade_in_opts_ = other.fade_in_opts_;
80 obj.fade_out_opts_ = other.fade_out_opts_;
81 }
82
83private:
84 static constexpr auto kFadeInOffsetKey = "fadeInOffset"sv;
85 static constexpr auto kFadeOutOffsetKey = "fadeOutOffset"sv;
86 static constexpr auto kFadeInOptsKey = "fadeInOpts"sv;
87 static constexpr auto kFadeOutOptsKey = "fadeOutOpts"sv;
88 friend auto to_json (nlohmann::json &j, const ArrangerObjectFadeRange &object)
89 {
90 j[kFadeInOffsetKey] = object.start_offset_;
91 j[kFadeOutOffsetKey] = object.end_offset_;
92 j[kFadeInOptsKey] = object.fade_in_opts_;
93 j[kFadeOutOptsKey] = object.fade_out_opts_;
94 }
95 friend auto
96 from_json (const nlohmann::json &j, ArrangerObjectFadeRange &object)
97 {
98 j.at (kFadeInOffsetKey).get_to (object.start_offset_);
99 j.at (kFadeOutOffsetKey).get_to (object.end_offset_);
100 j.at (kFadeInOptsKey).get_to (object.fade_in_opts_);
101 j.at (kFadeOutOptsKey).get_to (object.fade_out_opts_);
102 }
103
104 BOOST_DESCRIBE_CLASS (
105 ArrangerObjectFadeRange,
106 (),
107 (),
108 (),
109 (start_offset_, end_offset_, fade_in_opts_, fade_out_opts_))
110
111private:
113 dsp::AtomicPosition start_offset_;
114 utils::QObjectUniquePtr<dsp::AtomicPositionQmlAdapter> start_offset_adapter_;
115
119 dsp::AtomicPosition end_offset_;
120 utils::QObjectUniquePtr<dsp::AtomicPositionQmlAdapter> end_offset_adapter_;
121
123 dsp::CurveOptions fade_in_opts_;
124 utils::QObjectUniquePtr<dsp::CurveOptionsQmlAdapter> fade_in_opts_adapter_;
125
127 dsp::CurveOptions fade_out_opts_;
128 utils::QObjectUniquePtr<dsp::CurveOptionsQmlAdapter> fade_out_opts_adapter_;
129};
130} // namespace zrythm::structure::arrangement
Thread-safe position storage with automatic musical/absolute time conversion.
QML adapter for CurveOptions.
Definition curve.h:125
Curve options.
Definition curve.h:22
double get_normalized_y_for_fade(double x, bool fade_in) const
Gets the normalized Y (ie, gain from 0-1) for a normalized X, for a fade.