internal static SongEbeat[] Parse(Sng2014HSL.BpmSection bpmSection) { var songEbeats = new SongEbeat[bpmSection.Count]; for (var i = 0; i < bpmSection.Count; i++) { var sEbeat = new SongEbeat(); sEbeat.Time = bpmSection.BPMs[i].Time; sEbeat.Measure = -1; if (bpmSection.BPMs[i].Mask != 0) { sEbeat.Measure = bpmSection.BPMs[i].Measure; } songEbeats[i] = sEbeat; } return(songEbeats); }
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(); }
// COMPLETE private static void WriteRocksmithSngEbeats(EndianBinaryWriter w, SongEbeat[] ebeats) { // output header if (ebeats == null || ebeats.Length == 0) { w.Write(new byte[4]); // empty header return; } // output header count w.Write(ebeats.Length); Int16 currentMeasure = -1; Int16 currentMeasureBeat = -1; // output ebeats foreach (SongEbeat ebeat in ebeats) { // ebeat time w.Write(ebeat.Time); // measure Int16 measure = Convert.ToInt16(ebeat.Measure); if (measure >= 0) { currentMeasure = measure; currentMeasureBeat = 0; w.Write(currentMeasure); w.Write(currentMeasureBeat); w.Write(true); w.Write(false); w.Write(false); w.Write(false); } else if (measure == -1) { currentMeasureBeat++; w.Write(currentMeasure); w.Write(currentMeasureBeat); w.Write(false); w.Write(false); w.Write(false); w.Write(false); } } }
internal static SongEbeat[] Parse(Sng2014HSL.BpmSection bpmSection) { var songEbeats = new SongEbeat[bpmSection.Count]; for (var i = 0; i < bpmSection.Count; i++) { var sEbeat = new SongEbeat(); sEbeat.Time = bpmSection.BPMs[i].Time; sEbeat.Measure = -1; if (bpmSection.BPMs[i].Mask != 0) sEbeat.Measure = bpmSection.BPMs[i].Measure; songEbeats[i] = sEbeat; } return songEbeats; }