From 145364a8af6a1fec06556221e66d4b724a62fc9a Mon Sep 17 00:00:00 2001
From: tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>
Date: Mon, 1 Mar 2010 18:37:05 +0000
Subject: 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
---
 src/commands/edit/RetrogradeCommand.cpp | 121 ++++++++++++++++++++++++++++++++
 1 file changed, 121 insertions(+)
 create mode 100644 src/commands/edit/RetrogradeCommand.cpp

(limited to 'src/commands/edit/RetrogradeCommand.cpp')

diff --git a/src/commands/edit/RetrogradeCommand.cpp b/src/commands/edit/RetrogradeCommand.cpp
new file mode 100644
index 0000000..955f066
--- /dev/null
+++ b/src/commands/edit/RetrogradeCommand.cpp
@@ -0,0 +1,121 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Rosegarden
+    A MIDI and audio 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        <richard.bown@ferventsoftware.com>
+ 
+    The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+    Bown to claim authorship of this work have been asserted.
+ 
+    Other copyrights also apply to some parts of this work.  Please
+    see the AUTHORS file and individual file headers for details.
+ 
+    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 "RetrogradeCommand.h"
+
+#include "base/Event.h"
+#include "misc/Debug.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+RetrogradeCommand::modifySegment()
+{
+    std::vector<Event *> toErase;
+    std::vector<Event *> toInsert;
+
+    timeT a0 = m_selection->getStartTime();
+    timeT a1 = m_selection->getEndTime();
+
+    EventSelection::eventcontainer::iterator i;
+
+    bool useNotationTimings = false;
+
+    for (i = m_selection->getSegmentEvents().begin();
+            i != m_selection->getSegmentEvents().end(); ++i) {
+
+        RG_DEBUG << "RetrogradeCommand::modifySegment: event at " << (*i)->getAbsoluteTime() << " type " << (*i)->getType() << endl;
+
+        if ((*i)->isa(Note::EventRestType))
+            continue;
+
+        toErase.push_back(*i);
+        timeT newTime = a0 + a1 - (*i)->getDuration() -
+                        (useNotationTimings ?
+                         (*i)->getNotationAbsoluteTime() : (*i)->getAbsoluteTime());
+
+        Event *e;
+        if (useNotationTimings) {
+            e = new Event(**i, newTime, (*i)->getDuration(), (*i)->getSubOrdering(),
+                          newTime, (*i)->getNotationDuration());
+        } else {
+            e = new Event(**i, newTime);
+        }
+
+        toInsert.push_back(e);
+    }
+
+    Segment &segment(m_selection->getSegment());
+
+    for (unsigned int j = 0; j < toErase.size(); ++j) {
+        Segment::iterator jtr(segment.findSingle(toErase[j]));
+        if (jtr != segment.end()) {
+            RG_DEBUG << "found event " << j << endl;
+            segment.erase(jtr);
+        } else {
+            RG_DEBUG << "failed to find event " << j << endl;
+        }
+    }
+
+    for (unsigned int j = 0; j < toInsert.size(); ++j) {
+
+        Segment::iterator jtr = segment.end();
+
+        // somewhat like the NoteOverlay part of PasteEventsCommand::modifySegment
+        /* nah -- let's do a de-counterpoint afterwards perhaps
+        	if (m_useNotationTimings && toInsert[j]->isa(Note::EventType)) {
+        	    long pitch = 0;
+        	    Accidental explicitAccidental = NoAccidental;
+        	    toInsert[j]->get<String>(ACCIDENTAL, explicitAccidental);
+        	    if (toInsert[j]->get<Int>(PITCH, pitch)) {
+        		jtr = SegmentNotationHelper(segment).insertNote
+        		    (toInsert[j]->getAbsoluteTime(),
+        		     Note::getNearestNote(toInsert[j]->getDuration()),
+        		     pitch, explicitAccidental);
+        		delete toInsert[j];
+        		toInsert[j] = *jtr;
+        	    }
+        	} else {
+        */
+        jtr = segment.insert(toInsert[j]);
+        //	}
+
+        // insert new event back into selection
+        m_selection->addEvent(toInsert[j]);
+
+        // if (jtr != segment.end()) m_lastInsertedEvent = toInsert[j];
+    }
+
+    segment.normalizeRests(a0, a1);
+}
+
+}
-- 
cgit v1.2.1