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); }
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)); }