public ArcChart(ArcaeaAffReader reader) { Raw = reader; AudioOffset = reader.AudioOffset; foreach (ArcaeaAffEvent e in reader.Events) { switch (e.Type) { case Aff.EventType.Timing: var timing = e as ArcaeaAffTiming; Timings.Add(new ArcTiming() { Timing = timing.Timing, BeatsPerLine = timing.BeatsPerLine, Bpm = timing.Bpm }); break; case Aff.EventType.Tap: var tap = e as ArcaeaAffTap; Taps.Add(new ArcTap() { Timing = tap.Timing, Track = tap.Track }); break; case Aff.EventType.Hold: var hold = e as ArcaeaAffHold; Holds.Add(new ArcHold() { EndTiming = hold.EndTiming, Timing = hold.Timing, Track = hold.Track }); break; case Aff.EventType.Arc: var arc = e as ArcaeaAffArc; ArcArc arcArc = new ArcArc() { Color = arc.Color, EndTiming = arc.EndTiming, IsVoid = arc.IsVoid, LineType = ToArcLineType(arc.LineType), Timing = arc.Timing, XEnd = arc.XEnd, XStart = arc.XStart, YEnd = arc.YEnd, YStart = arc.YStart }; if (arc.ArcTaps != null) { arcArc.IsVoid = true; foreach (int t in arc.ArcTaps) { arcArc.ArcTaps.Add(new ArcArcTap() { Timing = t }); } } Arcs.Add(arcArc); break; case Aff.EventType.Camera: var camera = e as ArcaeaAffCamera; Cameras.Add(new ArcCamera() { Timing = camera.Timing, Move = camera.Move, Rotate = camera.Rotate, CameraType = ToCameraType(camera.CameraType), Duration = camera.Duration }); break; case Aff.EventType.SceneControl: var sceneControl = e as ArcaeaAffSceneControl; SceneControl.Add(new ArcSceneControl { Timing = sceneControl.Timing, Type = sceneControl.SceneControlType }); break; } } if (reader.Events.Count != 0) { LastEventTiming = reader.Events.Last().Timing; } }
public static void ArcaeaToLanota(string affPath) { ArcaeaAffReader reader = new ArcaeaAffReader(affPath); LanotaChartManaged la = new LanotaChartManaged(); float baseBpm = (reader.Events[0] as ArcaeaAffTiming).Bpm; la.LanotaChangeBpm.Add(new Lanota.Managed.LanotaChangeBpm { Time = -3, Bpm = baseBpm }); la.LanotaScroll.Add(new Lanota.Managed.LanotaScroll { Speed = 1, Time = -10 }); foreach (ArcaeaAffEvent e in reader.Events) { switch (e.Type) { case Arcaea.EventType.Timing: ArcaeaAffTiming timing = e as ArcaeaAffTiming; la.LanotaChangeBpm.Add(new Lanota.Managed.LanotaChangeBpm() { Bpm = timing.Bpm, Time = (timing.Timing + reader.AudioOffset) / 1000f }); la.LanotaScroll.Add(new Lanota.Managed.LanotaScroll() { Speed = timing.Bpm / baseBpm, Time = (timing.Timing + reader.AudioOffset) / 1000f }); break; case Arcaea.EventType.Tap: ArcaeaAffTap tap = e as ArcaeaAffTap; la.LanotaTapNote.Add(new Lanota.Managed.LanotaTapNote() { Type = 0, Time = (tap.Timing + reader.AudioOffset) / 1000f, Size = 1, Degree = tap.Track * 30 - 70 }); break; case Arcaea.EventType.Hold: ArcaeaAffHold hold = e as ArcaeaAffHold; la.LanotaHoldNote.Add(new Lanota.Managed.LanotaHoldNote() { Type = 5, Time = (hold.Timing + reader.AudioOffset) / 1000f, Degree = hold.Track * 30 - 70, Duration = (hold.EndTiming - hold.Timing) / 1000f, Size = 1 }); break; case Arcaea.EventType.Arc: ArcaeaAffArc arc = e as ArcaeaAffArc; if (!arc.IsVoid) { la.LanotaHoldNote.Add(new Lanota.Managed.LanotaHoldNote() { Type = 5, Time = (arc.Timing + reader.AudioOffset) / 1000f, Duration = (arc.EndTiming - arc.Timing) / 1000f, Degree = ArcaeaUtility.ConvertDegree(arc.XStart, arc.YStart, arc.Color), Jcount = 1, Size = 1, Joints = new List <Lanota.Managed.LanotaJoints>() { new Lanota.Managed.LanotaJoints() { dDegree = ArcaeaUtility.ConvertDegree(arc.XEnd, arc.YEnd, arc.Color) - ArcaeaUtility.ConvertDegree(arc.XStart, arc.YStart, arc.Color), dTime = (arc.EndTiming - arc.Timing) / 1000f, Cfmi = ArcaeaUtility.DetermineEase(arc.LineType) } } }); } if (arc.ArcTaps != null) { float startDegree = ArcaeaUtility.ConvertDegree(arc.XStart, arc.YStart, arc.Color); float deltaDegree = ArcaeaUtility.ConvertDegree(arc.XEnd, arc.YEnd, arc.Color) - ArcaeaUtility.ConvertDegree(arc.XStart, arc.YStart, arc.Color); float duration = (arc.EndTiming - arc.Timing) / 1000f; float startTiming = (arc.Timing + reader.AudioOffset) / 1000f; int ease = ArcaeaUtility.DetermineEase(arc.LineType); foreach (int i in arc.ArcTaps) { float t = (i + reader.AudioOffset) / 1000f; float percent = (t - startTiming) / duration; float degree = startDegree + deltaDegree * ArcaeaUtility.CalculateEasedCurve(percent, ease); la.LanotaTapNote.Add(new Lanota.Managed.LanotaTapNote() { Type = 0, Time = t, Size = 2, Degree = degree }); } } break; } } File.WriteAllText(affPath.Replace(".aff", "_convert.txt"), la.ToString()); }