public IEnumerable <GuitarMessage> GetByDifficulty(GuitarDifficulty diff)
        {
            var ret = new List <GuitarMessage>();

            foreach (var messageType in GetAllMessageTypes())
            {
                switch (messageType)
                {
                case GuitarMessageType.GuitarHandPosition:
                    ret.AddRange(HandPositions.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarChordName:
                    ret.AddRange(ChordNames.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarTextEvent:
                    ret.AddRange(TextEvents.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarTrainer:
                    ret.AddRange(Trainers.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarChordStrum:
                    ret.AddRange(ChordStrums.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarChord:
                    ret.AddRange(Chords.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarNote:
                    ret.AddRange(Notes.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarPowerup:
                    ret.AddRange(Powerups.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarSolo:
                    ret.AddRange(Solos.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarTempo:
                    ret.AddRange(Tempos.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarTimeSignature:
                    ret.AddRange(TimeSignatures.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarArpeggio:
                    ret.AddRange(Arpeggios.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarBigRockEnding:
                    ret.AddRange(BigRockEndings.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarBigRockEndingSubMessage:

                    break;

                case GuitarMessageType.GuitarSingleStringTremelo:
                    ret.AddRange(SingleStringTremelos.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarMultiStringTremelo:
                    ret.AddRange(MultiStringTremelos.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarSlide:
                    ret.AddRange(Slides.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                case GuitarMessageType.GuitarHammeron:
                    ret.AddRange(Hammerons.Where(x => diff.HasFlag(x.Difficulty)));
                    break;

                default:
                    ("unknown message: " + messageType).OutputDebug();
                    break;
                }
            }

            return(ret);
        }