X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmidi_streamview.cc;h=3bd46959def714b7fb6b339bb10f60f6361e69cb;hb=71a4796dc3dbf8a7fe1df5c5d7acea388b40eae0;hp=ba6d1b999ce08d5b67a1797ce38113033d511cac;hpb=14b0ca31bcb62e5b7e9e77634ef9cd2e8cf65800;p=ardour.git diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index ba6d1b999c..3bd46959de 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -63,22 +63,15 @@ MidiStreamView::MidiStreamView (MidiTimeAxisView& tv) , _highest_note(71) , _data_note_min(60) , _data_note_max(71) + , _note_lines (0) { - if (tv.is_track()) { - stream_base_color = ARDOUR_UI::config()->canvasvar_MidiTrackBase.get(); - } else { - stream_base_color = ARDOUR_UI::config()->canvasvar_MidiBusBase.get(); - } - - use_rec_regions = tv.editor().show_waveforms_recording (); - /* use a group dedicated to MIDI underlays. Audio underlays are not in this group. */ - midi_underlay_group = new ArdourCanvas::Group (*canvas_group); + midi_underlay_group = new ArdourCanvas::Group (*_canvas_group); midi_underlay_group->lower_to_bottom(); /* put the note lines in the timeaxisview's group, so it can be put below ghost regions from MIDI underlays*/ - _note_lines = new ArdourCanvas::LineSet(*canvas_group, ArdourCanvas::LineSet::Horizontal); + _note_lines = new ArdourCanvas::LineSet(*_canvas_group, ArdourCanvas::LineSet::Horizontal); _note_lines->property_x1() = 0; _note_lines->property_y1() = 0; @@ -91,7 +84,9 @@ MidiStreamView::MidiStreamView (MidiTimeAxisView& tv) _note_lines->lower_to_bottom(); - ColorsChanged.connect(sigc::mem_fun(*this, &MidiStreamView::draw_note_lines)); + color_handler (); + + ColorsChanged.connect(sigc::mem_fun(*this, &MidiStreamView::color_handler)); note_range_adjustment.set_page_size(_highest_note - _lowest_note); note_range_adjustment.set_value(_lowest_note); @@ -139,9 +134,9 @@ MidiStreamView::create_region_view (boost::shared_ptr r, bool /*wfd*/, b return 0; } - RegionView* region_view = new MidiRegionView (canvas_group, _trackview, region, + RegionView* region_view = new MidiRegionView (_canvas_group, _trackview, region, _samples_per_unit, region_color); - + region_view->init (region_color, false); return region_view; @@ -211,10 +206,12 @@ MidiStreamView::display_region(MidiRegionView* region_view, bool load_model) } void -MidiStreamView::display_diskstream (boost::shared_ptr ds) +MidiStreamView::display_track (boost::shared_ptr tr) { - StreamView::display_diskstream(ds); + StreamView::display_track (tr); + draw_note_lines(); + NoteRangeChanged(); } @@ -246,7 +243,7 @@ MidiStreamView::update_data_note_range(uint8_t min, uint8_t max) } void -MidiStreamView::redisplay_diskstream () +MidiStreamView::redisplay_track () { if (!_trackview.is_midi_track()) { return; @@ -258,7 +255,7 @@ MidiStreamView::redisplay_diskstream () _range_dirty = false; _data_note_min = 127; _data_note_max = 0; - _trackview.get_diskstream()->playlist()->foreach_region( + _trackview.track()->playlist()->foreach_region( sigc::mem_fun (*this, &StreamView::update_contents_metrics) ); @@ -281,7 +278,7 @@ MidiStreamView::redisplay_diskstream () } // Add and display region views, and flag them as valid - _trackview.get_diskstream()->playlist()->foreach_region( + _trackview.track()->playlist()->foreach_region( sigc::hide_return (sigc::mem_fun (*this, &StreamView::add_region_view)) ); @@ -298,17 +295,26 @@ 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 MidiStreamView::draw_note_lines() { + if (!_note_lines) { + return; + } + double y; double prev_y = contents_height(); uint32_t color; _note_lines->clear(); + + if(height < 140){ + return; + } for (int i = lowest_note(); i <= highest_note(); ++i) { y = floor(note_to_y(i)); @@ -357,13 +363,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 height beyond 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::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); } } @@ -387,24 +422,22 @@ MidiStreamView::setup_rec_box () if (!rec_active && _trackview.session()->record_status() == Session::Recording && - _trackview.get_diskstream()->record_enabled()) { + _trackview.track()->record_enabled()) { - if (use_rec_regions && rec_regions.size() == rec_rects.size()) { + if (Config->get_show_waveforms_while_recording() && rec_regions.size() == rec_rects.size()) { - /* add a new region, but don't bother if they set use_rec_regions mid-record */ + /* add a new region, but don't bother if they set show-waveforms-while-recording mid-record */ MidiRegion::SourceList sources; rec_data_ready_connections.drop_connections (); - boost::shared_ptr mds = _trackview.midi_track()->midi_diskstream(); - - sources.push_back(mds->write_source()); + sources.push_back (_trackview.midi_track()->write_source()); - mds->write_source()->ViewDataRangeReady.connect + _trackview.midi_track()->write_source()->ViewDataRangeReady.connect (rec_data_ready_connections, invalidator (*this), - ui_bind (&MidiStreamView::rec_data_range_ready, this, _1, _2, boost::weak_ptr(mds->write_source())), + ui_bind (&MidiStreamView::rec_data_range_ready, this, _1, _2, boost::weak_ptr(_trackview.midi_track()->write_source())), gui_context()); // handle multi @@ -412,7 +445,7 @@ MidiStreamView::setup_rec_box () nframes_t start = 0; if (rec_regions.size() > 0) { start = rec_regions.back().first->start() - + _trackview.get_diskstream()->get_captured_frames(rec_regions.size()-1); + + _trackview.track()->get_captured_frames(rec_regions.size()-1); } PropertyList plist; @@ -438,8 +471,7 @@ MidiStreamView::setup_rec_box () /* start a new rec box */ boost::shared_ptr mt = _trackview.midi_track(); /* we know what it is already */ - boost::shared_ptr ds = mt->midi_diskstream(); - nframes_t frame_pos = ds->current_capture_start (); + nframes_t frame_pos = mt->current_capture_start (); gdouble xstart = _trackview.editor().frame_to_pixel (frame_pos); gdouble xend; uint32_t fill_color; @@ -449,7 +481,7 @@ MidiStreamView::setup_rec_box () xend = xstart; fill_color = ARDOUR_UI::config()->canvasvar_RecordingRect.get(); - ArdourCanvas::SimpleRect * rec_rect = new Gnome::Canvas::SimpleRect (*canvas_group); + ArdourCanvas::SimpleRect * rec_rect = new Gnome::Canvas::SimpleRect (*_canvas_group); rec_rect->property_x1() = xstart; rec_rect->property_y1() = 1.0; rec_rect->property_x2() = xend; @@ -473,7 +505,7 @@ MidiStreamView::setup_rec_box () } else if (rec_active && (_trackview.session()->record_status() != Session::Recording || - !_trackview.get_diskstream()->record_enabled())) { + !_trackview.track()->record_enabled())) { screen_update_connection.disconnect(); rec_active = false; rec_updating = false; @@ -526,7 +558,7 @@ MidiStreamView::update_rec_regions (boost::shared_ptr data, nframes_t { ENSURE_GUI_THREAD (*this, &MidiStreamView::update_rec_regions, data, start, dur) - if (use_rec_regions) { + if (Config->get_show_waveforms_while_recording ()) { uint32_t n = 0; bool update_range = false; @@ -560,7 +592,7 @@ MidiStreamView::update_rec_regions (boost::shared_ptr data, nframes_t if (nlen != region->length()) { region->suspend_property_changes (); - region->set_position (_trackview.get_diskstream()->get_capture_start_frame(n), this); + region->set_position (_trackview.track()->get_capture_start_frame(n), this); region->set_length (start + dur - region->position(), this); region->resume_property_changes (); @@ -586,11 +618,23 @@ MidiStreamView::update_rec_regions (boost::shared_ptr data, nframes_t const boost::shared_ptr& note = *i; + cerr << "New note arrived, length = " << note->length() + << " num " << note->note() + << endl; + + if (note->length() == 0) { + /* we got NoteOn but not NoteOff (yet) + */ + continue; + } + nframes_t note_start_frames = tconv.to(note->time()); nframes_t note_end_frames = tconv.to(note->end_time()); - if (note->length() > 0 && note_end_frames + region->position() > start) + + if (note->length() > 0 && note_end_frames + region->position() > start) { mrv->resolve_note(note->note(), note_end_frames); + } if (note_start_frames + region->position() < start) { continue; @@ -617,14 +661,14 @@ MidiStreamView::update_rec_regions (boost::shared_ptr data, nframes_t } else { - nframes_t nlen = _trackview.get_diskstream()->get_captured_frames(n); + nframes_t nlen = _trackview.track()->get_captured_frames(n); if (nlen != region->length()) { if (region->source_length(0) >= region->position() + nlen) { region->suspend_property_changes (); - region->set_position (_trackview.get_diskstream()->get_capture_start_frame(n), this); + region->set_position (_trackview.track()->get_capture_start_frame(n), this); region->set_length (nlen, this); region->resume_property_changes (); @@ -672,14 +716,12 @@ MidiStreamView::rec_data_range_ready (nframes_t start, nframes_t cnt, boost::wea void MidiStreamView::color_handler () { - //case cMidiTrackBase: - if (_trackview.is_midi_track()) { - //canvas_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiTrackBase.get(); - } + draw_note_lines (); - //case cMidiBusBase: - if (!_trackview.is_midi_track()) { - //canvas_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiBusBase.get();; + if (_trackview.is_midi_track()) { + canvas_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiTrackBase.get(); + } else { + canvas_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiBusBase.get();; } }