diff options
author | David Robillard <d@drobilla.net> | 2014-11-30 18:33:22 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2014-11-30 23:56:19 -0500 |
commit | 008bfceb77298f21c592a3860d75d5cc4b315e4d (patch) | |
tree | 34e19194b2d450daa3b77aa0cf1c3062314bad0e /libs/ardour | |
parent | 0f72ea4a349480cf1272571395f63c10b6152b4f (diff) |
Clean up state tracking of raw MIDI.
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/midi_ring_buffer.h | 20 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_state_tracker.h | 15 | ||||
-rw-r--r-- | libs/ardour/midi_ring_buffer.cc | 8 | ||||
-rw-r--r-- | libs/ardour/midi_state_tracker.cc | 18 |
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)); |