Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
recording_midi_packet.h
1// SPDX-FileCopyrightText: © 2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <algorithm>
7#include <vector>
8
9#include "dsp/midi_event.h"
10#include "utils/units.h"
11
12namespace zrythm::controllers
13{
14
16{
17 static constexpr size_t kMaxEventsPerBlock = 256;
18
19 units::sample_t timeline_position;
20 bool transport_recording{};
21 units::sample_u32_t nframes;
22 std::vector<dsp::MidiEvent> midi_events;
23
24 static void write_to_slot (
26 units::sample_t timeline_position,
27 bool transport_recording,
28 std::span<const dsp::MidiEvent> events,
29 units::sample_u32_t nframes) noexcept [[clang::nonblocking]]
30 {
31 slot.timeline_position = timeline_position;
32 slot.transport_recording = transport_recording;
33 slot.nframes = nframes;
34 const auto count = std::min (events.size (), slot.midi_events.capacity ());
35 slot.midi_events.assign (
36 events.begin (),
37 events.begin ()
38 + static_cast<decltype (slot.midi_events)::difference_type> (count));
39 }
40
41 static void
42 copy_from (RecordingMidiPacket &slot, const RecordingMidiPacket &source)
43 [[clang::blocking]]
44 {
45 slot.timeline_position = source.timeline_position;
46 slot.transport_recording = source.transport_recording;
47 slot.nframes = source.nframes;
48 slot.midi_events = source.midi_events;
49 }
50
51 static void
52 resize (RecordingMidiPacket &slot, units::sample_u32_t /*block_length*/)
53 {
54 slot.midi_events.reserve (kMaxEventsPerBlock);
55 }
56};
57
58}