summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--muse/ChangeLog3
-rw-r--r--muse/muse/part.cpp40
2 files changed, 37 insertions, 6 deletions
diff --git a/muse/ChangeLog b/muse/ChangeLog
index 7cc6eff4..a5cd7d5e 100644
--- a/muse/ChangeLog
+++ b/muse/ChangeLog
@@ -1,3 +1,6 @@
+09.10.2010
+ * Fixed: Gluing of midi track parts, over tempo changes, caused incorrect note times and lengths. (T356)
+ - Fixed Song::cmdGluePart().
08.10.2010
* Disabled: Precount does not work, disabled function in gui (rj)
=======================================
diff --git a/muse/muse/part.cpp b/muse/muse/part.cpp
index c9a6308c..250cf3ea 100644
--- a/muse/muse/part.cpp
+++ b/muse/muse/part.cpp
@@ -1319,6 +1319,10 @@ void Song::changePart(Part* oPart, Part* nPart)
void Song::cmdGluePart(Track* track, Part* oPart)
{
+ // p3.3.54
+ if(track->type() != Track::WAVE && !track->isMidiTrack())
+ return;
+
PartList* pl = track->parts();
Part* nextPart = 0;
@@ -1344,12 +1348,36 @@ void Song::cmdGluePart(Track* track, Part* oPart)
dl->add(ie->second);
EventList* sl2 = nextPart->events();
- int frameOffset = nextPart->frame() - oPart->frame();
- for (iEvent ie = sl2->begin(); ie != sl2->end(); ++ie) {
- Event event = ie->second.clone();
- event.setFrame(event.frame() + frameOffset);
- dl->add(event);
- }
+
+ //int frameOffset = nextPart->frame() - oPart->frame();
+ //for (iEvent ie = sl2->begin(); ie != sl2->end(); ++ie) {
+ // Event event = ie->second.clone();
+ // event.setFrame(event.frame() + frameOffset);
+ // dl->add(event);
+ // }
+ // p3.3.54 Changed.
+ if(track->type() == Track::WAVE)
+ {
+ int frameOffset = nextPart->frame() - oPart->frame();
+ for (iEvent ie = sl2->begin(); ie != sl2->end(); ++ie)
+ {
+ Event event = ie->second.clone();
+ event.setFrame(event.frame() + frameOffset);
+ dl->add(event);
+ }
+ }
+ else
+ if(track->isMidiTrack())
+ {
+ int tickOffset = nextPart->tick() - oPart->tick();
+ for (iEvent ie = sl2->begin(); ie != sl2->end(); ++ie)
+ {
+ Event event = ie->second.clone();
+ event.setTick(event.tick() + tickOffset);
+ dl->add(event);
+ }
+ }
+
startUndo();
audio->msgRemovePart(nextPart, false);
// Indicate no undo, and do port controller values but not clone parts.