13
0

* preliminary impl for PGM Change support in MidiModel

git-svn-id: svn://localhost/ardour2/branches/3.0@3283 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Hans Baier 2008-04-24 15:04:56 +00:00
parent f91006d8d2
commit d9de6f2c4c
3 changed files with 43 additions and 8 deletions

View File

@ -261,8 +261,9 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, boost::shared_ptr<Route> rt
global_vpacker.pack_start (*gain_meter_alignment,Gtk::PACK_SHRINK);
global_vpacker.pack_start (bottom_button_table,Gtk::PACK_SHRINK);
global_vpacker.pack_start (post_processor_box, true, true);
if (!is_midi_track())
if (!is_midi_track()) {
global_vpacker.pack_start (panners, Gtk::PACK_SHRINK);
}
global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
global_vpacker.pack_start (comment_button, Gtk::PACK_SHRINK);

View File

@ -92,7 +92,6 @@ public:
inline size_t n_notes() const { return _notes.size(); }
inline bool empty() const { return _notes.size() == 0 && _controls.size() == 0; }
typedef std::vector< boost::shared_ptr<Note> > Notes;
inline static bool note_time_comparator (const boost::shared_ptr<const Note> a,
const boost::shared_ptr<const Note> b) {
@ -107,9 +106,14 @@ public:
}
};
typedef std::vector< boost::shared_ptr<Note> > Notes;
inline Notes& notes() { return _notes; }
inline const Notes& notes() const { return _notes; }
typedef std::vector<MIDI::Event> PgmChanges;
inline PgmChanges& pgm_changes() { return _pgm_changes; }
inline const PgmChanges& pgm_changes() const { return _pgm_changes; }
/** Add/Remove notes.
* Technically all operations can be implemented as one of these.
*/
@ -191,6 +195,7 @@ public:
Notes::const_iterator _note_iter;
std::vector<MidiControlIterator> _control_iters;
std::vector<MidiControlIterator>::iterator _control_iter;
PgmChanges::const_iterator _pgm_change_iter;
};
const_iterator begin() const { return const_iterator(*this, 0); }
@ -217,7 +222,9 @@ private:
mutable Glib::RWLock _lock;
Notes _notes;
Notes _notes;
PgmChanges _pgm_changes;
NoteMode _note_mode;
typedef std::vector<size_t> WriteNotes;

View File

@ -131,16 +131,33 @@ MidiModel::const_iterator::const_iterator(const MidiModel& model, double t)
else
_control_iter = _control_iters.end();
_pgm_change_iter = model.pgm_changes().end();
// find first program change which begins after t
for (vector<MIDI::Event>::const_iterator i = model.pgm_changes().begin(); i != model.pgm_changes().end(); ++i) {
if (i->time() >= t) {
_pgm_change_iter = i;
break;
}
}
if(_pgm_change_iter != model.pgm_changes().end()) {
if(_pgm_change_iter->time() <= _event.time()) {
_event = MIDI::Event((*_pgm_change_iter), true);
}
}
if (_event.size() == 0) {
//cerr << "Created MIDI iterator @ " << t << " is at end." << endl;
_is_end = true;
// FIXME: possible race condition here....
if(_locked) {
_model->read_unlock();
_locked = false;
_model->read_unlock();
_locked = false;
}
} else {
printf("MIDI Iterator = %X @ %lf\n", _event.type(), _event.time());
}
}
}
@ -194,7 +211,7 @@ MidiModel::const_iterator::operator++()
*/
enum Type { NIL, NOTE_ON, NOTE_OFF, CC };
enum Type { NIL, NOTE_ON, NOTE_OFF, CC, PGM_CHANGE, PITCH_BENDER };
Type type = NIL;
double t = 0;
@ -219,6 +236,12 @@ MidiModel::const_iterator::operator++()
if (type == NIL || _control_iter->x < t)
type = CC;
*/
if(_pgm_change_iter != _model->pgm_changes().end()) {
if(_pgm_change_iter->time() <= t) {
type = PGM_CHANGE;
t = _pgm_change_iter->time();
}
}
if (type == NOTE_ON) {
cerr << "********** MIDI Iterator = note on" << endl;
@ -232,6 +255,9 @@ MidiModel::const_iterator::operator++()
} else if (type == CC) {
cerr << "********** MIDI Iterator = CC" << endl;
_model->control_to_midi_event(_event, *_control_iter);
} else if (type == PGM_CHANGE) {
cerr << "********** MIDI Iterator = program change" << endl;
_event = MIDI::Event(*_pgm_change_iter, true);
} else {
cerr << "********** MIDI Iterator = END" << endl;
_is_end = true;
@ -269,6 +295,7 @@ MidiModel::const_iterator::operator=(const const_iterator& other)
_note_iter = other._note_iter;
_control_iters = other._control_iters;
_control_iter = other._control_iter;
_pgm_change_iter = other._pgm_change_iter;
assert( ! _event.owns_buffer());