home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume40 / chord / part03 / grid.c < prev    next >
C/C++ Source or Header  |  1993-11-06  |  41KB  |  953 lines

  1. static char copyright[] = "Copyright 1991-1993 by Martin Leclerc & Mario Dorion";
  2.  
  3. #include "chord.h"
  4.  
  5. struct chord_struct chordtab[MAX_CHORD];
  6. int    nb_chord = 0;
  7. int    first_ptr = 0;
  8.  
  9. /* char    known_chords[256][CHORD_NAME_SZ]; */
  10. struct kcs {
  11.     char    chord_name[CHORD_NAME_SZ];
  12.     int    displ;
  13.     int    s1,s2,s3,s4,s5,s6;
  14.     int    origin;
  15.     int    difficult;
  16. } known_chords[MAX_CHORD];
  17.  
  18.  
  19. int    nb_known_chord = 0;
  20.  
  21. extern int hpos,vpos;
  22. extern int grid_size, no_easy_grids, n_pages;
  23. extern int first_time_in_chordrc;
  24. extern char *mesg;
  25. extern int in_chordrc;
  26. extern int sort_type;
  27.  
  28. /*--------------------------------------------------------------------------------*/
  29. void do_init_grid_ps()
  30. {
  31.     printf("%% routines for the drawing of the chords\n");
  32.     printf("/grid { \n");
  33.     printf("    gsave currentpoint\n");
  34.     printf("    6 { 0 cagesizeX rlineto incr cagesize neg incr add rmoveto } repeat\n");
  35.     printf("    moveto\n");
  36.     printf("    5 { cagesize 0 rlineto 0 cagesize sub incr rmoveto } repeat\n");
  37.     printf("    1 setlinewidth stroke grestore\n");
  38.     printf("    gsave\n");
  39.     printf("    0 cagesizeX rmoveto cagesize 0 rlineto\n");
  40.     printf("    cagesize 30 div setlinewidth stroke\n");
  41.     printf("    grestore    \n");
  42.     printf("} def\n");
  43.     printf("\n");
  44.     printf("/dot {\n");
  45.     printf("    gsave\n");
  46.     printf("    /fret exch def /str exch def\n");
  47.     printf("    /x 5  fret abs sub incr mul half-incr sub def\n");
  48.     printf("    /y 6 str sub incr mul def\n");
  49.     printf("    y x rmoveto\n");
  50.     printf("    0 setgray\n");
  51.     printf("    fret -1 eq\n");
  52.     printf("      {\n");
  53.     printf("      0 incr rmoveto\n");
  54.     printf("      check neg  check neg rmoveto\n");
  55.     printf("      check check rlineto check check rlineto\n");
  56.     printf("      check neg check neg rmoveto check neg check rmoveto\n");
  57.     printf("        check check neg rlineto check check neg rlineto\n");
  58.     printf("      cagesize 50 div setlinewidth stroke\n");
  59.     printf("      }\n");
  60.     printf("      {  fret 0 ne\n");
  61.     printf("        { currentpoint dot-size 0 360 arc fill}\n");
  62.     printf("        { currentpoint\n");
  63.     printf("          check 0 360 newpath arc\n");
  64.     printf("          cagesize 50 div setlinewidth\n");
  65.     printf("        }\n");
  66.     printf("        ifelse \n");
  67.     printf("        stroke \n");
  68.     printf("      }\n");
  69.     printf("      ifelse\n");
  70.     printf("    grestore\n");
  71.     printf("} def    \n");
  72.     printf("\n");
  73.     printf("/dots {\n");
  74.     printf("    grid\n");
  75.     printf("    /origin exch def\n");
  76.     printf("    /fret-displ exch def\n");
  77.     printf("      1 1 6\n");
  78.     printf("      {\n");
  79.     printf("        /str exch def\n");
  80.     printf("        /fret exch def\n");
  81.     printf("        fret %d ne {str fret dot} if\n", FRET_NONE);
  82.     printf("      } for\n");
  83.     printf("\n");
  84.     printf("    fret-displ 1 ne\n");
  85.     printf("    {\n");
  86.     printf("          gsave displ-font setfont\n");
  87. /*    printf("          0 cagesize 3 div sub cagesizeX incr sub rmoveto\n"); */
  88.     printf("          0 cagesize fret-displ 10 ge {1.75} {3} ifelse div sub\n");
  89.     printf("      cagesizeX incr sub rmoveto\n");
  90.     printf("          /char 6 string def fret-displ char cvs show grestore \n");
  91.     printf("    } if\n");
  92.     printf("\n");
  93.     printf("    /chord-name exch def\n");
  94.     printf("    gsave displ-font setfont\n");
  95.     printf("    0 cagesizeX cagesizeX 15 div add dot-size 3 mul add rmoveto\n");
  96.     printf("    chord-name stringwidth pop 2 div cagesize 2 div exch sub 0 rmoveto\n");
  97.     printf("    chord-name show\n");
  98.     printf("    0 cagesize 10 div rmoveto\n");
  99.     printf("    origin 1 eq { (*) show} if\n");    
  100.     printf("    origin 2 eq { (**) show} if\n");    
  101.     printf("    chord-font setfont grestore\n");
  102.     printf("} def\n");
  103.     printf("\n");
  104.     printf("/cagesize %d def\n",grid_size);
  105.     printf("/incr cagesize 5 div def\n");
  106.     printf("/cagesizeX incr 4 mul def\n");
  107.     printf("/half-incr incr 2 div def\n");
  108.     printf("/dot-size cagesize 15 div def\n");
  109.     printf("/check cagesize 20 div def\n");
  110.     printf("\n");
  111.     printf("/chord-font /Times-Roman findfont cagesize 5 div scalefont def\n");
  112.     printf("/displ-font /Times-Roman findfont cagesize 3 div scalefont def\n");
  113.     printf("%% end of the routines for the drawing of the chords\n");
  114.     printf("\n");
  115. }
  116.  
  117. /*--------------------------------------------------------------------------------*/
  118.  
  119. int add_to_chordtab(chord)
  120. char *chord;
  121. {
  122.     int i, prev_i;
  123.     int n;
  124.     char chord1[CHORD_NAME_SZ],chord2[CHORD_NAME_SZ];
  125.  
  126.       /* printf(mesg, "attempting to add (%s)\n",chord);
  127.     debug (mesg); */
  128.  
  129.     i= first_ptr; prev_i = -1;
  130.     while (TRUE)
  131.     {
  132.         if (nb_chord > 0 && i != -1) {
  133.             
  134.             strcpy(chord1, chord);
  135.             strcpy(chord2, chordtab[i].chord_name);
  136.             n= chordcompare(chord1, chord2);
  137.             if (n == 0)
  138.                 return(i);
  139.             else if (n>0) {
  140.                 prev_i= i;
  141.                 i= chordtab[i].next_ptr;
  142.                 continue;
  143.                 }
  144.             }
  145.          /* sprintf(mesg, "inserting between %d and %d\n",prev_i,i); 
  146.         debug(mesg); */
  147.  
  148.         strcpy(chordtab[nb_chord].chord_name,      chord);
  149.         if (nb_chord != 0)
  150.             chordtab[nb_chord].next_ptr= i;
  151.         else
  152.             chordtab[nb_chord].next_ptr = -1;
  153.         if (prev_i != -1)
  154.             chordtab[prev_i].next_ptr = nb_chord;
  155.         if (i== first_ptr)
  156.             first_ptr= nb_chord;
  157.                 if (nb_chord >= MAX_CHORD-1) {
  158.             fprintf(stderr, "too many chords, bumping %s\n",
  159.             chordtab[nb_chord-1].chord_name);
  160.             return(nb_chord - 1);
  161.         }
  162.         nb_chord++;
  163.  
  164.         return(nb_chord - 1);
  165.     }
  166. }
  167.  
  168. /*--------------------------------------------------------------------------------*/
  169. /* ChordCompare - provided by Leo Bicknell (ab147@freenet.acsu.buffalo.edu) */
  170. int chordcompare(chord1, chord2)
  171. char *chord1, *chord2;
  172. {
  173.     chord1[0]=tolower(chord1[0]);
  174.     chord2[0]=tolower(chord2[0]);
  175.  
  176.     if (chord1[0] != chord2[0])
  177.     {
  178.         return(chord1[0] - chord2[0]);
  179.     }
  180.     else
  181.     {
  182.         switch (chord1[1]) {
  183.             case 'b':
  184.                 switch (chord2[1]) {
  185.                     case 'b':
  186.                         return (chordcompare(&chord1[1], &chord2[1]));
  187.                     case '#':
  188.                         return (-1);
  189.                     case 'm':
  190.                         return (-1);
  191.                     default:
  192.                         return (-1);
  193.                     }
  194.             case '#':
  195.                 switch (chord2[1]) {
  196.                     case 'b':
  197.                         return (1);
  198.                     case '#':
  199.                         return (chordcompare(&chord1[1], &chord2[1]));
  200.                     case 'm':
  201.                         return (1);
  202.                     default:
  203.                         return (1);
  204.                     }
  205.             case 'm':
  206.                 switch (chord2[1]) {
  207.                     case 'b':
  208.                         return (1);
  209.                     case '#':
  210.                         return (-1);
  211.                     case 'm':
  212.                         return (chordcompare(&chord1[1], &chord2[1]));
  213.                     default:
  214.                         return (1);
  215.                     }
  216.             default:
  217.                 switch(chord2[1]) {
  218.                     case 'b':
  219.                         return (1);
  220.                     case '#':
  221.                         return (-1);
  222.                     case 'm':
  223.                         return (-1);
  224.                     default:
  225.                         return (strcmp(chord1, chord2));
  226.                     }
  227.             }
  228.     }
  229. }
  230.  
  231.  
  232. /*--------------------------------------------------------------------------------*/
  233. void moveto(new_hpos,new_vpos)
  234. int    new_hpos,new_vpos;
  235. {
  236.     if (new_hpos + grid_size + L_MARGIN > WIDTH)
  237.         {
  238.         new_hpos = L_MARGIN;
  239.         new_vpos -= 2*grid_size;
  240.         }
  241.  
  242.     if (new_vpos < BOTTOM)
  243.         {
  244.         do_end_of_page(FALSE);
  245.         do_start_of_page();
  246.         new_vpos= TOP-2*grid_size;
  247.         }
  248.  
  249.     printf ("%d %d moveto\n", new_hpos, new_vpos);
  250.     hpos= new_hpos;vpos = new_vpos;
  251. }
  252.  
  253. /*--------------------------------------------------------------------------------*/
  254. void draw_chords()
  255.     {
  256.     int ptr;
  257.     int idx;
  258.  
  259.     moveto(WIDTH - grid_size - grid_size - L_MARGIN, vpos); 
  260.  
  261.     ptr= first_ptr;
  262.     if (nb_chord != 0)
  263.         {
  264.         while (ptr != -1) 
  265.             {
  266.             if ((idx= is_chord_known(chordtab[ptr].chord_name))== -1)
  267.                 {
  268.                 moveto(hpos + 2 * grid_size, vpos);
  269.                 sprintf (mesg, "chord \'%s\' has never been defined",
  270.                     chordtab[ptr].chord_name);
  271.                 error(mesg);
  272.     
  273.                 printf("(%s) -2 -2 -2 -2 -2 -2 1 0 dots\n",
  274.                      chordtab[ptr].chord_name);
  275.                 }
  276.             else if (!no_easy_grids || no_easy_grids && known_chords[idx].difficult) 
  277.                 {
  278.                 moveto(hpos + 2 * grid_size, vpos);
  279.                 printf("(");
  280.                 ps_puts(known_chords[idx].chord_name);
  281.                 printf(") %d %d %d %d %d %d %d %d dots\n",
  282.                     known_chords[idx].s1,
  283.                     known_chords[idx].s2,
  284.                     known_chords[idx].s3,
  285.                     known_chords[idx].s4,
  286.                     known_chords[idx].s5,
  287.                     known_chords[idx].s6,
  288.                     known_chords[idx].displ,
  289.                     known_chords[idx].origin);
  290.                 }
  291.             ptr = chordtab[ptr].next_ptr;
  292.             }
  293.         }
  294.     }
  295.  
  296. /*--------------------------------------------------------------------------------*/
  297. learn_chord(chord, s1, s2, s3, s4, s5, s6, displ, origin, difficult)
  298. char     *chord;
  299. int    displ;
  300. int    s1,s2,s3,s4,s5,s6;
  301. int    origin, difficult;
  302. {
  303.         int i,not_found;
  304.  
  305.         not_found= TRUE;
  306.         for (i= 0;i < nb_known_chord && not_found; i++) {
  307.                 not_found= strcmp(chord,known_chords[i].chord_name);
  308.         };
  309.  
  310.         if (not_found) {
  311.                 if (nb_known_chord >= MAX_CHORD-1) {
  312.             fprintf(stderr, "too many chords, can't learn %s\n", chord);
  313.             return(0);
  314.         }
  315.                 nb_known_chord++;
  316.         } else {
  317.         i--;
  318.         } 
  319.  
  320.     if (displ == 0) displ = 1;
  321.         strcpy(known_chords[i].chord_name,chord);
  322.     known_chords[i].displ= displ;
  323.     known_chords[i].s1= s1;
  324.     known_chords[i].s2= s2;
  325.     known_chords[i].s3= s3;
  326.     known_chords[i].s4= s4;
  327.     known_chords[i].s5= s5;
  328.     known_chords[i].s6= s6;
  329.     known_chords[i].origin= origin;
  330.     known_chords[i].difficult= difficult;
  331.     
  332.     return(0);
  333. }
  334.  
  335. /*--------------------------------------------------------------------------------*/
  336. int check_old_define_syntax(temp_str, chord_name)
  337. char     *temp_str;
  338. char    *chord_name;
  339. {
  340.     char     *str;
  341.     int     n;
  342.     int     ok = TRUE;
  343.     int    fret_displ;
  344.     int    dot_array[6];
  345.     int     i;
  346.     char     error_str[MAXLINE];
  347.  
  348.     fret_displ=atoi(temp_str);
  349.  
  350.     for (n=0; n<=5; n++) {
  351.         str=toupper_str(strtok(NULL, DELIM_STR));
  352.         if (!strcmp(str,FRET_NONE_STR) || !strcmp(str, FRET_X_STR))
  353.             dot_array[n]=FRET_X;
  354.         else
  355.             dot_array[n]=atoi(str);
  356.  
  357.         ok = ok && (str);
  358.         }
  359.  
  360.     if (strtok(NULL, DELIM_STR))
  361.         ok=FALSE;
  362.  
  363.     if (ok ) {
  364.         if (!in_chordrc || first_time_in_chordrc) {
  365.             sprintf(error_str,
  366.                 "definition of chord '%s' uses obsolete format",
  367.                 chord_name);
  368.             error(error_str);
  369.             fprintf(stderr,
  370.                 "   Please edit your input file and replace its %s",
  371.                 "definition by the following:\n");
  372.             fprintf(stderr, "   {define: %s base-fret %d frets ",
  373.                chord_name, fret_displ);
  374.             for (i=5; i>=0; i--)
  375.                 if (dot_array[i] < 0)
  376.                     fprintf (stderr, "x ");
  377.                 else
  378.                     fprintf (stderr, "%d ", dot_array[i]);
  379.             fprintf (stderr, "}\n\n");
  380.             }
  381.  
  382.  
  383.         learn_chord(chord_name,
  384.             dot_array[5],dot_array[4],dot_array[3],
  385.             dot_array[2],dot_array[1],dot_array[0],
  386.             fret_displ, in_chordrc ? CHORD_DEFINED : CHORD_IN_CHORDRC,
  387.             CHORD_HARD);
  388.         }
  389.  
  390.     return(ok);
  391. }
  392.     
  393.  
  394. /*--------------------------------------------------------------------------------*/
  395. int do_define_chord()
  396. {
  397.     int dot_array[6];
  398.     char *chord_name;
  399.     char *temp_str;
  400.     int fret_displ;
  401.     int n;
  402.     int hardtoplay = 0;
  403.  
  404.     for ( n= 0; n<6; n++)
  405.         dot_array[n] = 0;
  406.  
  407.     chord_name= strtok(NULL, DELIM_STR);
  408.     if (chord_name== NULL) {
  409.         error("syntax error in chord definition: no chord name");
  410.         return(0);
  411.     }
  412.  
  413.     temp_str= tolower_str(strtok(NULL, DELIM_STR));
  414.     if (strcmp(temp_str, BASE_FRET_STR)) {
  415.         if (!check_old_define_syntax(temp_str,chord_name)) 
  416.              error("syntax error in chord definition: keyword <base-fret> missing");
  417.         return(0); 
  418.     }
  419.  
  420.     temp_str= strtok(NULL, DELIM_STR);
  421.     if (temp_str== NULL) {
  422.         error("syntax error in chord definition: no base fret value");
  423.         return(0);
  424.     }
  425.     fret_displ= atoi(temp_str);
  426.     if (fret_displ == 0) fret_displ = 1;
  427.  
  428.     temp_str= tolower_str(strtok(NULL, DELIM_STR));
  429.     if (strcmp(temp_str, FRETS_STR)) {
  430.         error("syntax error in chord definition: keyword <frets> missing");
  431.         return(0);
  432.     }
  433.  
  434.     for (n= 0; n< 6; n++)
  435.         {
  436.         strcpy(temp_str, toupper_str(strtok(NULL, DELIM_STR)));
  437.  
  438.         if (temp_str!= NULL) {
  439.             if (!strcmp(temp_str, FRET_NONE_STR) ||
  440.                 !strcmp(temp_str, FRET_X_STR))
  441.                 dot_array[n]= FRET_X;
  442.             else {
  443.                 dot_array[n]= atoi(temp_str);
  444.                 if (dot_array[n] < 0) dot_array[n]= FRET_X;
  445.             }
  446.             hardtoplay= hardtoplay||(dot_array[n]>LONG_FINGERS);
  447.             }
  448.         else 
  449.             {
  450.             error("syntax error in chord definition : too few arguments");
  451.             return(0);
  452.             }
  453.         }
  454.  
  455.     temp_str= strtok(NULL, DELIM_STR);
  456.     if (temp_str!=NULL) {
  457.         error("syntax error in chord definition: too many arguments");
  458.         return(0);
  459.     }
  460.  
  461.     /* CHORD is OK */
  462.     if (hardtoplay)
  463.         {
  464.         sprintf(mesg,
  465.           "Warning: You'll need long fingers to play \"%s\" this way!", chord_name);
  466.         error (mesg);
  467.         }
  468.  
  469.     learn_chord(chord_name,
  470.             dot_array[0],dot_array[1],dot_array[2],
  471.             dot_array[3],dot_array[4],dot_array[5],
  472.             fret_displ, in_chordrc ? CHORD_DEFINED : CHORD_IN_CHORDRC,
  473.             CHORD_HARD);
  474.  
  475.     return(0);
  476. }
  477.  
  478.  
  479. /*--------------------------------------------------------------------------------*/
  480. void init_known_chords()
  481. {
  482.     nb_known_chord= 0;
  483.  
  484. #define N FRET_X
  485.  
  486.     learn_chord("Ab",     1, 3, 3, 2, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  487.     learn_chord("Ab+",     N, N, 2, 1, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  488.     learn_chord("Ab4",     N, N, 1, 1, 2, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  489.     learn_chord("Ab7",     N, N, 1, 1, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  490.     learn_chord("Ab11",     1, 3, 1, 3, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  491.     learn_chord("Absus",     N, N, 1, 1, 2, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  492.     learn_chord("Absus4",     N, N, 1, 1, 2, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  493.     learn_chord("Abdim",     N, N, 0, 1, 0, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  494.     learn_chord("Abmaj",     1, 3, 3, 2, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  495.     learn_chord("Abmaj7",     N, N, 1, 1, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  496.     learn_chord("Abmin",     1, 3, 3, 1, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  497.     learn_chord("Abm",     1, 3, 3, 1, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  498.     learn_chord("Abm7",     N, N, 1, 1, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  499.  
  500.     learn_chord("A",     N, 0, 2, 2, 2, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  501.     learn_chord("A+",     N, 0, 3, 2, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  502.     learn_chord("A4",     0, 0, 2, 2, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  503.     learn_chord("A6",     N, N, 2, 2, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  504.     learn_chord("A7",     N, 0, 2, 0, 2, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  505.     learn_chord("A7+",     N, N, 3, 2, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  506.     learn_chord("A7(9+)",     N, 2, 2, 2, 2, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  507.     learn_chord("A9",     N, 0, 2, 1, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  508.     learn_chord("A11",     N, 4, 2, 4, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  509.     learn_chord("A13",     N, 0, 1, 2, 3, 1,     5, CHORD_BUILTIN, CHORD_HARD);
  510.     learn_chord("A7sus4",     0, 0, 2, 0, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  511.     learn_chord("A9sus",     N, 0, 2, 1, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  512.     learn_chord("Asus",     N, N, 2, 2, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  513.     learn_chord("Asus2",     0, 0, 2, 2, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  514.     learn_chord("Asus4",     N, N, 2, 2, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  515.     learn_chord("Adim",     N, N, 1, 2, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  516.     learn_chord("Amaj",     N, 0, 2, 2, 2, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  517.     learn_chord("Amaj7",     N, 0, 2, 1, 2, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  518.     learn_chord("Adim",     N, N, 1, 2, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  519.     learn_chord("Amin",     N, 0, 2, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  520.     learn_chord("A/D",     N, N, 0, 0, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  521.     learn_chord("A/F#",     2, 0, 2, 2, 2, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  522.     learn_chord("A/G#",     4, 0, 2, 2, 2, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  523.  
  524.     learn_chord("Am",     N, 0, 2, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  525.     learn_chord("Am#7",     N, N, 2, 1, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  526.     learn_chord("Am(7#)",     N, 0, 2, 2, 1, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  527.     learn_chord("Am6",     N, 0, 2, 2, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  528.     learn_chord("Am7",     N, 0, 2, 2, 1, 3,     1, CHORD_BUILTIN, CHORD_EASY);
  529.     learn_chord("Am7sus4",     0, 0, 0, 0, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  530.     learn_chord("Am9",     N, 0, 1, 1, 1, 3,     5, CHORD_BUILTIN, CHORD_HARD);
  531.     learn_chord("Am/G",     3, 0, 2, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  532.     learn_chord("Amadd9",     0, 2, 2, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  533.     learn_chord("Am(add9)",     0, 2, 2, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  534.  
  535.     learn_chord("A#",     N, 1, 3, 3, 3, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  536.     learn_chord("A#+",     N, N, 0, 3, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  537.     learn_chord("A#4",     N, N, 3, 3, 4, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  538.     learn_chord("A#7",     N, N, 1, 1, 1, 2,     3, CHORD_BUILTIN, CHORD_HARD);
  539.     learn_chord("A#sus",     N, N, 3, 3, 4, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  540.     learn_chord("A#sus4",     N, N, 3, 3, 4, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  541.     learn_chord("A#maj",     N, 1, 3, 3, 3, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  542.     learn_chord("A#maj7",     N, 1, 3, 2, 3, N,     1, CHORD_BUILTIN, CHORD_HARD);
  543.     learn_chord("A#dim",     N, N, 2, 3, 2, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  544.     learn_chord("A#min",     N, 1, 3, 3, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  545.     learn_chord("A#m",     N, 1, 3, 3, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  546.     learn_chord("A#m7",     N, 1, 3, 1, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  547.  
  548.     learn_chord("Bb",     N, 1, 3, 3, 3, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  549.     learn_chord("Bb+",     N, N, 0, 3, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  550.     learn_chord("Bb4",     N, N, 3, 3, 4, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  551.     learn_chord("Bb6",     N, N, 3, 3, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  552.     learn_chord("Bb7",     N, N, 1, 1, 1, 2,     3, CHORD_BUILTIN, CHORD_HARD);
  553.     learn_chord("Bb9",     1, 3, 1, 2, 1, 3,     6, CHORD_BUILTIN, CHORD_HARD);
  554.     learn_chord("Bb11",     1, 3, 1, 3, 4, 1,     6, CHORD_BUILTIN, CHORD_HARD);
  555.     learn_chord("Bbsus",     N, N, 3, 3, 4, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  556.     learn_chord("Bbsus4",     N, N, 3, 3, 4, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  557.     learn_chord("Bbmaj",     N, 1, 3, 3, 3, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  558.     learn_chord("Bbmaj7",     N, 1, 3, 2, 3, N,     1, CHORD_BUILTIN, CHORD_HARD);
  559.     learn_chord("Bbdim",     N, N, 2, 3, 2, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  560.     learn_chord("Bbmin",     N, 1, 3, 3, 2, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  561.     learn_chord("Bbm",     N, 1, 3, 3, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  562.     learn_chord("Bbm7",     N, 1, 3, 1, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  563.     learn_chord("Bbm9",     N, N, N, 1, 1, 3,     6, CHORD_BUILTIN, CHORD_HARD);
  564.  
  565.     learn_chord("B",     N, 2, 4, 4, 4, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  566.     learn_chord("B+",     N, N, 1, 0, 0, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  567.     learn_chord("B4",     N, N, 3, 3, 4, 1,     2, CHORD_BUILTIN, CHORD_HARD);
  568.     learn_chord("B7",     0, 2, 1, 2, 0, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  569.     learn_chord("B7+",     N, 2, 1, 2, 0, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  570.     learn_chord("B7+5",     N, 2, 1, 2, 0, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  571.     learn_chord("B7#9",     N, 2, 1, 2, 3, N,     1, CHORD_BUILTIN, CHORD_HARD);
  572.     learn_chord("B7(#9)",     N, 2, 1, 2, 3, N,     1, CHORD_BUILTIN, CHORD_HARD);
  573.     learn_chord("B9",     1, 3, 1, 2, 1, 3,     7, CHORD_BUILTIN, CHORD_HARD);
  574.     learn_chord("B11",     1, 3, 3, 2, 0, 0,     7, CHORD_BUILTIN, CHORD_HARD);
  575.     learn_chord("B11/13",     N, 1, 1, 1, 1, 3,     2, CHORD_BUILTIN, CHORD_HARD);
  576.     learn_chord("B13",     N, 2, 1, 2, 0, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  577.     learn_chord("Bsus",     N, N, 3, 3, 4, 1,     2, CHORD_BUILTIN, CHORD_HARD);
  578.     learn_chord("Bsus4",     N, N, 3, 3, 4, 1,     2, CHORD_BUILTIN, CHORD_HARD);
  579.     learn_chord("Bmaj",     N, 2, 4, 3, 4, N,     1, CHORD_BUILTIN, CHORD_HARD);
  580.     learn_chord("Bmaj7",     N, 2, 4, 3, 4, N,     1, CHORD_BUILTIN, CHORD_HARD);
  581.     learn_chord("Bdim",     N, N, 0, 1, 0, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  582.     learn_chord("Bmin",     N, 2, 4, 4, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  583.     learn_chord("B/F#",     0, 2, 2, 2, 0, 0,     2, CHORD_BUILTIN, CHORD_HARD);
  584.     learn_chord("BaddE",     N, 2, 4, 4, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  585.     learn_chord("B(addE)",     N, 2, 4, 4, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  586.     learn_chord("BaddE/F#",     2, N, 4, 4, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  587.  
  588.     learn_chord("Bm",     N, 2, 4, 4, 3, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  589.     learn_chord("Bm6",     N, N, 4, 4, 3, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  590.     learn_chord("Bm7",     N, 1, 3, 1, 2, 1,     2, CHORD_BUILTIN, CHORD_EASY);
  591.     learn_chord("Bmmaj7",     N, 1, 4, 4, 3, N,     1, CHORD_BUILTIN, CHORD_HARD);
  592.     learn_chord("Bm(maj7)",     N, 1, 4, 4, 3, N,     1, CHORD_BUILTIN, CHORD_HARD);
  593.     learn_chord("Bmsus9",     N, N, 4, 4, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  594.     learn_chord("Bm(sus9)",     N, N, 4, 4, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  595.     learn_chord("Bm7b5",     1, 2, 4, 2, 3, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  596.  
  597.     learn_chord("C",     N, 3, 2, 0, 1, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  598.     learn_chord("C+",     N, N, 2, 1, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  599.     learn_chord("C4",     N, N, 3, 0, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  600.     learn_chord("C6",     N, 0, 2, 2, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  601.     learn_chord("C7",     0, 3, 2, 3, 1, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  602.     learn_chord("C9",     1, 3, 1, 2, 1, 3,     8, CHORD_BUILTIN, CHORD_HARD);
  603.     learn_chord("C9(11)",     N, 3, 3, 3, 3, N,     1, CHORD_BUILTIN, CHORD_HARD);
  604.     learn_chord("C11",     N, 1, 3, 1, 4, 1,     3, CHORD_BUILTIN, CHORD_HARD);
  605.     learn_chord("Csus",     N, N, 3, 0, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  606.     learn_chord("Csus2",     N, 3, 0, 0, 1, N,     1, CHORD_BUILTIN, CHORD_HARD);
  607.     learn_chord("Csus4",     N, N, 3, 0, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  608.     learn_chord("Csus9",     N, N, 4, 1, 2, 4,     7, CHORD_BUILTIN, CHORD_HARD);
  609.     learn_chord("Cmaj",     0, 3, 2, 0, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  610.     learn_chord("Cmaj7",     N, 3, 2, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  611.     learn_chord("Cmin",     N, 1, 3, 3, 2, 1,     3, CHORD_BUILTIN, CHORD_HARD);
  612.     learn_chord("Cdim",     N, N, 1, 2, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  613.     learn_chord("C/B",     N, 2, 2, 0, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  614.     learn_chord("Cadd2/B",     N, 2, 0, 0, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  615.     learn_chord("CaddD",     N, 3, 2, 0, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  616.     learn_chord("C(addD)",     N, 3, 2, 0, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  617.     learn_chord("Cadd9",     N, 3, 2, 0, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  618.     learn_chord("C(add9)",     N, 3, 2, 0, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  619.  
  620.     learn_chord("Cm",     N, 1, 3, 3, 2, 1,     3, CHORD_BUILTIN, CHORD_EASY);
  621.     learn_chord("Cm7",     N, 1, 3, 1, 2, 1,     3, CHORD_BUILTIN, CHORD_EASY);
  622.     learn_chord("Cm11",     N, 1, 3, 1, 4, N,     3, CHORD_BUILTIN, CHORD_HARD);
  623.  
  624.     learn_chord("C#",     N, N, 3, 1, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  625.     learn_chord("C#+",     N, N, 3, 2, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  626.     learn_chord("C#4",     N, N, 3, 3, 4, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  627.     learn_chord("C#7",     N, N, 3, 4, 2, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  628.     learn_chord("C#7(b5)",     N, 2, 1, 2, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  629.     learn_chord("C#sus",     N, N, 3, 3, 4, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  630.     learn_chord("C#sus4",     N, N, 3, 3, 4, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  631.     learn_chord("C#maj",     N, 4, 3, 1, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  632.     learn_chord("C#maj7",     N, 4, 3, 1, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  633.     learn_chord("C#dim",     N, N, 2, 3, 2, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  634.     learn_chord("C#min",     N, N, 2, 1, 2, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  635.     learn_chord("C#add9",     N, 1, 3, 3, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  636.     learn_chord("C#(add9)",     N, 1, 3, 3, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  637.     learn_chord("C#m",     N, N, 2, 1, 2, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  638.     learn_chord("C#m7",     N, N, 2, 4, 2, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  639.  
  640.     learn_chord("Db",     N, N, 3, 1, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  641.     learn_chord("Db+",     N, N, 3, 2, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  642.     learn_chord("Db7",     N, N, 3, 4, 2, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  643.     learn_chord("Dbsus",     N, N, 3, 3, 4, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  644.     learn_chord("Dbsus4",     N, N, 3, 3, 4, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  645.     learn_chord("Dbmaj",     N, N, 3, 1, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  646.     learn_chord("Dbmaj7",     N, 4, 3, 1, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  647.     learn_chord("Dbdim",     N, N, 2, 3, 2, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  648.     learn_chord("Dbmin",     N, N, 2, 1, 2, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  649.     learn_chord("Dbm",     N, N, 2, 1, 2, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  650.     learn_chord("Dbm7",     N, N, 2, 4, 2, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  651.  
  652.     learn_chord("D",     N, N, 0, 2, 3, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  653.     learn_chord("D+",     N, N, 0, 3, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  654.     learn_chord("D4",     N, N, 0, 2, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  655.     learn_chord("D6",     N, 0, 0, 2, 0, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  656.     learn_chord("D7",     N, N, 0, 2, 1, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  657.     learn_chord("D7#9",     N, 2, 1, 2, 3, 3,     4, CHORD_BUILTIN, CHORD_HARD);
  658.     learn_chord("D7(#9)",     N, 2, 1, 2, 3, 3,     4, CHORD_BUILTIN, CHORD_HARD);
  659.     learn_chord("D9",     1, 3, 1, 2, 1, 3,    10, CHORD_BUILTIN, CHORD_HARD);
  660.     learn_chord("D11",     3, 0, 0, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  661.     learn_chord("Dsus",     N, N, 0, 2, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  662.     learn_chord("Dsus2",     0, 0, 0, 2, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  663.     learn_chord("Dsus4",     N, N, 0, 2, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  664.     learn_chord("D7sus2",     N, 0, 0, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  665.     learn_chord("D7sus4",     N, 0, 0, 2, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  666.     learn_chord("Dmaj",     N, N, 0, 2, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  667.     learn_chord("Dmaj7",     N, N, 0, 2, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  668.     learn_chord("Ddim",     N, N, 0, 1, 0, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  669.     learn_chord("Dmin",     N, N, 0, 2, 3, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  670.     learn_chord("D/A",     N, 0, 0, 2, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  671.     learn_chord("D/B",     N, 2, 0, 2, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  672.     learn_chord("D/C",     N, 3, 0, 2, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  673.     learn_chord("D/C#",     N, 4, 0, 2, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  674.     learn_chord("D/E",     N, 1, 1, 1, 1, N,     7, CHORD_BUILTIN, CHORD_HARD);
  675.     learn_chord("D/G",     3, N, 0, 2, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  676.     learn_chord("D5/E",     0, 1, 1, 1, N, N,     7, CHORD_BUILTIN, CHORD_HARD);
  677.     learn_chord("Dadd9",     0, 0, 0, 2, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  678.     learn_chord("D(add9)",     0, 0, 0, 2, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  679.     learn_chord("D9add6",     1, 3, 3, 2, 0, 0,    10, CHORD_BUILTIN, CHORD_HARD);
  680.     learn_chord("D9(add6)",     1, 3, 3, 2, 0, 0,    10, CHORD_BUILTIN, CHORD_HARD);
  681.  
  682.     learn_chord("Dm",     N, N, 0, 2, 3, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  683.     learn_chord("Dm6(5b)",     N, N, 0, 1, 0, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  684.     learn_chord("Dm7",     N, N, 0, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  685.     learn_chord("Dm#5",     N, N, 0, 3, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  686.     learn_chord("Dm(#5)",     N, N, 0, 3, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  687.     learn_chord("Dm#7",     N, N, 0, 2, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  688.     learn_chord("Dm(#7)",     N, N, 0, 2, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  689.     learn_chord("Dm/A",     N, 0, 0, 2, 3, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  690.     learn_chord("Dm/B",     N, 2, 0, 2, 3, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  691.     learn_chord("Dm/C",     N, 3, 0, 2, 3, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  692.     learn_chord("Dm/C#",     N, 4, 0, 2, 3, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  693.     learn_chord("Dm9",     N, N, 3, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  694.  
  695.     learn_chord("D#",     N, N, 3, 1, 2, 1,     3, CHORD_BUILTIN, CHORD_HARD);
  696.     learn_chord("D#+",     N, N, 1, 0, 0, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  697.     learn_chord("D#4",     N, N, 1, 3, 4, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  698.     learn_chord("D#7",     N, N, 1, 3, 2, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  699.     learn_chord("D#sus",     N, N, 1, 3, 4, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  700.     learn_chord("D#sus4",     N, N, 1, 3, 4, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  701.     learn_chord("D#maj",     N, N, 3, 1, 2, 1,     3, CHORD_BUILTIN, CHORD_HARD);
  702.     learn_chord("D#maj7",     N, N, 1, 3, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  703.     learn_chord("D#dim",     N, N, 1, 2, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  704.     learn_chord("D#min",     N, N, 4, 3, 4, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  705.     learn_chord("D#m",     N, N, 4, 3, 4, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  706.     learn_chord("D#m7",     N, N, 1, 3, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  707.  
  708.     learn_chord("Eb",     N, N, 3, 1, 2, 1,     3, CHORD_BUILTIN, CHORD_HARD);
  709.     learn_chord("Eb+",     N, N, 1, 0, 0, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  710.     learn_chord("Eb4",     N, N, 1, 3, 4, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  711.     learn_chord("Eb7",     N, N, 1, 3, 2, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  712.     learn_chord("Ebsus",     N, N, 1, 3, 4, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  713.     learn_chord("Ebsus4",     N, N, 1, 3, 4, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  714.     learn_chord("Ebmaj",     N, N, 1, 3, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  715.     learn_chord("Ebmaj7",     N, N, 1, 3, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  716.     learn_chord("Ebdim",     N, N, 1, 2, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  717.     learn_chord("Ebadd9",     N, 1, 1, 3, 4, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  718.     learn_chord("Eb(add9)",     N, 1, 1, 3, 4, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  719.     learn_chord("Ebmin",     N, N, 4, 3, 4, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  720.     learn_chord("Ebm",     N, N, 4, 3, 4, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  721.     learn_chord("Ebm7",     N, N, 1, 3, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  722.  
  723.     learn_chord("E",     0, 2, 2, 1, 0, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  724.     learn_chord("E+",     N, N, 2, 1, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  725.     learn_chord("E5",     0, 1, 3, 3, N, N,     7, CHORD_BUILTIN, CHORD_HARD);
  726.     learn_chord("E6",     N, N, 3, 3, 3, 3,     9, CHORD_BUILTIN, CHORD_HARD);
  727.     learn_chord("E7",     0, 2, 2, 1, 3, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  728.     learn_chord("E7#9",     0, 2, 2, 1, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  729.     learn_chord("E7(#9)",     0, 2, 2, 1, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  730.     learn_chord("E7(5b)",     N, 1, 0, 1, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  731.     learn_chord("E7b9",     0, 2, 0, 1, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  732.     learn_chord("E7(b9)",     0, 2, 0, 1, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  733.     learn_chord("E7(11)",     0, 2, 2, 2, 3, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  734.     learn_chord("E9",     1, 3, 1, 2, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  735.     learn_chord("E11",     1, 1, 1, 1, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  736.     learn_chord("Esus",     0, 2, 2, 2, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  737.     learn_chord("Esus4",     0, 2, 2, 2, 0, 0,     0, CHORD_BUILTIN, CHORD_HARD);
  738.     learn_chord("Emaj",     0, 2, 2, 1, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  739.     learn_chord("Emaj7",     0, 2, 1, 1, 0, N,     1, CHORD_BUILTIN, CHORD_HARD);
  740.     learn_chord("Edim",     N, N, 2, 3, 2, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  741.     learn_chord("Emin",     0, 2, 2, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  742.  
  743.     learn_chord("Em",     0, 2, 2, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  744.     learn_chord("Em6",     0, 2, 2, 0, 2, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  745.     learn_chord("Em7",     0, 2, 2, 0, 3, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  746.     learn_chord("Em/B",     N, 2, 2, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  747.     learn_chord("Em/D",     N, N, 0, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  748.     learn_chord("Em7/D",     N, N, 0, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  749.     learn_chord("Emsus4",     0, 0, 2, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  750.     learn_chord("Em(sus4)",     0, 0, 2, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  751.     learn_chord("Emadd9",     0, 2, 4, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  752.     learn_chord("Em(add9)",     0, 2, 4, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  753.  
  754.     learn_chord("F",     1, 3, 3, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  755.     learn_chord("F+",     N, N, 3, 2, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  756.     learn_chord("F+7+11",     1, 3, 3, 2, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  757.     learn_chord("F4",     N, N, 3, 3, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  758.     learn_chord("F6",     N, 3, 3, 2, 3, N,     1, CHORD_BUILTIN, CHORD_HARD);
  759.     learn_chord("F7",     1, 3, 1, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  760.     learn_chord("F9",     2, 4, 2, 3, 2, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  761.     learn_chord("F11",     1, 3, 1, 3, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  762.     learn_chord("Fsus",     N, N, 3, 3, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  763.     learn_chord("Fsus4",     N, N, 3, 3, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  764.     learn_chord("Fmaj",     1, 3, 3, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  765.     learn_chord("Fmaj7",     N, 3, 3, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  766.     learn_chord("Fdim",     N, N, 0, 1, 0, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  767.     learn_chord("Fmin",     1, 3, 3, 1, 1, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  768.     learn_chord("F/A",     N, 0, 3, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  769.     learn_chord("F/C",     N, N, 3, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  770.     learn_chord("F/D",     N, N, 0, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  771.     learn_chord("F/G",     3, 3, 3, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  772.     learn_chord("F7/A",     N, 0, 3, 0, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  773.     learn_chord("Fmaj7/A",     N, 0, 3, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  774.     learn_chord("Fmaj7/C",     N, 3, 3, 2, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  775.     learn_chord("Fmaj7(+5)", N, N, 3, 2, 2, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  776.     learn_chord("Fadd9",     3, 0, 3, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  777.     learn_chord("F(add9)",     3, 0, 3, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  778.     learn_chord("FaddG",     1, N, 3, 2, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  779.     learn_chord("FaddG",     1, N, 3, 2, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  780.  
  781.     learn_chord("Fm",     1, 3, 3, 1, 1, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  782.     learn_chord("Fm6",     N, N, 0, 1, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  783.     learn_chord("Fm7",     1, 3, 1, 1, 1, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  784.     learn_chord("Fmmaj7",     N, 3, 3, 1, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  785.  
  786.     learn_chord("F#",     2, 4, 4, 3, 2, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  787.     learn_chord("F#+",     N, N, 4, 3, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  788.     learn_chord("F#7",     N, N, 4, 3, 2, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  789.     learn_chord("F#9",     N, 1, 2, 1, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  790.     learn_chord("F#11",     2, 4, 2, 4, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  791.     learn_chord("F#sus",     N, N, 4, 4, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  792.     learn_chord("F#sus4",     N, N, 4, 4, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  793.     learn_chord("F#maj",     2, 4, 4, 3, 2, 2,     0, CHORD_BUILTIN, CHORD_HARD);
  794.     learn_chord("F#maj7",     N, N, 4, 3, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  795.     learn_chord("F#dim",     N, N, 1, 2, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  796.     learn_chord("F#min",     2, 4, 4, 2, 2, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  797.     learn_chord("F#/E",     0, 4, 4, 3, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  798.     learn_chord("F#4",     N, N, 4, 4, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  799.     learn_chord("F#m",     2, 4, 4, 2, 2, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  800.     learn_chord("F#m6",     N, N, 1, 2, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  801.     learn_chord("F#m7",     N, N, 2, 2, 2, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  802.     learn_chord("F#m7-5",     1, 0, 2, 3, 3, 3,     2, CHORD_BUILTIN, CHORD_HARD);
  803.     learn_chord("F#m/C#m",     N, N, 4, 2, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  804.  
  805.     learn_chord("Gb",     2, 4, 4, 3, 2, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  806.     learn_chord("Gb+",     N, N, 4, 3, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  807.     learn_chord("Gb7",     N, N, 4, 3, 2, 0,     1, CHORD_BUILTIN, CHORD_EASY);
  808.     learn_chord("Gb9",     N, 1, 2, 1, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  809.     learn_chord("Gbsus",     N, N, 4, 4, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  810.     learn_chord("Gbsus4",     N, N, 4, 4, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  811.     learn_chord("Gbmaj",     2, 4, 4, 3, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  812.     learn_chord("Gbmaj7",     N, N, 4, 3, 2, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  813.     learn_chord("Gbdim",     N, N, 1, 2, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  814.     learn_chord("Gbmin",     2, 4, 4, 2, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  815.     learn_chord("Gbm",     2, 4, 4, 2, 2, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  816.     learn_chord("Gbm7",     N, N, 2, 2, 2, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  817.  
  818.     learn_chord("G",     3, 2, 0, 0, 0, 3,     1, CHORD_BUILTIN, CHORD_EASY);
  819.     learn_chord("G+",     N, N, 1, 0, 0, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  820.     learn_chord("G4",     N, N, 0, 0, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  821.     learn_chord("G6",     3, N, 0, 0, 0, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  822.     learn_chord("G7",     3, 2, 0, 0, 0, 1,     1, CHORD_BUILTIN, CHORD_EASY);
  823.     learn_chord("G7+",     N, N, 4, 3, 3, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  824.     learn_chord("G7b9",     N, N, 0, 1, 0, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  825.     learn_chord("G7(b9)",     N, N, 0, 1, 0, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  826.     learn_chord("G7#9",     1, 3, N, 2, 4, 4,     3, CHORD_BUILTIN, CHORD_HARD);
  827.     learn_chord("G7(#9)",     1, 3, N, 2, 4, 4,     3, CHORD_BUILTIN, CHORD_HARD);
  828.     learn_chord("G9",     3, N, 0, 2, 0, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  829.     learn_chord("G9(11)",     1, 3, 1, 3, 1, 3,     3, CHORD_BUILTIN, CHORD_HARD);
  830.     learn_chord("G11",     3, N, 0, 2, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  831.     learn_chord("Gsus",     N, N, 0, 0, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  832.     learn_chord("Gsus4",     N, N, 0, 0, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  833.     learn_chord("G6sus4",     0, 2, 0, 0, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  834.     learn_chord("G6(sus4)",     0, 2, 0, 0, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  835.     learn_chord("G7sus4",     3, 3, 0, 0, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  836.     learn_chord("G7(sus4)",     3, 3, 0, 0, 1, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  837.     learn_chord("Gmaj",     3, 2, 0, 0, 0, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  838.     learn_chord("Gmaj7",     N, N, 1, 2, 3, 4,     2, CHORD_BUILTIN, CHORD_HARD);
  839.     learn_chord("Gmaj7sus4", N, N, 0, 0, 1, 2,     1, CHORD_BUILTIN, CHORD_HARD);
  840.     learn_chord("Gmaj9",     1, 1, 4, 1, 2, 1,     2, CHORD_BUILTIN, CHORD_HARD);
  841.     learn_chord("Gmin",     1, 3, 3, 1, 1, 1,     3, CHORD_BUILTIN, CHORD_EASY);
  842.     learn_chord("Gdim",     N, N, 2, 3, 2, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  843.     learn_chord("Gadd9",     1, 3, N, 2, 1, 3,     3, CHORD_BUILTIN, CHORD_HARD);
  844.     learn_chord("G(add9)",     1, 3, N, 2, 1, 3,     3, CHORD_BUILTIN, CHORD_HARD);
  845.     learn_chord("G/A",     N, 0, 0, 0, 0, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  846.     learn_chord("G/B",     N, 2, 0, 0, 0, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  847.     learn_chord("G/D",     N, 2, 2, 1, 0, 0,     4, CHORD_BUILTIN, CHORD_HARD);
  848.     learn_chord("G/F#",     2, 2, 0, 0, 0, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  849.  
  850.     learn_chord("Gm",     1, 3, 3, 1, 1, 1,     3, CHORD_BUILTIN, CHORD_EASY);
  851.     learn_chord("Gm6",     N, N, 2, 3, 3, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  852.     learn_chord("Gm7",     1, 3, 1, 1, 1, 1,     3, CHORD_BUILTIN, CHORD_EASY);
  853.     learn_chord("Gm/Bb",     3, 2, 2, 1, N, N,     4, CHORD_BUILTIN, CHORD_HARD);
  854.  
  855.     learn_chord("G#",     1, 3, 3, 2, 1, 1,     4, CHORD_BUILTIN, CHORD_EASY);
  856.     learn_chord("G#+",     N, N, 2, 1, 1, 0,     1, CHORD_BUILTIN, CHORD_HARD);
  857.     learn_chord("G#4",     1, 3, 3, 1, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  858.     learn_chord("G#7",     N, N, 1, 1, 1, 2,     1, CHORD_BUILTIN, CHORD_EASY);
  859.     learn_chord("G#sus",     N, N, 1, 1, 2, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  860.     learn_chord("G#sus4",     N, N, 1, 1, 2, 4,     1, CHORD_BUILTIN, CHORD_HARD);
  861.     learn_chord("G#maj",     1, 3, 3, 2, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  862.     learn_chord("G#maj7",     N, N, 1, 1, 1, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  863.     learn_chord("G#dim",     N, N, 0, 1, 0, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  864.     learn_chord("G#min",     1, 3, 3, 1, 1, 1,     4, CHORD_BUILTIN, CHORD_HARD);
  865.     learn_chord("G#m",     1, 3, 3, 1, 1, 1,     4, CHORD_BUILTIN, CHORD_EASY);
  866.     learn_chord("G#m6",     N, N, 1, 1, 0, 1,     1, CHORD_BUILTIN, CHORD_HARD);
  867.     learn_chord("G#m7",     N, N, 1, 1, 1, 1,     4, CHORD_BUILTIN, CHORD_EASY);
  868.     learn_chord("G#m9maj7",     N, N, 1, 3, 0, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  869.     learn_chord("G#m9(maj7)",N, N, 1, 3, 0, 3,     1, CHORD_BUILTIN, CHORD_HARD);
  870.  
  871. #undef N
  872. }
  873.  
  874. /*--------------------------------------------------------------------------------*/
  875. int is_chord_known(chord)
  876. char *chord;
  877. {
  878.         int i;
  879.  
  880.         for (i= 0;i < nb_known_chord;i++)
  881.                 if (!strcmp(chord,known_chords[i].chord_name))
  882.             return (i);
  883.     return(-1);
  884. }
  885.  
  886. /*--------------------------------------------------------------------------------*/
  887. void dump_fret(fretnum)
  888. int fretnum;
  889. {
  890.     if (fretnum == FRET_X) printf("  %2s", FRET_X_STR);
  891.     else printf("  %2d", fretnum);
  892. }
  893.  
  894. /*--------------------------------------------------------------------------------*/
  895. void dump_chords(PostScript)
  896. int    PostScript;
  897. {
  898.     int i;
  899.     int ptr,idx;
  900.  
  901.     if (PostScript)
  902.     {
  903.         init_values();
  904.         init_ps();
  905.         init_known_chords();
  906.         do_title("CHORD CHART");
  907.         do_subtitle("Generated with the CHORD program");
  908.         do_subtitle("Copyright Martin.Leclerc@Sun.COM and Mario.Dorion@Sun.COM 1992-1993");
  909.     }
  910.     else
  911.     {
  912.         init_known_chords();
  913.         printf("#    CHORD CHART\n");
  914.         printf("#    Generated with the CHORD program\n");
  915.         printf("#    Copyright Martin.Leclerc@Sun.COM and Mario.Dorion@Sun.COM 1992-1993\n");
  916.         printf("#\n");
  917.         printf("#\t\t\t\t\t       '------ strings ------`\n");
  918.         printf("#Chord\t\t\t\t\t        E   A   D   G   B   E\n");
  919.     }
  920.  
  921.     read_chordrc();
  922.     for (i= 0;i < nb_known_chord;i++) {
  923.         add_to_chordtab(known_chords[i].chord_name);
  924.     }
  925.  
  926.     if (PostScript) 
  927.         {
  928.         draw_chords();
  929.         do_end_of_page(TRUE);
  930.             printf ("%%%%Trailer\n");
  931.             printf ("%%%%Pages: %d 1\n", n_pages);
  932.             printf ("%%%%EOF\n");
  933.         }
  934.     else {
  935.         ptr= first_ptr;
  936.         while (ptr != -1) {
  937.             idx= is_chord_known(chordtab[ptr].chord_name);
  938.             printf("{define %s:\t\tbase-fret %2d\tfrets",
  939.                 known_chords[idx].chord_name, known_chords[idx].displ);
  940.             dump_fret(known_chords[idx].s1);
  941.             dump_fret(known_chords[idx].s2);
  942.             dump_fret(known_chords[idx].s3);
  943.             dump_fret(known_chords[idx].s4);
  944.             dump_fret(known_chords[idx].s5);
  945.             dump_fret(known_chords[idx].s6);
  946.             printf("}");
  947.             printf("\t%s\n",
  948.                 known_chords[idx].origin== CHORD_BUILTIN ? "" : "(local)");
  949.             ptr = chordtab[ptr].next_ptr;
  950.             }
  951.         }
  952. }
  953.