Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
recording_materializer.h
1// SPDX-FileCopyrightText: © 2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <cstdint>
7#include <deque>
8#include <functional>
9#include <unordered_map>
10
11#include "controllers/recording_coordinator.h"
12#include "controllers/recording_mode.h"
13#include "structure/arrangement/arranger_object_all.h"
14#include "undo/undo_stack.h"
15#include "utils/audio.h"
16#include "utils/qt.h"
17
18#include <QObject>
19
20namespace zrythm::controllers
21{
22
41class RecordingMaterializer : public QObject
42{
43 Q_OBJECT
44
45public:
46 using RecordingMode = recording::RecordingMode;
47
50 {
51 structure::arrangement::ArrangerObjectUuidReference region;
52 size_t actual_lane_index{};
53 };
54 using RegionCreationResult = std::optional<CreatedRegion>;
55
57 using RecordingModeProvider = std::function<RecordingMode ()>;
58
66 {
68 std::function<RegionCreationResult (
69 structure::tracks::TrackUuid track_id,
70 units::sample_t start_position,
71 const utils::audio::AudioBuffer &initial_frames,
72 size_t lane_index)>
74
76 std::function<RegionCreationResult (
77 structure::tracks::TrackUuid track_id,
78 units::sample_t start_position,
79 size_t lane_index)>
81
83 std::function<void (
85 units::sample_t start_position,
86 units::sample_t end_position,
87 int pitch,
88 int velocity,
89 int channel)>
91
93 std::function<void (
95 units::sample_t position,
96 structure::arrangement::MidiControlEvent::EventType type,
97 int channel,
98 int controller,
99 int value)>
101 };
102
103 explicit RecordingMaterializer (
104 RecordingCoordinator &recording_coordinator,
105 undo::UndoStack &undo_stack,
106 ArrangerObjectCreators creators,
107 RecordingModeProvider recording_mode_provider,
108 QObject * parent = nullptr);
109
110 ~RecordingMaterializer () override;
111
112 Q_DISABLE_COPY_MOVE (RecordingMaterializer)
113
114private:
121 struct TrackRecordingState
122 {
125 {
126 units::sample_t start_position;
127 uint8_t velocity{};
128 uint8_t channel{};
129 };
130
132 std::optional<structure::arrangement::ArrangerObjectUuidReference>
133 current_region;
135 std::optional<units::sample_t> last_end_position;
137 size_t current_lane_index = 0;
143 std::unordered_map<uint16_t, std::deque<PendingNote>> unended_notes;
144 };
145
147 void on_audio_data_ready (
148 structure::tracks::TrackUuid track_id,
149 const std::vector<RecordingAudioPacket> &packets);
150
152 std::optional<structure::arrangement::ArrangerObjectUuidReference>
153 get_or_create_region (
154 TrackRecordingState &state,
155 structure::tracks::TrackUuid track_id,
156 units::sample_t start_position,
157 const utils::audio::AudioBuffer &initial_frames);
158
159 static dsp::FileAudioSource *
160 get_clip_for_region (structure::arrangement::AudioRegion &region);
161
163 void on_midi_data_ready (
164 structure::tracks::TrackUuid track_id,
165 const std::vector<RecordingMidiPacket> &packets);
166
169 bool ensure_midi_region (
170 TrackRecordingState &state,
171 structure::tracks::TrackUuid track_id,
172 units::sample_t start_position);
173
180 void handle_discontinuity (TrackRecordingState &state);
181
189 void force_complete_pending_notes (TrackRecordingState &state);
190
192 void ensure_recording_macro ();
193
195 void finalize_recording_macro ();
196
197 RecordingCoordinator &recording_coordinator_;
198 QPointer<undo::UndoStack> undo_stack_;
199 ArrangerObjectCreators creators_;
200 RecordingModeProvider recording_mode_provider_;
201
203 std::unordered_map<structure::tracks::TrackUuid, TrackRecordingState>
204 track_states_;
205
211 utils::audio::AudioBuffer scratch_buf_{ 2, 0 };
212
213 bool recording_macro_active_ = false;
214};
215
216}
Orchestrates the recording lifecycle across all armed tracks.
std::function< RecordingMode()> RecordingModeProvider
Called to query the current recording mode (Takes, TakesMuted, etc.).
Audio clips for the pool.
A region for playing back audio samples.
A Region containing MIDI events.
Definition midi_region.h:24
std::function< RegionCreationResult(structure::tracks::TrackUuid track_id, units::sample_t start_position, size_t lane_index)> midi_region
Creates an empty MidiRegion.
std::function< RegionCreationResult(structure::tracks::TrackUuid track_id, units::sample_t start_position, const utils::audio::AudioBuffer &initial_frames, size_t lane_index)> audio_region
Creates an AudioRegion with initial audio frames.
std::function< void(structure::arrangement::MidiRegion &region, units::sample_t start_position, units::sample_t end_position, int pitch, int velocity, int channel)> midi_note
Creates a MidiNote inside a region.
std::function< void(structure::arrangement::MidiRegion &region, units::sample_t position, structure::arrangement::MidiControlEvent::EventType type, int channel, int controller, int value)> midi_control_event
Creates a MidiControlEvent inside a region.
Returned by region creator callbacks on success.