private void AddEbeats(RsSong rsSong, Song zigSong) { var ebeats = new List <SongEbeat>(); var phrases = new List <SongPhraseIteration>(); var tempoTrack = zigSong.Tracks.Single(tr => "Tempo".Equals(tr.Name)); var tempoIndex = 0; var tsIndex = 0; var tempo = tempoTrack.Tempos[0]; var signature = tempoTrack.TimeSignatures[0]; float time = 0; int beat = 1; short measure = 1; float secondsPerQuarter = tempo.SecondsPerBar / signature.Numerator; var end = tempoTrack.MetaEvents.Single(ev => "EndOfTrack".Equals(ev.MetaType)).StartTime; while (time < end) { ebeats.Add(new SongEbeat { Measure = (beat == 1) ? measure : (short)-1, Time = time }); var delta = secondsPerQuarter * ((float)4 / signature.Denominator); time += delta; var changed = false; if (tsIndex + 1 != tempoTrack.TimeSignatures.Count && time + delta / 2 >= tempoTrack.TimeSignatures[tsIndex + 1].StartTime) { signature = tempoTrack.TimeSignatures[++tsIndex]; time = signature.StartTime; changed = true; } if (tempoIndex + 1 != tempoTrack.Tempos.Count && time + delta / 2 >= tempoTrack.Tempos[tempoIndex + 1].StartTime) { changed = true; tempo = tempoTrack.Tempos[++tempoIndex]; time = tempo.StartTime; secondsPerQuarter = tempo.SecondsPerBar / signature.Numerator; } if (changed || ++beat > signature.Numerator) { beat = 1; ++measure; } } rsSong.Ebeats = ebeats.ToArray(); var guitarTrack = GetTrack(zigSong); var firstNote = guitarTrack.Chords.Min(c => c.StartTime); var lastNote = guitarTrack.Chords.Max(c => c.EndTime); int measOffset = ebeats.Where(eb => eb.Measure != -1 && eb.Time <= firstNote).Last().Measure, phraseId = 0; measure = (short)measOffset; SongEbeat ebeat = null; //count in phrases.Add(new SongPhraseIteration { PhraseId = phraseId++, Time = 0 }); while (null != (ebeat = ebeats.FirstOrDefault(eb => eb.Measure == measure))) { if (ebeat.Time >= lastNote) { break; } phrases.Add(new SongPhraseIteration { PhraseId = phraseId++, Time = ebeat.Time }); measure += 12; } //end phrases.Add(new SongPhraseIteration { PhraseId = phraseId++, Time = lastNote + .001f }); rsSong.PhraseIterations = phrases.ToArray(); rsSong.Phrases = phrases.Select(it => new SongPhrase { MaxDifficulty = it.PhraseId == 0 || it.PhraseId == phrases.Count - 1 ? 0:3, Name = it.PhraseId == 0 ? "COUNT" : it.PhraseId == phrases.Count - 1 ? "END" : it.PhraseId.ToString() }).ToArray(); phrases.RemoveAt(0); phrases.RemoveAt(phrases.Count - 1); rsSong.Sections = phrases.Select(it => new SongSection { Name = "verse", Number = 1, StartTime = it.Time }).ToArray(); }
private static void AddEbeats(Song2014 rsSong, ZpeSong zigSong, string arrangement) { var ebeats = new List <SongEbeat>(); var phrases = new List <SongPhraseIteration2014>(); // var tempoTrack = zigSong.Tracks.Single(tr => "Tempo".Equals(tr.Name)); ZpeTrack tempoTrack = zigSong.Tracks[0]; var tempoIndex = 0; var tsIndex = 0; var tempo = tempoTrack.Tempos[0]; var signature = tempoTrack.TimeSignatures[0]; float time = 0; int beat = 1; short measure = 1; const int MU = 1000000; // float secondsPerQuarter = tempo.SecondsPerBar / signature.Numerator; float secondsPerQuarter = (float)tempo.RawTempo / MU; // var end = tempoTrack.MetaEvents.Single(ev => "EndOfTrack".Equals(ev.MetaType)).StartTime; Single end = zigSong.Length; while (time < end) { ebeats.Add(new SongEbeat { Measure = (beat == 1) ? measure : (short)-1, Time = (float)Math.Round(time, 3) }); // denominator already converted by ZPE var delta = secondsPerQuarter * ((float)4 / signature.Denominator); time += delta; var changed = false; if (tsIndex + 1 != tempoTrack.TimeSignatures.Count && time + delta / 2 >= tempoTrack.TimeSignatures[tsIndex + 1].StartTime) { signature = tempoTrack.TimeSignatures[++tsIndex]; time = signature.StartTime; changed = true; } if (tempoIndex + 1 != tempoTrack.Tempos.Count && time + delta / 2 >= tempoTrack.Tempos[tempoIndex + 1].StartTime) { changed = true; tempo = tempoTrack.Tempos[++tempoIndex]; time = tempo.StartTime; // secondsPerQuarter = tempo.SecondsPerBar / signature.Numerator; secondsPerQuarter = (float)tempo.RawTempo / MU; } if (changed || ++beat > signature.Numerator) { beat = 1; ++measure; } // Console.WriteLine("Getting Ebeats for bar: " + measure); } rsSong.Ebeats = ebeats.ToArray(); var guitarTrack = zigSong.Tracks.SingleOrDefault(tr => arrangement.Equals(tr.Name)); var difficultyCount = guitarTrack.Chords.GroupBy(chord => chord.Difficulty).Count(); var firstNote = (float)Math.Round(guitarTrack.Chords.Min(c => c.StartTime), 3); var lastNote = (float)Math.Round(guitarTrack.Chords.Max(c => c.EndTime), 3); int measOffset = ebeats.Where(eb => eb.Measure != -1 && eb.Time <= firstNote).Last().Measure, phraseId = 0; measure = (short)measOffset; SongEbeat ebeat = null; //count in phrases.Add(new SongPhraseIteration2014 { PhraseId = phraseId++, Time = 0 }); while (null != (ebeat = ebeats.FirstOrDefault(eb => eb.Measure == measure))) { if (ebeat.Time >= lastNote) { break; } phrases.Add(new SongPhraseIteration2014 { PhraseId = phraseId++, Time = ebeat.Time }); measure += 12; } //end phrases.Add(new SongPhraseIteration2014 { PhraseId = phraseId++, Time = lastNote + .001f }); // phrases.Add(new SongPhraseIteration2014 { PhraseId = phraseId++, Time = end + .001f }); rsSong.PhraseIterations = phrases.ToArray(); rsSong.Phrases = phrases.Select(it => new SongPhrase { MaxDifficulty = it.PhraseId == 0 || it.PhraseId == phrases.Count - 1 ? 0 : difficultyCount - 1, Name = it.PhraseId == 0 ? "COUNT" : it.PhraseId == phrases.Count - 1 ? "END" : it.PhraseId.ToString() }).ToArray(); phrases.RemoveAt(0); phrases.RemoveAt(phrases.Count - 1); rsSong.Sections = phrases.Select(it => new SongSection { Name = "verse", Number = 1, StartTime = it.Time }).ToArray(); }