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 Q_PROPERTY (
23 zrythm::dsp::CurveOptionsQmlAdapter * fadeOutCurveOpts READ fadeOutCurveOpts
24 CONSTANT)
25 QML_ELEMENT
26 QML_UNCREATABLE ("")
27
28public:
29 ArrangerObjectFadeRange (
30 const dsp::AtomicPosition::TimeConversionFunctions &time_conversion_funcs,
31 QObject * parent = nullptr);
32
33 // ========================================================================
34 // QML Interface
35 // ========================================================================
36
37 dsp::AtomicPositionQmlAdapter * startOffset () const
38 {
39 return start_offset_adapter_.get ();
40 }
41 dsp::AtomicPositionQmlAdapter * endOffset () const
42 {
43 return end_offset_adapter_.get ();
44 }
45 dsp::CurveOptionsQmlAdapter * fadeInCurveOpts () const
46 {
47 return fade_in_opts_adapter_.get ();
48 }
49 dsp::CurveOptionsQmlAdapter * fadeOutCurveOpts () const
50 {
51 return fade_out_opts_adapter_.get ();
52 }
53
54 Q_SIGNAL void fadePropertiesChanged ();
55
56 // ========================================================================
57
60 *
61 * @param x Normalized x.
62 * @param fade_in True for in, false for out.
63 */
64 double get_normalized_y_for_fade (double x, bool fade_in) const
65 {
66 if (fade_in)
67 {
68 return fadeInCurveOpts ()->normalizedY (x, false);
69 }
70
71 return fadeOutCurveOpts ()->normalizedY (x, true);
72 }
73
74protected:
75 friend void init_from (
77 const ArrangerObjectFadeRange &other,
78 utils::ObjectCloneType clone_type)
79 {
80 obj.start_offset_adapter_->setTicks (other.start_offset_adapter_->ticks ());
81 obj.end_offset_adapter_->setTicks (other.end_offset_adapter_->ticks ());
82 obj.fade_in_opts_ = other.fade_in_opts_;
83 obj.fade_out_opts_ = other.fade_out_opts_;
84 }
85
86private:
87 static constexpr auto kFadeInOffsetKey = "fadeInOffset"sv;
88 static constexpr auto kFadeOutOffsetKey = "fadeOutOffset"sv;
89 static constexpr auto kFadeInOptsKey = "fadeInOpts"sv;
90 static constexpr auto kFadeOutOptsKey = "fadeOutOpts"sv;
91 friend auto to_json (nlohmann::json &j, const ArrangerObjectFadeRange &object)
92 {
93 j[kFadeInOffsetKey] = object.start_offset_;
94 j[kFadeOutOffsetKey] = object.end_offset_;
95 j[kFadeInOptsKey] = object.fade_in_opts_;
96 j[kFadeOutOptsKey] = object.fade_out_opts_;
97 }
98 friend auto
99 from_json (const nlohmann::json &j, ArrangerObjectFadeRange &object)
100 {
101 j.at (kFadeInOffsetKey).get_to (object.start_offset_);
102 j.at (kFadeOutOffsetKey).get_to (object.end_offset_);
103 j.at (kFadeInOptsKey).get_to (object.fade_in_opts_);
104 j.at (kFadeOutOptsKey).get_to (object.fade_out_opts_);
105 }
106
107 BOOST_DESCRIBE_CLASS (
108 ArrangerObjectFadeRange,
109 (),
110 (),
111 (),
112 (start_offset_, end_offset_, fade_in_opts_, fade_out_opts_))
113
114private:
116 dsp::AtomicPosition start_offset_;
117 utils::QObjectUniquePtr<dsp::AtomicPositionQmlAdapter> start_offset_adapter_;
118
122 dsp::AtomicPosition end_offset_;
123 utils::QObjectUniquePtr<dsp::AtomicPositionQmlAdapter> end_offset_adapter_;
124
126 dsp::CurveOptions fade_in_opts_;
127 utils::QObjectUniquePtr<dsp::CurveOptionsQmlAdapter> fade_in_opts_adapter_;
128
130 dsp::CurveOptions fade_out_opts_;
131 utils::QObjectUniquePtr<dsp::CurveOptionsQmlAdapter> fade_out_opts_adapter_;
132};
133} // namespace zrythm::structure::arrangement
QML adapter for CurveOptions.
Definition curve.h:130
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.