Beispiel #1
0
        public ILength ConvertTo(long length, long time, TempoMap tempoMap)
        {
            ThrowIfLengthArgument.IsNegative(nameof(length), length);
            ThrowIfTimeArgument.IsNegative(nameof(time), time);
            ThrowIfArgument.IsNull(nameof(tempoMap), tempoMap);

            var ticksPerQuarterNoteTimeDivision = tempoMap.TimeDivision as TicksPerQuarterNoteTimeDivision;

            if (ticksPerQuarterNoteTimeDivision != null)
            {
                return(new MusicalLength(FractionUtilities.FromTicks(length, ticksPerQuarterNoteTimeDivision.TicksPerQuarterNote)));
            }

            ThrowIfTimeDivision.IsNotSupportedForLengthConversion(tempoMap.TimeDivision);
            return(null);
        }
Beispiel #2
0
        private static MusicalTime ConvertToByTicksPerQuarterNote(long time, short ticksPerQuarterNote, TempoMap tempoMap)
        {
            ThrowIfTimeArgument.IsNegative(nameof(time), time);
            ThrowIfArgument.IsNull(nameof(tempoMap), tempoMap);

            //

            var bars              = 0;
            var lastTime          = 0L;
            var lastTimeSignature = TimeSignature.Default;

            foreach (var timeSignatureChange in tempoMap.TimeSignature.Values.Where(v => v.Time <= time))
            {
                var timeSignatureChangeTime = timeSignatureChange.Time;

                bars += GetBarsCount(timeSignatureChangeTime - lastTime, lastTimeSignature, ticksPerQuarterNote);
                lastTimeSignature = timeSignatureChange.Value;
                lastTime          = timeSignatureChangeTime;
            }

            //

            var deltaTime = time - lastTime;
            var lastBars  = GetBarsCount(deltaTime, lastTimeSignature, ticksPerQuarterNote);

            bars += lastBars;

            //

            deltaTime = deltaTime % GetBarLength(lastTimeSignature, ticksPerQuarterNote);
            var beatLength = GetBeatLength(lastTimeSignature, ticksPerQuarterNote);
            var beats      = deltaTime / beatLength;

            //

            var fraction = FractionUtilities.FromTicks(deltaTime % beatLength, ticksPerQuarterNote);

            //

            return(new MusicalTime(bars, (int)beats, fraction));
        }