Example #1
0
        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();
        }