summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--muse2/muse/song.cpp94
1 files changed, 30 insertions, 64 deletions
diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp
index f0b9984b..926ba0ac 100644
--- a/muse2/muse/song.cpp
+++ b/muse2/muse/song.cpp
@@ -720,7 +720,7 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, const EventList& events, unsigned
//---------------------------------------------------
PartList* pl = mt->parts();
- MidiPart* part = 0;
+ const MidiPart* part = 0;
iPart ip;
for (ip = pl->begin(); ip != pl->end(); ++ip) {
part = (MidiPart*)(ip->second);
@@ -733,16 +733,17 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, const EventList& events, unsigned
if (MusEGlobal::debugMsg)
printf("create new part for recorded events\n");
// create new part
- part = new MidiPart(mt);
+ MidiPart* newpart;
+ newpart = new MidiPart(mt);
// Round the start down using the Arranger part snap raster value.
startTick = AL::sigmap.raster1(startTick, arrangerRaster());
// Round the end up using the Arranger part snap raster value.
endTick = AL::sigmap.raster2(endTick, arrangerRaster());
- part->setTick(startTick);
- part->setLenTick(endTick - startTick);
- part->setName(mt->name());
+ newpart->setTick(startTick);
+ newpart->setLenTick(endTick - startTick);
+ newpart->setName(mt->name());
// copy events
for (ciEvent i = s; i != e; ++i) {
const Event& old = i->second;
@@ -750,16 +751,18 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, const EventList& events, unsigned
event.setTick(old.tick() - startTick);
// addEvent also adds port controller values. So does msgAddPart, below. Let msgAddPart handle them.
//addEvent(event, part);
- if(part->events().find(event) == part->events().end())
- part->nonconst_events().add(event);
+ if(newpart->events().find(event) == newpart->events().end())
+ newpart->nonconst_events().add(event);
}
- MusEGlobal::audio->msgAddPart(part);
+ MusEGlobal::audio->msgAddPart(newpart);
updateFlags |= SC_PART_INSERTED;
return;
}
updateFlags |= SC_EVENT_INSERTED;
+ Undo operations;
+
unsigned partTick = part->tick();
if (endTick > part->endTick()) {
// Determine new part length...
@@ -775,67 +778,30 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, const EventList& events, unsigned
endTick = AL::sigmap.raster2(endTick, arrangerRaster());
// Create an undo op. Indicate do port controller values but not clone parts.
- addUndo(UndoOp(UndoOp::ModifyPartLength, part, part->lenTick(), endTick, true, false)); // FIXME XTICKS! FINDMICHJETZT!
+ operations.push_back(UndoOp(UndoOp::ModifyPartLength, part, part->lenTick(), endTick, true, false)); // FIXME XTICKS! FINDMICHJETZT!
updateFlags |= SC_PART_MODIFIED;
+ }
- if (_recMode == REC_REPLACE)
- {
- iEvent si = part->nonconst_events().lower_bound(startTick - part->tick());
- iEvent ei = part->nonconst_events().lower_bound(part->endTick() - part->tick());
- for (iEvent i = si; i != ei; ++i)
- {
- Event event = i->second;
- // Indicate do port controller values and clone parts.
- addUndo(UndoOp(UndoOp::DeleteEvent, event, part, true, true));
- // Remove the event from the new part's port controller values, and do all clone parts.
- removePortCtrlEvents(event, part, true);
- }
- part->nonconst_events().erase(si, ei);
- }
-
- for (ciEvent i = s; i != e; ++i) {
- Event event = i->second.clone();
- event.setTick(event.tick() - partTick);
- // Create an undo op. Indicate do port controller values and clone parts.
- addUndo(UndoOp(UndoOp::AddEvent, event, part, true, true));
-
- if(part->nonconst_events().find(event) == part->nonconst_events().end())
- part->nonconst_events().add(event);
-
- // Add the event to the new part's port controller values, and do all clone parts.
- addPortCtrlEvents(event, part, true);
- }
- }
- else {
- if (_recMode == REC_REPLACE) {
- iEvent si = part->nonconst_events().lower_bound(startTick - part->tick());
- iEvent ei = part->nonconst_events().lower_bound(endTick - part->tick());
-
- for (iEvent i = si; i != ei; ++i) {
- Event event = i->second;
- // Indicate that controller values and clone parts were handled.
- addUndo(UndoOp(UndoOp::DeleteEvent, event, part, true, true));
- // Remove the event from the part's port controller values, and do all clone parts.
- removePortCtrlEvents(event, part, true);
- }
- part->nonconst_events().erase(si, ei);
- }
- for (ciEvent i = s; i != e; ++i) {
- Event event = i->second.clone();
- int tick = event.tick() - partTick;
- event.setTick(tick);
-
+
+ if (_recMode == REC_REPLACE) {
+ ciEvent si = part->events().lower_bound(startTick - part->tick());
+ ciEvent ei = part->events().lower_bound(endTick - part->tick());
+
+ for (ciEvent i = si; i != ei; ++i) {
+ const Event& event = i->second;
// Indicate that controller values and clone parts were handled.
- addUndo(UndoOp(UndoOp::AddEvent, event, part, true, true));
-
- if(part->nonconst_events().find(event) == part->nonconst_events().end())
- part->nonconst_events().add(event);
-
- // Add the event to the part's port controller values, and do all clone parts.
- addPortCtrlEvents(event, part, true);
- }
+ operations.push_back(UndoOp(UndoOp::DeleteEvent, event, part, true, true));
}
}
+ for (ciEvent i = s; i != e; ++i) {
+ Event event = i->second.clone();
+ event.setTick(event.tick() - partTick);
+ // Indicate that controller values and clone parts were handled.
+ operations.push_back(UndoOp(UndoOp::AddEvent, event, part, true, true));
+ }
+
+ applyOperationGroup(operations,false); // don't do undo, startUndo must have been called from outside.
+}
//---------------------------------------------------------
// findTrack