X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fquantize.cc;h=66044690077d3ad3fbc517188881a573768adeca;hb=ced4378d0914bcfb926267772c45d1d23f3bed38;hp=563b7bf4e761eb0629c16fa86da83d1fe38f5c26;hpb=77be4a2742b593e74e6b0ca79a6aa990bacf3233;p=ardour.git diff --git a/libs/ardour/quantize.cc b/libs/ardour/quantize.cc index 563b7bf4e7..6604469007 100644 --- a/libs/ardour/quantize.cc +++ b/libs/ardour/quantize.cc @@ -20,13 +20,8 @@ #include "pbd/basename.h" -#include "ardour/types.h" #include "ardour/quantize.h" -#include "ardour/session.h" -#include "ardour/smf_source.h" #include "ardour/midi_model.h" -#include "ardour/midi_region.h" -#include "ardour/tempo.h" #include "i18n.h" @@ -40,11 +35,10 @@ using namespace ARDOUR; * 0.25 = quantize to beats/4, etc. */ -Quantize::Quantize (Session& s, bool snap_start, bool snap_end, +Quantize::Quantize (bool snap_start, bool snap_end, double start_grid, double end_grid, float strength, float swing, float threshold) - : session (s) - , _snap_start (snap_start) + : _snap_start (snap_start) , _snap_end (snap_end) , _start_grid(start_grid) , _end_grid(end_grid) @@ -60,27 +54,32 @@ Quantize::~Quantize () Command* Quantize::operator () (boost::shared_ptr model, - double position, - std::vector::Notes>& seqs) + Evoral::Beats position, + std::vector::Notes>& seqs) { + /* TODO: Rewrite this to be precise with fixed point? */ + /* Calculate offset from start of model to next closest quantize step, to quantize relative to actual session beats (etc.) rather than from the start of the model. */ - const double round_pos = ceil(position / _start_grid) * _start_grid; - const double offset = round_pos - position; + const double round_pos = round(position.to_double() / _start_grid) * _start_grid; + const double offset = round_pos - position.to_double(); bool even; MidiModel::NoteDiffCommand* cmd = new MidiModel::NoteDiffCommand (model, "quantize"); - for (std::vector::Notes>::iterator s = seqs.begin(); s != seqs.end(); ++s) { + for (std::vector::Notes>::iterator s = seqs.begin(); s != seqs.end(); ++s) { even = false; + /* TODO 'swing' probably requires a 2nd iteration: + * first quantize notes to the grid, then apply beat shift + */ for (Evoral::Sequence::Notes::iterator i = (*s).begin(); i != (*s).end(); ++i) { - double new_start = round ((*i)->time() / _start_grid) * _start_grid + offset; - double new_end = round ((*i)->end_time() / _end_grid) * _end_grid + offset; + double new_start = round (((*i)->time().to_double() - offset) / _start_grid) * _start_grid + offset; + double new_end = round (((*i)->end_time().to_double() - offset) / _end_grid) * _end_grid + offset; if (_swing > 0.0 && !even) { @@ -91,6 +90,7 @@ Quantize::operator () (boost::shared_ptr model, */ new_start = new_start + (2.0/3.0 * _swing * (next_grid - new_start)); + new_end = new_end + (2.0/3.0 * _swing * (next_grid - new_start)); } else if (_swing < 0.0 && !even) { @@ -101,27 +101,28 @@ Quantize::operator () (boost::shared_ptr model, */ new_start = new_start - (2.0/3.0 * _swing * (new_start - prev_grid)); + new_end = new_end - (2.0/3.0 * _swing * (new_start - prev_grid)); } - double delta = new_start - (*i)->time(); + double delta = new_start - (*i)->time().to_double(); if (fabs (delta) >= _threshold) { if (_snap_start) { delta *= _strength; cmd->change ((*i), MidiModel::NoteDiffCommand::StartTime, - (*i)->time() + delta); + (*i)->time() + delta); } } if (_snap_end) { - delta = new_end - (*i)->end_time(); + delta = new_end - (*i)->end_time().to_double(); if (fabs (delta) >= _threshold) { - double new_dur = new_end - new_start; + Evoral::Beats new_dur(new_end - new_start); - if (new_dur == 0.0) { - new_dur = _end_grid; + if (!new_dur) { + new_dur = Evoral::Beats(_end_grid); } cmd->change ((*i), MidiModel::NoteDiffCommand::Length, new_dur);