Catch keyboard events on notes.
[ardour.git] / gtk2_ardour / midi_streamview.cc
index 862e554cae8df9794c99da5de2bb7bc855985203..7d3c05a87697d6397e955d8c03192306ed8d1f1b 100644 (file)
@@ -54,8 +54,9 @@ using namespace Editing;
 
 MidiStreamView::MidiStreamView (MidiTimeAxisView& tv)
        : StreamView (tv)
-       , _lowest_note(0)
-       , _highest_note(127)
+       , _range(ContentsRange)
+       , _lowest_note(60)
+       , _highest_note(60)
 {
        if (tv.is_track())
                stream_base_color = ARDOUR_UI::config()->canvasvar_MidiTrackBase.get();
@@ -137,17 +138,13 @@ MidiStreamView::display_region(MidiRegionView* region_view, bool redisplay_event
        
        boost::shared_ptr<MidiSource> source(region_view->midi_region()->midi_source(0));
 
-       for (size_t i=0; i < source->model()->n_events(); ++i) {
-               const MidiEvent& ev = source->model()->event_at(i);
+       for (size_t i=0; i < source->model()->n_notes(); ++i) {
+               const MidiModel::Note& note = source->model()->note_at(i);
                
-               // Look at all note on events to find our note range
-               if ((ev.buffer[0] & 0xF0) == MIDI_CMD_NOTE_ON) {
-                       _lowest_note = min(_lowest_note, ev.buffer[1]);
-                       _highest_note = max(_highest_note, ev.buffer[1]);
-               }
+               update_bounds(note.note());
 
                if (redisplay_events)
-                       region_view->add_event(ev);
+                       region_view->add_note(note);
        }
        
        if (redisplay_events)
@@ -164,8 +161,8 @@ MidiStreamView::redisplay_diskstream ()
                (*i)->set_valid (false);
        }
        
-       _lowest_note = 60; // middle C
-       _highest_note = _lowest_note + 11;
+       //_lowest_note = 60; // middle C
+       //_highest_note = _lowest_note + 11;
 
        if (_trackview.is_midi_track()) {
                _trackview.get_diskstream()->playlist()->foreach_region (static_cast<StreamView*>(this), &StreamView::add_region_view);
@@ -191,6 +188,13 @@ MidiStreamView::redisplay_diskstream ()
                region_layered (*i);
        }
 }
+       
+void 
+MidiStreamView::update_bounds(uint8_t note_num)
+{
+       _lowest_note = min(_lowest_note, note_num);
+       _highest_note = max(_highest_note, note_num);
+}
 
 
 void
@@ -390,8 +394,8 @@ MidiStreamView::update_rec_regions (boost::shared_ptr<MidiBuffer> data, nframes_
 
                                                /* draw events */
                                                MidiRegionView* mrv = (MidiRegionView*)iter->second;
-                                               for (size_t i = 0; i < data->size(); ++i) {
-                                                       const MidiEvent& ev = (*data.get())[i];
+                                               for (MidiBuffer::iterator i = data->begin(); i != data->end(); ++i) {
+                                                       const MidiEvent& ev = *i;
                                                        mrv->add_event(ev);
                                                        mrv->extend_active_notes();
                                                }