patch from lincoln to make MIDI track height changes no longer just grow note height...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 3 Jun 2010 16:02:49 +0000 (16:02 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 3 Jun 2010 16:02:49 +0000 (16:02 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7222 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/midi_streamview.cc

index 4ab4c7154e46e63424ea5fb6787f50d8746f0bb8..ed0ed5073703c7bfaebab38bd761a4dead5799df 100644 (file)
@@ -299,7 +299,7 @@ MidiStreamView::update_contents_height ()
        StreamView::update_contents_height();
        _note_lines->property_y2() = height;
 
-       draw_note_lines();
+        apply_note_range (lowest_note(), highest_note(), true);
 }
 
 void
@@ -362,13 +362,42 @@ MidiStreamView::apply_note_range(uint8_t lowest, uint8_t highest, bool to_region
 {
        _highest_note = highest;
        _lowest_note = lowest;
+       
+       int range = _highest_note - _lowest_note;  
+       int pixels_per_note = floor (height/range);
+       
+       /* do not grow note display beyont 10 pixels */
+       if (pixels_per_note > 10){
+               
+               int available_note_range = floor ((height)/10);
+               int additional_notes = available_note_range - range;
+               
+               /* distribute additional notes to higher and lower ranges, clamp at 0 and 127 */
+               for (int i = 0; i < additional_notes; i++){
+                       
+                       if (i % 2 && _highest_note < 127){
+                               _highest_note++;
+                       }
+                       else if (i % 2) {
+                               _lowest_note--;
+                       }
+                       else if (_lowest_note > 0){
+                               _lowest_note--;
+                       }
+                       else {
+                               _highest_note++;
+                       }
+               }
+       }
+       
        note_range_adjustment.set_page_size(_highest_note - _lowest_note);
        note_range_adjustment.set_value(_lowest_note);
+       
        draw_note_lines();
 
        if (to_region_views) {
                for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
-                       ((MidiRegionView*)(*i))->apply_note_range(lowest, highest);
+                       ((MidiRegionView*)(*i))->apply_note_range(_lowest_note, _highest_note);
                }
        }