Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
midi_clip.h
1// SPDX-FileCopyrightText: © 2019-2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "dsp/midi_event.h"
7#include "dsp/timebase.h"
8#include "structure/arrangement/arranger_object_owner.h"
9#include "structure/arrangement/clip.h"
10#include "structure/arrangement/midi_control_event.h"
11#include "structure/arrangement/midi_note.h"
12
13namespace zrythm::structure::arrangement
14{
22class MidiClip final
23 : public Clip,
24 public ArrangerObjectOwner<MidiNote>,
25 public ArrangerObjectOwner<MidiControlEvent>
26{
27 Q_OBJECT
28 DEFINE_ARRANGER_OBJECT_OWNER_QML_PROPERTIES (MidiClip, midiNotes, MidiNote)
29 DEFINE_ARRANGER_OBJECT_OWNER_QML_PROPERTIES (
30 MidiClip,
31 midiControlEvents,
33 QML_ELEMENT
34 QML_UNCREATABLE ("")
35
36 friend class ArrangerObjectFactory;
37
38public:
39 MidiClip (
40 const dsp::TempoMapWrapper &tempo_map_wrapper,
41 utils::IObjectRegistry &object_registry,
42 QObject * parent = nullptr);
43
44 // ========================================================================
45 // QML Interface
46 // ========================================================================
47
48 // ========================================================================
49
52 [[nodiscard]] units::bpm_t source_bpm () const { return source_bpm_; }
53 void set_source_bpm (units::bpm_t bpm);
54
55 // ========================================================================
56
57 std::string get_field_name_for_serialization (const MidiNote *) const override
58 {
59 return "midiNotes";
60 }
61 std::string
62 get_field_name_for_serialization (const MidiControlEvent *) const override
63 {
64 return "midiControlEvents";
65 }
66
67 std::vector<ArrangerObjectListModel *> get_child_list_models () const override
68 {
69 return {
70 ArrangerObjectOwner<MidiNote>::get_model (),
71 ArrangerObjectOwner<MidiControlEvent>::get_model (),
72 };
73 }
74
75 void shift_all_children (dsp::ContentTick delta) override;
76
77 std::optional<dsp::ContentTick> first_child_position () const override;
78
79private:
80 friend void init_from (
81 MidiClip &obj,
82 const MidiClip &other,
83 utils::ObjectCloneType clone_type);
84
86 void update_warp_configuration ();
87
88 friend void to_json (nlohmann::json &j, const MidiClip &clip)
89 {
90 to_json (j, static_cast<const Clip &> (clip));
91 to_json (j, static_cast<const ArrangerObjectOwner<MidiNote> &> (clip));
92 to_json (
93 j, static_cast<const ArrangerObjectOwner<MidiControlEvent> &> (clip));
94 j["sourceBpm"] = clip.source_bpm_;
95 }
96 friend void from_json (const nlohmann::json &j, MidiClip &clip)
97 {
98 from_json (j, static_cast<Clip &> (clip));
99 from_json (j, static_cast<ArrangerObjectOwner<MidiNote> &> (clip));
100 from_json (j, static_cast<ArrangerObjectOwner<MidiControlEvent> &> (clip));
101 if (j.contains ("sourceBpm"))
102 j.at ("sourceBpm").get_to (clip.source_bpm_);
103 clip.update_warp_configuration ();
104 }
105
106private:
107 units::bpm_t source_bpm_{};
108
109 BOOST_DESCRIBE_CLASS (
110 MidiClip,
111 (Clip, ArrangerObjectOwner<MidiNote>, ArrangerObjectOwner<MidiControlEvent>),
112 (),
113 (),
114 (source_bpm_))
115};
116}
Intermediate base class for all clip types.
Definition clip.h:37
A Clip containing MIDI events.
Definition midi_clip.h:26
void shift_all_children(dsp::ContentTick delta) override
Shifts all child objects by delta content ticks.
std::optional< dsp::ContentTick > first_child_position() const override
Returns the position of the first child, if any.
units::bpm_t source_bpm() const
Source tempo for Absolute-mode anchor (default 0 = no anchor).
Definition midi_clip.h:52
A MIDI note inside a Clip shown in the piano roll.
Definition midi_note.h:23
Abstract interface for a UUID-keyed object registry.