static List <GenericToken <MusicToken> > GetChordTok(GenericToken <MusicToken> chord, ref int key, int durms, ref StringBuilder song)
        {
            if (!chord.isValid || ((chord.type != MusicToken.Chord) && (chord.type != MusicToken.ChordScale)))
            {
                return(new List <GenericToken <MusicToken> >());
            }
            ChordTokens ct = ChordTokens.None;

            if (Enum.TryParse <ChordTokens>(chord.data, true, out ct))
            {
                var gtc = new GenericToken <ChordTokens>(ct, ct.ToString());
                return(GetChordToks(gtc, ref key, durms, ref song));
            }

            throw new Exception("Unknown chord: " + chord.ToString() + ", please implement this chord.");
        }
        /// <summary>
        /// convert chord tokens to musictokens
        /// </summary>
        /// <param name="chord"></param>
        /// <param name="key"></param>
        /// <param name="durms"></param>
        /// <param name="song"></param>
        /// <returns></returns>
        static List <GenericToken <MusicToken> > MusicChord2MusicNotes(GenericToken <MusicToken> tok, ref int key, int durms, ref StringBuilder song)
        {
            ChordTokens chordtoken = ChordTokens.None;

            if (!tok.isValid || ((tok.type != MusicToken.Chord) && (tok.type != MusicToken.ChordScale)))
            {
                return(new List <GenericToken <MusicToken> >());
            }
            if (!Enum.TryParse <ChordTokens>(tok.data, true, out chordtoken))
            {
                return(new List <GenericToken <MusicToken> >());
            }

            string[] notes = new string[0];
            switch (chordtoken)
            {
            case ChordTokens.A: notes = new string[] { "a", "cs", "e" }; break;

            case ChordTokens.Am: notes = new string[] { "a", "c", "e" }; break;

            case ChordTokens.Af: notes = new string[] { "af", "c", "ef" }; break;

            case ChordTokens.B: notes = new string[] { "b", "ds", "fs" }; break;

            case ChordTokens.Bm: notes = new string[] { "b", "d", "fs" }; break;

            case ChordTokens.Bf: notes = new string[] { "bf", "d", "f" }; break;

            case ChordTokens.C: notes = new string[] { "c", "e", "g" }; break;

            case ChordTokens.Cm: notes = new string[] { "c", "ef", "g" }; break;

            case ChordTokens.Cf: notes = new string[] { "c", "e", "gf" }; break;

            case ChordTokens.D: notes = new string[] { "d", "fs", "a" }; break;

            case ChordTokens.Dm: notes = new string[] { "d", "f", "a" }; break;

            case ChordTokens.Df: notes = new string[] { "df", "f", "af" }; break;

            case ChordTokens.E: notes = new string[] { "e", "gs", "b" }; break;

            case ChordTokens.Em: notes = new string[] { "e", "g", "b" }; break;

            case ChordTokens.Ef: notes = new string[] { "ef", "g", "bf" }; break;

            case ChordTokens.F: notes = new string[] { "f", "a", "c" }; break;

            case ChordTokens.Fm: notes = new string[] { "f", "af", "c" }; break;

            case ChordTokens.Ff: notes = new string[] { "f", "af", "c" }; break;

            case ChordTokens.G: notes = new string[] { "g", "b", "d" }; break;

            case ChordTokens.Gm: notes = new string[] { "g", "bf", "d" }; break;

            case ChordTokens.Gf: notes = new string[] { "gf", "bf", "df" }; break;
            }
            List <GenericToken <MusicToken> > toknotes = new List <GenericToken <MusicToken> >();

            foreach (var note in notes)
            {
                toknotes.Add(new GenericToken <MusicToken>(MusicToken.Note, note));
            }
            return(toknotes);
        }