<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'/>
/* 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")))));
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);
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 */
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;
}
}
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:
}
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 ();
}
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)
@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.
#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"
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 ();
}
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);
}
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 ();
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 ();
}