some fuzzy logic to avoid note "overlaps" during step editing

git-svn-id: svn://localhost/ardour2/branches/3.0@7634 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2010-08-15 21:18:00 +00:00
parent faca3e5f5d
commit 0b2f156c58
2 changed files with 24 additions and 4 deletions

View File

@ -44,6 +44,8 @@ StepEditor::start_step_editing ()
_step_edit_chord_duration = 0.0;
step_edit_region.reset ();
step_edit_region_view = 0;
last_added_pitch = -1;
last_added_end = 0;
resync_step_edit_position ();
prepare_step_edit_region ();
@ -250,15 +252,31 @@ StepEditor::step_add_note (uint8_t channel, uint8_t pitch, uint8_t velocity, Evo
/* make sure its visible on the horizontal axis */
nframes64_t fpos = step_edit_region->position() +
framepos_t fpos = step_edit_region->position() +
step_edit_region_view->beats_to_frames (step_edit_beat_pos + beat_duration);
if (fpos >= (_editor.leftmost_position() + _editor.current_page_frames())) {
_editor.reset_x_origin (fpos - (_editor.current_page_frames()/4));
}
step_edit_region_view->step_add_note (channel, pitch, velocity, step_edit_beat_pos, beat_duration);
Evoral::MusicalTime at = step_edit_beat_pos;
Evoral::MusicalTime len = beat_duration;
if ((last_added_pitch >= 0) && (pitch == last_added_pitch) && (last_added_end == step_edit_beat_pos)) {
/* avoid any apparent note overlap - move the start of this note
up by 1 tick from where the last note ended
*/
at += 1.0/Meter::ticks_per_beat;
len -= 1.0/Meter::ticks_per_beat;
}
step_edit_region_view->step_add_note (channel, pitch, velocity, at, len);
last_added_pitch = pitch;
last_added_end = at+len;
if (_step_edit_triplet_countdown > 0) {
_step_edit_triplet_countdown--;

View File

@ -61,6 +61,8 @@ class StepEditor : public PBD::ScopedConnectionList, public sigc::trackable
boost::shared_ptr<ARDOUR::MidiTrack> _track;
StepEntry* step_editor;
MidiTimeAxisView& _mtv;
int8_t last_added_pitch;
Evoral::MusicalTime last_added_end;
void region_removed (boost::weak_ptr<ARDOUR::Region>);
void playlist_changed ();