示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        /// <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
                }
            }
        }
示例#4
0
        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;
        }