private void ShowTuningForm(ArrangementType selectedType, TuningDefinition tuning) { if (tuning == null) { MessageBox.Show("Pick a tuning definition to start editing.\r\n (DEBUG: Current tuning is Null)", DLCPackageCreator.MESSAGEBOX_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // get the latest comments from the XML to check if previous bass fixed is valid if (!String.IsNullOrEmpty(Arrangement.SongXml.File) && selectedType == ArrangementType.Bass) { //var debugMe = ""; var xmlComments = Song2014.ReadXmlComments(Arrangement.SongXml.File); var isBassFixed = xmlComments.Any(xComment => xComment.ToString().Contains("Low Bass Tuning Fixed")) || Convert.ToDouble(txtFrequency.Text) == 220.00; // commented out ... Arrangement.XmlComments may not be populated // var isBassFixed = Arrangement.XmlComments.Any(xComment => xComment.ToString().Contains("Low Bass Tuning Fixed")) || Convert.ToDouble(txtFrequency.Text) == 220.00; if (isBassFixed && !tuning.UIName.Contains("Fixed")) { // UIName may contain spaces, where as Name contains no spaces tuning.UIName = String.Format("{0} Fixed", tuning.UIName); tuning.Name = tuning.UIName.ReplaceSpaceWith(""); tuning.Custom = true; // fixed bass tuning definition is auto added to repository TuningDefinitionRepository.SaveUnique(tuning); } } bool addNew; TuningDefinition formTuning; using (var form = new TuningForm()) { form.Tuning = tuning; form.IsBass = selectedType == ArrangementType.Bass; if (DialogResult.OK != form.ShowDialog()) return; // prevent any further SET calls to form.Tuning formTuning = form.Tuning; addNew = form.AddNew; } if (tuning.UIName != formTuning.UIName) { // Update lstArrangements slots if tuning name is changed for (int i = 0; i < _parentControl.lstArrangements.Items.Count; i++) { var selectedArrangement = (Arrangement)_parentControl.lstArrangements.Items[i]; if (tuning.UIName.Equals(selectedArrangement.Tuning)) { selectedArrangement.Tuning = formTuning.UIName; _parentControl.lstArrangements.Items[i] = selectedArrangement; } } } FillTuningCombo(_gameVersion); int foundTuning = -1; cmbTuningName.SelectedIndex = -1; for (int tcbIndex = 0; tcbIndex < cmbTuningName.Items.Count; tcbIndex++) { cmbTuningName.SelectedIndex = tcbIndex; tuning = (TuningDefinition)cmbTuningName.Items[tcbIndex]; // check at least tuning strings and name match if (tuning.Tuning == formTuning.Tuning && tuning.Name == formTuning.Name) { foundTuning = tcbIndex; break; } } // add the custom tuning to tuningComboBox if (foundTuning == -1) { if (addNew) TuningDefinitionRepository.SaveUnique(formTuning); formTuning.Custom = true; cmbTuningName.Items.Add(formTuning); cmbTuningName.SelectedIndex = cmbTuningName.Items.Count - 1; } else cmbTuningName.SelectedIndex = foundTuning; cmbTuningName.Refresh(); Arrangement.TuningStrings = formTuning.Tuning; Arrangement.Tuning = formTuning.UIName; }
// 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); }