Clean up state tracking of raw MIDI.
authorDavid Robillard <d@drobilla.net>
Sun, 30 Nov 2014 23:33:22 +0000 (18:33 -0500)
committerDavid Robillard <d@drobilla.net>
Mon, 1 Dec 2014 04:56:19 +0000 (23:56 -0500)
libs/ardour/ardour/midi_ring_buffer.h
libs/ardour/ardour/midi_state_tracker.h
libs/ardour/midi_ring_buffer.cc
libs/ardour/midi_state_tracker.cc

index 78d14b91851d810ffa365e192ca80ed84e073d2c..13588e4f046fcb20ff44a8b21bda53fe88c6cc30 100644 (file)
@@ -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;
index 1a3d480045d5d148c1879afb6f161ebb46ba7fc3..d8a31c10aaddc8df3974424de45ddc85bcd8c8ee 100644 (file)
@@ -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:
index 555ac6fb96c6422975655688ee8f9eaf3092d9c0..0da3ba68354065eaf5c5cb27197a14b8ef5694d8 100644 (file)
@@ -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;
index 0eac3819f23d0500cec1d64bdc01baabc9e446d3..afe6f07db7438ea35c2293489bdd46d4ae3e5f38 100644 (file)
@@ -91,6 +91,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)
 {