more MIDI paste improvements, plus move region-mute binding to PRIMARY-m and use...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 13 Aug 2009 19:48:10 +0000 (19:48 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 13 Aug 2009 19:48:10 +0000 (19:48 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@5525 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour.menus.in
gtk2_ardour/editor_actions.cc
gtk2_ardour/editor_ops.cc
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h
gtk2_ardour/mnemonic-us.bindings.in
gtk2_ardour/selection.cc

index 102964586178abb4bfc5a40b1a66030b3fe48082..51d55b132da80ad4331eb309fcb67e6e85a85d64 100644 (file)
                   <menuitem action='set-mouse-mode-zoom'/>
                   <menuitem action='set-mouse-mode-timefx'/>
                   <separator/>
+                  <menuitem action='toggle-internal-edit'/>
+                  <separator/>
                   <menuitem action='cycle-edit-point'/>
                   <menuitem action='cycle-edit-point-with-marker'/>
                   <menuitem action='toggle-edit-mode'/>
index f6766c561f070e319c98324e096e0c4a87f70913..9dbdfcc94461cf681a372ea86680a5002e3fc149 100644 (file)
@@ -673,8 +673,6 @@ Editor::register_actions ()
        /* in the future, this may allow other kinds of "intra-region" editing, but for now its just MIDI */
        ARDOUR_UI::instance()->tooltips().set_tip (internal_edit_button, _("Edit MIDI Notes"));
 
-       cerr << "Registering mouse mode actions\n";
-
        act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Object Tool"), bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseObject));
        act->connect_proxy (mouse_move_button);
        mouse_move_button.set_image (*(manage (new Image (::get_icon("tool_object")))));
index 72a8d7bdf609a69f0e7f111153ab71668054f939..e7badf1c42f80aa202da5a86055317087b7449b2 100644 (file)
@@ -4011,8 +4011,6 @@ Editor::cut_copy_points (CutCopyOp op)
 void
 Editor::cut_copy_midi (CutCopyOp op)
 {
-       cerr << "CCM: there are " << selection->midi_regions.size() << " MRV's to work on\n";
-
        for (MidiRegionSelection::iterator i = selection->midi_regions.begin(); i != selection->midi_regions.end(); ++i) {
                MidiRegionView* mrv = *i;
                mrv->cut_copy_clear (op);
@@ -4347,9 +4345,6 @@ Editor::paste_internal (nframes64_t position, float times)
                ts.push_back (entered_track);
        }
 
-
-       cerr << "Paste into " << ts.size() << " tracks\n";
-
        for (nth = 0, i = ts.begin(); i != ts.end(); ++i, ++nth) {
 
                /* undo/redo is handled by individual tracks/regions */
@@ -4361,14 +4356,12 @@ Editor::paste_internal (nframes64_t position, float times)
                        MidiNoteSelection::iterator cb;
 
                        get_regions_at (rs, position, ts);
-                       
-
-                       cerr << " We have " << cut_buffer->midi_notes.size() << " MIDI cut buffers\n";
 
-                       for (cb = cut_buffer->midi_notes.begin(), r = rs.begin(); cb != cut_buffer->midi_notes.end() && r != rs.end(); ++r) {
+                       for (cb = cut_buffer->midi_notes.begin(), r = rs.begin(); 
+                            cb != cut_buffer->midi_notes.end() && r != rs.end(); ++r) {
                                MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (*r);
                                if (mrv) {
-                                       mrv->paste (position, **cb);
+                                       mrv->paste (position, times, **cb);
                                        ++cb;
                                }
                        }
index 990d53aa32fea970aa6f2975f0c7e1d30248839c..215f7c34da5fd6d769eea5d0b7b509b0eeb67053 100644 (file)
@@ -1674,7 +1674,6 @@ MidiRegionView::cut_copy_clear (Editing::CutCopyOp op)
        switch (op) {
        case Cut:
        case Copy:
-               cerr << "Cut/Copy: get selection as CB\n";
                editor.get_cut_buffer().add (selection_as_cut_buffer());
                break;
        default:
@@ -1718,21 +1717,39 @@ MidiRegionView::selection_as_cut_buffer () const
 }
 
 void
-MidiRegionView::paste (nframes64_t pos, const MidiCutBuffer& mcb)
+MidiRegionView::paste (nframes64_t pos, float times, const MidiCutBuffer& mcb)
 {
-       MidiModel::DeltaCommand* cmd = _model->new_delta_command("paste");
+       if (mcb.empty()) {
+               return;
+       }
+
+       start_delta_command (_("paste"));
+
        MidiModel::TimeType beat_delta;
        MidiModel::TimeType paste_pos_beats;
+       MidiModel::TimeType duration;
 
+       duration = mcb.notes().back()->end_time() - mcb.notes().front()->time();
        paste_pos_beats = frames_to_beats (pos);
        beat_delta = mcb.notes().front()->time() - paste_pos_beats;
+       paste_pos_beats = 0;
 
-       for (Evoral::Sequence<MidiModel::TimeType>::Notes::const_iterator i = mcb.notes().begin(); i != mcb.notes().end(); ++i) {
+       _selection.clear ();
 
-               boost::shared_ptr<NoteType> copied_note (new NoteType (*((*i).get())));
-               copied_note->set_time (copied_note->time() - beat_delta);
-               cmd->add (copied_note);
-       }
+       for (int n = 0; n < (int) times; ++n) {
 
-       _model->apply_command(trackview.session(), cmd);
+               for (Evoral::Sequence<MidiModel::TimeType>::Notes::const_iterator i = mcb.notes().begin(); i != mcb.notes().end(); ++i) {
+                       
+                       boost::shared_ptr<NoteType> copied_note (new NoteType (*((*i).get())));
+                       copied_note->set_time (paste_pos_beats + copied_note->time() - beat_delta);
+
+                       /* make all newly added notes selected */
+
+                       command_add_note (copied_note, true);
+               }
+
+               paste_pos_beats += duration;
+       }
+       
+       apply_command ();
 }
index 1d234e0d1af8cd0f6124e639beb328b3499bf89a..b56ebcab271ee55743ebac738eaaa4e7c282b173 100644 (file)
@@ -101,7 +101,7 @@ class MidiRegionView : public RegionView
        void resolve_note(uint8_t note_num, double end_time);
 
        void cut_copy_clear (Editing::CutCopyOp);
-       void paste (nframes64_t pos, const MidiCutBuffer&);
+       void paste (nframes64_t pos, float times, const MidiCutBuffer&);
 
        struct PCEvent {
                PCEvent(double a_time, uint8_t a_value, uint8_t a_channel) 
index 7ea5b8bf67cffa8655a40253558a07dfa585e492..e333f1c62706975b148b17610d9d1f86c95a910f 100644 (file)
@@ -199,7 +199,8 @@ This mode provides many different operations on both regions and control points,
 @rop|Editor/normalize-region|n|normalize
 @sess|Main/AddTrackBus|<@PRIMARY@><@TERTIARY@>n|add track(s) or bus(ses)
 @sess|Main/New|<@PRIMARY@>n|open a new session
-@rop|Editor/mute-unmute-region|m|mute/unmute
+@rop|Editor/toggle-internal-edit|<@PRIMARY@>m|toggle MIDI note editing
+@rop|Editor/mute-unmute-region|<@PRIMARY@>m|mute/unmute
 @wvis|Common/toggle-editor-mixer-on-top|<@WINDOW@>m|rotate editor \& mixer window
 
 ;; arrow keys, navigation etc.
index b5454c4a123ca6afcad970f79657b2eef1f9476b..66d1075557d9f7079d3a5b966c909d2c630338ee 100644 (file)
@@ -25,6 +25,7 @@
 #include "ardour/playlist.h"
 #include "ardour/rc_configuration.h"
 
+#include "midi_cut_buffer.h"
 #include "region_view.h"
 #include "selection.h"
 #include "selection_templates.h"
@@ -119,6 +120,9 @@ void
 Selection::clear_midi_notes ()
 {
        if (!midi_notes.empty()) {
+               for (MidiNoteSelection::iterator x = midi_notes.begin(); x != midi_notes.end(); ++x) {
+                       delete *x;
+               }
                midi_notes.clear ();
                MidiNotesChanged ();
        }
@@ -233,6 +237,8 @@ Selection::toggle (MidiCutBuffer* midi)
        if ((i = find (midi_notes.begin(), midi_notes.end(), midi)) == midi_notes.end()) {
                midi_notes.push_back (midi);
        } else {
+               /* remember that we own the MCB */
+               delete *i;
                midi_notes.erase (i);
        }
        
@@ -369,6 +375,8 @@ Selection::add (const MidiNoteSelection& midi_list)
 void
 Selection::add (MidiCutBuffer* midi)
 {
+       /* we take ownership of the MCB */
+
        if (find (midi_notes.begin(), midi_notes.end(), midi) == midi_notes.end()) {
                midi_notes.push_back (midi);
                MidiNotesChanged ();
@@ -554,6 +562,8 @@ Selection::remove (MidiCutBuffer* midi)
        MidiNoteSelection::iterator x;
        
        if ((x = find (midi_notes.begin(), midi_notes.end(), midi)) != midi_notes.end()) {
+               /* remember that we own the MCB */
+               delete *x;
                midi_notes.erase (x);
                MidiNotesChanged ();
        }