summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2014-11-30 18:33:22 -0500
committerDavid Robillard <d@drobilla.net>2014-11-30 23:56:19 -0500
commit008bfceb77298f21c592a3860d75d5cc4b315e4d (patch)
tree34e19194b2d450daa3b77aa0cf1c3062314bad0e /libs/ardour
parent0f72ea4a349480cf1272571395f63c10b6152b4f (diff)
Clean up state tracking of raw MIDI.
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/midi_ring_buffer.h20
-rw-r--r--libs/ardour/ardour/midi_state_tracker.h15
-rw-r--r--libs/ardour/midi_ring_buffer.cc8
-rw-r--r--libs/ardour/midi_state_tracker.cc18
4 files changed, 22 insertions, 39 deletions
diff --git a/libs/ardour/ardour/midi_ring_buffer.h b/libs/ardour/ardour/midi_ring_buffer.h
index 78d14b9185..13588e4f04 100644
--- a/libs/ardour/ardour/midi_ring_buffer.h
+++ b/libs/ardour/ardour/midi_ring_buffer.h
@@ -57,25 +57,7 @@ public:
void flush (framepos_t start, framepos_t end);
void reset_tracker ();
- void loop_resolve (MidiBuffer& dst, framepos_t);
-
-protected:
- inline bool is_channel_event(uint8_t event_type_byte) {
- // mask out channel information
- event_type_byte &= 0xF0;
- // midi channel events range from 0x80 to 0xE0
- return (0x80 <= event_type_byte) && (event_type_byte <= 0xE0);
- }
-
- inline bool is_note_on(uint8_t event_type_byte) {
- // mask out channel information
- return (event_type_byte & 0xF0) == MIDI_CMD_NOTE_ON;
- }
-
- inline bool is_note_off(uint8_t event_type_byte) {
- // mask out channel information
- return (event_type_byte & 0xF0) == MIDI_CMD_NOTE_OFF;
- }
+ void loop_resolve (MidiBuffer& dst, framepos_t);
private:
MidiStateTracker _tracker;
diff --git a/libs/ardour/ardour/midi_state_tracker.h b/libs/ardour/ardour/midi_state_tracker.h
index 1a3d480045..d8a31c10aa 100644
--- a/libs/ardour/ardour/midi_state_tracker.h
+++ b/libs/ardour/ardour/midi_state_tracker.h
@@ -39,6 +39,7 @@ public:
MidiStateTracker();
void track (const MidiBuffer::const_iterator& from, const MidiBuffer::const_iterator& to);
+ void track (const uint8_t* evbuf);
void add (uint8_t note, uint8_t chn);
void remove (uint8_t note, uint8_t chn);
void resolve_notes (MidiBuffer& buffer, framepos_t time);
@@ -54,19 +55,7 @@ public:
template<typename Time>
void track (const Evoral::Event<Time>& ev) {
- const uint8_t type = ev.buffer()[0] & 0xF0;
- const uint8_t chan = ev.buffer()[0] & 0x0F;
- switch (type) {
- case MIDI_CTL_ALL_NOTES_OFF:
- reset();
- break;
- case MIDI_CMD_NOTE_ON:
- add(ev.buffer()[1], chan);
- break;
- case MIDI_CMD_NOTE_OFF:
- remove(ev.buffer()[1], chan);
- break;
- }
+ track (ev.buffer());
}
private:
diff --git a/libs/ardour/midi_ring_buffer.cc b/libs/ardour/midi_ring_buffer.cc
index 555ac6fb96..0da3ba6835 100644
--- a/libs/ardour/midi_ring_buffer.cc
+++ b/libs/ardour/midi_ring_buffer.cc
@@ -114,13 +114,7 @@ MidiRingBuffer<T>::read(MidiBuffer& dst, framepos_t start, framepos_t end, frame
#endif
if (success) {
-
- if (is_note_on(write_loc[0]) ) {
- _tracker.add (write_loc[1], write_loc[0] & 0xf);
- } else if (is_note_off(write_loc[0])) {
- _tracker.remove (write_loc[1], write_loc[0] & 0xf);
- }
-
+ _tracker.track(write_loc);
++count;
} else {
cerr << "WARNING: error reading event contents from MIDI ring" << endl;
diff --git a/libs/ardour/midi_state_tracker.cc b/libs/ardour/midi_state_tracker.cc
index 0eac3819f2..afe6f07db7 100644
--- a/libs/ardour/midi_state_tracker.cc
+++ b/libs/ardour/midi_state_tracker.cc
@@ -92,6 +92,24 @@ MidiStateTracker::track (const MidiBuffer::const_iterator &from, const MidiBuffe
}
void
+MidiStateTracker::track (const uint8_t* evbuf)
+{
+ const uint8_t type = evbuf[0] & 0xF0;
+ const uint8_t chan = evbuf[0] & 0x0F;
+ switch (type) {
+ case MIDI_CTL_ALL_NOTES_OFF:
+ reset();
+ break;
+ case MIDI_CMD_NOTE_ON:
+ add(evbuf[1], chan);
+ break;
+ case MIDI_CMD_NOTE_OFF:
+ remove(evbuf[1], chan);
+ break;
+ }
+}
+
+void
MidiStateTracker::resolve_notes (MidiBuffer &dst, framepos_t time)
{
DEBUG_TRACE (PBD::DEBUG::MidiTrackers, string_compose ("%1 MB-resolve notes @ %2 on = %3\n", this, time, _on));