Advertisement
Guest User

Untitled

a guest
Sep 26th, 2022
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.37 KB | Music | 0 0
  1. #define WOPENFMT  "<%d>|"
  2. #define WFSTRFMT  "-<%d>-|"
  3. #define WUSTRFMT  "-----|"
  4. #define WMAXFRET 13
  5. #define NOPENFMT " %d |"
  6. #define NFSTRFMT "-%d-|"
  7. #define NUSTRFMT "---|"
  8. #define NMAXFRET 16
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12.  
  13. char * openfmt = WOPENFMT;
  14. char * fstrfmt = WFSTRFMT;
  15. char * ustrfmt = WUSTRFMT;
  16. int maxfret = WMAXFRET;
  17. int capo = 0;
  18. int transp = 0;
  19. int tune[6] = { 7,2,10,5,0,7 };
  20. int notes[12];                  /* the available notes */
  21.  
  22. int main(void);
  23. void chord( char *cp );
  24. void string( int b );
  25. int has( char * cp, char c );
  26. void retune( char * ap );
  27. int getword( char * wp );
  28.  
  29. int main(void)
  30. {
  31.     char line[80], *ap;
  32.     while ( getword(line) ) {
  33.     if ( *(ap = line) == '-' ) {
  34.         ap += 2;
  35.         switch( ap[-1] ) {
  36.         case 'c':               /* capo */
  37.             capo = atoi( ap ); break;
  38.         case 't':
  39.             retune( ap ); break;
  40.         case 'T':
  41.             if ( *ap == 'D' || *ap == 'd' ) {
  42.                 tune[0] = tune[5] = 5;
  43.             }
  44.             break;
  45.         case 'n':
  46.             maxfret = NMAXFRET;
  47.             openfmt = NOPENFMT;
  48.             fstrfmt = NFSTRFMT;
  49.             ustrfmt = NUSTRFMT;
  50.             break;
  51.         case 'w':
  52.             maxfret = WMAXFRET;
  53.             openfmt = WOPENFMT;
  54.             fstrfmt = WFSTRFMT;
  55.             ustrfmt = WUSTRFMT;
  56.             break;
  57.         case 's':
  58.             if ( *ap == '-' )
  59.                 transp = -atoi( ap+1 );
  60.             else
  61.                 transp = atoi( ap );
  62.             break;
  63.         }
  64.     } else
  65.         chord( ap );
  66.     }
  67.     return 0;
  68. }
  69. void chord( char *cp )
  70. {
  71.     int i;
  72.     int n;                  /* which note: A=0,A#=1,...G#=11 */
  73.  
  74.     int     mflag = 0;      /* minor chord */
  75.     int     Mflag = 0;      /* major 7th/9th chord */
  76.     int     sflag = 0;      /* sharp or flat */
  77.     int     flag7 = 0;      /* seventh chord */
  78.     int     flag9 = 0;      /* ninth chord */
  79.     int     flag6 = 0;
  80.     int     aflag = 0;      /* augmented */
  81.     int     dflag = 0;      /* diminished */
  82.  
  83.     int t1[7] = {0,2,3,5,7,8,10};
  84.     char *names[] = {
  85.         "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#" };
  86.     char *bnames[] = {
  87.         "A", "Bb", "B", "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab" };
  88.  
  89.     if ( cp[0] == '\0' )
  90.         return;
  91.  
  92.     mflag = sflag = flag7 = flag9 = flag6 = 0;
  93.     for ( i = 0; i < 12; i++ )
  94.         notes[i] = 0;
  95.  
  96.     if ( has( cp+1, '#' ) ) sflag = 1;
  97.     if ( has( cp+1, 'b' ) ) sflag = -1;
  98.     if ( has( cp+1, '7' ) ) flag7 = 1;
  99.     if ( has( cp+1, '6' ) ) flag6 = 1;
  100.     if ( has( cp+1, '9' ) ) flag9 = 1;
  101.     if ( has( cp+1, 'm' ) ) mflag = 1;
  102.     if ( has( cp+1, 'M' ) ) Mflag = 1;
  103.     if ( has( cp+1, '+' ) ) aflag = 1;
  104.     if ( has( cp+1, 'o' ) ) dflag = 1;
  105.     n = transp + 48 + t1[cp[0]-'a'] + sflag;
  106.     n %= 12;
  107.     // C     D     E  F     G     A    B  C
  108.     // 0  1  2  3  4  5  6  7  8  9 10 11 12
  109.     // u m2 M2 m3 M3  4 tt  5 m6 m6 m7 M7  O    
  110.     //        1 3 5 6 7  9
  111.     // Major: 0 4 7   11    
  112.     // Minor: 0 3 7   10    mflag=1
  113.     // Aug:   0 4 8   10            aflag=1
  114.     // Dim:   0 3 6    9                    dflag=1
  115.     //                    Cmaug C7maug
  116.     /*
  117.                 0 4  7  9 11  14
  118.         Co      C Eb Gb
  119.         Co7     C Eb Gb   Bbb
  120.         Cm      C Eb G
  121.         Cm6     C Eb G  A
  122.         Cm7     C Eb G    Bb
  123.         Cm7     C Eb G    Bb
  124.         Cm9     C Eb G    Bb  D
  125.  
  126.         C       C E  G
  127.         C6      C E  G  A
  128.         C7      C E  G    Bb
  129.         C9      C E  G    Bb  D
  130.         CM7     C E  G    B
  131.         CM9     C E  G    B   D
  132.  
  133.         C+      C E  G#
  134.  
  135.         C+7     C E  G#   Bb
  136.     */
  137.     notes[n] = 1;
  138.     notes[(n+4-(mflag|dflag))%12] = 3;
  139.     notes[(n+7+aflag-dflag)%12] = 5;
  140.     notes[(n+9)%12] = flag6 ? 6 : 0;
  141.     notes[(n+11+Mflag-flag7-flag9-dflag)%12] = (flag7|flag9) ? 7 : 0;
  142.     notes[(n+14)%12] = flag9 ? 9 : 0;
  143.  
  144.     printf( "%s", sflag < 0 ? bnames[n] : names[n] );
  145.     if ( mflag ) printf( "m" );
  146.     if ( flag6 ) printf( "6" );
  147.     if ( flag7 ) printf( "7" );
  148.     if ( flag9 ) printf( "9" );
  149.     if ( aflag ) printf( "aug" );
  150.     if ( dflag ) printf( "dim" );
  151.     printf( ": " );
  152.     for ( i = 0; i < 12; i++ )
  153.         if ( notes[(i+n)%12] )
  154.             printf( " %s", sflag < 0 ? bnames[(i+n)%12] : names[(i+n)%12] );
  155.     printf( "\n" );
  156.     if ( capo ) printf( "capo up %d frets\n", capo );
  157.     for ( i = 0; i < 6; i++ )
  158.         string( tune[i]+capo );
  159. }
  160.  
  161. void string( int b )
  162. {
  163.     int i;
  164.     b %= 12;
  165.     if ( notes[b] )
  166.         printf( openfmt, notes[b] );
  167.     else
  168.         printf( "   |" );
  169.     for ( i=1,++b; i<maxfret; i++,b++ ) {
  170.         b %= 12;
  171.         if ( notes[b] )
  172.             printf( fstrfmt, notes[b] );
  173.         else
  174.             printf( "%s", ustrfmt );
  175.     }
  176.     printf( "\n" );
  177. }
  178.  
  179. int has( char * cp, char c )
  180. {
  181.     while ( *cp )
  182.     if ( *cp++ == c )
  183.         return 1;
  184.     return 0;
  185. }
  186.  
  187. void retune( char * ap )
  188. {
  189.     int i;
  190.     for ( i = 0; i < 6; i++ ) {
  191.         if ( ! *ap )
  192.             break;
  193.         tune[i] = *ap++ - 'a';
  194.         if ( tune[i] < 0 || tune[i] > 7 )
  195.             break;
  196.         if ( *ap == '#' ) tune[i]++,ap++;
  197.         if ( *ap == '-' ) tune[i]--,ap++;
  198.         tune[i] = (tune[i]+12)%12;
  199.     }
  200. }
  201.  
  202. int getword( char * wp )
  203. {
  204.     int c;
  205.     while ( (c=getchar()) != EOF ) {
  206.         if ( c == ' ' || c == '\t' || c == '\n' ) {
  207.             *wp = 0;
  208.             return 1;
  209.         }
  210.         *wp++ = c;
  211.     }
  212.     return 0;
  213. }
  214. #ifdef NOTDEF
  215. if ( argc == 1 ) {
  216.     printf( "Usage: %s [options] chord ...\n", argv[0] );
  217.     printf( "Options are:\n" );
  218.     printf( "  -cN:      capo up N frets\n" );
  219.     printf( "  -tRSTUVW: strings tuned to R,S,T,U,V,W\n" );
  220.     printf( "            R,etc are note name with optional # or -\n" );
  221.     printf( "            to indicate sharp or flat.  Order is string 1 to 6\n");
  222.     printf( "  -Td:      strings 1 and 6 are tuned to D\n" );
  223.     printf( "  -n:       Draw frets in narrower format\n" );
  224.     printf( "  -sN:      transpose by N half steps\n" );
  225.     printf( "chord is a note name {a,b,c,d,e,f,g}.  The note name can be\n" );
  226.     printf( "followed be the following modifiers, in any order:\n" );
  227.     printf( "  7: 7th chord\n" );
  228.     printf( "  #: sharp\n" );
  229.     printf( "  b: flat\n" );
  230.     printf( "  m: minor\n" );
  231.     exit(0);
  232. }
  233. #endif
  234.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement