public static void UpdateXml(Arrangement arr, DLCPackageData info) { // update xml with user modified DLCPackageData info var songXml = Song2014.LoadFromFile(arr.SongXml.File); arr.SongFile = new RocksmithToolkitLib.DLCPackage.AggregateGraph.SongFile { File = "" }; arr.Id = IdGenerator.Guid(); arr.MasterId = RandomGenerator.NextInt(); songXml.AlbumName = info.SongInfo.Album; songXml.AlbumYear = info.SongInfo.SongYear.ToString(); songXml.ArtistName = info.SongInfo.Artist; songXml.ArtistNameSort = info.SongInfo.ArtistSort; songXml.AverageTempo = info.SongInfo.AverageTempo; songXml.Title = info.SongInfo.SongDisplayName; songXml.ToneBase = arr.ToneBase; songXml.ToneA = arr.ToneA; songXml.ToneB = arr.ToneB; songXml.ToneC = arr.ToneC; songXml.ToneD = arr.ToneD; File.Delete(arr.SongXml.File); using (var stream = File.OpenWrite(arr.SongXml.File)) { songXml.Serialize(stream, true); } }
// TODO: apply before generate, like metronome arrangements does // only for RS2014 public static bool ApplyBassFix(Arrangement arr) { if (arr.TuningPitch.Equals(220.0)) { // MessageBox.Show("This song is already at 220Hz pitch (bass fixed applied already?)", MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } Song2014 songXml = Song2014.LoadFromFile(arr.SongXml.File); // Force 220Hz arr.TuningPitch = 220.0; songXml.CentOffset = "-1200.0"; // Octave up for each string Int16[] strings = arr.TuningStrings.ToArray(); for (int s = 0; s < strings.Length; s++) { if (strings[s] < 0) strings[s] += 12; } //Detect tuning var tuning = TuningDefinitionRepository.Instance.Detect(new TuningStrings(strings), GameVersion.RS2014, true); arr.Tuning = tuning.UIName = tuning.Name = String.Format("{0} Fixed", tuning.Name);// bastartd bass hack, huh? arr.TuningStrings = songXml.Tuning = tuning.Tuning; TuningDefinitionRepository.Instance.Save(true); var xmlComments = Song2014.ReadXmlComments(arr.SongXml.File); using (var stream = File.Open(arr.SongXml.File, FileMode.Create)) songXml.Serialize(stream, true); Song2014.WriteXmlComments(arr.SongXml.File, xmlComments); return true; }
public ArrangementForm(Arrangement arrangement, IEnumerable<string> toneNames, DLCPackageCreator control) { InitializeComponent(); foreach (var val in Enum.GetValues(typeof(InstrumentTuning))) { tuningComboBox.Items.Add(val); } foreach (var val in Enum.GetValues(typeof(ArrangementType))) { arrangementTypeCombo.Items.Add(val); } arrangementTypeCombo.SelectedValueChanged += (sender, e) => { // Selecting defaults ArrangementType selectedType = ((ArrangementType)((ComboBox)sender).SelectedItem); switch (selectedType) { case ArrangementType.Bass: arrangementNameCombo.Items.Clear(); arrangementNameCombo.Items.Add(ArrangementName.Bass); arrangementNameCombo.SelectedItem = ArrangementName.Bass; break; case ArrangementType.Vocal: arrangementNameCombo.Items.Clear(); arrangementNameCombo.Items.Add(ArrangementName.Vocals); arrangementNameCombo.SelectedItem = ArrangementName.Vocals; break; default: arrangementNameCombo.Items.Clear(); arrangementNameCombo.Items.Add(ArrangementName.Combo); arrangementNameCombo.Items.Add(ArrangementName.Lead); arrangementNameCombo.Items.Add(ArrangementName.Rhythm); arrangementNameCombo.SelectedItem = arrangement.Name; break; } // Disabling options that are not meant for Arrangement Types arrangementNameCombo.Enabled = selectedType == ArrangementType.Guitar; groupBox1.Enabled = selectedType != ArrangementType.Vocal; groupBox2.Enabled = selectedType != ArrangementType.Guitar; Picked.Visible = selectedType == ArrangementType.Bass; tonesCombo.Enabled = selectedType != ArrangementType.Vocal; tuningComboBox.Enabled = selectedType != ArrangementType.Vocal; Picked.Checked = selectedType == ArrangementType.Bass ? false : true; MasterId.Enabled = selectedType != ArrangementType.Vocal; PersistentId.Enabled = selectedType != ArrangementType.Vocal; }; foreach (var tone in toneNames) { tonesCombo.Items.Add(tone); } scrollSpeedTrackBar.Scroll += (sender, e) => { scrollSpeedDisplay.Text = String.Format("Scroll speed: {0:#.0}", Math.Truncate((decimal)scrollSpeedTrackBar.Value) / 10); }; Arrangement = arrangement; parentControl = control; }
// only for RS2014 public static bool ApplyBassFix(Arrangement arr) { if (arr.TuningPitch.Equals(220.0)) { // MessageBox.Show("This song is already at 220Hz pitch (bass fixed applied already?)", MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } Song2014 songXml = Song2014.LoadFromFile(arr.SongXml.File); // Force 220Hz arr.TuningPitch = 220.0; songXml.CentOffset = "-1200.0"; // Octave up for each string Int16[] strings = arr.TuningStrings.ToArray(); for (int s = 0; s < strings.Length; s++) { if (strings[s] != 0) strings[s] += 12; } //Detect tuning var tuning = TuningDefinitionRepository.Instance().SelectAny(new TuningStrings(strings), GameVersion.RS2014); if (tuning == null) { tuning = new TuningDefinition(); tuning.Tuning = new TuningStrings(strings); tuning.Name = tuning.NameFromStrings(tuning.Tuning); tuning.UIName = tuning.Name = String.Format("{0} Fixed", tuning.Name); tuning.Custom = true; tuning.GameVersion = GameVersion.RS2014; TuningDefinitionRepository.Instance().Add(tuning, true); } arr.TuningStrings = tuning.Tuning; arr.Tuning = tuning.Name; songXml.Tuning = tuning.Tuning; File.Delete(arr.SongXml.File); using (var stream = File.OpenWrite(arr.SongXml.File)) { songXml.Serialize(stream, true); } return true; }
// TODO: apply before generate, like metronome arrangements does // only for RS2014 public static bool ApplyBassFix(Arrangement arr) { if (arr.TuningPitch.Equals(220.0)) { // MessageBox.Show("This song is already at 220Hz pitch (bass fixed applied already?)", MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } var songFile = arr.SongXml.File; var comments = Song2014.ReadXmlComments(songFile); Song2014 songXml = Song2014.LoadFromFile(songFile); // Force 220Hz arr.TuningPitch = 220.0; songXml.CentOffset = "-1200.0"; // Octave up for each string Int16[] strings = arr.TuningStrings.ToArray(); for (int s = 0; s < strings.Length; s++) { if (strings[s] < 0) { strings[s] += 12; } } //Detect tuning var tuning = TuningDefinitionRepository.Instance.Detect(new TuningStrings(strings), GameVersion.RS2014, true); arr.Tuning = tuning.UIName = tuning.Name = String.Format("{0} Fixed", tuning.Name);// bastartd bass hack, huh? arr.TuningStrings = songXml.Tuning = tuning.Tuning; TuningDefinitionRepository.Instance.Save(true); File.Delete(songFile); using (var stream = File.OpenWrite(songFile)) { songXml.Serialize(stream, true); } Song2014.WriteXmlComments(songFile, comments, false); return(true); }
public static DLCPackageData LoadFromFile(string unpackedDir, Platform targetPlatform) { //Load files var jsonFiles = Directory.GetFiles(unpackedDir, "*.json", SearchOption.AllDirectories); var data = new DLCPackageData(); data.GameVersion = GameVersion.RS2014; data.SignatureType = PackageMagic.CON; //Get Arrangements / Tones data.Arrangements = new List <Arrangement>(); data.TonesRS2014 = new List <Tone2014>(); foreach (var json in jsonFiles) { Attributes2014 attr = Manifest2014 <Attributes2014> .LoadFromFile(json).Entries.ToArray()[0].Value.ToArray()[0].Value; var xmlName = attr.SongXml.Split(':')[3]; var xmlFile = Directory.GetFiles(unpackedDir, xmlName + ".xml", SearchOption.AllDirectories)[0]; if (attr.Phrases != null) { if (data.SongInfo == null) { // Fill Package Data data.Name = attr.DLCKey; data.Volume = attr.SongVolume; data.PreviewVolume = (attr.PreviewVolume != null) ? (float)attr.PreviewVolume : data.Volume; // Fill SongInfo data.SongInfo = new SongInfo(); data.SongInfo.SongDisplayName = attr.SongName; data.SongInfo.SongDisplayNameSort = attr.SongNameSort; data.SongInfo.Album = attr.AlbumName; data.SongInfo.SongYear = attr.SongYear ?? 0; data.SongInfo.Artist = attr.ArtistName; data.SongInfo.ArtistSort = attr.ArtistNameSort; data.SongInfo.AverageTempo = (int)attr.SongAverageTempo; } // Adding Tones foreach (var jsonTone in attr.Tones) { if (jsonTone == null) { continue; } if (!data.TonesRS2014.OfType <Tone2014>().Any(t => t.Key == jsonTone.Key)) { data.TonesRS2014.Add(jsonTone); } } // Adding Arrangement data.Arrangements.Add(new Arrangement(attr, xmlFile)); } else { var voc = new Arrangement(); voc.Name = ArrangementName.Vocals; voc.ArrangementType = ArrangementType.Vocal; voc.SongXml = new SongXML { File = xmlFile }; voc.SongFile = new SongFile { File = "" }; voc.Sng2014 = Sng2014HSL.Sng2014File.ConvertXML(xmlFile, ArrangementType.Vocal); voc.ScrollSpeed = 20; // Adding Arrangement data.Arrangements.Add(voc); } } //Get Files var ddsFiles = Directory.GetFiles(unpackedDir, "*_256.dds", SearchOption.AllDirectories); if (ddsFiles.Length > 0) { data.AlbumArtPath = ddsFiles[0]; } var sourceAudioFiles = Directory.GetFiles(unpackedDir, "*.wem", SearchOption.AllDirectories); var targetAudioFiles = new List <string>(); foreach (var file in sourceAudioFiles) { var newFile = Path.Combine(Path.GetDirectoryName(file), String.Format("{0}_fixed{1}", Path.GetFileNameWithoutExtension(file), Path.GetExtension(file))); if (targetPlatform.IsConsole != file.GetAudioPlatform().IsConsole) { OggFile.ConvertAudioPlatform(file, newFile); targetAudioFiles.Add(newFile); } else { targetAudioFiles.Add(file); } } if (targetAudioFiles.Count() <= 0) { throw new InvalidDataException("Audio files not found."); } string audioPath = null, audioPreviewPath = null; FileInfo a = new FileInfo(targetAudioFiles[0]); FileInfo b = null; if (targetAudioFiles.Count() == 2) { b = new FileInfo(targetAudioFiles[1]); if (a.Length > b.Length) { audioPath = a.FullName; audioPreviewPath = b.FullName; } else { audioPath = b.FullName; audioPreviewPath = a.FullName; } } else { audioPath = a.FullName; } data.OggPath = audioPath; //Make Audio preview with expected name when rebuild if (!String.IsNullOrEmpty(audioPreviewPath)) { var newPreviewFileName = Path.Combine(Path.GetDirectoryName(audioPath), String.Format("{0}_preview{1}", Path.GetFileNameWithoutExtension(audioPath), Path.GetExtension(audioPath))); File.Move(audioPreviewPath, newPreviewFileName); data.OggPreviewPath = newPreviewFileName; } var appidFile = Directory.GetFiles(unpackedDir, "*.appid", SearchOption.AllDirectories); if (appidFile.Length > 0) { data.AppId = File.ReadAllText(appidFile[0]); } return(data); }
/// <summary> /// Fill toneCombo with autotone values or BaseOnly. /// Get tones, fill combo, select tones. /// </summary> /// <param name="arr"></param> private void SetupTones(Arrangement arr) { disableTonesCheckbox.Checked = false; bool isRS2014 = parentControl.CurrentGameVersion != GameVersion.RS2012; if (!String.IsNullOrEmpty(arr.ToneBase)) if (parentControl.tonesLB.Items.Count == 1 && parentControl.tonesLB.Items[0].ToString() == "Default") parentControl.tonesLB.Items.Clear(); var toneItems = parentControl.tonesLB.Items; var toneNames = new List<string>(); if (isRS2014) toneNames.AddRange(parentControl.tonesLB.Items.OfType<Tone2014>().Select(t => t.Name)); else toneNames.AddRange(parentControl.tonesLB.Items.OfType<Tone>().Select(t => t.Name)); //Check if autotone tones are present and add it's if not. if (!toneNames.Contains(arr.ToneBase) && !String.IsNullOrEmpty(arr.ToneBase)) { toneItems.Add(parentControl.CreateNewTone(arr.ToneBase)); toneNames.Add(arr.ToneBase); } if (!toneNames.Contains(arr.ToneA) && !String.IsNullOrEmpty(arr.ToneA)) { toneItems.Add(parentControl.CreateNewTone(arr.ToneA)); toneNames.Add(arr.ToneA); } if (!toneNames.Contains(arr.ToneB) && !String.IsNullOrEmpty(arr.ToneB)) { toneItems.Add(parentControl.CreateNewTone(arr.ToneB)); toneNames.Add(arr.ToneB); } if (!toneNames.Contains(arr.ToneC) && !String.IsNullOrEmpty(arr.ToneC)) { toneItems.Add(parentControl.CreateNewTone(arr.ToneC)); toneNames.Add(arr.ToneC); } if (!toneNames.Contains(arr.ToneD) && !String.IsNullOrEmpty(arr.ToneD)) { toneItems.Add(parentControl.CreateNewTone(arr.ToneD)); toneNames.Add(arr.ToneD); } // FILL TONE COMBO FillToneCombo(toneBaseCombo, toneNames, true); FillToneCombo(toneACombo, toneNames, false); FillToneCombo(toneBCombo, toneNames, false); FillToneCombo(toneCCombo, toneNames, false); FillToneCombo(toneDCombo, toneNames, false); // SELECTING TONES toneBaseCombo.Enabled = true; if (!String.IsNullOrEmpty(arr.ToneBase)) toneBaseCombo.SelectedItem = arr.ToneBase; if (!String.IsNullOrEmpty(arr.ToneA)) toneACombo.SelectedItem = arr.ToneA; if (!String.IsNullOrEmpty(arr.ToneB)) toneBCombo.SelectedItem = arr.ToneB; if (!String.IsNullOrEmpty(arr.ToneC)) toneCCombo.SelectedItem = arr.ToneC; if (!String.IsNullOrEmpty(arr.ToneD)) toneDCombo.SelectedItem = arr.ToneD; // If have ToneBase and ToneB is setup it's because auto tone are setup in EoF, so, disable edit to prevent errors. disableTonesCheckbox.Checked = (!String.IsNullOrEmpty(arr.ToneBase) && !String.IsNullOrEmpty(arr.ToneB)); if (disableTonesCheckbox.Checked && !EditMode) disableTonesCheckbox.Enabled = false; }
public ArrangementForm(Arrangement arrangement, DLCPackageCreator control, GameVersion gameVersion) { InitializeComponent(); currentGameVersion = gameVersion == GameVersion.RS2012 ? GameVersion.RS2012 : GameVersion.RS2014; FillTuningCombo(arrangement.ArrangementType, currentGameVersion); foreach (var val in Enum.GetValues(typeof(ArrangementType))) arrangementTypeCombo.Items.Add(val); // this is a giant EH - careful arrangementTypeCombo.SelectedValueChanged += (sender, e) => { // Selecting defaults var selectedType = ((ArrangementType)((ComboBox)sender).SelectedItem); switch (selectedType) { case ArrangementType.Bass: arrangementNameCombo.Items.Clear(); arrangementNameCombo.Items.Add(ArrangementName.Bass); arrangementNameCombo.SelectedItem = ArrangementName.Bass; break; case ArrangementType.Vocal: arrangementNameCombo.Items.Clear(); arrangementNameCombo.Items.Add(ArrangementName.Vocals); arrangementNameCombo.Items.Add(ArrangementName.JVocals); arrangementNameCombo.SelectedItem = ArrangementName.Vocals; break; case ArrangementType.ShowLight: arrangementNameCombo.Items.Clear(); arrangementNameCombo.Items.Add(ArrangementName.ShowLights); arrangementNameCombo.SelectedItem = ArrangementName.ShowLights; break; default: arrangementNameCombo.Items.Clear(); arrangementNameCombo.Items.Add(ArrangementName.Combo); arrangementNameCombo.Items.Add(ArrangementName.Lead); arrangementNameCombo.Items.Add(ArrangementName.Rhythm); arrangementNameCombo.SelectedItem = ArrangementName.Lead; break; } var selectedArrangementName = (ArrangementName)arrangementNameCombo.SelectedItem; // Disabling options that are not meant for Arrangement Types // Arrangement Information arrangementNameCombo.Enabled = selectedType != ArrangementType.Bass; tuningComboBox.Enabled = (selectedType != ArrangementType.Vocal && selectedType != ArrangementType.ShowLight); gbTuningPitch.Enabled = (selectedType != ArrangementType.Vocal && selectedType != ArrangementType.ShowLight) && currentGameVersion != GameVersion.RS2012; gbScrollSpeed.Enabled = (selectedType != ArrangementType.Vocal && selectedType != ArrangementType.ShowLight); Picked.Enabled = selectedType == ArrangementType.Bass; BonusCheckBox.Enabled = gbTuningPitch.Enabled; MetronomeCb.Enabled = gbTuningPitch.Enabled; // Gameplay Path UpdateRouteMaskPath(selectedType, selectedArrangementName); // Tone Selector gbTone.Enabled = (selectedType != ArrangementType.Vocal && selectedType != ArrangementType.ShowLight); // Arrangement ID MasterId.Enabled = true; PersistentId.Enabled = true; // Tuning Edit tuningEditButton.Enabled = (selectedType != ArrangementType.Vocal && selectedType != ArrangementType.ShowLight); // Vocal/ShowLights Edit typeEdit.Enabled = (selectedType == ArrangementType.Vocal || selectedType == ArrangementType.ShowLight); // Update tuningComboBox if ((selectedType != ArrangementType.Vocal && selectedType != ArrangementType.ShowLight)) FillTuningCombo(selectedType, currentGameVersion); }; // this EH may cause serious brain damage arrangementNameCombo.SelectedValueChanged += (sender, e) => { var selectedType = ((ArrangementType)arrangementTypeCombo.SelectedItem); var selectedArrangementName = ((ArrangementName)((ComboBox)sender).SelectedItem); UpdateRouteMaskPath(selectedType, selectedArrangementName); }; // this EH may cause serious brain damage tuningComboBox.SelectedValueChanged += (sender, e) => { // Selecting defaults var selectedType = (ArrangementType)arrangementTypeCombo.SelectedItem; var selectedTuning = (TuningDefinition)((ComboBox)sender).SelectedItem; tuningEditButton.Enabled = (selectedType != ArrangementType.Vocal && selectedType != ArrangementType.ShowLight) && selectedTuning != null; }; parentControl = control; SetupTones(arrangement); Arrangement = arrangement; // total update by SET action EditMode = routeMaskNoneRadio.Checked; }
private static void UpdateTones(Arrangement arrangement) { // template may not reflect current XML state, update tone slots if (arrangement.ArrangementType != ArrangementType.Vocal) { var xml = Song2014.LoadFromFile(arrangement.SongXml.File); if (xml.ToneBase != null) arrangement.ToneBase = xml.ToneBase; // A (ID 0) if (xml.ToneA != null) { if (xml.ToneA != xml.ToneBase) // SNG convertor expects ToneA to be ID 0 throw new InvalidDataException(String.Format("Invalid tone definition detected in {0}, ToneA (ID 0) is expected to be same as ToneBase.", arrangement.SongXml.File)); arrangement.ToneA = xml.ToneA; } else arrangement.ToneA = null; // B (ID 1) if (xml.ToneB != null) arrangement.ToneB = xml.ToneB; else arrangement.ToneB = null; // C (ID 2) if (xml.ToneC != null) arrangement.ToneC = xml.ToneC; else arrangement.ToneC = null; // D (ID 3) if (xml.ToneD != null) arrangement.ToneD = xml.ToneD; else arrangement.ToneD = null; } }
// Load RS1 CDLC into PackageCreator public static DLCPackageData RS1LoadFromFolder(string unpackedDir, Platform targetPlatform, bool convert) { var data = new DLCPackageData(); data.Arrangements = new List <Arrangement>(); data.TonesRS2014 = new List <Tone2014>(); data.Tones = new List <Tone>(); data.GameVersion = (convert ? GameVersion.RS2014 : GameVersion.RS2012); data.SignatureType = PackageMagic.CON; // set default volumes data.Volume = -6.5F; // default maybe too quite data.PreviewVolume = data.Volume; //Load song manifest var songsManifestJson = Directory.GetFiles(unpackedDir, "songs.manifest.json", SearchOption.AllDirectories); if (songsManifestJson.Length < 1) { throw new DataException("No songs.manifest.json file found."); } if (songsManifestJson.Length > 1) { throw new DataException("More than one songs.manifest.json file found."); } List <Attributes> attr = new List <Attributes>(); var songsManifest = Manifest.Manifest.LoadFromFile(songsManifestJson[0]).Entries.ToArray(); for (int smIndex = 0; smIndex < songsManifest.Count(); smIndex++) { var smData = songsManifest[smIndex].Value.ToArray()[0].Value; attr.Add(smData); } if (attr.FirstOrDefault() == null) { throw new DataException("songs.manifest.json file did not parse correctly."); } // Fill SongInfo data.SongInfo = new SongInfo(); data.SongInfo.SongDisplayName = attr.FirstOrDefault().SongName; data.SongInfo.SongDisplayNameSort = attr.FirstOrDefault().SongNameSort; data.SongInfo.Album = attr.FirstOrDefault().AlbumName; data.SongInfo.SongYear = (attr.FirstOrDefault().SongYear == 0 ? 2012 : attr.FirstOrDefault().SongYear); data.SongInfo.Artist = attr.FirstOrDefault().ArtistName; data.SongInfo.ArtistSort = attr.FirstOrDefault().ArtistNameSort; data.Name = attr.FirstOrDefault().SongKey; //Load tone manifest, even poorly formed tone_bass.manifest.json var toneManifestJson = Directory.GetFiles(unpackedDir, "*tone*.manifest.json", SearchOption.AllDirectories); if (toneManifestJson.Length < 1) { throw new DataException("No tone.manifest.json file found."); } // toolkit produces multiple tone.manifest.json files when packing RS1 CDLC files // rather than change toolkit behavior just merge manifest files for now if (toneManifestJson.Length > 1) { var mergeSettings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union }; JObject toneObject1 = new JObject(); foreach (var tone in toneManifestJson) { JObject toneObject2 = JObject.Parse(File.ReadAllText(tone)); //(toneObject1.SelectToken("Entries") as JArray).Merge(toneObject2.SelectToken("Entries")); toneObject1.Merge(toneObject2, mergeSettings); } toneManifestJson = new string[1]; toneManifestJson[0] = Path.Combine(unpackedDir, "merged.tone.manifest"); string json = JsonConvert.SerializeObject(toneObject1, Formatting.Indented); File.WriteAllText(toneManifestJson[0], json); } List <Tone> tones = new List <Tone>(); Manifest.Tone.Manifest toneManifest = Manifest.Tone.Manifest.LoadFromFile(toneManifestJson[0]); for (int tmIndex = 0; tmIndex < toneManifest.Entries.Count(); tmIndex++) { var tmData = toneManifest.Entries[tmIndex]; tones.Add(tmData); } data.Tones = tones; // Load AggregateGraph.nt var songDir = Path.Combine(unpackedDir, data.Name); var aggFile = Directory.GetFiles(songDir, "*.nt", SearchOption.TopDirectoryOnly)[0]; List <AgGraphNt> aggGraphData = AggregateGraph.AggregateGraph.ReadFromFile(aggFile); // Load Exports\Songs\*.xblock var xblockDir = Path.Combine(unpackedDir, data.Name, "Exports\\Songs"); var xblockFile = Directory.GetFiles(xblockDir, "*.xblock", SearchOption.TopDirectoryOnly)[0]; // xblockFile = "D:\\Temp\\Mapping\\songs.xblock"; XblockX songsXblock = XblockX.LoadFromFile(xblockFile); // create project map for cross referencing arrangements with tones var projectMap = AggregateGraph.AggregateGraph.ProjectMap(aggGraphData, songsXblock, toneManifest); // Load xml arrangements var xmlFiles = Directory.GetFiles(unpackedDir, "*.xml", SearchOption.AllDirectories); if (xmlFiles.Length <= 0) { throw new DataException("Can not find any XML arrangement files"); } List <Tone2014> tones2014 = new List <Tone2014>(); foreach (var xmlFile in xmlFiles) { if (xmlFile.ToLower().Contains("metadata")) // skip DeadFox file { continue; } // some poorly formed RS1 CDLC use just "vocal" if (xmlFile.ToLower().Contains("vocal")) { var voc = new Arrangement(); voc.Name = ArrangementName.Vocals; voc.ArrangementType = ArrangementType.Vocal; voc.ScrollSpeed = 20; voc.SongXml = new SongXML { File = xmlFile }; voc.SongFile = new SongFile { File = "" }; voc.CustomFont = false; // Add Vocal Arrangement data.Arrangements.Add(voc); } else { Attributes2014 attr2014 = new Attributes2014(); Song rsSong = new Song(); Song2014 rsSong2014 = new Song2014(); // optimized tone matching effort using project mapping algo var result = projectMap.First(m => Path.GetFileName(m.SongXmlPath).ToLower() == Path.GetFileName(xmlFile).ToLower()); if (result.Tones.Count != 1) { throw new DataException("Invalid RS1 CDLC Tones Data"); } var arrangement = attr.First(s => s.SongXml.ToLower().Contains(result.LLID)); var tone = tones.First(t => t.Key == result.Tones[0]); using (var obj1 = new Rs1Converter()) { rsSong = obj1.XmlToSong(xmlFile); data.SongInfo.AverageTempo = (int)obj1.AverageBPM(rsSong); } if (arrangement.Tuning == "E Standard") { rsSong.Tuning = new TuningStrings { String0 = 0, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 } } ; else if (arrangement.Tuning == "DropD") { rsSong.Tuning = new TuningStrings { String0 = -2, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 } } ; else if (arrangement.Tuning == "OpenG") { rsSong.Tuning = new TuningStrings { String0 = -2, String1 = -2, String2 = 0, String3 = 0, String4 = 0, String5 = -2 } } ; else if (arrangement.Tuning == "EFlat") { rsSong.Tuning = new TuningStrings { String0 = -1, String1 = -1, String2 = -1, String3 = -1, String4 = -1, String5 = -1 } } ; else // default to standard tuning { arrangement.Tuning = "E Standard"; rsSong.Tuning = new TuningStrings { String0 = 0, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 }; } // save/write the changes to xml file using (var obj1 = new Rs1Converter()) obj1.SongToXml(rsSong, xmlFile, true); if (convert) { using (var obj1 = new Rs1Converter()) tones2014.Add(obj1.ToneToTone2014(tone, rsSong)); } var test = tones2014.ToArray(); // load attr2014 with RS1 mapped values for use by Arrangement() attr2014.Tone_Base = tone.Name; attr2014.ArrangementName = arrangement.ArrangementName; attr2014.CentOffset = 0; attr2014.DynamicVisualDensity = new List <float>() { 2 }; attr2014.SongPartition = arrangement.SongPartition; attr2014.PersistentID = IdGenerator.Guid().ToString(); attr2014.MasterID_RDV = RandomGenerator.NextInt(); attr2014.ArrangementProperties = new SongArrangementProperties2014(); // processing order is important - CAREFUL // RouteMask None = 0, Lead = 1, Rhythm = 2, Any = 3, Bass = 4 // XML file names are usually meaningless to arrangement determination if (arrangement.ArrangementName.ToLower().Contains("lead") || rsSong.Arrangement.ToLower().Contains("lead")) { attr2014.ArrangementName = "Lead"; attr2014.ArrangementType = (int)ArrangementType.Guitar; attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Lead; attr2014.ArrangementProperties.PathLead = 1; attr2014.ArrangementProperties.PathRhythm = 0; attr2014.ArrangementProperties.PathBass = 0; } else if (arrangement.ArrangementName.ToLower().Contains("rhythm") || rsSong.Arrangement.ToLower().Contains("rhythm")) // || rsSong.Arrangement.ToLower().Contains("guitar")) { attr2014.ArrangementName = "Rhythm"; attr2014.ArrangementType = (int)ArrangementType.Guitar; attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Rhythm; attr2014.ArrangementProperties.PathLead = 0; attr2014.ArrangementProperties.PathRhythm = 1; attr2014.ArrangementProperties.PathBass = 0; } else if (arrangement.ArrangementName.ToLower().Contains("combo") || rsSong.Arrangement.ToLower().Contains("combo")) { attr2014.ArrangementName = "Combo"; attr2014.ArrangementType = (int)ArrangementType.Guitar; attr2014.ArrangementProperties.RouteMask = arrangement.EffectChainName.ToLower().Contains("lead") ? (int)RouteMask.Lead : (int)RouteMask.Rhythm; attr2014.ArrangementProperties.PathLead = arrangement.EffectChainName.ToLower().Contains("lead") ? 1 : 0; attr2014.ArrangementProperties.PathRhythm = arrangement.EffectChainName.ToLower().Contains("lead") ? 0 : 1; attr2014.ArrangementProperties.PathBass = 0; } else if (arrangement.ArrangementName.ToLower().Contains("bass") || rsSong.Arrangement.ToLower().Contains("bass")) { attr2014.ArrangementName = "Bass"; attr2014.ArrangementType = (int)ArrangementType.Bass; attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Bass; attr2014.ArrangementProperties.PathLead = 0; attr2014.ArrangementProperties.PathRhythm = 0; attr2014.ArrangementProperties.PathBass = 1; } else { // default to Lead arrangment attr2014.ArrangementName = "Lead"; attr2014.ArrangementType = (int)ArrangementType.Guitar; attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Lead; attr2014.ArrangementProperties.PathLead = 1; attr2014.ArrangementProperties.PathRhythm = 0; attr2014.ArrangementProperties.PathBass = 0; Console.WriteLine("RS1->RS2 CDLC Conversion defaulted to 'Lead' arrangment"); } if (convert) // RS1 -> RS2 magic { using (var obj1 = new Rs1Converter()) rsSong2014 = obj1.SongToSong2014(rsSong); // update ArrangementProperties rsSong2014.ArrangementProperties.RouteMask = attr2014.ArrangementProperties.RouteMask; rsSong2014.ArrangementProperties.PathLead = attr2014.ArrangementProperties.PathLead; rsSong2014.ArrangementProperties.PathRhythm = attr2014.ArrangementProperties.PathRhythm; rsSong2014.ArrangementProperties.PathBass = attr2014.ArrangementProperties.PathBass; rsSong2014.ArrangementProperties.StandardTuning = (arrangement.Tuning == "E Standard" ? 1 : 0); // <note time="58.366" linkNext="0" accent="0" bend="0" fret="7" hammerOn="0" harmonic="0" hopo="0" ignore="0" leftHand="-1" mute="0" palmMute="0" pluck="-1" pullOff="0" slap="-1" slideTo="-1" string="3" sustain="0.108" tremolo="0" harmonicPinch="0" pickDirection="0" rightHand="-1" slideUnpitchTo="-1" tap="0" vibrato="0" /> if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.Bend != 0))) { rsSong2014.ArrangementProperties.Bends = 1; } if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.Hopo != 0))) { rsSong2014.ArrangementProperties.Hopo = 1; } if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.SlideTo != -1))) { rsSong2014.ArrangementProperties.Slides = 1; } if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.Sustain > 0))) { rsSong2014.ArrangementProperties.Sustain = 1; } // fixing times that are off var lastEbeatsTime = rsSong2014.Ebeats[rsSong2014.Ebeats.Length - 1].Time; var lastPhraseIterationsTime = rsSong2014.PhraseIterations[rsSong2014.PhraseIterations.Length - 1].Time; // tested ... not source of in game hangs // confirm last PhraseIterations time is less than last Ebeats time if (lastPhraseIterationsTime > lastEbeatsTime) { rsSong2014.PhraseIterations[rsSong2014.PhraseIterations.Length - 1].Time = lastEbeatsTime; rsSong2014.Sections[rsSong2014.Sections.Length - 1].StartTime = lastEbeatsTime; } // tested ... not source of in game hangs // confirm SongLength at least equals last Ebeats time if (rsSong2014.SongLength < lastEbeatsTime) { rsSong2014.SongLength = lastEbeatsTime; } using (var obj2 = new Rs2014Converter()) obj2.Song2014ToXml(rsSong2014, xmlFile, true); } // Adding Song Arrangement try { data.Arrangements.Add(new Arrangement(attr2014, xmlFile)); } catch (Exception ex) { // mainly for the benifit of convert2012 CLI users Console.WriteLine(@"This CDLC could not be auto converted." + Environment.NewLine + "You can still try manually adding the arrangements and assests." + Environment.NewLine + ex.Message); } } } // get rid of duplicate tone names tones2014 = tones2014.Where(p => p.Name != null) .GroupBy(p => p.Name).Select(g => g.First()).ToList(); data.TonesRS2014 = tones2014; //Get Album Artwork DDS Files var artFiles = Directory.GetFiles(unpackedDir, "*.dds", SearchOption.AllDirectories); if (artFiles.Length < 1) { throw new DataException("No Album Artwork file found."); } if (artFiles.Length > 1) { throw new DataException("More than one Album Artwork file found."); } var targetArtFiles = new List <DDSConvertedFile>(); data.AlbumArtPath = artFiles[0]; targetArtFiles.Add(new DDSConvertedFile() { sizeX = 256, sizeY = 256, sourceFile = artFiles[0], destinationFile = artFiles[0].CopyToTempFile(".dds") }); data.ArtFiles = targetArtFiles; //Audio files var targetAudioFiles = new List <string>(); var audioFiles = Directory.GetFiles(unpackedDir, "*.ogg", SearchOption.AllDirectories); if (audioFiles.Length < 1) { throw new DataException("No Audio file found."); } if (audioFiles.Length > 2) { throw new DataException("Too many Audio files found."); } int i; for (i = 0; i < audioFiles.Length; i++) { if (convert && audioFiles[i].Contains("_fixed.ogg")) // use it { break; } if (!convert && !audioFiles[i].Contains("_fixed.ogg")) { break; } } var sourcePlatform = unpackedDir.GetPlatform(); if (targetPlatform.IsConsole != (sourcePlatform = audioFiles[i].GetAudioPlatform()).IsConsole) { var newFile = Path.Combine(Path.GetDirectoryName(audioFiles[i]), String.Format("{0}_cap.ogg", Path.GetFileNameWithoutExtension(audioFiles[i]))); OggFile.ConvertAudioPlatform(audioFiles[i], newFile); audioFiles[i] = newFile; } targetAudioFiles.Add(audioFiles[i]); if (!targetAudioFiles.Any()) { throw new DataException("Audio file not found."); } FileInfo a = new FileInfo(audioFiles[i]); data.OggPath = a.FullName; //AppID if (!convert) { var appidFile = Directory.GetFiles(unpackedDir, "*APP_ID*", SearchOption.AllDirectories); if (appidFile.Length > 0) { data.AppId = File.ReadAllText(appidFile[0]); } } else { data.AppId = "248750"; } //Package version var versionFile = Directory.GetFiles(unpackedDir, "toolkit.version", SearchOption.AllDirectories); if (versionFile.Length > 0) { data.PackageVersion = GeneralExtensions.ReadPackageVersion(versionFile[0]); } else { data.PackageVersion = "1"; } if (convert) { data.Tones = null; } return(data); }
// only for RS2014 public static bool ApplyBassFix(Arrangement arr, bool saveTuningDefinition = false) { var debubMe = arr; // get the latest comments from the XML var xmlComments = Song2014.ReadXmlComments(arr.SongXml.File); var isBassFixed = xmlComments.Any(xComment => xComment.ToString().Contains("Low Bass Tuning Fixed")) || arr.TuningPitch.Equals(220.0); if (isBassFixed) { Debug.WriteLine("Low bass tuning may already be fixed: " + arr.SongXml.File); // return false; } // TODO: check guitar compatibility // Octave up for each string Int16[] strings = arr.TuningStrings.ToArray(); for (int s = 0; s < strings.Length; s++) { if (strings[s] < 0) { strings[s] += 12; } } // update XML arrangement Song2014 songXml = Song2014.LoadFromFile(arr.SongXml.File); songXml.CentOffset = "-1200.0"; // Force 220Hz songXml.Tuning = new TuningStrings(strings); // bass tuning definition gets auto added/saved to repository if (saveTuningDefinition) { var tuningDef = TuningDefinitionRepository.Instance.Detect(songXml.Tuning, GameVersion.RS2014, false); if (!tuningDef.Name.Contains("Fixed")) { var tuningUiName = String.Format("{0} Fixed", tuningDef.UIName); var bassTuning = new TuningDefinition { Custom = true, GameVersion = GameVersion.RS2014, Name = tuningUiName.Replace(" ", ""), Tuning = songXml.Tuning, UIName = tuningUiName }; TuningDefinitionRepository.SaveUnique(bassTuning); } } using (var stream = File.Open(arr.SongXml.File, FileMode.Create)) songXml.Serialize(stream, true); // write xml comments back to fixed bass arrangement if (!isBassFixed) { Song2014.WriteXmlComments(arr.SongXml.File, xmlComments, customComment: "Low Bass Tuning Fixed"); } return(true); }
/// <summary> /// Fill toneCombo with autotone values or BaseOnly. /// Get tones, fill combo, select tones. /// </summary> /// <param name="arr"></param> private void SetupTones(Arrangement arr) { disableTonesCheckbox.Checked = false; bool isRS2014 = parentControl.CurrentGameVersion != GameVersion.RS2012; if (!String.IsNullOrEmpty(arr.ToneBase)) if (parentControl.tonesLB.Items.Count == 1 && parentControl.tonesLB.Items[0].ToString() == "Default") parentControl.tonesLB.Items.Clear(); var toneItems = parentControl.tonesLB.Items; var toneNames = new List<string>(); if (isRS2014) toneNames.AddRange(parentControl.tonesLB.Items.OfType<Tone2014>().Select(t => t.Name)); else toneNames.AddRange(parentControl.tonesLB.Items.OfType<Tone>().Select(t => t.Name)); //Check if autotone tones are present and add it's if not. if (!toneNames.Contains(arr.ToneBase) && !String.IsNullOrEmpty(arr.ToneBase)) { toneItems.Add(parentControl.CreateNewTone(arr.ToneBase)); toneNames.Add(arr.ToneBase); } if (!toneNames.Contains(arr.ToneA) && !String.IsNullOrEmpty(arr.ToneA)) { toneItems.Add(parentControl.CreateNewTone(arr.ToneA)); toneNames.Add(arr.ToneA); } if (!toneNames.Contains(arr.ToneB) && !String.IsNullOrEmpty(arr.ToneB)) { toneItems.Add(parentControl.CreateNewTone(arr.ToneB)); toneNames.Add(arr.ToneB); } if (!toneNames.Contains(arr.ToneC) && !String.IsNullOrEmpty(arr.ToneC)) { toneItems.Add(parentControl.CreateNewTone(arr.ToneC)); toneNames.Add(arr.ToneC); } if (!toneNames.Contains(arr.ToneD) && !String.IsNullOrEmpty(arr.ToneD)) { toneItems.Add(parentControl.CreateNewTone(arr.ToneD)); toneNames.Add(arr.ToneD); } // FILL TONE COMBO FillToneCombo(toneBaseCombo, toneNames, true); FillToneCombo(toneACombo, toneNames, false); FillToneCombo(toneBCombo, toneNames, false); FillToneCombo(toneCCombo, toneNames, false); FillToneCombo(toneDCombo, toneNames, false); // SELECTING TONES toneBaseCombo.Enabled = true; if (!String.IsNullOrEmpty(arr.ToneBase)) toneBaseCombo.SelectedItem = arr.ToneBase; if (!String.IsNullOrEmpty(arr.ToneA)) toneACombo.SelectedItem = arr.ToneA; if (!String.IsNullOrEmpty(arr.ToneB)) toneBCombo.SelectedItem = arr.ToneB; if (!String.IsNullOrEmpty(arr.ToneC)) toneCCombo.SelectedItem = arr.ToneC; if (!String.IsNullOrEmpty(arr.ToneD)) toneDCombo.SelectedItem = arr.ToneD; // If have ToneBase and ToneB is setup it's because auto tone are setup in EoF, so, disable edit to prevent errors. disableTonesCheckbox.Checked = (!String.IsNullOrEmpty(arr.ToneBase) && !String.IsNullOrEmpty(arr.ToneB)); if (disableTonesCheckbox.Checked && !EditMode) { // disableTonesCheckbox.Enabled = false; tt.IsBalloon = true; tt.AutoPopDelay = 9000; // tt remains visible if the point is stationary tt.InitialDelay = 100; // time that passes before tt appears tt.ReshowDelay = 100; // time before next tt window appears tt.ShowAlways = true; // force tt display even if parent is not active tt.SetToolTip(disableTonesCheckbox, "For Toolkit Expert Use Only"); } }
// Load RS1 CDLC into PackageCreator public static DLCPackageData RS1LoadFromFolder(string unpackedDir, Platform targetPlatform, bool convert) { var data = new DLCPackageData(); data.Arrangements = new List <Arrangement>(); data.TonesRS2014 = new List <Tone2014>(); data.Tones = new List <Tone>(); data.GameVersion = (convert ? GameVersion.RS2014 : GameVersion.RS2012); data.SignatureType = PackageMagic.CON; // set default volumes data.Volume = (float)-5.5; // - 7 default a little too quite data.PreviewVolume = data.Volume; //Load song manifest var songsManifestJson = Directory.GetFiles(unpackedDir, "songs.manifest.json", SearchOption.AllDirectories); if (songsManifestJson.Length < 1) { throw new DataException("No songs.manifest.json file found."); } if (songsManifestJson.Length > 1) { throw new DataException("More than one songs.manifest.json file found."); } List <Attributes> attr = new List <Attributes>(); var songsManifest = Manifest.Manifest.LoadFromFile(songsManifestJson[0]).Entries.ToArray(); for (int smIndex = 0; smIndex < songsManifest.Count(); smIndex++) { var smData = songsManifest[smIndex].Value.ToArray()[0].Value; attr.Add(smData); } if (attr.FirstOrDefault() == null) { throw new DataException("songs.manifest.json file did not parse correctly."); } // Fill SongInfo data.SongInfo = new SongInfo(); data.SongInfo.SongDisplayName = attr.FirstOrDefault().SongName; data.SongInfo.SongDisplayNameSort = attr.FirstOrDefault().SongNameSort; data.SongInfo.Album = attr.FirstOrDefault().AlbumName; data.SongInfo.SongYear = (attr.FirstOrDefault().SongYear == 0 ? 2012 : attr.FirstOrDefault().SongYear); data.SongInfo.Artist = attr.FirstOrDefault().ArtistName; data.SongInfo.ArtistSort = attr.FirstOrDefault().ArtistNameSort; data.Name = attr.FirstOrDefault().SongKey; //Load tone manifest, even poorly formed tone_bass.manifest.json var toneManifestJson = Directory.GetFiles(unpackedDir, "*tone*.manifest.json", SearchOption.AllDirectories); if (toneManifestJson.Length < 1) { throw new DataException("No tone.manifest.json file found."); } // toolkit produces multiple tone.manifest.json files when packing RS1 CDLC files // rather than change toolkit behavior just merge manifest files for now if (toneManifestJson.Length > 1) { var mergeSettings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union }; JObject toneObject1 = new JObject(); foreach (var tone in toneManifestJson) { JObject toneObject2 = JObject.Parse(File.ReadAllText(tone)); //(toneObject1.SelectToken("Entries") as JArray).Merge(toneObject2.SelectToken("Entries")); toneObject1.Merge(toneObject2, mergeSettings); } toneManifestJson = new string[1]; toneManifestJson[0] = Path.Combine(unpackedDir, "merged.tone.manifest"); string json = JsonConvert.SerializeObject(toneObject1, Formatting.Indented); File.WriteAllText(toneManifestJson[0], json); } List <Tone> tones = new List <Tone>(); var toneManifest = Manifest.Tone.Manifest.LoadFromFile(toneManifestJson[0]); for (int tmIndex = 0; tmIndex < toneManifest.Entries.Count(); tmIndex++) { var tmData = toneManifest.Entries[tmIndex]; tones.Add(tmData); } data.Tones = tones; // Load xml arrangements var xmlFiles = Directory.GetFiles(unpackedDir, "*.xml", SearchOption.AllDirectories); if (xmlFiles.Length <= 0) { throw new DataException("Can not find any XML arrangement files"); } List <Tone2014> tones2014 = new List <Tone2014>(); foreach (var xmlFile in xmlFiles) { if (xmlFile.ToLower().Contains("metadata")) // skip DF file { continue; } // some poorly formed RS1 CDLC use just "vocal" if (xmlFile.ToLower().Contains("vocal")) { var voc = new Arrangement(); voc.Name = ArrangementName.Vocals; voc.ArrangementType = ArrangementType.Vocal; voc.ScrollSpeed = 20; voc.SongXml = new SongXML { File = xmlFile }; voc.SongFile = new SongFile { File = "" }; voc.CustomFont = false; // Add Vocal Arrangement data.Arrangements.Add(voc); } else { Attributes2014 attr2014 = new Attributes2014(); Song rsSong = new Song(); bool foundToneForArrangement = false; using (var obj1 = new Rs1Converter()) { rsSong = obj1.XmlToSong(xmlFile); data.SongInfo.AverageTempo = (int)obj1.AverageBPM(rsSong); } // matchup rsSong, songs.manifest, and tone.manifest files foreach (var arrangement in attr) { // apply best guesstimate matching, RS1 CDLC are very inconsistent // TODO: improve accuracy possibly by matching .xblock data string xmlArr = rsSong.Arrangement.ToLowerInvariant(); // var matchLead = Regex.Match(xmlArr.ToLower(), "^lead$", RegexOptions.IgnoreCase); // if(matchLead.Success) if (xmlArr.ToLower().Contains("guitar") && !xmlArr.ToLower().Equals("lead") && !xmlArr.ToLower().Equals("rhythm") && !xmlArr.ToLower().Equals("combo") && !xmlArr.ToLower().Equals("bass")) { if (xmlArr.ToUpper().Equals("PART REAL_GUITAR_22")) // { if (arrangement.ArrangementName.ToLower().Contains("combo")) { rsSong.Arrangement = arrangement.ArrangementName = "Rhythm"; } else { rsSong.Arrangement = arrangement.ArrangementName = "Lead"; } } else { if (arrangement.ArrangementName.ToLower().Contains("combo")) { rsSong.Arrangement = arrangement.ArrangementName = "Rhythm"; } else { rsSong.Arrangement = arrangement.ArrangementName = "Lead"; } } } if (xmlArr.ToLower().Contains("lead") && arrangement.ArrangementName.ToLower().Contains("rhythm")) { rsSong.Arrangement = arrangement.ArrangementName = "Lead"; } if (xmlArr.ToLower().Contains("rhythm") && arrangement.ArrangementName.ToLower().Contains("lead")) { rsSong.Arrangement = arrangement.ArrangementName = "Rhythm"; } if (xmlArr.ToLower().Contains("lead")) { if (!arrangement.ArrangementName.ToLower().Contains("lead")) { continue; } } if (xmlArr.ToLower().Contains("rhythm")) { if (!arrangement.ArrangementName.ToLower().Contains("rhythm")) { continue; } } if (xmlArr.ToLower().Contains("combo")) { if (!arrangement.ArrangementName.ToLower().Contains("combo")) { continue; } } if (xmlArr.ToLower().Contains("bass")) { if (!arrangement.ArrangementName.ToLower().Contains("bass")) { continue; } } if (rsSong.Part == arrangement.SongPartition || tones.Count == 1) // this is inaccurate for some { foreach (var tone in tones) // tone.manifest { if (String.IsNullOrEmpty(arrangement.EffectChainName)) { arrangement.EffectChainName = "Default"; } if (arrangement.EffectChainName.ToLower() == tone.Key.ToLower() || tones.Count == 1) // ok { if (convert) { using (var obj1 = new Rs1Converter()) tones2014.Add(obj1.ToneToTone2014(tone)); // added for consistent naming tone.Name = tones2014[tones2014.Count - 1].Name; tone.Key = tones2014[tones2014.Count - 1].Key; } // load attr2014 with RS1 mapped values for use by Arrangement() attr2014.Tone_Base = tone.Name; attr2014.ArrangementName = arrangement.ArrangementName; attr2014.CentOffset = 0; attr2014.DynamicVisualDensity = new List <float>() { 2 }; attr2014.SongPartition = arrangement.SongPartition; attr2014.PersistentID = IdGenerator.Guid().ToString(); attr2014.MasterID_RDV = RandomGenerator.NextInt(); attr2014.ArrangementProperties = new SongArrangementProperties2014(); if (arrangement.ArrangementName.ToLower().Contains("lead")) { attr2014.ArrangementType = 0; attr2014.ArrangementProperties.RouteMask = 1; } else if (arrangement.ArrangementName.ToLower().Contains("rhythm")) { attr2014.ArrangementType = 1; attr2014.ArrangementProperties.RouteMask = 2; } else if (arrangement.ArrangementName.ToLower().Contains("combo")) { attr2014.ArrangementType = 2; attr2014.ArrangementProperties.RouteMask = arrangement.EffectChainName.ToLower().Contains("lead") ? 1 : 2; } else if (arrangement.ArrangementName.ToLower().Contains("bass")) { attr2014.ArrangementType = 3; attr2014.ArrangementProperties.RouteMask = 4; } else { // some RS1 CDLC do not have a valid ArrangementName if (rsSong.Arrangement.ToLower().Contains("guitar")) { attr2014.ArrangementName = "Lead"; attr2014.ArrangementType = 0; attr2014.ArrangementProperties.RouteMask = 1; } else if (rsSong.Arrangement.ToLower().Contains("bass")) { attr2014.ArrangementName = "Bass"; attr2014.ArrangementType = 3; attr2014.ArrangementProperties.RouteMask = 4; } else // default to rhythm { attr2014.ArrangementName = "Rhythm"; attr2014.ArrangementType = 1; attr2014.ArrangementProperties.RouteMask = 2; } } if (arrangement.Tuning == "E Standard") { rsSong.Tuning = new TuningStrings { String0 = 0, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 } } ; else if (arrangement.Tuning == "DropD") { rsSong.Tuning = new TuningStrings { String0 = -2, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 } } ; else if (arrangement.Tuning == "OpenG") { rsSong.Tuning = new TuningStrings { String0 = -2, String1 = -2, String2 = 0, String3 = 0, String4 = 0, String5 = -2 } } ; else if (arrangement.Tuning == "EFlat") { rsSong.Tuning = new TuningStrings { String0 = -1, String1 = -1, String2 = -1, String3 = -1, String4 = -1, String5 = -1 } } ; else // default to standard tuning { rsSong.Tuning = new TuningStrings { String0 = 0, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 } }; foundToneForArrangement = true; break; } } } if (foundToneForArrangement) { break; } } if (!foundToneForArrangement) { Console.WriteLine(@"Could not determine the arrangement tone pairing"); } // write the tones to file using (var obj1 = new Rs1Converter()) obj1.SongToXml(rsSong, xmlFile, true); if (convert) // RS1 -> RS2 { Song2014 rsSong2014 = new Song2014(); using (var obj1 = new Rs1Converter()) rsSong2014 = obj1.SongToSong2014(rsSong); using (var obj2 = new Rs2014Converter()) obj2.Song2014ToXml(rsSong2014, xmlFile, true); } // Adding Song Arrangement try { data.Arrangements.Add(new Arrangement(attr2014, xmlFile)); } catch (Exception ex) { // mainly for the benifit of convert2012 CLI users Console.WriteLine(@"This CDLC could not be auto converted." + Environment.NewLine + "You can still try manually adding the arrangements and assests." + Environment.NewLine + ex.Message); } } } data.TonesRS2014 = tones2014; //Get Album Artwork DDS Files var artFiles = Directory.GetFiles(unpackedDir, "*.dds", SearchOption.AllDirectories); if (artFiles.Length < 1) { throw new DataException("No Album Artwork file found."); } if (artFiles.Length > 1) { throw new DataException("More than one Album Artwork file found."); } var targetArtFiles = new List <DDSConvertedFile>(); data.AlbumArtPath = artFiles[0]; targetArtFiles.Add(new DDSConvertedFile() { sizeX = 256, sizeY = 256, sourceFile = artFiles[0], destinationFile = artFiles[0].CopyToTempFile(".dds") }); data.ArtFiles = targetArtFiles; //Audio files var targetAudioFiles = new List <string>(); var audioFiles = Directory.GetFiles(unpackedDir, "*.ogg", SearchOption.AllDirectories); if (audioFiles.Length < 1) { throw new DataException("No Audio file found."); } if (audioFiles.Length > 2) { throw new DataException("Too many Audio files found."); } int i; for (i = 0; i < audioFiles.Length; i++) { if (convert && audioFiles[i].Contains("_fixed.ogg")) // use it { break; } if (!convert && !audioFiles[i].Contains("_fixed.ogg")) { break; } } var sourcePlatform = unpackedDir.GetPlatform(); if (targetPlatform.IsConsole != (sourcePlatform = audioFiles[i].GetAudioPlatform()).IsConsole) { var newFile = Path.Combine(Path.GetDirectoryName(audioFiles[i]), String.Format("{0}_cap.ogg", Path.GetFileNameWithoutExtension(audioFiles[i]))); OggFile.ConvertAudioPlatform(audioFiles[i], newFile); audioFiles[i] = newFile; } targetAudioFiles.Add(audioFiles[i]); if (!targetAudioFiles.Any()) { throw new DataException("Audio file not found."); } FileInfo a = new FileInfo(audioFiles[i]); data.OggPath = a.FullName; //AppID if (!convert) { var appidFile = Directory.GetFiles(unpackedDir, "*APP_ID*", SearchOption.AllDirectories); if (appidFile.Length > 0) { data.AppId = File.ReadAllText(appidFile[0]); } } else { data.AppId = "248750"; } //Package version var versionFile = Directory.GetFiles(unpackedDir, "toolkit.version", SearchOption.AllDirectories); if (versionFile.Length > 0) { data.PackageVersion = GeneralExtensions.ReadPackageVersion(versionFile[0]); } else { data.PackageVersion = "1"; } if (convert) { data.Tones = null; } return(data); }
public static void GenerateSNG(Arrangement arrangement, GamePlatform platform) { string sngFile = Path.Combine(Path.GetDirectoryName(arrangement.SongXml.File), arrangement.SongXml.Name + ".sng"); InstrumentTuning tuning = InstrumentTuning.Standard; Enum.TryParse<InstrumentTuning>(arrangement.Tuning, true, out tuning); SngFileWriter.Write(arrangement.SongXml.File, sngFile, arrangement.ArrangementType, platform, tuning); if (arrangement.SongFile == null) arrangement.SongFile = new SongFile(); arrangement.SongFile.File = sngFile; SNGTmpFiles.Add(sngFile); }
/// <summary> /// Loads required DLC info from folder. /// </summary> /// <returns>The DLCPackageData info.</returns> /// <param name="unpackedDir">Unpacked dir.</param> /// <param name="targetPlatform">Target platform.</param> public static DLCPackageData LoadFromFolder(string unpackedDir, Platform targetPlatform) { var data = new DLCPackageData(); data.GameVersion = GameVersion.RS2014; data.SignatureType = PackageMagic.CON; //Arrangements / Tones data.Arrangements = new List <Arrangement>(); data.TonesRS2014 = new List <Tone2014>(); //Source platform + audio files var targetAudioFiles = new List <string>(); var sourceAudioFiles = Directory.GetFiles(unpackedDir, "*.wem", SearchOption.AllDirectories); Platform sourcePlatform = new Platform(GamePlatform.Pc, GameVersion.None); foreach (var file in sourceAudioFiles) { var newFile = Path.Combine(Path.GetDirectoryName(file), String.Format("{0}_fixed{1}", Path.GetFileNameWithoutExtension(file), Path.GetExtension(file))); if (targetPlatform.IsConsole != (sourcePlatform = file.GetAudioPlatform()).IsConsole) { OggFile.ConvertAudioPlatform(file, newFile); targetAudioFiles.Add(newFile); } else { targetAudioFiles.Add(file); } } if (!targetAudioFiles.Any()) { throw new InvalidDataException("Audio files not found."); } //Load files var jsonFiles = Directory.GetFiles(unpackedDir, "*.json", SearchOption.AllDirectories); foreach (var json in jsonFiles) { var attr = Manifest2014 <Attributes2014> .LoadFromFile(json).Entries.ToArray()[0].Value.ToArray()[0].Value; var xmlName = attr.SongXml.Split(':')[3]; var xmlFile = Directory.GetFiles(unpackedDir, xmlName + ".xml", SearchOption.AllDirectories)[0]; if (attr.Phrases != null) { if (data.SongInfo == null) { // Fill Package Data data.Name = attr.DLCKey; data.Volume = attr.SongVolume; data.PreviewVolume = (float)(attr.PreviewVolume ?? data.Volume); // Fill SongInfo data.SongInfo = new SongInfo(); data.SongInfo.SongDisplayName = attr.SongName; data.SongInfo.SongDisplayNameSort = attr.SongNameSort; data.SongInfo.Album = attr.AlbumName; data.SongInfo.SongYear = attr.SongYear ?? 0; data.SongInfo.Artist = attr.ArtistName; data.SongInfo.ArtistSort = attr.ArtistNameSort; data.SongInfo.AverageTempo = (int)attr.SongAverageTempo; } // Adding Tones foreach (var jsonTone in attr.Tones) { if (jsonTone == null) { continue; } var key = jsonTone.Key; if (data.TonesRS2014.All(t => t.Key != key)) { data.TonesRS2014.Add(jsonTone); } } // Adding Arrangement data.Arrangements.Add(new Arrangement(attr, xmlFile)); } else { var voc = new Arrangement(); voc.Name = attr.JapaneseVocal == true ? ArrangementName.JVocals : ArrangementName.Vocals; voc.ArrangementType = ArrangementType.Vocal; voc.ScrollSpeed = 20; voc.SongXml = new SongXML { File = xmlFile }; voc.SongFile = new SongFile { File = "" }; voc.CustomFont = attr.JapaneseVocal == true; // Get symbols stuff, write plain sng to disk. var fontSng = Directory.GetFiles(unpackedDir, xmlName + ".sng", SearchOption.AllDirectories)[0]; var vocSng = Sng2014HSL.Sng2014File.LoadFromFile(fontSng, sourcePlatform); if (vocSng.IsCustomFont()) { voc.CustomFont = true; voc.FontSng = fontSng; vocSng.WriteChartData(fontSng, new Platform(GamePlatform.Pc, GameVersion.None)); } voc.Sng2014 = Sng2014HSL.Sng2014File.ConvertXML(xmlFile, ArrangementType.Vocal, voc.FontSng); // Adding Arrangement data.Arrangements.Add(voc); } } //Get DDS Files + hacky reuse if exist var ddsFiles = Directory.GetFiles(unpackedDir, "album_*.dds", SearchOption.AllDirectories); if (ddsFiles.Length > 0) { var ddsFilesC = new List <DDSConvertedFile>(); foreach (var file in ddsFiles) { switch (Path.GetFileNameWithoutExtension(file).Split('_')[2]) { case "256": data.AlbumArtPath = file; ddsFilesC.Add(new DDSConvertedFile() { sizeX = 256, sizeY = 256, sourceFile = file, destinationFile = file.CopyToTempFile(".dds") }); break; case "128": ddsFilesC.Add(new DDSConvertedFile() { sizeX = 128, sizeY = 128, sourceFile = file, destinationFile = file.CopyToTempFile(".dds") }); break; case "64": ddsFilesC.Add(new DDSConvertedFile() { sizeX = 64, sizeY = 64, sourceFile = file, destinationFile = file.CopyToTempFile(".dds") }); break; } } data.ArtFiles = ddsFilesC; } // Lyric Art var LyricArt = Directory.GetFiles(unpackedDir, "lyrics_*.dds", SearchOption.AllDirectories); if (LyricArt.Any()) { data.LyricArtPath = LyricArt[0]; } //Get other files string audioPath = null, audioPreviewPath = null; FileInfo a = new FileInfo(targetAudioFiles[0]); FileInfo b = null; if (targetAudioFiles.Count == 2) { b = new FileInfo(targetAudioFiles[1]); if (a.Length > b.Length) { audioPath = a.FullName; audioPreviewPath = b.FullName; } else { audioPath = b.FullName; audioPreviewPath = a.FullName; } } else { audioPath = a.FullName; } data.OggPath = audioPath; //Make Audio preview with expected name when rebuild if (!String.IsNullOrEmpty(audioPreviewPath)) { var newPreviewFileName = Path.Combine(Path.GetDirectoryName(audioPath), String.Format("{0}_preview{1}", Path.GetFileNameWithoutExtension(audioPath), Path.GetExtension(audioPath))); File.Move(audioPreviewPath, newPreviewFileName); data.OggPreviewPath = newPreviewFileName; } //AppID var appidFile = Directory.GetFiles(unpackedDir, "*.appid", SearchOption.AllDirectories); if (appidFile.Length > 0) { data.AppId = File.ReadAllText(appidFile[0]); } //Package version var versionFile = Directory.GetFiles(unpackedDir, "toolkit.version", SearchOption.AllDirectories); if (versionFile.Length > 0) { data.PackageVersion = GeneralExtensions.ReadPackageVersion(versionFile[0]); } else { data.PackageVersion = "1"; } return(data); }
public ArrangementForm(Arrangement arrangement, DLCPackageCreator control, GameVersion gameVersion) { InitializeComponent(); currentGameVersion = gameVersion; FillTuningCombo(); foreach (var val in Enum.GetValues(typeof(ArrangementType))) arrangementTypeCombo.Items.Add(val); arrangementTypeCombo.SelectedValueChanged += (sender, e) => { // Selecting defaults var selectedType = ((ArrangementType)((ComboBox)sender).SelectedItem); switch (selectedType) { case ArrangementType.Bass: arrangementNameCombo.Items.Clear(); arrangementNameCombo.Items.Add(ArrangementName.Bass); arrangementNameCombo.SelectedItem = ArrangementName.Bass; break; case ArrangementType.Vocal: arrangementNameCombo.Items.Clear(); arrangementNameCombo.Items.Add(ArrangementName.Vocals); arrangementNameCombo.SelectedItem = ArrangementName.Vocals; break; default: arrangementNameCombo.Items.Clear(); arrangementNameCombo.Items.Add(ArrangementName.Combo); arrangementNameCombo.Items.Add(ArrangementName.Lead); arrangementNameCombo.Items.Add(ArrangementName.Rhythm); arrangementNameCombo.SelectedItem = arrangement.Name; break; } var selectedArrangementName = ((ArrangementName)((ComboBox)arrangementNameCombo).SelectedItem); // Disabling options that are not meant for Arrangement Types // Arrangement Information arrangementNameCombo.Enabled = selectedType == ArrangementType.Guitar; tuningComboBox.Enabled = selectedType != ArrangementType.Vocal; gbTuningPitch.Enabled = selectedType != ArrangementType.Vocal && currentGameVersion == GameVersion.RS2014; gbScrollSpeed.Enabled = selectedType != ArrangementType.Vocal; Picked.Enabled = selectedType == ArrangementType.Bass; Picked.Checked = selectedType == ArrangementType.Bass ? false : true; BonusCheckBox.Enabled = selectedType != ArrangementType.Vocal && currentGameVersion == GameVersion.RS2014; UpdateCentOffset(); // Gameplay Path UpdateRouteMaskPath(selectedType, selectedArrangementName); // Tone Selector gbTone.Enabled = selectedType != ArrangementType.Vocal; // Arrangement ID MasterId.Enabled = selectedType != ArrangementType.Vocal; PersistentId.Enabled = selectedType != ArrangementType.Vocal; // Tuning Edit tuningEditButton.Enabled = selectedType != ArrangementType.Vocal; }; arrangementNameCombo.SelectedValueChanged += (sender, e) => { var selectedType = ((ArrangementType)((ComboBox)arrangementTypeCombo).SelectedItem); var selectedArrangementName = ((ArrangementName)((ComboBox)sender).SelectedItem); UpdateRouteMaskPath(selectedType, selectedArrangementName); }; tuningComboBox.SelectedValueChanged += (sender, e) => { // Selecting defaults var selectedType = ((ArrangementType)((ComboBox)arrangementTypeCombo).SelectedItem); var selectedTuning = ((TuningDefinition)((ComboBox)sender).SelectedItem); tuningEditButton.Enabled = selectedType != ArrangementType.Vocal && selectedTuning != null; }; var scrollSpeed = arrangement.ScrollSpeed; if (scrollSpeed == 0) scrollSpeed = Convert.ToInt32(ConfigRepository.Instance().GetDecimal("creator_scrollspeed") * 10); scrollSpeedTrackBar.Value = scrollSpeed; UpdateScrollSpeedDisplay(); parentControl = control; //Tones setup SetupTones(arrangement); Arrangement = arrangement; }
public static DLCPackageData LoadFromFile(string unpackedDir, Platform targetPlatform) { //Load files var jsonFiles = Directory.GetFiles(unpackedDir, "*.json", SearchOption.AllDirectories); var data = new DLCPackageData(); data.GameVersion = GameVersion.RS2014; data.SignatureType = PackageMagic.CON; //Get Arrangements / Tones data.Arrangements = new List<Arrangement>(); data.TonesRS2014 = new List<Tone2014>(); foreach (var json in jsonFiles) { Attributes2014 attr = Manifest2014<Attributes2014>.LoadFromFile(json).Entries.ToArray()[0].Value.ToArray()[0].Value; var xmlName = attr.SongXml.Split(':')[3]; var xmlFile = Directory.GetFiles(unpackedDir, xmlName + ".xml", SearchOption.AllDirectories)[0]; if (attr.Phrases != null) { if (data.SongInfo == null) { // Fill Package Data data.Name = attr.DLCKey; data.Volume = attr.SongVolume; data.PreviewVolume = (attr.PreviewVolume != null) ? (float)attr.PreviewVolume : data.Volume; // Fill SongInfo data.SongInfo = new SongInfo(); data.SongInfo.SongDisplayName = attr.SongName; data.SongInfo.SongDisplayNameSort = attr.SongNameSort; data.SongInfo.Album = attr.AlbumName; data.SongInfo.SongYear = attr.SongYear ?? 0; data.SongInfo.Artist = attr.ArtistName; data.SongInfo.ArtistSort = attr.ArtistNameSort; data.SongInfo.AverageTempo = (int)attr.SongAverageTempo; } // Adding Tones foreach (var jsonTone in attr.Tones) { if (jsonTone == null) continue; if (!data.TonesRS2014.OfType<Tone2014>().Any(t => t.Key == jsonTone.Key)) data.TonesRS2014.Add(jsonTone); } // Adding Arrangement data.Arrangements.Add(new Arrangement(attr, xmlFile)); } else { var voc = new Arrangement(); voc.Name = ArrangementName.Vocals; voc.ArrangementType = ArrangementType.Vocal; voc.SongXml = new SongXML { File = xmlFile }; voc.SongFile = new SongFile { File = "" }; voc.Sng2014 = Sng2014HSL.Sng2014File.ConvertXML(xmlFile, ArrangementType.Vocal); voc.ScrollSpeed = 20; // Adding Arrangement data.Arrangements.Add(voc); } } //Get Files var ddsFiles = Directory.GetFiles(unpackedDir, "*_256.dds", SearchOption.AllDirectories); if (ddsFiles.Length > 0) data.AlbumArtPath = ddsFiles[0]; var sourceAudioFiles = Directory.GetFiles(unpackedDir, "*.wem", SearchOption.AllDirectories); var targetAudioFiles = new List<string>(); foreach (var file in sourceAudioFiles) { var newFile = Path.Combine(Path.GetDirectoryName(file), String.Format("{0}_fixed{1}", Path.GetFileNameWithoutExtension(file), Path.GetExtension(file))); if (targetPlatform.IsConsole != file.GetAudioPlatform().IsConsole) { OggFile.ConvertAudioPlatform(file, newFile); targetAudioFiles.Add(newFile); } else targetAudioFiles.Add(file); } if (targetAudioFiles.Count() <= 0) throw new InvalidDataException("Audio files not found."); string audioPath = null, audioPreviewPath = null; FileInfo a = new FileInfo(targetAudioFiles[0]); FileInfo b = null; if (targetAudioFiles.Count() == 2) { b = new FileInfo(targetAudioFiles[1]); if (a.Length > b.Length) { audioPath = a.FullName; audioPreviewPath = b.FullName; } else { audioPath = b.FullName; audioPreviewPath = a.FullName; } } else audioPath = a.FullName; data.OggPath = audioPath; //Make Audio preview with expected name when rebuild if (!String.IsNullOrEmpty(audioPreviewPath)) { var newPreviewFileName = Path.Combine(Path.GetDirectoryName(audioPath), String.Format("{0}_preview{1}", Path.GetFileNameWithoutExtension(audioPath), Path.GetExtension(audioPath))); File.Move(audioPreviewPath, newPreviewFileName); data.OggPreviewPath = newPreviewFileName; } var appidFile = Directory.GetFiles(unpackedDir, "*.appid", SearchOption.AllDirectories); if (appidFile.Length > 0) data.AppId = File.ReadAllText(appidFile[0]); return data; }
/// <summary> /// Loads required DLC info from folder. /// </summary> /// <returns>The DLCPackageData info.</returns> /// <param name="unpackedDir">Unpacked dir.</param> /// <param name="targetPlatform">Target platform.</param> /// <param name = "sourcePlatform"></param> /// <param name="ignoreMultitoneEx">Ignore multitone exceptions</param> public static DLCPackageData LoadFromFolder(string unpackedDir, Platform targetPlatform, Platform sourcePlatform = null, bool ignoreMultitoneEx = false) { var data = new DLCPackageData(); data.GameVersion = GameVersion.RS2014; data.SignatureType = PackageMagic.CON; if (sourcePlatform == null) { sourcePlatform = unpackedDir.GetPlatform(); } //Arrangements / Tones data.Arrangements = new List <Arrangement>(); data.TonesRS2014 = new List <Tone2014>(); //Load files var jsonFiles = Directory.EnumerateFiles(unpackedDir, "*.json", SearchOption.AllDirectories).ToArray(); foreach (var json in jsonFiles) { var attr = Manifest2014 <Attributes2014> .LoadFromFile(json).Entries.ToArray()[0].Value.ToArray()[0].Value; var xmlName = attr.SongXml.Split(':')[3]; var xmlFile = Directory.EnumerateFiles(unpackedDir, xmlName + ".xml", SearchOption.AllDirectories).FirstOrDefault(); if (attr.Phrases != null) { if (data.SongInfo == null) { // Fill Package Data data.Name = attr.DLCKey; data.Volume = (attr.SongVolume == 0 ? -12 : attr.SongVolume); //FIXME: too low song volume issue, revert to -6 to fix. data.PreviewVolume = (attr.PreviewVolume ?? data.Volume); // Fill SongInfo data.SongInfo = new SongInfo { SongDisplayName = attr.SongName, SongDisplayNameSort = attr.SongNameSort, Album = attr.AlbumName, AlbumSort = attr.AlbumNameSort, SongYear = attr.SongYear ?? 0, Artist = attr.ArtistName, ArtistSort = attr.ArtistNameSort, AverageTempo = (int)attr.SongAverageTempo }; } // Adding Arrangement data.Arrangements.Add(new Arrangement(attr, xmlFile, ignoreMultitoneEx)); // make a list of tone names used in arrangements var toneNames = new List <string>(); foreach (var arr in data.Arrangements) { if (!String.IsNullOrEmpty(arr.ToneA)) { toneNames.Add(arr.ToneA); } if (!String.IsNullOrEmpty(arr.ToneB)) { toneNames.Add(arr.ToneB); } if (!String.IsNullOrEmpty(arr.ToneC)) { toneNames.Add(arr.ToneC); } if (!String.IsNullOrEmpty(arr.ToneD)) { toneNames.Add(arr.ToneD); } if (!String.IsNullOrEmpty(arr.ToneBase)) { toneNames.Add(arr.ToneBase); } } // Adding Tones foreach (var jsonTone in attr.Tones) { if (jsonTone == null) { continue; } var key = jsonTone.Key; if (data.TonesRS2014.All(t => t.Key != key)) { // fix tones names that do not have the correct alphacase for cross matching if (attr.Tone_Base.ToLower() == jsonTone.Name.ToLower() && attr.Tone_Base != jsonTone.Name) { jsonTone.Name = attr.Tone_Base; } if (attr.Tone_A != null && attr.Tone_A.ToLower() == jsonTone.Name.ToLower() && attr.Tone_A != jsonTone.Name) { jsonTone.Name = attr.Tone_A; } if (attr.Tone_B != null && attr.Tone_B.ToLower() == jsonTone.Name.ToLower() && attr.Tone_B != jsonTone.Name) { jsonTone.Name = attr.Tone_B; } if (attr.Tone_C != null && attr.Tone_C.ToLower() == jsonTone.Name.ToLower() && attr.Tone_C != jsonTone.Name) { jsonTone.Name = attr.Tone_C; } if (attr.Tone_D != null && attr.Tone_D.ToLower() == jsonTone.Name.ToLower() && attr.Tone_D != jsonTone.Name) { jsonTone.Name = attr.Tone_D; } // this is part of multitone exception handling auto convert to single tone arrangment // make data.TonesRS2014 consistent with data.Arragment.Tones (toneNames) if (toneNames.Contains(jsonTone.Name)) { data.TonesRS2014.Add(jsonTone); } } } } else if (xmlFile.ToLower().Contains("_vocals")) { var voc = new Arrangement { Name = attr.JapaneseVocal == true ? ArrangementName.JVocals : ArrangementName.Vocals, ArrangementType = ArrangementType.Vocal, ScrollSpeed = 20, SongXml = new SongXML { File = xmlFile }, SongFile = new SongFile { File = "" }, CustomFont = attr.JapaneseVocal == true }; // Get symbols stuff from _vocals.xml var fontSng = Path.Combine(unpackedDir, xmlName + ".sng"); var vocSng = Sng2014FileWriter.ReadVocals(xmlFile); if (vocSng.IsCustomFont()) { voc.CustomFont = true; voc.FontSng = fontSng; vocSng.WriteChartData(fontSng, new Platform(GamePlatform.Pc, GameVersion.None)); } voc.Sng2014 = Sng2014File.ConvertXML(xmlFile, ArrangementType.Vocal, voc.FontSng); // Adding Arrangement data.Arrangements.Add(voc); } } //ShowLights XML var xmlShowLights = Directory.EnumerateFiles(unpackedDir, "*_showlights.xml", SearchOption.AllDirectories).FirstOrDefault(); if (!String.IsNullOrEmpty(xmlShowLights)) { var shl = new Arrangement { ArrangementType = ArrangementType.ShowLight, Name = ArrangementName.ShowLights, SongXml = new SongXML { File = xmlShowLights }, SongFile = new SongFile { File = "" } }; // Adding ShowLights data.Arrangements.Add(shl); data.Showlights = true; } //Get DDS Files var ddsFiles = Directory.EnumerateFiles(unpackedDir, "album_*.dds", SearchOption.AllDirectories).ToArray(); if (ddsFiles.Any()) { var ddsFilesC = new List <DDSConvertedFile>(); foreach (var file in ddsFiles) { switch (Path.GetFileNameWithoutExtension(file).Split('_')[2]) { case "256": data.AlbumArtPath = file; ddsFilesC.Add(new DDSConvertedFile() { sizeX = 256, sizeY = 256, sourceFile = file, destinationFile = file.CopyToTempFile(".dds") }); break; case "128": ddsFilesC.Add(new DDSConvertedFile() { sizeX = 128, sizeY = 128, sourceFile = file, destinationFile = file.CopyToTempFile(".dds") }); break; case "64": ddsFilesC.Add(new DDSConvertedFile() { sizeX = 64, sizeY = 64, sourceFile = file, destinationFile = file.CopyToTempFile(".dds") }); break; } } data.ArtFiles = ddsFilesC; } // Lyric Art var lyricArt = Directory.EnumerateFiles(unpackedDir, "lyrics_*.dds", SearchOption.AllDirectories).ToArray(); if (lyricArt.Any()) { data.LyricArtPath = lyricArt.FirstOrDefault(); } //Get other files //Audio files var targetAudioFiles = new List <string>(); var sourceAudioFiles = Directory.EnumerateFiles(unpackedDir, "*.wem", SearchOption.AllDirectories).ToArray(); foreach (var file in sourceAudioFiles) { var newFile = Path.Combine(Path.GetDirectoryName(file), String.Format("{0}_fixed{1}", Path.GetFileNameWithoutExtension(file), Path.GetExtension(file))); if (targetPlatform.IsConsole != (sourcePlatform = file.GetAudioPlatform()).IsConsole) { OggFile.ConvertAudioPlatform(file, newFile); targetAudioFiles.Add(newFile); } else { targetAudioFiles.Add(file); } } if (!targetAudioFiles.Any()) { throw new InvalidDataException("Audio files not found."); } string audioPath = null, audioPreviewPath = null; var a = new FileInfo(targetAudioFiles[0]); if (targetAudioFiles.Count == 2) { var b = new FileInfo(targetAudioFiles[1]); if (a.Length > b.Length) { audioPath = a.FullName; audioPreviewPath = b.FullName; } else { audioPath = b.FullName; audioPreviewPath = a.FullName; } } else { audioPath = a.FullName; } data.OggPath = audioPath; //Make Audio preview with expected name when rebuild if (!String.IsNullOrEmpty(audioPreviewPath)) { var newPreviewFileName = Path.Combine(Path.GetDirectoryName(audioPath), String.Format("{0}_preview{1}", Path.GetFileNameWithoutExtension(audioPath), Path.GetExtension(audioPath))); File.Move(audioPreviewPath, newPreviewFileName); data.OggPreviewPath = newPreviewFileName; } //AppID var appidFile = Directory.EnumerateFiles(unpackedDir, "*.appid", SearchOption.AllDirectories).FirstOrDefault(); if (appidFile != null) { data.AppId = File.ReadAllText(appidFile); } // Package Info var versionFile = Directory.EnumerateFiles(unpackedDir, "toolkit.version", SearchOption.AllDirectories).FirstOrDefault(); if (versionFile != null) { var tkInfo = GeneralExtensions.ReadToolkitInfo(versionFile); data.PackageVersion = tkInfo.PackageVersion; data.PackageComment = tkInfo.PackageComment; } else { data.PackageVersion = "1"; data.PackageComment = ""; } return(data); }
private void AssociateTechniques(Arrangement x, Attributes att, string technique) { att.AssociatedTechniques.Add(String.Format("{0}{1}", x.ArrangementType == Sng.ArrangementType.Bass ? "Bass" : "", technique)); }