bool NoteTrack::Copy(double t0, double t1, Track **dest){ //dest goes onto clipboard *dest = NULL; // This is redundant and matches WaveTrack::Copy if (t1 <= t0) return false; double len = t1-t0; NoteTrack *newTrack = new NoteTrack(mDirManager); newTrack->Init(*this); mSeq->convert_to_seconds(); newTrack->mSeq = mSeq->copy(t0 - GetOffset(), len, false); newTrack->SetOffset(GetOffset()); // What should be done with the rest of newTrack's members? //(mBottomNote, mDirManager, mLastMidiPosition, // mSerializationBuffer, mSerializationLength, mVisibleChannels) *dest = newTrack; return true; }
Track *NoteTrack::Duplicate() { NoteTrack *duplicate = new NoteTrack(mDirManager); duplicate->Init(*this); // Duplicate on NoteTrack moves data from mSeq to mSerializationBuffer // and from mSerializationBuffer to mSeq on alternate calls. Duplicate // to the undo stack and Duplicate back to the project should result // in serialized blobs on the undo stack and traversable data in the // project object. if (mSeq) { SonifyBeginSerialize(); assert(!mSerializationBuffer); // serialize from this to duplicate's mSerializationBuffer mSeq->serialize((void**)&duplicate->mSerializationBuffer, &duplicate->mSerializationLength); SonifyEndSerialize(); } else if (mSerializationBuffer) { SonifyBeginUnserialize(); assert(!mSeq); Alg_track_ptr alg_track = Alg_seq::unserialize(mSerializationBuffer, mSerializationLength); assert(alg_track->get_type() == 's'); duplicate->mSeq = (Alg_seq_ptr) alg_track; SonifyEndUnserialize(); } else assert(false); // bug if neither mSeq nor mSerializationBuffer // copy some other fields here duplicate->SetBottomNote(mBottomNote); duplicate->SetPitchHeight(mPitchHeight); duplicate->mLastMidiPosition = mLastMidiPosition; duplicate->mVisibleChannels = mVisibleChannels; duplicate->SetOffset(GetOffset()); #ifdef EXPERIMENTAL_MIDI_OUT duplicate->SetGain(GetGain()); #endif return duplicate; }