Fix vertical order of MIDI notes.

Extend current active notes to end of region while recording.
Initialize note state correctly.


git-svn-id: svn://localhost/ardour2/trunk@1945 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
David Robillard
2007-06-02 00:55:32 +00:00
parent 7bfe236ba7
commit b6814c4839
4 changed files with 21 additions and 3 deletions

View File

@@ -122,7 +122,9 @@ MidiRegionView::add_ghost (AutomationTimeAxisView& atv)
void
MidiRegionView::begin_write()
{
_active_notes = new ArdourCanvas::SimpleRect*[127];
_active_notes = new ArdourCanvas::SimpleRect*[128];
for (unsigned i=0; i < 128; ++i)
_active_notes[i] = NULL;
}
@@ -148,7 +150,7 @@ MidiRegionView::add_event (const MidiEvent& ev)
double y1 = trackview.height / 2.0;
if ((ev.buffer[0] & 0xF0) == MIDI_CMD_NOTE_ON) {
const Byte& note = ev.buffer[1];
y1 = (trackview.height / 127.0) * note;
y1 = trackview.height - ((trackview.height / 127.0) * note);
ArdourCanvas::SimpleRect * ev_rect = new Gnome::Canvas::SimpleRect(
*(ArdourCanvas::Group*)get_canvas_group());
@@ -179,4 +181,18 @@ MidiRegionView::add_event (const MidiEvent& ev)
}
/** Extend active notes to rightmost edge of region (if length is changed)
*/
void
MidiRegionView::extend_active_notes()
{
if (!_active_notes)
return;
for (unsigned i=0; i < 128; ++i)
if (_active_notes[i])
_active_notes[i]->property_x2() = trackview.editor.frame_to_pixel(_region->length());
}

View File

@@ -66,6 +66,7 @@ class MidiRegionView : public RegionView
void begin_write();
void end_write();
void extend_active_notes();
protected:

View File

@@ -356,6 +356,7 @@ MidiStreamView::update_rec_regions (boost::shared_ptr<MidiBuffer> data, nframes_
for (size_t i = 0; i < data->size(); ++i) {
const MidiEvent& ev = (*data.get())[i];
mrv->add_event(ev);
mrv->extend_active_notes();
}
}

View File

@@ -51,7 +51,7 @@ MidiModel::append(const MidiBuffer& buf)
{
for (size_t i=0; i < buf.size(); ++i) {
const MidiEvent& buf_event = buf[i];
assert(buf_event.time >= _events.back().time);
assert(_events.empty() || buf_event.time >= _events.back().time);
_events.push_back(buf_event);
MidiEvent& my_event = _events.back();