/// <summary> /// Returns a list having the position and duration of the originalRest. /// The iLmdds have been put in(side) the original rest, either at the beginning, middle, or end. /// </summary> private List <IUniqueDef> GetReplacementList(IUniqueDef originalRest, VoiceDef iVoiceDef) { Debug.Assert(originalRest is RestDef); Debug.Assert(iVoiceDef[0] is MidiChordDef || iVoiceDef[0] is InputChordDef); Debug.Assert(iVoiceDef[iVoiceDef.Count - 1] is MidiChordDef || iVoiceDef[iVoiceDef.Count - 1] is InputChordDef); List <IUniqueDef> rList = new List <IUniqueDef>(); if (iVoiceDef[0].MsPosition > originalRest.MsPosition) { RestDef rest1 = new RestDef(originalRest.MsPosition, iVoiceDef[0].MsPosition - originalRest.MsPosition); rList.Add(rest1); } rList.AddRange(iVoiceDef.UniqueDefs); int iLmddsEndMsPos = iVoiceDef[iVoiceDef.Count - 1].MsPosition + iVoiceDef[iVoiceDef.Count - 1].MsDuration; int originalRestEndMsPos = originalRest.MsPosition + originalRest.MsDuration; if (originalRestEndMsPos > iLmddsEndMsPos) { RestDef rest2 = new RestDef(iLmddsEndMsPos, originalRestEndMsPos - iLmddsEndMsPos); rList.Add(rest2); } return(rList); }
protected void _InsertRange(int index, VoiceDef voiceDef) { M.Assert(!(Container is Bar), "Cannot Insert range of IUniqueDefs inside a Bar."); _uniqueDefs.InsertRange(index, voiceDef.UniqueDefs); SetMsPositionsReFirstUD(); AssertConsistency(); }
/// <summary> /// This function __moves__ the voiceDef's UniqueDefs to the end of this voiceDef's UniqueDefs _without_cloning_them_ (c.f. Trk.ConcatCloneAt(...) ). /// Rests are automatically agglommerated. /// </summary> protected void _AddRange(VoiceDef voiceDef) { M.Assert(!(Container is Bar), "Cannot AddRange of VoiceDefs inside a Bar."); _uniqueDefs.AddRange(voiceDef.UniqueDefs); AgglomerateRests(); SetMsPositionsReFirstUD(); AssertConsistency(); }
private void InsertVoiceDefInRest(int restIndex, VoiceDef iVoiceDef) { List <IUniqueDef> lmdds = _uniqueDefs; IUniqueDef rest = lmdds[restIndex]; List <IUniqueDef> replacement = GetReplacementList(rest, iVoiceDef); int replacementStart = replacement[0].MsPosition; int replacementEnd = replacement[replacement.Count - 1].MsPosition + replacement[replacement.Count - 1].MsDuration; int restStart = rest.MsPosition; int restEnd = rest.MsPosition + rest.MsDuration; Debug.Assert(restStart == replacementStart && restEnd == replacementEnd); lmdds.RemoveAt(restIndex); lmdds.InsertRange(restIndex, replacement); }
protected void _InsertInRest(VoiceDef iVoiceDef) { int iLmddsStartMsPos = iVoiceDef[0].MsPosition; int iLmddsEndMsPos = iVoiceDef[iVoiceDef.Count - 1].MsPosition + iVoiceDef[iVoiceDef.Count - 1].MsDuration; int restIndex = FindIndexOfSpanningRest(iLmddsStartMsPos, iLmddsEndMsPos); // if index >= 0, it is the index of a rest into which the chord will fit. if (restIndex >= 0) { InsertVoiceDefInRest(restIndex, iVoiceDef); SetMsPositions(); // just to be sure! } else { Debug.Assert(false, "Can't find a rest spanning the chord!"); } }
internal void SetToRange(VoiceDef argVoiceDef, int startMsPosReSeq, int endMsPosReSeq) { _uniqueDefs.Clear(); foreach (IUniqueDef iud in argVoiceDef) { int msPos = iud.MsPositionReFirstUD; if (msPos < startMsPosReSeq) { continue; } if (msPos >= endMsPosReSeq) { break; } _uniqueDefs.Add(iud); } //SetMsPositionsReFirstUD(); }
public void Concat(Bar bar2) { M.Assert(_voiceDefs.Count == bar2._voiceDefs.Count); for (int i = 0; i < _voiceDefs.Count; ++i) { VoiceDef vd1 = _voiceDefs[i]; VoiceDef vd2 = bar2._voiceDefs[i]; vd1.Container = null; vd2.Container = null; vd1.AddRange(vd2); vd1.RemoveDuplicateClefDefs(); vd1.AgglomerateRests(); vd1.Container = this; } AssertConsistency(); }
protected void _InsertRange(int index, VoiceDef voiceDef) { _uniqueDefs.InsertRange(index, voiceDef.UniqueDefs); SetMsPositions(); }
protected void _AddRange(VoiceDef voiceDef) { _uniqueDefs.AddRange(voiceDef.UniqueDefs); SetMsPositions(); }
public abstract void AddRange(VoiceDef voiceDef);