mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-21 14:16:31 +01:00
add skeleton for full MidiStateTracker
This commit is contained in:
parent
1ab49bcc32
commit
04004d2178
2 changed files with 112 additions and 3 deletions
|
|
@ -41,16 +41,19 @@ class LIBARDOUR_API MidiNoteTracker
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MidiNoteTracker();
|
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 MidiBuffer::const_iterator& from, const MidiBuffer::const_iterator& to);
|
||||||
void track (const uint8_t* evbuf);
|
|
||||||
void add (uint8_t note, uint8_t chn);
|
void add (uint8_t note, uint8_t chn);
|
||||||
void remove (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 (MidiBuffer& buffer, samplepos_t time);
|
||||||
void resolve_notes (Evoral::EventSink<samplepos_t>& 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 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; }
|
bool empty() const { return _on == 0; }
|
||||||
uint16_t on() const { return _on; }
|
uint16_t on() const { return _on; }
|
||||||
bool active (uint8_t note, uint8_t channel) {
|
bool active (uint8_t note, uint8_t channel) {
|
||||||
|
|
@ -67,6 +70,25 @@ private:
|
||||||
uint16_t _on;
|
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
|
} // namespace ARDOUR
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -212,3 +212,90 @@ MidiNoteTracker::dump (ostream& o)
|
||||||
}
|
}
|
||||||
o << "+++++\n";
|
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…
Add table
Add a link
Reference in a new issue