diff options
Diffstat (limited to 'muse2/muse/song.cpp')
-rw-r--r-- | muse2/muse/song.cpp | 519 |
1 files changed, 112 insertions, 407 deletions
diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp index d13f8398..926ba0ac 100644 --- a/muse2/muse/song.cpp +++ b/muse2/muse/song.cpp @@ -216,9 +216,7 @@ Track* Song::addNewTrack(QAction* action, Track* insertAt) if((Track::TrackType)n >= Track::AUDIO_SOFTSYNTH) return 0; - Undo operations; - Track* t = addTrack(operations, (Track::TrackType)n, insertAt); - applyOperationGroup(operations); + Track* t = addTrack((Track::TrackType)n, insertAt); if (t->isVisible()) { deselectTracks(); t->setSelected(true); @@ -236,7 +234,7 @@ Track* Song::addNewTrack(QAction* action, Track* insertAt) // If insertAt is valid, inserts before insertAt. Else at the end after all tracks. //--------------------------------------------------------- -Track* Song::addTrack(Undo& /*operations*/, Track::TrackType type, Track* insertAt) +Track* Song::addTrack(Track::TrackType type, Track* insertAt) { Track* track = 0; int lastAuxIdx = _auxs.size(); @@ -293,12 +291,9 @@ Track* Song::addTrack(Undo& /*operations*/, Track::TrackType type, Track* insert int idx = insertAt ? _tracks.index(insertAt) : -1; - insertTrack1(track, idx); // this and the below are replaced - msgInsertTrack(track, idx, true); // by the UndoOp-operation - insertTrack3(track, idx); // does nothing - // No, can't do this. insertTrack2 needs to be called now, not later, otherwise it sees + // Apply it *now*. insertTrack2 needs to be called now, not later, otherwise it sees // that the track may have routes, and reciprocates them, causing duplicate routes. - ///operations.push_back(UndoOp(UndoOp::AddTrack, idx, track)); + applyOperation(UndoOp(UndoOp::AddTrack, idx, track)); // Add default track <-> midiport routes. if(track->isMidiTrack()) @@ -439,7 +434,8 @@ void Song::duplicateTracks() QString track_name; int idx; int trackno = tl.size(); - MusEGlobal::song->startUndo(); + + Undo operations; for(TrackList::reverse_iterator it = tl.rbegin(); it != tl.rend(); ++it) { Track* track = *it; @@ -449,114 +445,23 @@ void Song::duplicateTracks() for(int cp = 0; cp < copies; ++cp) { - // There are two ways to copy a track now. Using the copy constructor or using new + assign(). - // Tested: Both ways seem OK. Prefer copy constructors for simplicity. But new + assign() may be - // required for fine-grained control over initializing various track types. - // - - // Set to 0 to use the copy constructor. Set to 1 to use new + assign(). - // DELETETHIS is this still necessary to keep around? - // also consider removing and adding a hint to a revision number instead - #if 0 - - Track* new_track = 0; - int lastAuxIdx = _auxs.size(); - switch(track->type()) - { - case Track::AUDIO_SOFTSYNTH: // TODO: Handle synths. p4.0.47 - // ((AudioTrack*)new_track)->addAuxSend(lastAuxIdx); DELETETHIS? - break; - - case Track::MIDI: - new_track = new MidiTrack(); - new_track->setType(Track::MIDI); - break; - case Track::DRUM: - new_track = new MidiTrack(); - new_track->setType(Track::DRUM); - //((MidiTrack*)new_track)->setOutChannel(9); DELETETHIS? - break; - case Track::WAVE: - new_track = new MusECore::WaveTrack(); - //((AudioTrack*)new_track)->addAuxSend(lastAuxIdx); DELETETHIS? - break; - case Track::AUDIO_OUTPUT: - new_track = new AudioOutput(); - break; - case Track::AUDIO_GROUP: - new_track = new AudioGroup(); - //((AudioTrack*)new_track)->addAuxSend(lastAuxIdx); DELETETHIS? - break; - case Track::AUDIO_AUX: - new_track = new AudioAux(); - break; - case Track::AUDIO_INPUT: - new_track = new AudioInput(); - //((AudioTrack*)new_track)->addAuxSend(lastAuxIdx); DELETETHIS? - break; - default: - printf("Song::duplicateTracks: Illegal type %d\n", track->type()); - break; - } - - if(new_track) - { - new_track->assign(*track, flags); - #else - { Track* new_track = track->clone(flags); - #endif //new_track->setDefaultName(track_name); // Handled in class now. idx = trackno + cp; - insertTrack1(new_track, idx); - addUndo(MusECore::UndoOp(MusECore::UndoOp::AddTrack, idx, new_track)); - msgInsertTrack(new_track, idx, false); // No undo. - insertTrack3(new_track, idx); - } + operations.push_back(MusECore::UndoOp(MusECore::UndoOp::AddTrack, idx, new_track)); } } --trackno; } - MusECore::SongChangedFlags_t update_flags = SC_TRACK_INSERTED; - if(flags & (Track::ASSIGN_ROUTES | Track::ASSIGN_DEFAULT_ROUTES)) - update_flags |= SC_ROUTE; - MusEGlobal::song->endUndo(update_flags); + MusEGlobal::song->applyOperationGroup(operations); MusEGlobal::audio->msgUpdateSoloStates(); } -//--------------------------------------------------------- -// cmdRemoveTrack -//--------------------------------------------------------- -void Song::cmdRemoveTrack(Track* track) - { - int idx = _tracks.index(track); - addUndo(UndoOp(UndoOp::DeleteTrack, idx, track)); - removeTrack2(track); - updateFlags |= SC_TRACK_REMOVED; - } -//--------------------------------------------------------- -// removeMarkedTracks -//--------------------------------------------------------- - -void Song::removeMarkedTracks() - { - bool loop; - do { - loop = false; - for (iTrack t = _tracks.begin(); t != _tracks.end(); ++t) { - if ((*t)->selected()) { - removeTrack2(*t); - loop = true; - break; - } - } - } while (loop); - } //--------------------------------------------------------- // deselectTracks @@ -577,15 +482,15 @@ bool Song::addEvent(Event& event, Part* part) { // Return false if the event is already found. // (But allow a port controller value, above, in case it is not already stored.) - if(part->events()->find(event) != part->events()->end()) + if(part->events().find(event) != part->events().end()) { // This can be normal for some (redundant) operations. if(MusEGlobal::debugMsg) - printf("Song::addEvent event already found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->events()->size()); + printf("Song::addEvent event already found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->events().size()); return false; } - part->events()->add(event); + part->nonconst_events().add(event); return true; } @@ -595,18 +500,18 @@ bool Song::addEvent(Event& event, Part* part) void Song::changeEvent(Event& oldEvent, Event& newEvent, Part* part) { - iEvent i = part->events()->find(oldEvent); + iEvent i = part->nonconst_events().find(oldEvent); - if (i == part->events()->end()) { + if (i == part->nonconst_events().end()) { // This can be normal for some (redundant) operations. if(MusEGlobal::debugMsg) - printf("Song::changeEvent event not found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->events()->size()); + printf("Song::changeEvent event not found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->nonconst_events().size()); // no "return;" because: Allow it to add the new event. (And remove the old one from the midi port controller!) (tim) } else - part->events()->erase(i); + part->nonconst_events().erase(i); - part->events()->add(newEvent); + part->nonconst_events().add(newEvent); } //--------------------------------------------------------- @@ -615,14 +520,14 @@ void Song::changeEvent(Event& oldEvent, Event& newEvent, Part* part) void Song::deleteEvent(Event& event, Part* part) { - iEvent ev = part->events()->find(event); - if (ev == part->events()->end()) { + iEvent ev = part->nonconst_events().find(event); + if (ev == part->nonconst_events().end()) { // This can be normal for some (redundant) operations. if(MusEGlobal::debugMsg) - printf("Song::deleteEvent event not found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->events()->size()); + printf("Song::deleteEvent event not found in part:%s size:%zd\n", part->name().toLatin1().constData(), part->nonconst_events().size()); return; } - part->events()->erase(ev); + part->nonconst_events().erase(ev); } //--------------------------------------------------------- @@ -646,8 +551,8 @@ void Song::remapPortDrumCtrlEvents(int mapidx, int newnote, int newchan, int new for(ciPart ip = pl->begin(); ip != pl->end(); ++ip) { MidiPart* part = (MidiPart*)(ip->second); - const EventList* el = part->cevents(); - for(ciEvent ie = el->begin(); ie != el->end(); ++ie) + const EventList& el = part->events(); + for(ciEvent ie = el.begin(); ie != el.end(); ++ie) { const Event& ev = ie->second; if(ev.type() != Controller) @@ -717,17 +622,10 @@ void Song::changeAllPortDrumCtrlEvents(bool add, bool drumonly) for(ciPart ip = pl->begin(); ip != pl->end(); ++ip) { MidiPart* part = (MidiPart*)(ip->second); - const EventList* el = part->cevents(); - // unsigned len = part->lenTick(); // Commented out by flo, see below - for(ciEvent ie = el->begin(); ie != el->end(); ++ie) + for(ciEvent ie = part->events().begin(); ie != part->events().end(); ++ie) { const Event& ev = ie->second; - // Added by T356. Do not handle events which are past the end of the part. - // Commented out by flo: yes, DO handle them! these are "hidden events" - // which may be revealed later again! - // if(ev.tick() >= len) - // break; - + if(ev.type() != Controller) continue; @@ -765,45 +663,35 @@ void Song::changeAllPortDrumCtrlEvents(bool add, bool drumonly) } } -void Song::addACEvent(AudioTrack* t, int acid, int frame, double val) -{ - MusEGlobal::audio->msgAddACEvent(t, acid, frame, val); -} - -void Song::changeACEvent(AudioTrack* t, int acid, int frame, int newFrame, double val) -{ - MusEGlobal::audio->msgChangeACEvent(t, acid, frame, newFrame, val); -} - //--------------------------------------------------------- // cmdAddRecordedEvents // add recorded Events into part //--------------------------------------------------------- -void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned startTick) +void Song::cmdAddRecordedEvents(MidiTrack* mt, const EventList& events, unsigned startTick) { - if (events->empty()) { + if (events.empty()) { if (MusEGlobal::debugMsg) printf("no events recorded\n"); return; } - iEvent s; - iEvent e; + ciEvent s; + ciEvent e; unsigned endTick; if((MusEGlobal::audio->loopCount() > 0 && startTick > lPos().tick()) || (punchin() && startTick < lPos().tick())) { startTick = lpos(); - s = events->lower_bound(startTick); + s = events.lower_bound(startTick); } else { - s = events->begin(); + s = events.begin(); } // search for last noteOff: endTick = 0; - for (iEvent i = events->begin(); i != events->end(); ++i) { + for (ciEvent i = events.begin(); i != events.end(); ++i) { Event ev = i->second; unsigned l = ev.endTick(); if (l > endTick) @@ -813,10 +701,10 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start if((MusEGlobal::audio->loopCount() > 0) || (punchout() && endTick > rPos().tick()) ) { endTick = rpos(); - e = events->lower_bound(endTick); + e = events.lower_bound(endTick); } else - e = events->end(); + e = events.end(); if (startTick > endTick) { if (MusEGlobal::debugMsg) @@ -832,7 +720,7 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start //--------------------------------------------------- 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); @@ -845,39 +733,42 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start 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 (iEvent i = s; i != e; ++i) { - Event old = i->second; + for (ciEvent i = s; i != e; ++i) { + const Event& old = i->second; Event event = old.clone(); 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->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... endTick = 0; - for (iEvent i = s; i != e; ++i) { - Event event = i->second; + for (ciEvent i = s; i != e; ++i) { + const Event& event = i->second; unsigned tick = event.tick() - partTick + event.lenTick(); if (endTick < tick) endTick = tick; @@ -886,88 +777,31 @@ void Song::cmdAddRecordedEvents(MidiTrack* mt, EventList* events, unsigned start // Round the end up (again) using the Arranger part snap raster value. endTick = AL::sigmap.raster2(endTick, arrangerRaster()); - - removePortCtrlEvents(part, false); // Remove all of the part's port controller values. Don't do clone parts. - - // Clone the part. This doesn't increment aref count, and doesn't chain clones. - // It also gives the new part a new serial number, but it is - // overwritten with the old one by Song::changePart(), below. - Part* newPart = part->clone(); - - newPart->setLenTick(endTick); // Set the new part's length. - changePart(part, newPart); // Change the part. - - part->events()->incARef(-1); // Manually adjust reference counts. HACK! - newPart->events()->incARef(1); - - replaceClone(part, newPart); // Replace the part in the clone chain with the new part. - - // Now add all of the new part's port controller values. Indicate do not do clone parts. - addPortCtrlEvents(newPart, false); - // Create an undo op. Indicate do port controller values but not clone parts. - addUndo(UndoOp(UndoOp::ModifyPart, part, newPart, true, false)); + 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 = newPart->events()->lower_bound(startTick - newPart->tick()); - iEvent ei = newPart->events()->lower_bound(newPart->endTick() - newPart->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, newPart, true, true)); - // Remove the event from the new part's port controller values, and do all clone parts. - removePortCtrlEvents(event, newPart, true); - } - newPart->events()->erase(si, ei); - } - - for (iEvent i = s; i != e; ++i) { - Event event = i->second; - event.setTick(event.tick() - partTick); - Event e; - // Create an undo op. Indicate do port controller values and clone parts. - addUndo(UndoOp(UndoOp::AddEvent, e, event, newPart, true, true)); - - if(newPart->events()->find(event) == newPart->events()->end()) - newPart->events()->add(event); - - // Add the event to the new part's port controller values, and do all clone parts. - addPortCtrlEvents(event, newPart, true); - } - } - else { - if (_recMode == REC_REPLACE) { - iEvent si = part->events()->lower_bound(startTick - part->tick()); - iEvent ei = part->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->events()->erase(si, ei); - } - for (iEvent i = s; i != e; ++i) { - Event event = i->second; - 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->events()->find(event) == part->events()->end()) - part->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 @@ -1400,23 +1234,6 @@ void Song::updatePos() } //--------------------------------------------------------- -// setChannelMute -// mute all midi tracks associated with channel -//--------------------------------------------------------- - -void Song::setChannelMute(int channel, bool val) - { - for (iTrack i = _tracks.begin(); i != _tracks.end(); ++i) { - MidiTrack* track = dynamic_cast<MidiTrack*>(*i); - if (track == 0) - continue; - if (track->outChannel() == channel) - track->setMute(val); - } - emit songChanged(SC_MUTE); - } - -//--------------------------------------------------------- // len //--------------------------------------------------------- @@ -1788,10 +1605,17 @@ void Song::endMsgCmd() void Song::undo() { updateFlags = 0; - if (doUndo1()) + + Undo& opGroup = undoList->back(); + + if (opGroup.empty()) return; - MusEGlobal::audio->msgUndo(); - doUndo3(); + + MusEGlobal::audio->msgRevertOperationGroup(opGroup); + + redoList->push_back(opGroup); + undoList->pop_back(); + MusEGlobal::redoAction->setEnabled(true); MusEGlobal::undoAction->setEnabled(!undoList->empty()); setUndoRedoText(); @@ -1800,6 +1624,7 @@ void Song::undo() MusEGlobal::audio->msgUpdateSoloStates(); emit songChanged(updateFlags); + emit sigDirty(); } //--------------------------------------------------------- @@ -1809,10 +1634,17 @@ void Song::undo() void Song::redo() { updateFlags = 0; - if (doRedo1()) + + Undo& opGroup = redoList->back(); + + if (opGroup.empty()) return; - MusEGlobal::audio->msgRedo(); - doRedo3(); + + MusEGlobal::audio->msgExecuteOperationGroup(opGroup); + + undoList->push_back(opGroup); + redoList->pop_back(); + MusEGlobal::undoAction->setEnabled(true); MusEGlobal::redoAction->setEnabled(!redoList->empty()); setUndoRedoText(); @@ -1821,6 +1653,7 @@ void Song::redo() MusEGlobal::audio->msgUpdateSoloStates(); emit songChanged(updateFlags); + emit sigDirty(); } //--------------------------------------------------------- @@ -1834,78 +1667,14 @@ void Song::processMsg(AudioMsg* msg) case SEQM_UPDATE_SOLO_STATES: updateSoloStates(); break; - case SEQM_UNDO: - doUndo2(); - break; - case SEQM_REDO: - doRedo2(); - break; - case SEQM_MOVE_TRACK: - if (msg->a > msg->b) { - for (int i = msg->a; i > msg->b; --i) { - swapTracks(i, i-1); - } - } - else { - for (int i = msg->a; i < msg->b; ++i) { - swapTracks(i, i+1); - } - } - updateFlags = SC_TRACK_MODIFIED; - break; - case SEQM_ADD_EVENT: - updateFlags = SC_EVENT_INSERTED; - if (addEvent(msg->ev1, (MidiPart*)msg->p2)) { - Event ev; - addUndo(UndoOp(UndoOp::AddEvent, ev, msg->ev1, (Part*)msg->p2, msg->a, msg->b)); - } - else - updateFlags = 0; - if(msg->a) - addPortCtrlEvents(msg->ev1, (Part*)msg->p2, msg->b); + case SEQM_EXECUTE_OPERATION_GROUP: + executeOperationGroup2(*msg->operations); break; - case SEQM_REMOVE_EVENT: - { - Event event = msg->ev1; - MidiPart* part = (MidiPart*)msg->p2; - if(msg->a) - removePortCtrlEvents(event, part, msg->b); - Event e; - addUndo(UndoOp(UndoOp::DeleteEvent, e, event, (Part*)part, msg->a, msg->b)); - deleteEvent(event, part); - updateFlags = SC_EVENT_REMOVED; - } - break; - case SEQM_CHANGE_EVENT: - if(msg->a) - removePortCtrlEvents(msg->ev1, (MidiPart*)msg->p3, msg->b); - changeEvent(msg->ev1, msg->ev2, (MidiPart*)msg->p3); - if(msg->a) - addPortCtrlEvents(msg->ev2, (Part*)msg->p3, msg->b); - addUndo(UndoOp(UndoOp::ModifyEvent, msg->ev2, msg->ev1, (Part*)msg->p3, msg->a, msg->b)); - updateFlags = SC_EVENT_MODIFIED; - break; - - // Moved here from MidiSeq::processMsg p4.0.34 - case SEQM_ADD_TRACK: - insertTrack2(msg->track, msg->ival); - break; - case SEQM_REMOVE_TRACK: - cmdRemoveTrack(msg->track); - break; - //case SEQM_CHANGE_TRACK: DELETETHIS 3 - // changeTrack((Track*)(msg->p1), (Track*)(msg->p2)); - // break; - case SEQM_ADD_PART: - cmdAddPart((Part*)msg->p1); - break; - case SEQM_REMOVE_PART: - cmdRemovePart((Part*)msg->p1); - break; - case SEQM_CHANGE_PART: - cmdChangePart((Part*)msg->p1, (Part*)msg->p2, msg->a, msg->b); + case SEQM_REVERT_OPERATION_GROUP: + revertOperationGroup2(*msg->operations); break; + case SEQM_ADD_TEMPO: addUndo(UndoOp(UndoOp::AddTempo, msg->a, msg->b)); MusEGlobal::tempomap.addTempo(msg->a, msg->b); @@ -1959,56 +1728,6 @@ void Song::processMsg(AudioMsg* msg) } //--------------------------------------------------------- -// cmdAddPart -//--------------------------------------------------------- - -void Song::cmdAddPart(Part* part) - { - addPart(part); - addUndo(UndoOp(UndoOp::AddPart, part)); - updateFlags = SC_PART_INSERTED; - } - -//--------------------------------------------------------- -// cmdRemovePart -//--------------------------------------------------------- - -void Song::cmdRemovePart(Part* part) - { - removePart(part); - addUndo(UndoOp(UndoOp::DeletePart, part)); - part->events()->incARef(-1); - unchainClone(part); - updateFlags = SC_PART_REMOVED; - } - -//--------------------------------------------------------- -// cmdChangePart -//--------------------------------------------------------- - -void Song::cmdChangePart(Part* oldPart, Part* newPart, bool doCtrls, bool doClones) - { - if(doCtrls) - removePortCtrlEvents(oldPart, doClones); - - changePart(oldPart, newPart); - - addUndo(UndoOp(UndoOp::ModifyPart, oldPart, newPart, doCtrls, doClones)); - - // Changed by T356. Do not decrement ref count if the new part is a clone of the old part, since the event list - // will still be active. - if(oldPart->cevents() != newPart->cevents()) - oldPart->events()->incARef(-1); - - replaceClone(oldPart, newPart); - - if(doCtrls) - addPortCtrlEvents(newPart, doClones); - - updateFlags = SC_PART_MODIFIED; - } - -//--------------------------------------------------------- // panic //--------------------------------------------------------- @@ -2383,7 +2102,7 @@ void Song::recordEvent(MidiTrack* mt, Event& event) unsigned tick = event.tick(); 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); @@ -2395,14 +2114,14 @@ void Song::recordEvent(MidiTrack* mt, Event& event) updateFlags |= SC_EVENT_INSERTED; if (ip == pl->end()) { // create new part - part = new MidiPart(mt); + MidiPart* part = new MidiPart(mt); int startTick = roundDownBar(tick); int endTick = roundUpBar(tick + 1); part->setTick(startTick); part->setLenTick(endTick - startTick); part->setName(mt->name()); event.move(-startTick); - part->events()->add(event); + part->nonconst_events().add(event); MusEGlobal::audio->msgAddPart(part); return; } @@ -2413,23 +2132,21 @@ void Song::recordEvent(MidiTrack* mt, Event& event) Event ev; if(event.type() == Controller) { - EventRange range = part->events()->equal_range(tick); - for(iEvent i = range.first; i != range.second; ++i) + EventRange range = part->events().equal_range(tick); + for(ciEvent i = range.first; i != range.second; ++i) { ev = i->second; if(ev.type() == Controller && ev.dataA() == event.dataA()) { if(ev.dataB() == event.dataB()) // Don't bother if already set. return; - // Indicate do undo, and do port controller values and clone parts. - MusEGlobal::audio->msgChangeEvent(ev, event, part, true, true, true); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::ModifyEvent,event,ev,part,true,true)); return; } } } - // Indicate do undo, and do port controller values and clone parts. - MusEGlobal::audio->msgAddEvent(event, part, true, true, true); + MusEGlobal::song->applyOperation(UndoOp(UndoOp::AddEvent, event, part, true,true)); } //--------------------------------------------------------- @@ -2705,8 +2422,8 @@ int Song::execMidiAutomationCtlPopup(MidiTrack* track, MidiPart* part, const QPo unsigned partEnd = partStart + part->lenTick(); if(tick >= partStart && tick < partEnd) { - EventRange range = part->events()->equal_range(tick - partStart); - for(iEvent i = range.first; i != range.second; ++i) + EventRange range = part->events().equal_range(tick - partStart); + for(ciEvent i = range.first; i != range.second; ++i) { ev = i->second; if(ev.type() == Controller) @@ -2785,7 +2502,7 @@ int Song::execMidiAutomationCtlPopup(MidiTrack* track, MidiPart* part, const QPo part->setLenTick(endTick - startTick); part->setName(mt->name()); e.setTick(tick - startTick); - part->events()->add(e); + part->nonconst_events().add(e); // Allow undo. MusEGlobal::audio->msgAddPart(part); } @@ -3040,7 +2757,7 @@ void Song::connectJackRoutes(AudioTrack* track, bool disconnect) void Song::insertTrack0(Track* track, int idx) { insertTrack1(track, idx); - insertTrack2(track, idx); // MusEGlobal::audio->msgInsertTrack(track, idx, false); DELETETHIS or is this somehow explanatory? + insertTrack2(track, idx); // the same as MusEGlobal::audio->msgInsertTrack(track, idx, false); insertTrack3(track, idx); } @@ -3221,18 +2938,6 @@ void Song::insertTrack3(Track* /*track*/, int /*idx*/)//prevent compiler warning } //--------------------------------------------------------- -// removeTrack0 -//--------------------------------------------------------- - -void Song::removeTrack0(Track* track) - { - removeTrack1(track); - MusEGlobal::audio->msgRemoveTrack(track); - removeTrack3(track); - update(SC_TRACK_REMOVED); - } - -//--------------------------------------------------------- // removeTrack1 // non realtime part of removeTrack //--------------------------------------------------------- @@ -3285,12 +2990,12 @@ void Song::removeTrack2(Track* track) case Track::DRUM: case Track::NEW_DRUM: removePortCtrlEvents(((MidiTrack*)track)); - unchainTrackParts(track, true); + unchainTrackParts(track); _midis.erase(track); break; case Track::WAVE: - unchainTrackParts(track, true); + unchainTrackParts(track); _waves.erase(track); break; @@ -3439,7 +3144,7 @@ void Song::executeScript(const char* scriptfile, PartList* parts, int quant, boo fprintf(fp, "BEATLEN %d\n", AL::sigmap.ticksBeat(0)); fprintf(fp, "QUANTLEN %d\n", quant); - for (iEvent e = part->events()->begin(); e != part->events()->end(); e++) { + for (ciEvent e = part->events().begin(); e != part->events().end(); e++) { Event ev = e->second; if (ev.isNote()) @@ -3583,14 +3288,14 @@ QString Song::getScriptPath(int id, bool isdelivered) return path; } -void Song::informAboutNewParts(const std::map< Part*, std::set<Part*> >& param) +void Song::informAboutNewParts(const std::map< const Part*, std::set<const Part*> >& param) { emit newPartsCreated(param); } -void Song::informAboutNewParts(Part* orig, Part* p1, Part* p2, Part* p3, Part* p4, Part* p5, Part* p6, Part* p7, Part* p8, Part* p9) +void Song::informAboutNewParts(const Part* orig, const Part* p1, const Part* p2, const Part* p3, const Part* p4, const Part* p5, const Part* p6, const Part* p7, const Part* p8, const Part* p9) { - std::map< Part*, std::set<Part*> > temp; + std::map<const Part*, std::set<const Part*> > temp; temp[orig].insert(p1); temp[orig].insert(p2); @@ -3601,7 +3306,7 @@ void Song::informAboutNewParts(Part* orig, Part* p1, Part* p2, Part* p3, Part* p temp[orig].insert(p7); temp[orig].insert(p8); temp[orig].insert(p9); - temp[orig].erase(static_cast<Part*>(NULL)); + temp[orig].erase(static_cast<const Part*>(NULL)); temp[orig].erase(orig); informAboutNewParts(temp); |