X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmidi_streamview.cc;h=90e6147763ab95827af368850550763c030d2f57;hb=8cd71108c1d153f84f25c3b9e5153a110826c130;hp=2fb3bba597ae20d2daf3e083f59c830dbd3f1ba2;hpb=3d05125a86d99edd5f498221d4cb0ec3935930a7;p=ardour.git diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 2fb3bba597..90e6147763 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -17,21 +17,19 @@ */ #include -#include #include #include #include -#include "ardour/midi_diskstream.h" -#include "ardour/midi_playlist.h" #include "ardour/midi_region.h" #include "ardour/midi_source.h" #include "ardour/midi_track.h" +#include "ardour/operations.h" #include "ardour/region_factory.h" -#include "ardour/smf_source.h" #include "ardour/session.h" +#include "ardour/smf_source.h" #include "ardour_ui.h" #include "canvas-simplerect.h" @@ -50,6 +48,8 @@ #include "simplerect.h" #include "utils.h" +#include "i18n.h" + using namespace std; using namespace ARDOUR; using namespace PBD; @@ -103,32 +103,6 @@ MidiStreamView::~MidiStreamView () { } -static void -veto_note_range(uint8_t& min, uint8_t& max) -{ - /* Legal notes, thanks */ - clamp_to_0_127(min); - clamp_to_0_127(max); - - /* Always display at least one octave in [0, 127] */ - if (max == 127) { - if (min > (127 - 11)) { - min = 127 - 11; - } - } else if (max < min + 11) { - uint8_t d = 11 - (max - min); - if (max + d/2 > 127) { - min -= d; - } else { - min -= d / 2; - max += d / 2; - } - } - assert(max - min >= 11); - assert(max <= 127); - assert(min <= 127); -} - RegionView* MidiStreamView::create_region_view (boost::shared_ptr r, bool /*wfd*/, bool) { @@ -184,8 +158,14 @@ MidiStreamView::add_region_view_internal (boost::shared_ptr r, bool wfd, /* display events and find note range */ display_region (region_view, wfd); + /* fit note range if we are importing */ + if (_trackview.session()->operation_in_progress (Operations::insert_file)) { + set_note_range (ContentsRange); + } + /* catch regionview going away */ - region->DropReferences.connect (*this, invalidator (*this), boost::bind (&MidiStreamView::remove_region_view, this, region), gui_context()); + boost::weak_ptr wr (region); // make this explicit + region->DropReferences.connect (*this, invalidator (*this), boost::bind (&MidiStreamView::remove_region_view, this, wr), gui_context()); RegionViewAdded (region_view); @@ -275,12 +255,6 @@ MidiStreamView::redisplay_track () _data_note_max = 71; } - // Extend visible range to show newly recorded data, if necessary - _lowest_note = std::min(_lowest_note, _data_note_min); - _highest_note = std::max(_highest_note, _data_note_max); - - veto_note_range(_lowest_note, _highest_note); - // Flag region views as invalid and disable drawing for (i = region_views.begin(); i != region_views.end(); ++i) { (*i)->set_valid(false); @@ -321,7 +295,8 @@ MidiStreamView::draw_note_lines() _note_lines->clear(); - if (child_height() < 140){ + if (child_height() < 140 || note_height() < 3) { + /* track is too small for note lines, or there are too many */ return; } @@ -426,7 +401,6 @@ MidiStreamView::apply_note_range_to_regions () void MidiStreamView::update_note_range(uint8_t note_num) { - assert(note_num <= 127); _data_note_min = min(_data_note_min, note_num); _data_note_max = max(_data_note_max, note_num); } @@ -487,21 +461,23 @@ MidiStreamView::setup_rec_box () boost::shared_ptr region (boost::dynamic_pointer_cast (RegionFactory::create (sources, plist, false))); - - assert(region); - region->set_start (_trackview.track()->current_capture_start() - _trackview.track()->get_capture_start_frame (0), this); - region->set_position (_trackview.track()->current_capture_start(), this); - RegionView* rv = add_region_view_internal (region, false); - MidiRegionView* mrv = dynamic_cast (rv); - mrv->begin_write (); - - rec_regions.push_back (make_pair (region, rv)); - - // rec regions are destroyed in setup_rec_box - - /* we add the region later */ - - setup_new_rec_layer_time (region); + if (region) { + region->set_start (_trackview.track()->current_capture_start() + - _trackview.track()->get_capture_start_frame (0)); + region->set_position (_trackview.track()->current_capture_start()); + RegionView* rv = add_region_view_internal (region, false); + MidiRegionView* mrv = dynamic_cast (rv); + mrv->begin_write (); + + + /* rec region will be destroyed in setup_rec_box */ + rec_regions.push_back (make_pair (region, rv)); + + /* we add the region later */ + setup_new_rec_layer_time (region); + } else { + error << _("failed to create MIDI region") << endmsg; + } } /* start a new rec box */ @@ -512,8 +488,6 @@ MidiStreamView::setup_rec_box () gdouble const xend = xstart; uint32_t fill_color; - assert(_trackview.midi_track()->mode() == Normal); - fill_color = ARDOUR_UI::config()->canvasvar_RecordingRect.get(); ArdourCanvas::SimpleRect * rec_rect = new Gnome::Canvas::SimpleRect (*_canvas_group); @@ -639,7 +613,7 @@ MidiStreamView::update_rec_box () /* Update the region being recorded to reflect where we currently are */ boost::shared_ptr region = rec_regions.back().first; - region->set_length (_trackview.track()->current_capture_end () - _trackview.track()->current_capture_start(), this); + region->set_length (_trackview.track()->current_capture_end () - _trackview.track()->current_capture_start()); MidiRegionView* mrv = dynamic_cast (rec_regions.back().second); mrv->extend_active_notes (); @@ -680,3 +654,15 @@ MidiStreamView::resume_updates () draw_note_lines (); apply_note_range_to_regions (); } + +void +MidiStreamView::leave_internal_edit_mode () +{ + StreamView::leave_internal_edit_mode (); + for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) { + MidiRegionView* mrv = dynamic_cast (*i); + if (mrv) { + mrv->clear_selection (); + } + } +}