Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
midi_region.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 "structure/arrangement/arranger_object_owner.h"
8#include "structure/arrangement/midi_control_event.h"
9#include "structure/arrangement/midi_note.h"
10
11namespace zrythm::structure::arrangement
12{
20class MidiRegion final
21 : public ArrangerObject,
22 public ArrangerObjectOwner<MidiNote>,
23 public ArrangerObjectOwner<MidiControlEvent>
24{
25 Q_OBJECT
26 DEFINE_ARRANGER_OBJECT_OWNER_QML_PROPERTIES (MidiRegion, midiNotes, MidiNote)
27 DEFINE_ARRANGER_OBJECT_OWNER_QML_PROPERTIES (
28 MidiRegion,
29 midiControlEvents,
31 QML_ELEMENT
32 QML_UNCREATABLE ("")
33
34 friend class ArrangerObjectFactory;
35
36public:
37 MidiRegion (
38 const dsp::TempoMap &tempo_map,
39 utils::IObjectRegistry &object_registry,
40 QObject * parent = nullptr);
41
42 // ========================================================================
43 // QML Interface
44 // ========================================================================
45
46 Q_SIGNAL void contentChanged ();
47
48 // ========================================================================
49
50 std::string get_field_name_for_serialization (const MidiNote *) const override
51 {
52 return "midiNotes";
53 }
54 std::string
55 get_field_name_for_serialization (const MidiControlEvent *) const override
56 {
57 return "midiControlEvents";
58 }
59
60 std::vector<ArrangerObjectListModel *> get_child_list_models () const override
61 {
62 return {
63 ArrangerObjectOwner<MidiNote>::get_model (),
64 ArrangerObjectOwner<MidiControlEvent>::get_model (),
65 };
66 }
67
68private:
69 friend void init_from (
70 MidiRegion &obj,
71 const MidiRegion &other,
72 utils::ObjectCloneType clone_type);
73
74 friend void to_json (nlohmann::json &j, const MidiRegion &region)
75 {
76 to_json (j, static_cast<const ArrangerObject &> (region));
77 to_json (j, static_cast<const ArrangerObjectOwner<MidiNote> &> (region));
78 to_json (
79 j, static_cast<const ArrangerObjectOwner<MidiControlEvent> &> (region));
80 }
81 friend void from_json (const nlohmann::json &j, MidiRegion &region)
82 {
83 from_json (j, static_cast<ArrangerObject &> (region));
84 from_json (j, static_cast<ArrangerObjectOwner<MidiNote> &> (region));
85 from_json (j, static_cast<ArrangerObjectOwner<MidiControlEvent> &> (region));
86 }
87
88private:
89 BOOST_DESCRIBE_CLASS (
90 MidiRegion,
92 ArrangerObjectOwner<MidiNote>,
93 ArrangerObjectOwner<MidiControlEvent>),
94 (),
95 (),
96 ())
97};
98}
ArrangerObject(Type type, const dsp::TempoMap &tempo_map, ArrangerObjectFeatures features, QObject *parent=nullptr) noexcept
Construct a new ArrangerObject.
A MIDI note inside a Region shown in the piano roll.
Definition midi_note.h:23
Abstract interface for a UUID-keyed object registry.