add skeleton for full MidiStateTracker

This commit is contained in:
Paul Davis 2022-02-01 17:33:44 -07:00
parent 1ab49bcc32
commit 04004d2178
2 changed files with 112 additions and 3 deletions

View File

@ -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<samplepos_t>& 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

View File

@ -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 */
}