Special case MIDI note selection auditioning - #8358

This adds a few exceptions to the general preference
"Sound MIDI notes as they are being selected in the editor".

* Select all no longer plays _all_ notes.
* Remain silent when selection is inverted or a range is selected.
* Play no sound when a saved selection is restored on session load.
This commit is contained in:
Robin Gareus 2020-08-09 20:34:12 +02:00
parent 90f8212af7
commit 4ad1c19166
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04
5 changed files with 11 additions and 6 deletions

View file

@ -233,5 +233,5 @@ EditNoteDialog::done (int r)
notes.push_back ((*i)->note()->id()); notes.push_back ((*i)->note()->id());
} }
_region_view->select_notes (notes); _region_view->select_notes (notes, true);
} }

View file

@ -5319,7 +5319,7 @@ Editor::region_view_added (RegionView * rv)
list<pair<PBD::ID const, list<Evoral::event_id_t> > >::iterator rnote; list<pair<PBD::ID const, list<Evoral::event_id_t> > >::iterator rnote;
for (rnote = selection->pending_midi_note_selection.begin(); rnote != selection->pending_midi_note_selection.end(); ++rnote) { for (rnote = selection->pending_midi_note_selection.begin(); rnote != selection->pending_midi_note_selection.end(); ++rnote) {
if (rv->region()->id () == (*rnote).first) { if (rv->region()->id () == (*rnote).first) {
mrv->select_notes ((*rnote).second); mrv->select_notes ((*rnote).second, false);
selection->pending_midi_note_selection.erase(rnote); selection->pending_midi_note_selection.erase(rnote);
break; break;
} }

View file

@ -889,7 +889,7 @@ MidiRegionView::create_note_at (samplepos_t t, double y, Temporal::Beats length,
trackview.editor().set_selected_midi_region_view (*this); trackview.editor().set_selected_midi_region_view (*this);
list<Evoral::event_id_t> to_be_selected; list<Evoral::event_id_t> to_be_selected;
to_be_selected.push_back (new_note->id()); to_be_selected.push_back (new_note->id());
select_notes (to_be_selected); select_notes (to_be_selected, true);
play_midi_note (new_note); play_midi_note (new_note);
} }
@ -2159,6 +2159,7 @@ MidiRegionView::unique_select(NoteBase* ev)
void void
MidiRegionView::select_all_notes () MidiRegionView::select_all_notes ()
{ {
PBD::Unwinder<bool> uw (_no_sound_notes, true);
for (Events::iterator i = _events.begin(); i != _events.end(); ++i) { for (Events::iterator i = _events.begin(); i != _events.end(); ++i) {
add_to_selection (i->second); add_to_selection (i->second);
} }
@ -2167,6 +2168,7 @@ MidiRegionView::select_all_notes ()
void void
MidiRegionView::select_range (samplepos_t start, samplepos_t end) MidiRegionView::select_range (samplepos_t start, samplepos_t end)
{ {
PBD::Unwinder<bool> uw (_no_sound_notes, true);
for (Events::iterator i = _events.begin(); i != _events.end(); ++i) { for (Events::iterator i = _events.begin(); i != _events.end(); ++i) {
samplepos_t t = source_beats_to_absolute_samples(i->first->time()); samplepos_t t = source_beats_to_absolute_samples(i->first->time());
if (t >= start && t <= end) { if (t >= start && t <= end) {
@ -2178,6 +2180,7 @@ MidiRegionView::select_range (samplepos_t start, samplepos_t end)
void void
MidiRegionView::invert_selection () MidiRegionView::invert_selection ()
{ {
PBD::Unwinder<bool> uw (_no_sound_notes, true);
for (Events::iterator i = _events.begin(); i != _events.end(); ++i) { for (Events::iterator i = _events.begin(); i != _events.end(); ++i) {
if (i->second->selected()) { if (i->second->selected()) {
remove_from_selection(i->second); remove_from_selection(i->second);
@ -2191,11 +2194,13 @@ MidiRegionView::invert_selection ()
The requested notes most likely won't exist in the view until the next model redisplay. The requested notes most likely won't exist in the view until the next model redisplay.
*/ */
void void
MidiRegionView::select_notes (list<Evoral::event_id_t> notes) MidiRegionView::select_notes (list<Evoral::event_id_t> notes, bool allow_audition)
{ {
NoteBase* cne; NoteBase* cne;
list<Evoral::event_id_t>::iterator n; list<Evoral::event_id_t>::iterator n;
PBD::Unwinder<bool> uw (_no_sound_notes, allow_audition ? _no_sound_notes : true);
for (n = notes.begin(); n != notes.end(); ++n) { for (n = notes.begin(); n != notes.end(); ++n) {
if ((cne = find_canvas_note(*n)) != 0) { if ((cne = find_canvas_note(*n)) != 0) {
add_to_selection (cne); add_to_selection (cne);

View file

@ -214,7 +214,7 @@ public:
NoteBase* copy_selection (NoteBase* primary); NoteBase* copy_selection (NoteBase* primary);
void move_copies(double dx_qn, double dy, double cumulative_dy); void move_copies(double dx_qn, double dy, double cumulative_dy);
void select_notes (std::list<Evoral::event_id_t>); void select_notes (std::list<Evoral::event_id_t>, bool allow_audition);
void select_matching_notes (uint8_t notenum, uint16_t channel_mask, bool add, bool extend); void select_matching_notes (uint8_t notenum, uint16_t channel_mask, bool add, bool extend);
void toggle_matching_notes (uint8_t notenum, uint16_t channel_mask); void toggle_matching_notes (uint8_t notenum, uint16_t channel_mask);

View file

@ -1216,7 +1216,7 @@ Selection::set_state (XMLNode const & node, int)
for (RegionSelection::iterator rsi = rs.begin(); rsi != rs.end(); ++rsi) { for (RegionSelection::iterator rsi = rs.begin(); rsi != rs.end(); ++rsi) {
MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (*rsi); MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (*rsi);
if (mrv) { if (mrv) {
mrv->select_notes(notes); mrv->select_notes(notes, false);
} }
} }