X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=inline;f=gtk2_ardour%2Fmidi_region_view.cc;h=79933b94d6cdb58afb0877c796720801733885c3;hb=b8f5306d5bf59ddb237fabcdbab91a7d1e6fd612;hp=287b6787eef63748302826271c0256ea3bc9630b;hpb=71ed5865f53f94bd77cd8b09920b28734d507062;p=ardour.git diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 287b6787ee..79933b94d6 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -82,7 +82,7 @@ #include "sys_ex.h" #include "ui_config.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace PBD; @@ -935,12 +935,16 @@ MidiRegionView::create_note_at (framepos_t t, double y, Evoral::Beats length, bo } // Start of note in frames relative to region start + uint32_t divisions = 0; + if (snap_t) { framecnt_t grid_frames; t = snap_frame_to_grid_underneath (t, grid_frames); + divisions = trackview.editor().get_grid_music_divisions (0); } - const MidiModel::TimeType beat_time = Evoral::Beats (trackview.session()->tempo_map().beat_at_frame (_region->position() + t) + + const MidiModel::TimeType beat_time = Evoral::Beats (trackview.session()->tempo_map().exact_beat_at_frame (_region->position() + t, divisions) - (mr->beat() - mr->start_beats().to_double())); const double note = view->y_to_note(y); const uint8_t chan = mtv->get_channel_for_add(); @@ -1184,11 +1188,11 @@ MidiRegionView::redisplay_model() _optimization_iterator = _events.begin(); bool empty_when_starting = _events.empty(); + NoteBase* cne; for (MidiModel::Notes::iterator n = notes.begin(); n != notes.end(); ++n) { boost::shared_ptr note (*n); - NoteBase* cne; bool visible; if (note_in_region_range (note, visible)) { @@ -1417,10 +1421,11 @@ MidiRegionView::region_resized (const PropertyChange& what_changed) what_changed.contains (ARDOUR::Properties::position)) { _source_relative_time_converter.set_origin_b (_region->position() - _region->start()); } - if (what_changed.contains (ARDOUR::Properties::length)) { + /* catch an end trim so we can live update */ + if (!what_changed.contains (ARDOUR::Properties::start) && + what_changed.contains (ARDOUR::Properties::length)) { enable_display (true); } - } void @@ -1719,7 +1724,7 @@ MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions) Evoral::Beats note_end_time = note->end_time(); if (note->end_time() > mr->start_beats() + mr->length_beats()) { - note_end_time = mr->length_beats(); + note_end_time = mr->start_beats() + mr->length_beats(); } const framepos_t note_end_frames = map.frame_at_beat (_region->beat() - mr->start_beats().to_double() @@ -1732,10 +1737,8 @@ MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions) y1 = y0 + std::max(1., floor(midi_stream_view()->note_height()) - 1); - ev->set_x0 (x0); - ev->set_x1 (x1); - ev->set_y0 (y0); - ev->set_y1 (y1); + ArdourCanvas::Rect rect (x0, y0, x1, y1); + ev->set (rect); if (!note->length()) { if (_active_notes && note->note() < 128) { @@ -2747,6 +2750,7 @@ MidiRegionView::begin_resizing (bool /*at_front*/) void MidiRegionView::update_resizing (NoteBase* primary, bool at_front, double delta_x, bool relative, double snap_delta, bool with_snap) { + TempoMap& tmap (trackview.session()->tempo_map()); bool cursor_set = false; bool const ensure_snap = trackview.editor().snap_mode () != SnapMagnetic; @@ -2808,9 +2812,19 @@ MidiRegionView::update_resizing (NoteBase* primary, bool at_front, double delta_ sign = -1; } - const double snapped_x = (with_snap ? snap_pixel_to_sample (current_x, ensure_snap) : trackview.editor ().pixel_to_sample (current_x)); - Evoral::Beats beats = region_frames_to_region_beats (snapped_x); - Evoral::Beats len = Evoral::Beats(); + double snapped_x; + uint32_t divisions = 0; + + if (with_snap) { + snapped_x = snap_pixel_to_sample (current_x, ensure_snap); + divisions = trackview.editor().get_grid_music_divisions (0); + } else { + snapped_x = trackview.editor ().pixel_to_sample (current_x); + } + const Evoral::Beats beats = Evoral::Beats (tmap.exact_beat_at_frame (snapped_x + midi_region()->position(), divisions) + - midi_region()->beat()) + midi_region()->start_beats(); + + Evoral::Beats len = Evoral::Beats(); if (at_front) { if (beats < canvas_note->note()->end_time()) { @@ -2843,6 +2857,7 @@ void MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_x, bool relative, double snap_delta, bool with_snap) { _note_diff_command = _model->new_note_diff_command (_("resize notes")); + TempoMap& tmap (trackview.session()->tempo_map()); /* XX why doesn't snap_pixel_to_sample() handle this properly? */ bool const ensure_snap = trackview.editor().snap_mode () != SnapMagnetic; @@ -2890,16 +2905,19 @@ MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_ sign = -1; } + uint32_t divisions = 0; /* Convert the new x position to a frame within the source */ framepos_t current_fr; if (with_snap) { current_fr = snap_pixel_to_sample (current_x, ensure_snap); + divisions = trackview.editor().get_grid_music_divisions (0); } else { current_fr = trackview.editor().pixel_to_sample (current_x); } /* and then to beats */ - const Evoral::Beats x_beats = region_frames_to_region_beats (current_fr + _region->start()); + const Evoral::Beats x_beats = Evoral::Beats (tmap.exact_beat_at_frame (current_fr + midi_region()->position(), divisions) + - midi_region()->beat()) + midi_region()->start_beats(); if (at_front && x_beats < canvas_note->note()->end_time()) { note_diff_add_change (canvas_note, MidiModel::NoteDiffCommand::StartTime, x_beats - (sign * snap_delta_beats)); @@ -3506,7 +3524,7 @@ MidiRegionView::selection_as_cut_buffer () const /** This method handles undo */ bool -MidiRegionView::paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx, const int32_t& sub_num) +MidiRegionView::paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx, const int32_t sub_num) { bool commit = false; // Paste notes, if available @@ -3981,6 +3999,10 @@ MidiRegionView::trim_front_ending () /* Trim drag made start time -ve; fix this */ midi_region()->fix_negative_start (); } + /* until _start is modified on the fly during front trim, + we have to redisplay the model when a start trim has finished. + */ + enable_display (true); } void @@ -4039,7 +4061,7 @@ MidiRegionView::get_note_name (boost::shared_ptr n, uint8_t note_value char buf[128]; snprintf (buf, sizeof (buf), "%d %s\nCh %d Vel %d", (int) note_value, - name.empty() ? Evoral::midi_note_name (note_value).c_str() : name.c_str(), + name.empty() ? ParameterDescriptor::midi_note_name (note_value).c_str() : name.c_str(), (int) n->channel() + 1, (int) n->velocity()); @@ -4107,8 +4129,8 @@ framepos_t MidiRegionView::snap_frame_to_grid_underneath (framepos_t p, framecnt_t& grid_frames) const { PublicEditor& editor = trackview.editor (); - const Evoral::Beats p_beat = region_frames_to_region_beats (p); const Evoral::Beats grid_beats = get_grid_beats(p); + const Evoral::Beats p_beat = max (Evoral::Beats(), region_frames_to_region_beats (p)); grid_frames = region_beats_to_region_frames (p_beat + grid_beats) - region_beats_to_region_frames (p_beat);