private static IHasTicksDuration FindPreviousEventOrForward(List <IHasTicksDuration> eventsAndEventGroups, int graceIndex) { if (graceIndex == 0) { M.ThrowError("Can't steal ticks from the previous measure."); } IHasTicksDuration previousObject = eventsAndEventGroups[graceIndex - 1]; if (previousObject is Grace) { M.ThrowError("Can't steal ticks from a Grace."); } IHasTicksDuration previousEvent; if (previousObject is EventGroup eg) { List <IHasTicksDuration> events = eg.IEventsAndGraces; previousEvent = events[events.Count - 1]; } else { previousEvent = previousObject as Event; } return(previousEvent); }
private static IHasTicksDuration FindNextEventOrForward(List <IHasTicksDuration> eventsAndEventGroups, int graceIndex) { if (graceIndex == (eventsAndEventGroups.Count - 1)) { M.ThrowError("Can't steal ticks from the next measure."); } IHasTicksDuration nextObject = eventsAndEventGroups[graceIndex + 1]; if (nextObject is Grace) { M.ThrowError("Can't steal ticks from a Grace."); } IHasTicksDuration nextEvent; if (nextObject is EventGroup eg) { List <IHasTicksDuration> events = eg.IEventsAndGraces; nextEvent = events[0]; } else { nextEvent = nextObject as Event; } return(nextEvent); }
/// <summary> /// This function is called recursively. /// TicksPosInScore is not set. Grace groups are ignored. /// TicksPosInScore and TicksDurations are updated for grace notes /// when the whole score has been read (in MNX.AdjustForGraceNotes()). /// </summary> /// <param name="outerTicks"></param> private void SetTicksDurationsInContentIgnoringGraces(int outerTicks) { int GetBasicTicks(IHasTicksDuration component) { int rval = 0; if (component is Event e) { MNXDurationSymbol defaultDuration = e.MNXDurationSymbol; MNXDurationSymbol ticksOverride = e.TicksOverride; rval = (ticksOverride == null) ? defaultDuration.GetDefaultTicks() : ticksOverride.GetDefaultTicks(); } else if (component is Forward f) { rval = f.TicksDuration; } else if (component is TupletDef t) { rval = t.OuterDuration.GetDefaultTicks(); } return(rval); } List <int> eventForwardTupletBasicTicks = new List <int>(); List <IHasTicksDuration> eventForwardTuplets = new List <IHasTicksDuration>(); // Get the default outer ticks of each contained Event, Forward and TupletDef component. foreach (IHasTicksDuration component in Components) { if (component is Event || component is Forward || component is TupletDef) { eventForwardTupletBasicTicks.Add(GetBasicTicks(component)); eventForwardTuplets.Add(component); } } List <int> innerTicks = M.IntDivisionSizes(outerTicks, eventForwardTupletBasicTicks); // Set the default outer ticks of each contained Event, Forward and TupletDef component. for (int i = 0; i < eventForwardTuplets.Count; i++) { IHasTicksDuration eventForwardTuplet = eventForwardTuplets[i]; int ticks = innerTicks[i]; if (eventForwardTuplet is Event e) { e.TicksDuration = innerTicks[i]; } if (eventForwardTuplet is Forward f) { f.TicksDuration = innerTicks[i]; } if (eventForwardTuplet is TupletDef t) { t.SetTicksDurationsInContentIgnoringGraces(innerTicks[i]); // recursive call } } }
public void SetMsDurations(int seqMsPositionInScore, double millisecondsPerTick) { MsPosInScore = seqMsPositionInScore; var tickPositions = new List <int>(); int currentTickPosition = 0; foreach (var evt in IEventsAndGraces) { tickPositions.Add(currentTickPosition); currentTickPosition += evt.TicksDuration; } tickPositions.Add(currentTickPosition); var msPositions = new List <int>(); foreach (var tickPosition in tickPositions) { msPositions.Add((int)Math.Round(tickPosition * millisecondsPerTick)); } int totalMsDuration = 0; int evtMsPositionInScore = MsPosInScore; List <IHasTicksDuration> iEventsAndGraces = IEventsAndGraces; for (var i = 1; i < msPositions.Count; i++) { IHasTicksDuration ihtd = iEventsAndGraces[i - 1]; int msDuration = msPositions[i] - msPositions[i - 1]; if (ihtd is Event e) { e.MsDuration = msDuration; e.MsPosInScore = evtMsPositionInScore; } else if (ihtd is Forward f) { f.MsDuration = msDuration; f.MsPosInScore = evtMsPositionInScore; } else if (ihtd is Grace g) { g.MsDuration = msDuration; g.MsPosInScore = evtMsPositionInScore; List <IHasTicksDuration> graceEvents = g.IEventsAndGraces; List <int> tickDurations = new List <int>(); foreach (var ge in graceEvents) { tickDurations.Add(ge.TicksDuration); } List <int> msDurations = M.IntDivisionSizes(msDuration, tickDurations); int localMsPosInScore = g.MsPosInScore; for (int j = 0; j < msDurations.Count; j++) { int msDur = msDurations[j]; graceEvents[j].MsPosInScore = localMsPosInScore; graceEvents[j].MsDuration = msDur; localMsPosInScore += msDur; } } evtMsPositionInScore += msDuration; totalMsDuration += msDuration; } MsDuration = totalMsDuration; }