add skeleton for full MidiStateTracker
This commit is contained in:
parent
1ab49bcc32
commit
04004d2178
|
@ -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
|
||||
|
||||
|
|
|
@ -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 */
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user