internal static SongPhraseProperty[] Parse(Sng2014HSL.PhraseExtraInfoByLevelSection phraseExtraInfoByLevelSection) { var phraseProperties = new SongPhraseProperty[phraseExtraInfoByLevelSection.Count]; for (var i = 0; i < phraseExtraInfoByLevelSection.Count; i++) { var spp = new SongPhraseProperty(); spp.PhraseId = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].PhraseId; spp.Redundant = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].Redundant; spp.LevelJump = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].LevelJump; spp.Empty = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].Empty; spp.Difficulty = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].Difficulty; phraseProperties[i] = spp; } return(phraseProperties); }
internal static SongPhraseProperty[] Parse(Sng2014HSL.PhraseExtraInfoByLevelSection phraseExtraInfoByLevelSection) { var phraseProperties = new SongPhraseProperty[phraseExtraInfoByLevelSection.Count]; for (var i = 0; i < phraseExtraInfoByLevelSection.Count; i++) { phraseProperties[i] = new SongPhraseProperty { PhraseId = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].PhraseId, Redundant = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].Redundant, LevelJump = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].LevelJump, Empty = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].Empty, Difficulty = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].Difficulty }; } return(phraseProperties); }
public Song2014(Sng2014HSL.Sng sngData, Attributes2014 attr = null) { Version = "7"; CrowdSpeed = "1"; if (attr != null) { // If manifest is passed, fill general song information Title = attr.SongName; Arrangement = ((ArrangementName)attr.ArrangementType).ToString(); Part = (short)attr.SongPartition; Offset = (float)attr.SongOffset; CentOffset = Convert.ToString(attr.CentOffset); SongLength = (float)attr.SongLength; SongNameSort = attr.SongNameSort; AverageTempo = attr.SongAverageTempo; Tuning = attr.Tuning; Capo = Convert.ToByte(attr.CapoFret); ArtistName = attr.ArtistName; ArtistNameSort = attr.ArtistNameSort; AlbumName = attr.AlbumName; AlbumNameSort = attr.AlbumNameSort; AlbumYear = Convert.ToString(attr.SongYear) ?? ""; AlbumArt = attr.AlbumArt; ArrangementProperties = attr.ArrangementProperties; LastConversionDateTime = attr.LastConversionDateTime; ToneBase = attr.Tone_Base; ToneA = attr.Tone_A; ToneB = attr.Tone_B; ToneC = attr.Tone_C; ToneD = attr.Tone_D; } else { Part = sngData.Metadata.Part; SongLength = sngData.Metadata.SongLength; Tuning = new TuningStrings(sngData.Metadata.Tuning); Capo = (byte)((sngData.Metadata.CapoFretId == 0xFF) ? 0x00 : sngData.Metadata.CapoFretId); LastConversionDateTime = sngData.Metadata.LastConversionDateTime.ToNullTerminatedAscii(); } Tones = SongTone2014.Parse(sngData.Tones, attr); if (attr == null) { // Fix tones slots for fake tone names if manifest was not entered foreach (var tone in Tones) { if (tone.Name.EndsWith("_0")) { ToneBase = tone.Name; } if (tone.Name.EndsWith("_1")) { ToneA = ToneBase; ToneB = tone.Name; } if (tone.Name.EndsWith("_2")) { ToneC = tone.Name; } if (tone.Name.EndsWith("_3")) { ToneD = tone.Name; } } } //Sections can be obtained from manifest or sng file (manifest preferred) Sections = (attr != null) ? SongSection.Parse(attr.Sections) : SongSection.Parse(sngData.Sections); //Can be obtained from manifest or sng file (sng preferred) Phrases = SongPhrase.Parse(sngData.Phrases); PhraseIterations = SongPhraseIteration2014.Parse(sngData.PhraseIterations); //Can be obtained from manifest or sng file (combined preferred) ChordTemplates = SongChordTemplate2014.Parse(sngData.Chords); // Only SNG have all ChordTemplates, manifest have only chord templates with name if (attr != null) { SongChordTemplate2014.AddChordIds(ChordTemplates, attr.ChordTemplates); // Only manifest has chordIds } //Only in SNG Ebeats = SongEbeat.Parse(sngData.BPMs); StartBeat = sngData.BPMs.BPMs[0].Time; Events = SongEvent.Parse(sngData.Events); Levels = SongLevel2014.Parse(sngData); //Not used in RS2014 customs at this time. Need to check official files NewLinkedDiff = SongNewLinkedDiff.Parse(sngData.NLD); PhraseProperties = SongPhraseProperty.Parse(sngData.PhraseExtraInfo); LinkedDiffs = new SongLinkedDiff[0]; FretHandMuteTemplates = new SongFretHandMuteTemplate[0]; //ddc TranscriptionTrack = TranscriptionTrack2014.GetDefault(); }
// INCOMPLETE - review Angela_Combo.xml for some inconsistencies private static void WriteRocksmithSngPhraseProperties(EndianBinaryWriter w, SongPhraseProperty[] phraseProperties) { // output header if (phraseProperties == null || phraseProperties.Length == 0) { w.Write(new byte[4]); // empty header return; } // output header count w.Write(phraseProperties.Length); // output phrase properties foreach (SongPhraseProperty phraseProperty in phraseProperties) { // phrase id w.Write(phraseProperty.PhraseId); // difficulty w.Write(phraseProperty.Difficulty); // empty? w.Write(phraseProperty.Empty); // These seem to be 1 in many RS SNGs where the XML shows 0. // level jump? w.Write(phraseProperty.LevelJump); // redundant w.Write(phraseProperty.Redundant); } }
internal static SongPhraseProperty[] Parse(Sng2014HSL.PhraseExtraInfoByLevelSection phraseExtraInfoByLevelSection) { var phraseProperties = new SongPhraseProperty[phraseExtraInfoByLevelSection.Count]; for (var i = 0; i < phraseExtraInfoByLevelSection.Count; i++) { var spp = new SongPhraseProperty(); spp.PhraseId = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].PhraseId; spp.Redundant = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].Redundant; spp.LevelJump = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].LevelJump; spp.Empty = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].Empty; spp.Difficulty = phraseExtraInfoByLevelSection.PhraseExtraInfoByLevel[i].Difficulty; phraseProperties[i] = spp; } return phraseProperties; }