From 04004d21783ba16a24187d4c25e2575b4227c30f Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 1 Feb 2022 17:33:44 -0700 Subject: [PATCH] add skeleton for full MidiStateTracker --- libs/ardour/ardour/midi_state_tracker.h | 28 +++++++- libs/ardour/midi_state_tracker.cc | 87 +++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 3 deletions(-) diff --git a/libs/ardour/ardour/midi_state_tracker.h b/libs/ardour/ardour/midi_state_tracker.h index a69e5efddc..0922c8c1d4 100644 --- a/libs/ardour/ardour/midi_state_tracker.h +++ b/libs/ardour/ardour/midi_state_tracker.h @@ -41,16 +41,19 @@ class LIBARDOUR_API MidiNoteTracker { public: MidiNoteTracker(); + virtual ~MidiNoteTracker() {} + + virtual void track (const uint8_t* evbuf); + virtual void dump (std::ostream&); + virtual void reset (); 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, samplepos_t time); void resolve_notes (Evoral::EventSink& buffer, samplepos_t time); void resolve_notes (MidiSource& src, const Glib::Threads::Mutex::Lock& lock, Temporal::Beats time); - void dump (std::ostream&); - void reset (); + bool empty() const { return _on == 0; } uint16_t on() const { return _on; } bool active (uint8_t note, uint8_t channel) { @@ -67,6 +70,25 @@ private: uint16_t _on; }; +class LIBARDOUR_API MidiStateTracker : public MidiNoteTracker +{ + public: + MidiStateTracker (); + ~MidiStateTracker() {} + + void track (const uint8_t* evbuf); + void dump (std::ostream&); + void reset (); + + void resolve (MidiBuffer&, samplepos_t); + + private: + uint8_t have_program[16]; + uint8_t program[16]; + uint16_t bender[16]; + uint16_t pressure[16]; + uint8_t control[16][127]; +}; } // namespace ARDOUR diff --git a/libs/ardour/midi_state_tracker.cc b/libs/ardour/midi_state_tracker.cc index 10877c89dc..4d7128d3fb 100644 --- a/libs/ardour/midi_state_tracker.cc +++ b/libs/ardour/midi_state_tracker.cc @@ -212,3 +212,90 @@ MidiNoteTracker::dump (ostream& o) } o << "+++++\n"; } + +/*----------------*/ + +MidiStateTracker::MidiStateTracker () +{ + reset (); +} + +void +MidiStateTracker::reset () +{ + const size_t n_channels = 16; + const size_t n_controls = 127; + + MidiNoteTracker::reset (); + + for (size_t n = 0; n < n_channels; ++n) { + have_program[n] = 0; + } + + for (size_t n = 0; n < n_channels; ++n) { + program[n] = 0; + } + + for (size_t chn = 0; chn < n_channels; ++chn) { + for (size_t c = 0; c < n_controls; ++c) { + control[chn][c] = 0; + } + } +} + +void +MidiStateTracker::dump (ostream& o) +{ + MidiNoteTracker::dump (o); + o << "implement MidiStateTracker::dump()"; +} + +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: + MidiNoteTracker::reset(); + break; + case MIDI_CMD_NOTE_ON: + add (evbuf[1], chan); + break; + case MIDI_CMD_NOTE_OFF: + remove (evbuf[1], chan); + break; + + case MIDI_CMD_CONTROL: + control[chan][evbuf[1]] = evbuf[2]; + break; + + case MIDI_CMD_PGM_CHANGE: + program[chan] = evbuf[1]; + have_program[chan] = 1; + break; + + case MIDI_CMD_CHANNEL_PRESSURE: + pressure[chan] = evbuf[1]; + break; + + case MIDI_CMD_NOTE_PRESSURE: + break; + + case MIDI_CMD_BENDER: + break; + + case MIDI_CMD_COMMON_RESET: + reset (); + break; + + default: + break; + } +} + +void +MidiStateTracker::resolve (MidiBuffer& buffer, samplepos_t time) +{ + /* XXX implement me */ +}