Zrythm v2.0.0-alpha.1
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/curve.h"
7#include "dsp/position.h"
8#include "dsp/tempo_map_qml_adapter.h"
9#include "utils/icloneable.h"
10
11#include <nlohmann/json_fwd.hpp>
12
13namespace zrythm::structure::arrangement
14{
15class ArrangerObjectFadeRange : public QObject
16{
17 Q_OBJECT
18 Q_PROPERTY (zrythm::dsp::Position * startOffset READ startOffset CONSTANT)
19 Q_PROPERTY (zrythm::dsp::Position * endOffset READ endOffset CONSTANT)
20 Q_PROPERTY (
21 zrythm::dsp::CurveOptionsQmlAdapter * fadeInCurveOpts READ fadeInCurveOpts
22 CONSTANT)
23 Q_PROPERTY (
24 zrythm::dsp::CurveOptionsQmlAdapter * fadeOutCurveOpts READ fadeOutCurveOpts
25 CONSTANT)
26 QML_ELEMENT
27 QML_UNCREATABLE ("")
28
29public:
30 ArrangerObjectFadeRange (
31 const dsp::Position &start_position,
32 const dsp::TempoMapWrapper &tempo_map_wrapper,
33 QObject * parent = nullptr);
34
35 // ========================================================================
36 // QML Interface
37 // ========================================================================
38
39 dsp::Position * startOffset () const { return start_offset_.get (); }
40 dsp::Position * endOffset () const { return end_offset_.get (); }
41 dsp::CurveOptionsQmlAdapter * fadeInCurveOpts () const
42 {
43 return fade_in_opts_adapter_.get ();
44 }
45 dsp::CurveOptionsQmlAdapter * fadeOutCurveOpts () const
46 {
47 return fade_out_opts_adapter_.get ();
48 }
49
50 Q_SIGNAL void fadePropertiesChanged ();
51
52 // ========================================================================
53
58 * @param fade_in True for in, false for out.
59 */
60 double get_normalized_y_for_fade (double x, bool fade_in) const
61 {
62 if (fade_in)
63 {
64 return fadeInCurveOpts ()->normalizedY (x, false);
65 }
66
67 return fadeOutCurveOpts ()->normalizedY (x, true);
68 }
69
70protected:
71 friend void init_from (
73 const ArrangerObjectFadeRange &other,
74 utils::ObjectCloneType clone_type)
75 {
76 obj.start_offset_->setTicks (other.start_offset_->ticks ());
77 obj.end_offset_->setTicks (other.end_offset_->ticks ());
78 obj.fade_in_opts_ = other.fade_in_opts_;
79 obj.fade_out_opts_ = other.fade_out_opts_;
80 }
81
82private:
83 static constexpr auto kFadeInOffsetKey = "fadeInOffset"sv;
84 static constexpr auto kFadeOutOffsetKey = "fadeOutOffset"sv;
85 static constexpr auto kFadeInOptsKey = "fadeInOpts"sv;
86 static constexpr auto kFadeOutOptsKey = "fadeOutOpts"sv;
87 friend void
88 to_json (nlohmann::json &j, const ArrangerObjectFadeRange &object);
89 friend void
90 from_json (const nlohmann::json &j, ArrangerObjectFadeRange &object);
91
92 BOOST_DESCRIBE_CLASS (
93 ArrangerObjectFadeRange,
94 (),
95 (),
96 (),
97 (start_offset_, end_offset_, fade_in_opts_, fade_out_opts_))
98
99private:
115
125
127 dsp::CurveOptions fade_in_opts_;
129
131 dsp::CurveOptions fade_out_opts_;
133};
134} // namespace zrythm::structure::arrangement
QML adapter for CurveOptions.
Definition curve.h:131
Curve options.
Definition curve.h:23
An observable, serializable musical position stored as ticks.
Definition position.h:33
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.
A unique pointer for QObject objects that also works with QObject-based ownership.
Definition qt.h:36