39 auto it = std::upper_bound(events_.begin(), events_.end(), event,
41 return a.timestamp < b.timestamp;
43 events_.insert(it, event);
47 void add_note_on(
double timestamp,
int channel,
int note,
int velocity) {
49 e.timestamp = timestamp;
50 e.status =
static_cast<uint8_t
>(0x90 | (channel & 0x0F));
51 e.data1 =
static_cast<uint8_t
>(note & 0x7F);
52 e.data2 =
static_cast<uint8_t
>(velocity & 0x7F);
59 e.timestamp = timestamp;
60 e.status =
static_cast<uint8_t
>(0x80 | (channel & 0x0F));
61 e.data1 =
static_cast<uint8_t
>(note & 0x7F);
67 void add_cc(
double timestamp,
int channel,
int cc,
int value) {
69 e.timestamp = timestamp;
70 e.status =
static_cast<uint8_t
>(0xB0 | (channel & 0x0F));
71 e.data1 =
static_cast<uint8_t
>(cc & 0x7F);
72 e.data2 =
static_cast<uint8_t
>(value & 0x7F);
77 int size()
const {
return static_cast<int>(events_.size()); }
83 void clear() { events_.clear(); }
86 double duration()
const {
return events_.empty() ? 0 : events_.back().timestamp; }
90 std::vector<const TimestampedMidiEvent*> result;
91 for (
auto& e : events_)
92 if (e.timestamp >= start && e.timestamp <
end)
99 if (note_on_index < 0 || note_on_index >=
size())
return std::nullopt;
100 auto& on = events_[
static_cast<size_t>(note_on_index)];
101 if (!on.is_note_on())
return std::nullopt;
103 for (
int i = note_on_index + 1; i <
size(); ++i) {
104 auto& e = events_[
static_cast<size_t>(i)];
105 if (e.is_note_off() && e.note() == on.note() && e.channel() == on.channel())
113 for (
auto& e : events_)
114 e.timestamp += offset;
118 const std::vector<TimestampedMidiEvent>&
events()
const {
return events_; }
121 auto begin()
const {
return events_.begin(); }
122 auto end()
const {
return events_.end(); }
125 std::vector<TimestampedMidiEvent> events_;
std::vector< const TimestampedMidiEvent * > events_in_range(double start, double end) const
Find events in a time range [start, end).
Definition midi_message_sequence.hpp:89
void add_cc(double timestamp, int channel, int cc, int value)
Add a CC event.
Definition midi_message_sequence.hpp:67
void add_event(const TimestampedMidiEvent &event)
Add an event (maintains sorted order by timestamp).
Definition midi_message_sequence.hpp:38
MidiMessageSequence()=default
void offset_timestamps(double offset)
Shift all timestamps by an offset.
Definition midi_message_sequence.hpp:112
std::optional< int > find_note_off(int note_on_index) const
Find matching note-off for a note-on event.
Definition midi_message_sequence.hpp:98
auto begin() const
Iterator support.
Definition midi_message_sequence.hpp:121
double duration() const
Duration (timestamp of last event).
Definition midi_message_sequence.hpp:86
void add_note_off(double timestamp, int channel, int note)
Add a note-off event.
Definition midi_message_sequence.hpp:57
int size() const
Number of events.
Definition midi_message_sequence.hpp:77
void clear()
Clear all events.
Definition midi_message_sequence.hpp:83
const std::vector< TimestampedMidiEvent > & events() const
Get all events (const).
Definition midi_message_sequence.hpp:118
auto end() const
Definition midi_message_sequence.hpp:122
void add_note_on(double timestamp, int channel, int note, int velocity)
Add a note-on event.
Definition midi_message_sequence.hpp:47
const TimestampedMidiEvent & operator[](int i) const
Access event by index.
Definition midi_message_sequence.hpp:80
Definition custom_node_events.hpp:26
A MIDI event with timestamp (in seconds or samples).
Definition midi_message_sequence.hpp:16
int velocity() const
Definition midi_message_sequence.hpp:29
uint8_t data1
Definition midi_message_sequence.hpp:19
uint8_t status
Definition midi_message_sequence.hpp:18
uint8_t data2
Definition midi_message_sequence.hpp:20
int channel() const
Definition midi_message_sequence.hpp:27
bool is_note_on() const
Definition midi_message_sequence.hpp:23
bool is_note_off() const
Definition midi_message_sequence.hpp:24
bool is_sysex() const
Definition midi_message_sequence.hpp:26
std::vector< uint8_t > sysex
Definition midi_message_sequence.hpp:21
int note() const
Definition midi_message_sequence.hpp:28
double timestamp
Definition midi_message_sequence.hpp:17
bool is_cc() const
Definition midi_message_sequence.hpp:25