41class RecordingMaterializer :
public QObject
46 using RecordingMode = recording::RecordingMode;
51 structure::arrangement::ArrangerObjectUuidReference region;
52 size_t actual_lane_index{};
54 using RegionCreationResult = std::optional<CreatedRegion>;
68 std::function<RegionCreationResult (
69 structure::tracks::TrackUuid track_id,
70 units::sample_t start_position,
76 std::function<RegionCreationResult (
77 structure::tracks::TrackUuid track_id,
78 units::sample_t start_position,
85 units::sample_t start_position,
86 units::sample_t end_position,
95 units::sample_t position,
96 structure::arrangement::MidiControlEvent::EventType type,
103 explicit RecordingMaterializer (
108 QObject * parent =
nullptr);
110 ~RecordingMaterializer ()
override;
112 Q_DISABLE_COPY_MOVE (RecordingMaterializer)
121 struct TrackRecordingState
126 units::sample_t start_position;
132 std::optional<structure::arrangement::ArrangerObjectUuidReference>
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;
147 void on_audio_data_ready (
148 structure::tracks::TrackUuid track_id,
149 const std::vector<RecordingAudioPacket> &packets);
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,
163 void on_midi_data_ready (
164 structure::tracks::TrackUuid track_id,
165 const std::vector<RecordingMidiPacket> &packets);
169 bool ensure_midi_region (
170 TrackRecordingState &state,
171 structure::tracks::TrackUuid track_id,
172 units::sample_t start_position);
180 void handle_discontinuity (TrackRecordingState &state);
189 void force_complete_pending_notes (TrackRecordingState &state);
192 void ensure_recording_macro ();
195 void finalize_recording_macro ();
198 QPointer<undo::UndoStack> undo_stack_;
203 std::unordered_map<structure::tracks::TrackUuid, TrackRecordingState>
213 bool recording_macro_active_ =
false;
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 ®ion, 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 ®ion, units::sample_t position, structure::arrangement::MidiControlEvent::EventType type, int channel, int controller, int value)> midi_control_event
Creates a MidiControlEvent inside a region.