diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-06-03 16:02:49 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-06-03 16:02:49 +0000 |
commit | dab0dacc66dcc190b4408ba75e3807973582cbd6 (patch) | |
tree | 8bc042db573192eaf61a9d046598deb9815a52fb /gtk2_ardour/midi_streamview.cc | |
parent | 9208598c2653ccaf7af30f3f6289851fcbb37a32 (diff) |
patch from lincoln to make MIDI track height changes no longer just grow note height, but instead expand the visible note range once notes hit a given height
git-svn-id: svn://localhost/ardour2/branches/3.0@7222 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/midi_streamview.cc')
-rw-r--r-- | gtk2_ardour/midi_streamview.cc | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 4ab4c7154e..ed0ed50737 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -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); } } |