+ double prev_grid = new_start - _start_grid;
+
+ /* find a spot 2/3 (* swing factor) of the way between the grid point
+ we would put this note at, and the nominal position of the previous note.
+ */
+
+ new_start = new_start - (2.0/3.0 * _swing * (new_start - prev_grid));
+
+ }
+
+ delta = new_start - (*i)->time();
+
+ if (fabs (delta) >= _threshold) {
+ if (_snap_start) {
+ delta *= _strength;
+ cmd->change ((*i), MidiModel::NoteDiffCommand::StartTime,
+ (*i)->time() + delta);
+ }
+ }
+
+ if (_snap_end) {
+ delta = new_end - (*i)->end_time();
+
+ if (fabs (delta) >= _threshold) {
+ double new_dur = new_end - new_start;
+
+ if (new_dur == 0.0) {
+ new_dur = _end_grid;
+ }
+
+ cmd->change ((*i), MidiModel::NoteDiffCommand::Length, new_dur);
+ }
+ }
+
+ even = !even;
+ }
+ }