Fix inaccurate beat snapping for Quaver charts.

This commit is contained in:
2023-03-06 08:16:42 +08:00
parent 2f10c79dee
commit 717e77b47e
3 changed files with 4 additions and 3 deletions

View File

@@ -60,7 +60,7 @@ namespace Cryville.Crtr.Extensions.Quaver {
evs.Sort();
var longevs = new Dictionary<EventWrapper, ChartEvent>();
var tm = new TimeTimingModel(src.TimingPoints[0].StartTime / 1e3);
var tm = new TimeTimingModel(src.TimingPoints[0].StartTime / 1e3, 2e-3);
foreach (var ev in evs) {
tm.ForwardTo(ev.StartTime / 1e3);
if (ev is EventWrapper.HitObject) {
@@ -84,6 +84,7 @@ namespace Cryville.Crtr.Extensions.Quaver {
else if (ev is EventWrapper.TimingPoint) {
var tev = (EventWrapper.TimingPoint)ev;
tm.BPM = tev.Event.Bpm;
tm.ForceSnap();
chart.sigs.Add(new Chart.Signature {
time = tm.FractionalBeatTime,
tempo = tev.Event.Bpm,

View File

@@ -43,7 +43,7 @@ namespace Cryville.Crtr.Extensions {
}
public class TimeTimingModel : TimingModel {
public readonly double InputTimeAccuracy;
public TimeTimingModel(double accuracy = 2e-3, double offset = 0) : base(offset) {
public TimeTimingModel(double offset = 0, double accuracy = 2e-3) : base(offset) {
if (accuracy <= 0) throw new ArgumentOutOfRangeException("accuracy");
InputTimeAccuracy = accuracy;
}

View File

@@ -108,7 +108,7 @@ namespace Cryville.Crtr.Extensions.osu {
else if (ev is osuEvent.TimingChange) {
var tev = (osuEvent.TimingChange)ev;
if (tm == null) {
tm = new TimeTimingModel(2e-3, tev.StartTime / 1e3);
tm = new TimeTimingModel(tev.StartTime / 1e3, 2e-3);
bgmEv.offset = (float)(tev.StartTime / 1e3 + OFFSET);
}
tm.BeatLength = tev.BeatLength / 1e3;