#include "ardour/midi_diskstream.h"
#include "ardour/midi_model.h"
#include "ardour/midi_patch_manager.h"
+#include "ardour/session.h"
#include "evoral/Parameter.hpp"
#include "evoral/Control.hpp"
{
_model = model;
content_connection.disconnect ();
- content_connection = _model->ContentsChanged.connect(sigc::mem_fun(this, &MidiRegionView::redisplay_model));
+ content_connection = _model->ContentsChanged.connect(
+ sigc::mem_fun(this, &MidiRegionView::redisplay_model));
clear_events ();
if (_enable_display) {
(*i)->invalidate ();
}
- _model->read_lock();
+ MidiModel::ReadLock lock(_model->read_lock());
MidiModel::Notes& notes (_model->notes());
_optimization_iterator = _events.begin();
display_sysexes();
display_program_changes();
- _model->read_unlock();
-
_marked_for_selection.clear ();
_marked_for_velocity.clear ();
nframes64_t unused;
nframes64_t distance;
- if ((distance = trackview.editor().get_nudge_distance (ref_point, unused)) == 0) {
+ if (trackview.editor().snap_mode() == Editing::SnapOff) {
+
+ /* grid is off - use nudge distance */
+
+ distance = trackview.editor().get_nudge_distance (ref_point, unused);
- /* no nudge distance set - use grid */
+ } else {
+
+ /* use grid */
nframes64_t next_pos = ref_point;
note_selected(ev, true);
}
- PublicEditor& editor (trackview.editor());
char buf[4];
snprintf (buf, sizeof (buf), "%d", (int) ev->note()->note());
+ // This causes an infinite loop on note add sometimes
+ //PublicEditor& editor (trackview.editor());
//editor.show_verbose_canvas_cursor_with (Evoral::midi_note_name (ev->note()->note()));
- editor.show_verbose_canvas_cursor_with (buf);
+ //editor.show_verbose_canvas_cursor_with (buf);
}
void
MidiCutBuffer*
MidiRegionView::selection_as_cut_buffer () const
{
- NoteList notes;
+ Notes notes;
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
- notes.push_back (boost::shared_ptr<NoteType> (new NoteType (*((*i)->note().get()))));
+ notes.insert (boost::shared_ptr<NoteType> (new NoteType (*((*i)->note().get()))));
}
- /* sort them into time order */
-
- Evoral::Sequence<Evoral::MusicalTime>::LaterNoteComparator cmp;
- sort (notes.begin(), notes.end(), cmp);
-
MidiCutBuffer* cb = new MidiCutBuffer (trackview.session());
cb->set (notes);
Evoral::MusicalTime duration;
Evoral::MusicalTime end_point;
- duration = mcb.notes().back()->end_time() - mcb.notes().front()->time();
+ duration = (*mcb.notes().rbegin())->end_time() - (*mcb.notes().begin())->time();
paste_pos_beats = frames_to_beats (pos - _region->position());
- beat_delta = mcb.notes().front()->time() - paste_pos_beats;
+ beat_delta = (*mcb.notes().begin())->time() - paste_pos_beats;
paste_pos_beats = 0;
_selection.clear ();
for (int n = 0; n < (int) times; ++n) {
- for (NoteList::const_iterator i = mcb.notes().begin(); i != mcb.notes().end(); ++i) {
+ for (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);
}
void
-MidiRegionView::selection_as_notelist (NoteList& selected)
+MidiRegionView::selection_as_notelist (Notes& selected)
{
time_sort_events ();
for (Events::iterator i = _events.begin(); i != _events.end(); ++i) {
if ((*i)->selected()) {
- selected.push_back ((*i)->note());
+ selected.insert ((*i)->note());
}
}
}
-
-