From a0bf9f94d5f3826e1315ba9a37946bd270a9a282 Mon Sep 17 00:00:00 2001 From: sevenc-nanashi Date: Fri, 20 Feb 2026 18:29:15 +0900 Subject: [PATCH] fix: fix ufdata export --- TuneLab/Extensions/Formats/FormatsManager.cs | 6 +- .../Formats/UFData/UtaFormatixV1Data.cs | 213 +++++++++--------- 2 files changed, 110 insertions(+), 109 deletions(-) diff --git a/TuneLab/Extensions/Formats/FormatsManager.cs b/TuneLab/Extensions/Formats/FormatsManager.cs index ba7b7092..91798856 100644 --- a/TuneLab/Extensions/Formats/FormatsManager.cs +++ b/TuneLab/Extensions/Formats/FormatsManager.cs @@ -127,13 +127,13 @@ public static bool Serialize(ProjectInfo info, string format, [NotNullWhen(true) try { - if (!mImportFormats.ContainsKey(format)) + if (!mExportFormats.ContainsKey(format)) { throw new Exception(string.Format("Format {0} is not support!", format)); } - IExportFormat importFormat = (IExportFormat)mExportFormats[format].Invoke(null); - stream = importFormat.Serialize(info); + IExportFormat exportFormat = (IExportFormat)mExportFormats[format].Invoke(null); + stream = exportFormat.Serialize(info); return true; } catch (Exception e) diff --git a/TuneLab/Extensions/Formats/UFData/UtaFormatixV1Data.cs b/TuneLab/Extensions/Formats/UFData/UtaFormatixV1Data.cs index 4947e19a..dc25a0b3 100644 --- a/TuneLab/Extensions/Formats/UFData/UtaFormatixV1Data.cs +++ b/TuneLab/Extensions/Formats/UFData/UtaFormatixV1Data.cs @@ -129,7 +129,8 @@ public static object Deserialize(Stream stream) midiPartInfo.Pitch.Add(pitchBend); pitchBend = [new Point((double)pitchTicks[i], (double)pitchValues[i])]; } - else { + else + { pitchBend.Add(new Point((double)pitchTicks[i], (double)pitchValues[i])); } @@ -166,82 +167,82 @@ public static Stream Serialize(ProjectInfo projectInfo) { "formatVersion", 1 } }; - var tracks = new JArray(); - var tempos = new JArray(); - var timeSignatures = new JArray(); + var tracks = new JArray(); + var tempos = new JArray(); + var timeSignatures = new JArray(); - foreach (var trackInfo in projectInfo.Tracks) + foreach (var trackInfo in projectInfo.Tracks) + { + var trackObj = new JObject { - var trackObj = new JObject - { - ["name"] = trackInfo.Name - }; + ["name"] = trackInfo.Name + }; - foreach (var partInfo in trackInfo.Parts) + var notes = new JArray(); + var pitch = new JObject(); + var ticks = new JArray(); + var values = new JArray(); + foreach (var partInfo in trackInfo.Parts) + { + if (partInfo is MidiPartInfo midiPartInfo) { - if (partInfo is MidiPartInfo midiPartInfo) + foreach (var noteInfo in midiPartInfo.Notes) { - var notes = new JArray(); - foreach (var noteInfo in midiPartInfo.Notes) - { - var note = new JObject(); - note.Add("tickOn", (int)noteInfo.Pos); - note.Add("tickOff", (int)(noteInfo.Dur + noteInfo.Pos)); - note.Add("key", noteInfo.Pitch); - note.Add("lyric", noteInfo.Lyric); - note.Add("phoneme", ToJson(noteInfo.Properties)["Phoneme"] ?? "a"); - - notes.Add(note); - } - trackObj.Add("notes", notes); + var note = new JObject(); + note.Add("tickOn", (int)(partInfo.Pos + noteInfo.Pos)); + note.Add("tickOff", (int)(partInfo.Pos + noteInfo.Dur + noteInfo.Pos)); + note.Add("key", noteInfo.Pitch); + note.Add("lyric", noteInfo.Lyric); + note.Add("phoneme", ToJson(noteInfo.Properties)["Phoneme"] ?? "a"); + + notes.Add(note); + } - var pitch = new JObject(); - var ticks = new JArray(); - var values = new JArray(); - foreach (var pointList in midiPartInfo.Pitch) + foreach (var pointList in midiPartInfo.Pitch) + { + foreach (var point in pointList) { - foreach (var point in pointList) - { - ticks.Add((int)point.X); - values.Add(point.Y); - } + ticks.Add((int)(partInfo.Pos + point.X)); + values.Add(point.Y); } - - pitch.Add("ticks", ticks); - pitch.Add("values", values); - pitch.Add("isAbsolute", true); - - trackObj.Add("pitch", pitch); } - - tracks.Add(trackObj); } + } + pitch.Add("ticks", ticks); + pitch.Add("values", values); + pitch.Add("isAbsolute", true); - foreach (var tempoInfo in projectInfo.Tempos) - { - var tempo = new JObject() + trackObj.Add("notes", notes); + trackObj.Add("pitch", pitch); + tracks.Add(trackObj); + } + + + foreach (var tempoInfo in projectInfo.Tempos) + { + var tempo = new JObject() { { "tickPosition", (int)tempoInfo.Pos }, { "bpm", (int)tempoInfo.Bpm } }; - tempos.Add(tempo); - } + tempos.Add(tempo); + } - foreach (var timeSignatureInfo in projectInfo.TimeSignatures) - { - var timeSignature = new JObject() + foreach (var timeSignatureInfo in projectInfo.TimeSignatures) + { + var timeSignature = new JObject() { { "measurePosition", timeSignatureInfo.BarIndex }, { "numerator", timeSignatureInfo.Numerator }, { "denominator", timeSignatureInfo.Denominator } }; - timeSignatures.Add(timeSignature); - } + timeSignatures.Add(timeSignature); + } - var ufProject = new JObject + var ufProject = new JObject { { "name", "Project" }, { "tracks", tracks }, @@ -250,66 +251,66 @@ public static Stream Serialize(ProjectInfo projectInfo) { "measurePrefix", 4 } }; - project.Add("project", ufProject); + project.Add("project", ufProject); - return new MemoryStream(Encoding.UTF8.GetBytes(project.ToString(Formatting.None))); - } + return new MemoryStream(Encoding.UTF8.GetBytes(project.ToString(Formatting.None))); } + } - static PropertyObject FromJson(JToken jToken) - { - var map = new Map(); + static PropertyObject FromJson(JToken jToken) + { + var map = new Map(); - foreach (JProperty property in jToken.Children()) - { - var key = property.Name; - var value = property.Value; - switch (value.Type) - { - case JTokenType.Boolean: - map.Add(key, (bool)value); - break; - case JTokenType.Integer: - map.Add(key, (int)value); - break; - case JTokenType.Float: - map.Add(key, (double)value); - break; - case JTokenType.String: - map.Add(key, (string)value); - break; - case JTokenType.Object: - map.Add(key, FromJson(value)); - break; - } - } - return new(map); + foreach (JProperty property in jToken.Children()) + { + var key = property.Name; + var value = property.Value; + switch (value.Type) + { + case JTokenType.Boolean: + map.Add(key, (bool)value); + break; + case JTokenType.Integer: + map.Add(key, (int)value); + break; + case JTokenType.Float: + map.Add(key, (double)value); + break; + case JTokenType.String: + map.Add(key, (string)value); + break; + case JTokenType.Object: + map.Add(key, FromJson(value)); + break; } + } + return new(map); + } - static JObject ToJson(PropertyObject properties) + static JObject ToJson(PropertyObject properties) + { + var json = new JObject(); + foreach (var property in properties.Map) + { + var key = property.Key; + var value = property.Value; + if (value.ToObject(out var propertyObject)) { - var json = new JObject(); - foreach (var property in properties.Map) - { - var key = property.Key; - var value = property.Value; - if (value.ToObject(out var propertyObject)) - { - json.Add(key, ToJson(propertyObject)); - } - else if (value.ToBool(out var boolValue)) - { - json.Add(key, boolValue); - } - else if (value.ToDouble(out var doubleValue)) - { - json.Add(key, doubleValue); - } - else if (value.ToString(out var strinValue)) - { - json.Add(key, strinValue); - } - } - return json; + json.Add(key, ToJson(propertyObject)); + } + else if (value.ToBool(out var boolValue)) + { + json.Add(key, boolValue); + } + else if (value.ToDouble(out var doubleValue)) + { + json.Add(key, doubleValue); } + else if (value.ToString(out var strinValue)) + { + json.Add(key, strinValue); + } + } + return json; + } }