From c432e03b98a8052c56109fb92808cb52f1ddb72e Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 14 Aug 2012 04:29:39 +0000 Subject: Move Quantizer to Machina. git-svn-id: http://svn.drobilla.net/lad/trunk/machina@4688 a436a847-0d15-0410-975c-d299462d15a1 --- src/engine/Quantizer.hpp | 47 ++++++++++++++++++++++++++++++++++++++++++++ src/engine/quantize_test.cpp | 40 +++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/engine/Quantizer.hpp create mode 100644 src/engine/quantize_test.cpp (limited to 'src/engine') diff --git a/src/engine/Quantizer.hpp b/src/engine/Quantizer.hpp new file mode 100644 index 0000000..078f5e2 --- /dev/null +++ b/src/engine/Quantizer.hpp @@ -0,0 +1,47 @@ +/* + This file is part of Raul. + Copyright 2007-2012 David Robillard + + Raul is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or any later version. + + Raul is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Raul. If not, see . +*/ + +#ifndef RAUL_QUANTIZER_HPP +#define RAUL_QUANTIZER_HPP + +#include +#include "raul/TimeStamp.hpp" + +namespace Raul { + +/** Quantizer. + * \ingroup raul + */ +class Quantizer { +public: + inline static TimeStamp quantize(TimeStamp q, TimeStamp t) { + assert(q.unit() == t.unit()); + // FIXME: Precision problem? Should probably stay in discrete domain + const double qd = q.to_double(); + const double td = t.to_double(); + return TimeStamp(t.unit(), (qd > 0) ? lrint(td / qd) * qd : td); + } + + inline static double quantize(double q, double t) { + return (q > 0) + ? lrint(t / q) * q + : t; + } +}; + +} // namespace Raul + +#endif // RAUL_QUANTIZER_HPP diff --git a/src/engine/quantize_test.cpp b/src/engine/quantize_test.cpp new file mode 100644 index 0000000..9cc165d --- /dev/null +++ b/src/engine/quantize_test.cpp @@ -0,0 +1,40 @@ +/* + This file is part of Raul. + Copyright 2007-2012 David Robillard + + Raul is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or any later version. + + Raul is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Raul. If not, see . +*/ + +#include "raul/Quantizer.hpp" +#include + +using namespace std; +using namespace Raul; + +int +main() +{ + TimeStamp q(TimeUnit(TimeUnit::BEATS, 19200), 0.25); + + for (double in = 0.0; in < 32; in += 0.23) { + TimeStamp beats(TimeUnit(TimeUnit::BEATS, 19200), in); + + /*cout << "Q(" << in << ", 1/4) = " + << Quantizer::quantize(q, beats) << endl;*/ + + if (Quantizer::quantize(q, beats).subticks() % (19200/4) != 0) + return 1; + } + + return 0; +} + -- cgit v1.2.1