public void buttonSet108Events(object sender, EventArgs e)
 {
     ExecAndRestoreTrackDifficulty(delegate()
     {
         var genConfig = new GenDiffConfig(SelectedSong,
                     true, checkGenDiffCopyGuitarToBass.Checked,
                     checkBoxInitSelectedDifficultyOnly.Checked,
                     checkBoxInitSelectedTrackOnly.Checked,
                     Utility.HandPositionGenerationEnabled);
         if (genConfig.Generate108Events)
         {
             if (!Set108Events(genConfig))
             {
                 MessageBox.Show("Failed");
             }
             Refresh108EventList();
         }
         if (Utility.ClearChordNames)
         {
             EditorPro.GuitarTrack.ClearChordNames();
         }
         else
         {
             EditorPro.GuitarTrack.CreateChordNames(GuitarTuning, BassTuning);
         }
     });
 }
        public bool Set108Events(GenDiffConfig config)
        {
            bool ret = false;

            if (!EditorPro.IsLoaded)
                return ret;

            if (!config.Generate108Events)
                return true;

            try
            {
                var tracks = new List<Track>();
                if (config.SelectedTrackOnly)
                {
                    if (EditorPro.SelectedTrack != null)
                    {
                        tracks.Add(EditorPro.SelectedTrack);
                    }
                }
                else
                {
                    tracks.AddRange(EditorPro.GetTracks(GuitarTrack.TrackNames6));
                }
                foreach (var t in tracks)
                {
                    if (EditorPro.SetTrack(t, GuitarDifficulty.Expert))
                    {
                        EditorPro.GuitarTrack.CreateHandPositionEvents();
                        if (Utility.ClearChordNames)
                        {
                            EditorPro.GuitarTrack.ClearChordNames();
                        }
                        else
                        {
                            EditorPro.GuitarTrack.CreateChordNames(GuitarTuning, BassTuning);
                        }
                    }
                }
                ret = true;
            }
            catch { ret = false; }

            return ret;
        }
        public bool GenerateCompletedDifficulties()
        {
            progressBarGenCompletedDifficulty.Value = 0;

            var songs = SongList.GetBatchSongList(checkBoxMultiSelectionSongList.Checked);

            progressBarGenCompletedDifficulty.Maximum = songs.Count();

            foreach (var item in songs.ToList())
            {
                Application.DoEvents();

                WriteBatchResult("Generating Difficulties: " + item.ToString());
                if (buttonSongLibCancel.Enabled == false)
                {
                    WriteBatchResult("User Cancelled");
                    return false;
                }
                try
                {
                    progressBarGenCompletedDifficulty.Value = songs.IndexOf(item);
                }
                catch { }

                if ((checkBoxBatchProcessIncomplete.Checked == false && !item.IsComplete) ||
                    (checkBoxBatchProcessFinalized.Checked == false && item.IsFinalized))
                {
                    WriteBatchResult("Skipping: " + item.ToString());
                }
                else
                {
                    WriteBatchResult("Processing: " + item.ToString());
                    try
                    {
                        if (!OpenSongCacheItem(item))
                        {
                            WriteBatchResult("Unable to open: " + item.ToString());
                            continue;
                        }

                        if (checkBoxSkipGenIfEasyNotes.Checked &&
                            hasEasyMedHardEvent6())
                        {
                            WriteBatchResult("Skipping (already calculated): " + item.ToString());
                        }
                        else
                        {
                            var config = new GenDiffConfig(item,
                                true,
                                checkBoxSongLibCopyGuitar.Checked,
                                false,
                                false,
                                Utility.HandPositionGenerationEnabled);

                            if (!GenerateDifficulties(true, config))
                            {
                                WriteBatchResult("Gen Difficulty Failed: " + item.ToString());
                                continue;
                            }

                            if (!SaveSongCacheItem(item, true))
                            {
                                WriteBatchResult("Failed Saving: " + item.ToString());
                                continue;
                            }
                        }

                    }
                    catch
                    {
                        WriteBatchResult("Error processing: " + item.ToString());
                    }
                }
            }

            WriteBatchResult("Batch Generate Difficulties Complete");

            return true;
        }
        private bool GenerateDifficulties(bool isBatch, GenDiffConfig config)
        {
            var ret = false;

            if (!EditorG5.IsLoaded || !EditorPro.IsLoaded)
                return false;
            ExecAndRestoreTrackDifficulty(() =>
                {
                    try
                    {
                        var g5Track = EditorG5.GuitarTrack;
                        var proTrack = EditorPro.GuitarTrack;

                        EditorPro.BackupSequence();

                        bool genGuitar = false;
                        bool genBass = false;

                        bool selectedTrackGuitar = false;
                        bool selectedTrackBass = false;

                        if (config.SelectedTrackOnly)
                        {
                            if (proTrack.Name.IsGuitarTrackName6())
                            {
                                genGuitar = true;
                                selectedTrackGuitar = true;
                            }
                            else if (proTrack.Name.IsBassTrackName6())
                            {
                                genBass = true;
                                selectedTrackBass = true;
                            }
                        }
                        else
                        {
                            genGuitar = true;
                            genBass = config.CopyGuitarToBass == false;
                        }

                        var guitarDifficulties = GuitarDifficulty.None;
                        var bassDifficulties = GuitarDifficulty.None;

                        if (config.SelectedDifficultyOnly)
                        {
                            guitarDifficulties = EditorPro.CurrentDifficulty;
                            bassDifficulties = EditorPro.CurrentDifficulty;
                        }
                        else
                        {
                            if (config.ProcessingSong)
                            {
                                if (genGuitar)
                                {
                                    if (config.EnableProGuitarHard)
                                        guitarDifficulties |= GuitarDifficulty.Hard;
                                    if (config.EnableProGuitarMedium)
                                        guitarDifficulties |= GuitarDifficulty.Medium;
                                    if (config.EnableProGuitarEasy)
                                        guitarDifficulties |= GuitarDifficulty.Easy;
                                }
                                if (genBass)
                                {
                                    if (config.EnableProBassHard)
                                        bassDifficulties |= GuitarDifficulty.Hard;
                                    if (config.EnableProBassMedium)
                                        bassDifficulties |= GuitarDifficulty.Medium;
                                    if (config.EnableProBassEasy)
                                        bassDifficulties |= GuitarDifficulty.Easy;
                                }
                            }
                            else
                            {
                                if (genGuitar)
                                {
                                    guitarDifficulties = GuitarDifficulty.Hard | GuitarDifficulty.Medium | GuitarDifficulty.Easy;
                                }
                                if (genBass)
                                {
                                    bassDifficulties = GuitarDifficulty.Hard | GuitarDifficulty.Medium | GuitarDifficulty.Easy;
                                }
                            }
                        }

                        if (config.SelectedTrackOnly)
                        {
                            if (selectedTrackGuitar && genGuitar)
                            {
                                if (!guitarDifficulties.IsUnknownOrNone())
                                {
                                    GenerateDifficultiesForTrack(EditorG5.GuitarTrack.GetTrack(), EditorPro.GuitarTrack.GetTrack(), guitarDifficulties, config);
                                }
                            }
                            else if (selectedTrackBass && genBass)
                            {
                                if (!bassDifficulties.IsUnknownOrNone())
                                {
                                    GenerateDifficultiesForTrack(EditorG5.GuitarTrack.GetTrack(), EditorPro.GuitarTrack.GetTrack(), bassDifficulties, config);
                                }
                            }
                        }
                        else
                        {
                            if (genGuitar)
                            {
                                var gt5 = EditorG5.GetGuitar5MidiTrack();
                                var gt6 = EditorPro.GetTrackGuitar17();

                                if (gt5 != null && gt6 != null)
                                {
                                    GenerateDifficultiesForTrack(gt5, gt6, guitarDifficulties, config);
                                }

                                gt6 = EditorPro.GetTrackGuitar22();
                                if (gt5 != null && gt6 != null)
                                {
                                    GenerateDifficultiesForTrack(gt5, gt6, guitarDifficulties, config);
                                }
                            }

                            if (config.CopyGuitarToBass)
                            {
                                if (EditorPro.GetTrackGuitar17() != null)
                                {
                                    CopyTrack(GuitarTrack.GuitarTrackName17, GuitarTrack.BassTrackName17);
                                }
                                if (EditorPro.GetTrackGuitar22() != null)
                                {
                                    CopyTrack(GuitarTrack.GuitarTrackName22, GuitarTrack.BassTrackName22);
                                }
                            }
                            else if (genBass)
                            {
                                var gt5 = EditorG5.GetGuitar5BassMidiTrack();

                                var gt6 = EditorPro.GetTrackBass17();
                                if (gt5 != null && gt6 != null)
                                {
                                    GenerateDifficultiesForTrack(gt5, gt6, bassDifficulties, config);
                                }

                                gt6 = EditorPro.GetTrackBass22();
                                if (gt5 != null && gt6 != null)
                                {
                                    GenerateDifficultiesForTrack(gt5, gt6, bassDifficulties, config);
                                }
                            }
                        }

                        if (config.Generate108Events)
                        {
                            Set108Events(config);
                        }

                        ret = true;
                    }
                    catch { ret = false; }
                });
            return ret;
        }
        private void GenDiffNotes(
            IEnumerable<GuitarChord> expertChords,
            IEnumerable<GuitarChord> sourceChords,
            IEnumerable<GuitarArpeggio> sourceArpeggio,
            GuitarDifficulty targetDifficulty, GenDiffConfig config)
        {
            var chords = sourceChords.Where(x => x.IsPureArpeggioHelper == false).ToList();
            CreateChords(expertChords, targetDifficulty, chords);

            if (targetDifficulty == GuitarDifficulty.Hard)
            {
                var owner = EditorPro.Messages;
                foreach (var arp in sourceArpeggio.Where(x => owner.Chords.AnyBetweenTick(x.TickPair)))
                {
                    GuitarArpeggio.CreateArpeggio(owner, arp.TickPair, targetDifficulty);
                }
            }
        }
        private void GenerateDifficultiesForTrack(
            Track trackG5,
            Track trackG6,
            GuitarDifficulty guitarDifficulties,
            GenDiffConfig config)
        {
            if (guitarDifficulties.IsUnknownOrNone())
                return;

            var diffs = guitarDifficulties.GetDifficulties().Where(x => x.IsEasyMediumHard());

            EditorPro.SetTrack(trackG6, GuitarDifficulty.Expert);
            EditorG5.SetTrack(trackG5, GuitarDifficulty.Expert);

            var expertChords = EditorPro.Messages.Chords.ToList();

            foreach (var diff in diffs)
            {
                var sourceDifficulty =
                    diff == GuitarDifficulty.Easy ? GuitarDifficulty.Medium :
                    diff == GuitarDifficulty.Medium ? GuitarDifficulty.Hard :
                    GuitarDifficulty.Expert;

                EditorPro.CurrentDifficulty = sourceDifficulty;

                var sourceChords = EditorPro.Messages.Chords.ToList();
                var sourceArpeggio = EditorPro.Messages.Arpeggios.ToList();

                EditorPro.CurrentDifficulty = diff;
                EditorG5.CurrentDifficulty = diff;

                EditorPro.Messages.Chords.ToList().ForEach(x => x.DeleteAll());

                EditorPro.Messages.Arpeggios.Where(x => x.Difficulty == diff).ToList().ForEach(x => x.DeleteAll());

                GenDiffNotes(expertChords, sourceChords, sourceArpeggio, diff, config);

            }
        }