/// <summary> /// Converts length from <see cref="long"/> to the specified length type. /// </summary> /// <param name="length">Length to convert.</param> /// <param name="lengthType">Type that will represent the length of an object.</param> /// <param name="time">Start time of an object to convert length of.</param> /// <param name="tempoMap">Tempo map used to convert <paramref name="length"/>.</param> /// <returns>Length as an instance of time span defined by <paramref name="lengthType"/>.</returns> /// <exception cref="ArgumentOutOfRangeException"> /// <para>One of the following errors occured:</para> /// <list type="bullet"> /// <item> /// <description><paramref name="length"/> is negative.</description> /// </item> /// <item> /// <description><paramref name="time"/> is negative.</description> /// </item> /// </list> /// </exception> /// <exception cref="ArgumentNullException"><paramref name="tempoMap"/> is <c>null</c>.</exception> /// <exception cref="InvalidEnumArgumentException"><paramref name="lengthType"/> specified an invalid value.</exception> public static ITimeSpan ConvertTo(long length, TimeSpanType lengthType, long time, TempoMap tempoMap) { ThrowIfLengthArgument.IsNegative(nameof(length), length); ThrowIfArgument.IsInvalidEnumValue(nameof(lengthType), lengthType); ThrowIfTimeArgument.IsNegative(nameof(time), time); ThrowIfArgument.IsNull(nameof(tempoMap), tempoMap); return(TimeSpanConverter.ConvertTo(length, lengthType, time, tempoMap)); }
/// <summary> /// Converts length from <see cref="long"/> to the specified length type. /// </summary> /// <typeparam name="TTimeSpan">Type that will represent the length of an object.</typeparam> /// <param name="length">Length to convert.</param> /// <param name="time">Start time of an object to convert length of.</param> /// <param name="tempoMap">Tempo map used to convert <paramref name="length"/>.</param> /// <returns>Length as an instance of <typeparamref name="TTimeSpan"/>.</returns> /// <exception cref="ArgumentOutOfRangeException"><paramref name="length"/> is negative.</exception> /// <exception cref="ArgumentNullException"> /// <para>One of the following errors occured:</para> /// <list type="bullet"> /// <item> /// <description><paramref name="time"/> is <c>null</c>.</description> /// </item> /// <item> /// <description><paramref name="tempoMap"/> is <c>null</c>.</description> /// </item> /// </list> /// </exception> /// <exception cref="NotSupportedException"><typeparamref name="TTimeSpan"/> is not supported.</exception> public static TTimeSpan ConvertTo <TTimeSpan>(long length, ITimeSpan time, TempoMap tempoMap) where TTimeSpan : ITimeSpan { ThrowIfLengthArgument.IsNegative(nameof(length), length); ThrowIfArgument.IsNull(nameof(time), time); ThrowIfArgument.IsNull(nameof(tempoMap), tempoMap); return(TimeSpanConverter.ConvertTo <TTimeSpan>(length, TimeConverter.ConvertFrom(time, tempoMap), tempoMap)); }
/// <summary> /// Converts length from one length type to another one. /// </summary> /// <param name="length">Length to convert.</param> /// <param name="lengthType">Type to convert <paramref name="length"/> to.</param> /// <param name="time">Start time of an object to convert length of.</param> /// <param name="tempoMap">Tempo map used to convert <paramref name="length"/>.</param> /// <returns>Length as an instance of <paramref name="lengthType"/>.</returns> /// <exception cref="ArgumentNullException"> /// <para>One of the following errors occured:</para> /// <list type="bullet"> /// <item> /// <description><paramref name="length"/> is <c>null</c>.</description> /// </item> /// <item> /// <description><paramref name="lengthType"/> is <c>null</c>.</description> /// </item> /// <item> /// <description><paramref name="time"/> is <c>null</c>.</description> /// </item> /// <item> /// <description><paramref name="tempoMap"/> is <c>null</c>.</description> /// </item> /// </list> /// </exception> /// <exception cref="NotSupportedException"><paramref name="lengthType"/> is not supported.</exception> public static ITimeSpan ConvertTo(ITimeSpan length, Type lengthType, ITimeSpan time, TempoMap tempoMap) { ThrowIfArgument.IsNull(nameof(length), length); ThrowIfArgument.IsNull(nameof(lengthType), lengthType); ThrowIfArgument.IsNull(nameof(time), time); ThrowIfArgument.IsNull(nameof(tempoMap), tempoMap); return(TimeSpanConverter.ConvertTo(length, lengthType, TimeConverter.ConvertFrom(time, tempoMap), tempoMap)); }
private static long ConvertFromTimeTime(MathTimeSpan mathTimeSpan, long time, TempoMap tempoMap) { var timeSpan1 = mathTimeSpan.TimeSpan1; var timeSpan2 = mathTimeSpan.TimeSpan2; // Ensure that the first time span is not an instance of the MathTimeSpan. If it is, // convert it to the type of its first time span. For example, if we the following // time span was passed to the method: // // (a1 + b1) + c // // the time span will be transformed to: // // a2 + c var timeSpan1AsMath = mathTimeSpan.TimeSpan1 as MathTimeSpan; if (timeSpan1AsMath != null) { timeSpan1 = TimeSpanConverter.ConvertTo(timeSpan1AsMath, timeSpan1AsMath.TimeSpan1.GetType(), time, tempoMap); } // To subtract one time from another one we need to convert the second time span // to the type of the first one. After that result of subtraction will be of the // first time span type. And finally we convert result time span according to the // specified time. For example, time span shown above will be transformed first to // // a3 // // and then will be converted to MIDI time. switch (mathTimeSpan.Operation) { case MathOperation.Subtract: { var convertedTimeSpan2 = TimeConverter.ConvertTo(timeSpan2, timeSpan1.GetType(), tempoMap); return(TimeSpanConverter.ConvertFrom(timeSpan1.Subtract(convertedTimeSpan2, TimeSpanMode.TimeTime), time, tempoMap)); } default: throw new ArgumentException($"{mathTimeSpan.Operation} is not supported by the converter.", nameof(mathTimeSpan)); } }