private static Score CreateSong(Song2014 song, IEnumerable <SongNoteChordWrapper> allSounds) { var score = new Score(); score.Album = song.AlbumName; score.Artist = song.ArtistName; //score.copyright //score.instructions //score.music score.Notices = "Created by RockSmith Tab Explorer"; //_score.subTitle //_score.tab score.Tempo = (int)song.AverageTempo; score.TempoLabel = "avg. bpm"; score.Title = song.Title + " (" + song.Arrangement + ")"; //_score.words bool isBass = song.Arrangement.ToLower() == "bass"; var track = new Track(); track.Name = song.Arrangement; track.Index = 1; int capo = track.Capo; track.TuningName = GetTuningName(song.Tuning, isBass, capo); track.ShortName = song.Arrangement; // Add string tunings in reverse order var tuning = new int[(isBass ? 4 : 6)]; for (Byte s = 0; s < tuning.Length; s++) { tuning[tuning.Length - 1 - s] = Sng2014FileWriter.GetMidiNote(song.Tuning.ToShortArray(), s, 0, isBass, capo); } track.Tuning.AddRange(tuning); score.AddTrack(track); foreach (var chordTemplate in song.ChordTemplates.Where(ct => ct.ChordId != null)) { var chord = new global::AlphaTab.Model.Chord(); track.Chords[chordTemplate.ChordId.ToString()] = chord; chord.Name = chordTemplate.ChordName; chord.Strings.Add(chordTemplate.Fret0); chord.Strings.Add(chordTemplate.Fret1); chord.Strings.Add(chordTemplate.Fret2); chord.Strings.Add(chordTemplate.Fret3); chord.Strings.Add(chordTemplate.Fret4); chord.Strings.Add(chordTemplate.Fret5); } List <eBeatWrapper> ebeatMeasures = new List <eBeatWrapper>(); eBeatWrapper currentMeasureBeat = null; foreach (var srcBeat in song.Ebeats) { if (srcBeat.Measure > 0) { currentMeasureBeat = new eBeatWrapper() { MeasureStartBeat = srcBeat, MeasureSubBeats = new List <SongEbeat>() }; ebeatMeasures.Add(currentMeasureBeat); } else { if (currentMeasureBeat == null) { System.Diagnostics.Debug.WriteLine("Invalid ebeats in source file. Sub measure is before first measure!?"); } else { currentMeasureBeat.MeasureSubBeats.Add(srcBeat); } } } var notesStack = new Stack <SongNoteChordWrapper>(allSounds.OrderByDescending(x => x.Time)); var currentNote = notesStack.Pop(); var nextNote = notesStack.Pop(); int prevMeasureId = 0; int i = 1; float prevMeasureDuration = 0; foreach (var measure in ebeatMeasures) { var nextmeasure = i < ebeatMeasures.Count ? ebeatMeasures[i] : null; if (measure.MeasureStartBeat.Measure > prevMeasureId) { var measureDuration = nextmeasure != null ? nextmeasure.MeasureStartBeat.Time - measure.MeasureStartBeat.Time : prevMeasureDuration; AddMasterBarToScore(score, measure.MeasureStartBeat.Time.ToString("n2"), measure); var voice = AddBarAndVoiceToTrack(track, isBass ? Clef.F4 : Clef.G2); bool firstNoteInBar = true; while (currentNote != null && (nextmeasure == null || currentNote.Time < nextmeasure.MeasureStartBeat.Time)) { if (currentNote.IsNote() && currentNote.AsNote().Bend != 0) { System.Diagnostics.Debug.WriteLine("Bent detected. Bend value: {0}. Measure: {1}", currentNote.AsNote().Bend, measure.MeasureStartBeat.Measure); } Duration duration = Duration.Quarter; if (firstNoteInBar && currentNote.Time > measure.MeasureStartBeat.Time) { var leadingSilenceTicks = Get64thsFromDuration(measure.MeasureStartBeat.Time, currentNote.Time, measureDuration); while (leadingSilenceTicks >= 1) { if (leadingSilenceTicks >= 32) { AddBeatAndSilenceToVoice(voice, Duration.Half); leadingSilenceTicks -= 32; } else if (leadingSilenceTicks >= 16) { AddBeatAndSilenceToVoice(voice, Duration.Quarter); leadingSilenceTicks -= 16; } else if (leadingSilenceTicks >= 8) { AddBeatAndSilenceToVoice(voice, Duration.Eighth); leadingSilenceTicks -= 8; } else if (leadingSilenceTicks >= 4) { AddBeatAndSilenceToVoice(voice, Duration.Sixteenth); leadingSilenceTicks -= 4; } else if (leadingSilenceTicks >= 2) { AddBeatAndSilenceToVoice(voice, Duration.ThirtySecond); leadingSilenceTicks -= 2; } else if (leadingSilenceTicks >= 1) { AddBeatAndSilenceToVoice(voice, Duration.SixtyFourth); leadingSilenceTicks -= 1; } } } Single durationTime = 0; if (nextNote != null) { duration = GetBeatDuration(currentNote.Time, nextNote.Time, measureDuration); durationTime = nextNote.Time - currentNote.Time; } else { durationTime = measureDuration; } if (currentNote.IsNote()) { AddBeatAndNoteToVoice(voice, currentNote.AsNote(), duration, durationTime); } else { AddBeatWithChordToVoice(voice, currentNote.AsChord(), duration, durationTime); } currentNote = nextNote; if (notesStack.Any()) { nextNote = notesStack.Pop(); } else { nextNote = null; } firstNoteInBar = false; } prevMeasureId = measure.MeasureStartBeat.Measure; prevMeasureDuration = measureDuration; } i++; } return(score); }
private static Score CreateSong(Song2014 song, IEnumerable<SongNoteChordWrapper> allSounds) { var score = new Score(); score.Album = song.AlbumName; score.Artist = song.ArtistName; //score.copyright //score.instructions //score.music score.Notices = "Created by RockSmith Tab Explorer"; //_score.subTitle //_score.tab score.Tempo = (int)song.AverageTempo; score.TempoLabel = "avg. bpm"; score.Title = song.Title + " (" + song.Arrangement + ")"; //_score.words bool isBass = song.Arrangement.ToLower() == "bass"; var track = new Track(); track.Name = song.Arrangement; track.Index = 1; int capo = track.Capo; track.TuningName = GetTuningName(song.Tuning, isBass, capo); track.ShortName = song.Arrangement; // Add string tunings in reverse order var tuning = new int[(isBass ? 4 : 6)]; for (Byte s = 0; s < tuning.Length; s++) { tuning[tuning.Length - 1 - s] = Sng2014FileWriter.GetMidiNote(song.Tuning.ToShortArray(), s, 0, isBass, capo); } track.Tuning.AddRange(tuning); score.AddTrack(track); foreach (var chordTemplate in song.ChordTemplates.Where(ct=>ct.ChordId!=null)) { var chord = new global::AlphaTab.Model.Chord(); track.Chords[chordTemplate.ChordId.ToString()] = chord; chord.Name = chordTemplate.ChordName; chord.Strings.Add(chordTemplate.Fret0); chord.Strings.Add(chordTemplate.Fret1); chord.Strings.Add(chordTemplate.Fret2); chord.Strings.Add(chordTemplate.Fret3); chord.Strings.Add(chordTemplate.Fret4); chord.Strings.Add(chordTemplate.Fret5); } List<eBeatWrapper> ebeatMeasures = new List<eBeatWrapper>(); eBeatWrapper currentMeasureBeat = null; foreach (var srcBeat in song.Ebeats) { if (srcBeat.Measure > 0) { currentMeasureBeat = new eBeatWrapper() { MeasureStartBeat = srcBeat, MeasureSubBeats = new List<SongEbeat>() }; ebeatMeasures.Add(currentMeasureBeat); } else { if (currentMeasureBeat == null) System.Diagnostics.Debug.WriteLine("Invalid ebeats in source file. Sub measure is before first measure!?"); else currentMeasureBeat.MeasureSubBeats.Add(srcBeat); } } var notesStack = new Stack<SongNoteChordWrapper>(allSounds.OrderByDescending(x => x.Time)); var currentNote = notesStack.Pop(); var nextNote = notesStack.Pop(); int prevMeasureId = 0; int i = 1; float prevMeasureDuration=0; foreach (var measure in ebeatMeasures) { var nextmeasure = i < ebeatMeasures.Count ? ebeatMeasures[i] : null; if (measure.MeasureStartBeat.Measure > prevMeasureId) { var measureDuration = nextmeasure !=null ? nextmeasure.MeasureStartBeat.Time - measure.MeasureStartBeat.Time : prevMeasureDuration; AddMasterBarToScore(score, measure.MeasureStartBeat.Time.ToString("n2"), measure); var voice = AddBarAndVoiceToTrack(track, isBass ? Clef.F4 : Clef.G2); bool firstNoteInBar = true; while (currentNote != null && (nextmeasure == null || currentNote.Time < nextmeasure.MeasureStartBeat.Time)) { if (currentNote.IsNote() && currentNote.AsNote().Bend != 0) System.Diagnostics.Debug.WriteLine("Bent detected. Bend value: {0}. Measure: {1}", currentNote.AsNote().Bend, measure.MeasureStartBeat.Measure); Duration duration = Duration.Quarter; if (firstNoteInBar && currentNote.Time > measure.MeasureStartBeat.Time) { var leadingSilenceTicks = Get64thsFromDuration(measure.MeasureStartBeat.Time, currentNote.Time, measureDuration); while (leadingSilenceTicks >= 1) { if (leadingSilenceTicks >= 32) { AddBeatAndSilenceToVoice(voice, Duration.Half); leadingSilenceTicks -= 32; } else if (leadingSilenceTicks >= 16) { AddBeatAndSilenceToVoice(voice, Duration.Quarter); leadingSilenceTicks -= 16; } else if (leadingSilenceTicks >= 8) { AddBeatAndSilenceToVoice(voice, Duration.Eighth); leadingSilenceTicks -= 8; } else if (leadingSilenceTicks >= 4) { AddBeatAndSilenceToVoice(voice, Duration.Sixteenth); leadingSilenceTicks -= 4; } else if (leadingSilenceTicks >= 2) { AddBeatAndSilenceToVoice(voice, Duration.ThirtySecond); leadingSilenceTicks -= 2; } else if (leadingSilenceTicks >= 1) { AddBeatAndSilenceToVoice(voice, Duration.SixtyFourth); leadingSilenceTicks -= 1; } } } Single durationTime = 0; if (nextNote != null) { duration = GetBeatDuration(currentNote.Time, nextNote.Time, measureDuration); durationTime = nextNote.Time - currentNote.Time; } else { durationTime = measureDuration; } if (currentNote.IsNote()) AddBeatAndNoteToVoice(voice, currentNote.AsNote(), duration, durationTime); else AddBeatWithChordToVoice(voice, currentNote.AsChord(), duration, durationTime); currentNote = nextNote; if (notesStack.Any()) nextNote = notesStack.Pop(); else nextNote = null; firstNoteInBar = false; } prevMeasureId = measure.MeasureStartBeat.Measure; prevMeasureDuration = measureDuration; } i++; } return score; }