Add optional offset to TimingModel constructor.

This commit is contained in:
2022-12-13 10:50:34 +08:00
parent 815f48fe06
commit b582da90e5

View File

@@ -1,4 +1,5 @@
using Cryville.Common.Math;
using System;
namespace Cryville.Crtr.Extensions {
public abstract class TimingModel {
@@ -6,13 +7,16 @@ namespace Cryville.Crtr.Extensions {
public double BeatTime { get; protected set; }
public BeatTime FractionalBeatTime { get; protected set; }
public double BPM { get; set; }
public TimingModel() {
public TimingModel(double offset) {
Time = offset;
FractionalBeatTime = new BeatTime(0, 0, 1);
}
}
public class FractionalBeatTimeTimingModel : TimingModel {
public FractionalBeatTimeTimingModel(double offset = 0) : base(offset) { }
public void ForwardTo(BeatTime t) {
if (t == FractionalBeatTime) return;
if (BPM == 0) throw new InvalidOperationException("BPM not determined");
FractionalBeatTime = t;
var nt = t.Decimal;
Time += (nt - BeatTime) / BPM * 60;
@@ -20,13 +24,15 @@ namespace Cryville.Crtr.Extensions {
}
}
public class BeatTimeTimingModel : TimingModel {
public BeatTimeTimingModel(double offset = 0) : base(offset) { }
public void ForwardTo(double t) {
if (t == BeatTime) return;
if (BPM == 0) throw new InvalidOperationException("BPM not determined");
Time += (t - BeatTime) / BPM * 60;
BeatTime = t;
FractionalBeatTime = ToBeatTime(t);
}
BeatTime ToBeatTime(double beat, double error = 1e-4) {
static BeatTime ToBeatTime(double beat, double error = 1e-4) {
int i, n, d;
FractionUtils.ToFraction(beat, error, out n, out d);
i = n / d; n %= d;