home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Multimed / Multimed.zip / chord3_6.zip / chord / grid.c < prev    next >
C/C++ Source or Header  |  1995-04-25  |  42KB  |  1,023 lines

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