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