//(Voice voice, InputChordDef umcd, int absMsPosition, int minimumCrotchetDurationMS, float fontSize) public CautionaryInputChordSymbol(Voice voice, CautionaryChordDef lccd, int absMsPosition, float fontSize) : base(voice, lccd.MsDuration, absMsPosition, 600, fontSize) { SetNoteheadPitches(lccd.NotatedMidiPitches); _durationClass = DurationClass.cautionary; _msDuration = 0; Stem.Draw = false; }
public RestSymbol(Voice voice, IUniqueDef iumdd, int minimumCrotchetDurationMS, float fontHeight) : base(voice, iumdd.MsDuration, iumdd.MsPosition, minimumCrotchetDurationMS, fontHeight) { if(iumdd is CautionaryChordDef) { Console.WriteLine("rest is CautionaryChordDef!"); } LocalCautionaryChordDef = iumdd as CautionaryChordDef; }
public IUniqueDef DeepClone() { CautionaryChordDef deepClone = new CautionaryChordDef(this, this._msPosition, this._msDuration); return deepClone; }
/// <summary> /// Returns two bars. The first is the beginning of the argument bar up to absoluteSplitPos, /// The second is the end of the argument bar beginning at absoluteSplitPos. /// The final UniqueMidiDurationDef in each voice.UniqueMidiDurationDefs list is converted /// to a FinalLMDDInVoice object containing an MsDurationToBarline property. /// If a chord or rest overlaps a barline, a LocalizedCautionaryChordDef object is created at the /// start of the voice.UniqueMidiDurationDefs in the second bar. A LocalizedCautionaryChordDef /// object is a kind of chord which is used while justifying systems, but is not displayed and /// does not affect performance. /// ClefChangeDefs are placed at the end of the first bar, not at the start of the second bar. /// </summary> protected List<List<VoiceDef>> SplitBar(List<VoiceDef> originalBar, int absoluteSplitPos) { List<List<VoiceDef>> twoBars = new List<List<VoiceDef>>(); List<VoiceDef> firstBar = new List<VoiceDef>(); List<VoiceDef> secondBar = new List<VoiceDef>(); twoBars.Add(firstBar); twoBars.Add(secondBar); int originalBarStartPos = originalBar[0].UniqueDefs[0].MsPosition; int originalBarEndPos = originalBar[0].UniqueDefs[originalBar[0].UniqueDefs.Count - 1].MsPosition + originalBar[0].UniqueDefs[originalBar[0].UniqueDefs.Count - 1].MsDuration; VoiceDef firstBarVoice; VoiceDef secondBarVoice; foreach(VoiceDef voice in originalBar) { TrkDef outputVoice = voice as TrkDef; if(outputVoice != null) { firstBarVoice = new TrkDef(outputVoice.MidiChannel,new List<IUniqueDef>()); firstBar.Add(firstBarVoice); secondBarVoice = new TrkDef(outputVoice.MidiChannel, new List<IUniqueDef>()); secondBar.Add(secondBarVoice); } else { firstBarVoice = new InputVoiceDef(); firstBar.Add(firstBarVoice); secondBarVoice = new InputVoiceDef(); secondBar.Add(secondBarVoice); } foreach(IUniqueDef iUnique in voice.UniqueDefs) { int udMsDuration = iUnique.MsDuration; IUniqueSplittableChordDef uniqueChordDef = iUnique as IUniqueSplittableChordDef; if(uniqueChordDef != null) { udMsDuration = (uniqueChordDef.MsDurationToNextBarline == null) ? iUnique.MsDuration : (int)uniqueChordDef.MsDurationToNextBarline; } int udEndPos = iUnique.MsPosition + udMsDuration; if(iUnique.MsPosition >= absoluteSplitPos) { if(iUnique.MsPosition == absoluteSplitPos && iUnique is ClefChangeDef) { firstBarVoice.UniqueDefs.Add(iUnique); } else { Debug.Assert(udEndPos <= originalBarEndPos); secondBarVoice.UniqueDefs.Add(iUnique); } } else if(udEndPos > absoluteSplitPos) { int durationAfterBarline = udEndPos - absoluteSplitPos; if(iUnique is RestDef) { // This is a rest. Split it. RestDef firstRestHalf = new RestDef(iUnique.MsPosition, absoluteSplitPos - iUnique.MsPosition); firstBarVoice.UniqueDefs.Add(firstRestHalf); RestDef secondRestHalf = new RestDef(absoluteSplitPos, durationAfterBarline); secondBarVoice.UniqueDefs.Add(secondRestHalf); } else if(iUnique is CautionaryChordDef) { // This is a cautionary chord. Set the position of the following barline, and // Add an LocalizedCautionaryChordDef at the beginning of the following bar. iUnique.MsDuration = absoluteSplitPos - iUnique.MsPosition; firstBarVoice.UniqueDefs.Add(iUnique); CautionaryChordDef secondLmdd = new CautionaryChordDef((IUniqueChordDef)iUnique, absoluteSplitPos, durationAfterBarline); secondBarVoice.UniqueDefs.Add(secondLmdd); } else { // This is a MidiChordDef or a InputChordDef. // Set the position of the following barline, and add a CautionaryChordDef at the beginning // of the following bar. if(uniqueChordDef != null) { uniqueChordDef.MsDurationToNextBarline = absoluteSplitPos - iUnique.MsPosition; } firstBarVoice.UniqueDefs.Add((IUniqueDef)uniqueChordDef); CautionaryChordDef secondLmdd = new CautionaryChordDef((IUniqueChordDef)uniqueChordDef, absoluteSplitPos, durationAfterBarline); secondBarVoice.UniqueDefs.Add(secondLmdd); } } else { Debug.Assert(udEndPos <= absoluteSplitPos && iUnique.MsPosition >= originalBarStartPos); firstBarVoice.UniqueDefs.Add(iUnique); } } } return twoBars; }
/// <summary> /// Creates a "bar" which is a list of voiceDefs containing IUniqueDefs that begin before barlineEndMsPosition, /// and removes these IUniqueDefs from the current block. /// </summary> /// <param name="endBarlineAbsMsPosition"></param> /// <returns>The popped bar</returns> private List<VoiceDef> PopBar(int endBarlineAbsMsPosition) { Debug.Assert(AbsMsPosition < endBarlineAbsMsPosition); AssertNonEmptyBlockConsistency(); List<VoiceDef> poppedBar = new List<VoiceDef>(); List<VoiceDef> remainingBar = new List<VoiceDef>(); int currentBlockAbsEndPos = this.AbsMsPosition + this.MsDuration; bool isLastBar = (currentBlockAbsEndPos == endBarlineAbsMsPosition); VoiceDef poppedBarVoice; VoiceDef remainingBarVoice; foreach(VoiceDef voiceDef in _voiceDefs) { Trk outputVoice = voiceDef as Trk; InputVoiceDef inputVoice = voiceDef as InputVoiceDef; if(outputVoice != null) { poppedBarVoice = new Trk(outputVoice.MidiChannel); poppedBar.Add(poppedBarVoice); remainingBarVoice = new Trk(outputVoice.MidiChannel); remainingBar.Add(remainingBarVoice); } else { poppedBarVoice = new InputVoiceDef(inputVoice.MidiChannel); poppedBar.Add(poppedBarVoice); remainingBarVoice = new InputVoiceDef(inputVoice.MidiChannel); remainingBar.Add(remainingBarVoice); } foreach(IUniqueDef iud in voiceDef.UniqueDefs) { int iudMsDuration = iud.MsDuration; int iudAbsStartPos = this.AbsMsPosition + iud.MsPositionReFirstUD; int iudAbsEndPos = iudAbsStartPos + iudMsDuration; if(iudAbsStartPos >= endBarlineAbsMsPosition) { Debug.Assert(iudAbsEndPos <= currentBlockAbsEndPos); if(iud is ClefChangeDef && iudAbsStartPos == endBarlineAbsMsPosition) { poppedBarVoice.UniqueDefs.Add(iud); } else { remainingBarVoice.UniqueDefs.Add(iud); } } else if(iudAbsEndPos > endBarlineAbsMsPosition) { int durationBeforeBarline = endBarlineAbsMsPosition - iudAbsStartPos; int durationAfterBarline = iudAbsEndPos - endBarlineAbsMsPosition; if(iud is RestDef) { // This is a rest. Split it. RestDef firstRestHalf = new RestDef(iudAbsStartPos, durationBeforeBarline); poppedBarVoice.UniqueDefs.Add(firstRestHalf); RestDef secondRestHalf = new RestDef(endBarlineAbsMsPosition, durationAfterBarline); remainingBarVoice.UniqueDefs.Add(secondRestHalf); } else if(iud is CautionaryChordDef) { // This is a cautionary chord. Set the position of the following barline, and // Add a CautionaryChordDef at the beginning of the following bar. iud.MsDuration = endBarlineAbsMsPosition - iudAbsStartPos; poppedBarVoice.UniqueDefs.Add(iud); Debug.Assert(remainingBarVoice.UniqueDefs.Count == 0); CautionaryChordDef secondLmdd = new CautionaryChordDef((IUniqueChordDef)iud, 0, durationAfterBarline); remainingBarVoice.UniqueDefs.Add(secondLmdd); } else if(iud is MidiChordDef || iud is InputChordDef) { IUniqueSplittableChordDef uniqueChordDef = iud as IUniqueSplittableChordDef; uniqueChordDef.MsDurationToNextBarline = durationBeforeBarline; poppedBarVoice.UniqueDefs.Add(uniqueChordDef); Debug.Assert(remainingBarVoice.UniqueDefs.Count == 0); CautionaryChordDef ccd = new CautionaryChordDef(uniqueChordDef, 0, durationAfterBarline); remainingBarVoice.UniqueDefs.Add(ccd); } } else { Debug.Assert(iudAbsEndPos <= endBarlineAbsMsPosition && iudAbsStartPos >= AbsMsPosition); poppedBarVoice.UniqueDefs.Add(iud); } } } this.AbsMsPosition = endBarlineAbsMsPosition; this._voiceDefs = remainingBar; SetMsPositions(); if(!isLastBar) { // _voiceDefs is not empty AssertNonEmptyBlockConsistency(); } return poppedBar; }
public object Clone() { CautionaryChordDef deepClone = new CautionaryChordDef(this, this._msPositionReFirstIUD, this._msDuration); return deepClone; }
public IUniqueDef DeepClone() { CautionaryChordDef deepClone = new CautionaryChordDef(this, this._msPosition, this._msDuration); return(deepClone); }
public object Clone() { CautionaryChordDef deepClone = new CautionaryChordDef(this, this._msPositionReFirstIUD, this._msDuration); return(deepClone); }