summaryrefslogtreecommitdiffstats
path: root/src/base/LegatoQuantizer.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-03-01 18:37:05 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-03-01 18:37:05 +0000
commit145364a8af6a1fec06556221e66d4b724a62fc9a (patch)
tree53bd71a544008c518034f208d64c932dc2883f50 /src/base/LegatoQuantizer.cpp
downloadrosegarden-145364a8af6a1fec06556221e66d4b724a62fc9a.tar.gz
rosegarden-145364a8af6a1fec06556221e66d4b724a62fc9a.zip
Added old abandoned KDE3 version of the RoseGarden MIDI tool
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/rosegarden@1097595 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src/base/LegatoQuantizer.cpp')
-rw-r--r--src/base/LegatoQuantizer.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/base/LegatoQuantizer.cpp b/src/base/LegatoQuantizer.cpp
new file mode 100644
index 0000000..dcc2458
--- /dev/null
+++ b/src/base/LegatoQuantizer.cpp
@@ -0,0 +1,141 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <glaurent@telegraph-road.org>,
+ Chris Cannam <cannam@all-day-breakfast.com>,
+ Richard Bown <bownie@bownie.com>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ This program 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 2 of the
+ License, or (at your option) any later version. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "LegatoQuantizer.h"
+#include "BaseProperties.h"
+#include "NotationTypes.h"
+#include "Selection.h"
+#include "Composition.h"
+#include "Profiler.h"
+
+#include <iostream>
+#include <cmath>
+#include <cstdio> // for sprintf
+#include <ctime>
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+
+LegatoQuantizer::LegatoQuantizer(timeT unit) :
+ Quantizer(RawEventData),
+ m_unit(unit)
+{
+ if (m_unit < 0) m_unit = Note(Note::Shortest).getDuration();
+}
+
+LegatoQuantizer::LegatoQuantizer(std::string source, std::string target, timeT unit) :
+ Quantizer(source, target),
+ m_unit(unit)
+{
+ if (m_unit < 0) m_unit = Note(Note::Shortest).getDuration();
+}
+
+LegatoQuantizer::LegatoQuantizer(const LegatoQuantizer &q) :
+ Quantizer(q.m_target),
+ m_unit(q.m_unit)
+{
+ // nothing else
+}
+
+LegatoQuantizer::~LegatoQuantizer()
+{
+ // nothing
+}
+
+void
+LegatoQuantizer::quantizeRange(Segment *s,
+ Segment::iterator from,
+ Segment::iterator to) const
+{
+ Segment::iterator tmp;
+ while (from != to) {
+ quantizeSingle(s, from, tmp);
+ from = tmp;
+ if (!s->isBeforeEndMarker(from) ||
+ (s->isBeforeEndMarker(to) &&
+ ((*from)->getAbsoluteTime() >= (*to)->getAbsoluteTime()))) break;
+ }
+}
+
+void
+LegatoQuantizer::quantizeSingle(Segment *s, Segment::iterator i,
+ Segment::iterator &nexti) const
+{
+ // Stretch each note out to reach the quantized start time of the
+ // next note whose quantized start time is greater than or equal
+ // to the end time of this note after quantization
+
+ timeT t = getFromSource(*i, AbsoluteTimeValue);
+ timeT d = getFromSource(*i, DurationValue);
+
+ timeT d0(d), t0(t);
+
+ timeT barStart = s->getBarStartForTime(t);
+
+ t -= barStart;
+ t = quantizeTime(t);
+ t += barStart;
+
+ nexti = i;
+ ++nexti;
+
+ for (Segment::iterator j = i; s->isBeforeEndMarker(j); ++j) {
+ if (!(*j)->isa(Note::EventType)) continue;
+
+ timeT qt = (*j)->getAbsoluteTime();
+ qt -= barStart;
+ qt = quantizeTime(qt);
+ qt += barStart;
+
+ if (qt >= t + d) {
+ d = qt - t;
+ }
+ if (qt > t) {
+ break;
+ }
+ }
+
+ if (t0 != t || d0 != d) {
+ setToTarget(s, i, t, d);
+ nexti = s->findTime(t + d);
+ }
+}
+
+timeT
+LegatoQuantizer::quantizeTime(timeT t) const
+{
+ if (m_unit != 0) {
+ timeT low = (t / m_unit) * m_unit;
+ timeT high = low + m_unit;
+ t = ((high - t > t - low) ? low : high);
+ }
+ return t;
+}
+
+}