Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define WOPENFMT "<%d>|"
- #define WFSTRFMT "-<%d>-|"
- #define WUSTRFMT "-----|"
- #define WMAXFRET 13
- #define NOPENFMT " %d |"
- #define NFSTRFMT "-%d-|"
- #define NUSTRFMT "---|"
- #define NMAXFRET 16
- #include <stdio.h>
- #include <stdlib.h>
- char * openfmt = WOPENFMT;
- char * fstrfmt = WFSTRFMT;
- char * ustrfmt = WUSTRFMT;
- int maxfret = WMAXFRET;
- int capo = 0;
- int transp = 0;
- int tune[6] = { 7,2,10,5,0,7 };
- int notes[12]; /* the available notes */
- int main(void);
- void chord( char *cp );
- void string( int b );
- int has( char * cp, char c );
- void retune( char * ap );
- int getword( char * wp );
- int main(void)
- {
- char line[80], *ap;
- while ( getword(line) ) {
- if ( *(ap = line) == '-' ) {
- ap += 2;
- switch( ap[-1] ) {
- case 'c': /* capo */
- capo = atoi( ap ); break;
- case 't':
- retune( ap ); break;
- case 'T':
- if ( *ap == 'D' || *ap == 'd' ) {
- tune[0] = tune[5] = 5;
- }
- break;
- case 'n':
- maxfret = NMAXFRET;
- openfmt = NOPENFMT;
- fstrfmt = NFSTRFMT;
- ustrfmt = NUSTRFMT;
- break;
- case 'w':
- maxfret = WMAXFRET;
- openfmt = WOPENFMT;
- fstrfmt = WFSTRFMT;
- ustrfmt = WUSTRFMT;
- break;
- case 's':
- if ( *ap == '-' )
- transp = -atoi( ap+1 );
- else
- transp = atoi( ap );
- break;
- }
- } else
- chord( ap );
- }
- return 0;
- }
- void chord( char *cp )
- {
- int i;
- int n; /* which note: A=0,A#=1,...G#=11 */
- int mflag = 0; /* minor chord */
- int Mflag = 0; /* major 7th/9th chord */
- int sflag = 0; /* sharp or flat */
- int flag7 = 0; /* seventh chord */
- int flag9 = 0; /* ninth chord */
- int flag6 = 0;
- int aflag = 0; /* augmented */
- int dflag = 0; /* diminished */
- int t1[7] = {0,2,3,5,7,8,10};
- char *names[] = {
- "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#" };
- char *bnames[] = {
- "A", "Bb", "B", "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab" };
- if ( cp[0] == '\0' )
- return;
- mflag = sflag = flag7 = flag9 = flag6 = 0;
- for ( i = 0; i < 12; i++ )
- notes[i] = 0;
- if ( has( cp+1, '#' ) ) sflag = 1;
- if ( has( cp+1, 'b' ) ) sflag = -1;
- if ( has( cp+1, '7' ) ) flag7 = 1;
- if ( has( cp+1, '6' ) ) flag6 = 1;
- if ( has( cp+1, '9' ) ) flag9 = 1;
- if ( has( cp+1, 'm' ) ) mflag = 1;
- if ( has( cp+1, 'M' ) ) Mflag = 1;
- if ( has( cp+1, '+' ) ) aflag = 1;
- if ( has( cp+1, 'o' ) ) dflag = 1;
- n = transp + 48 + t1[cp[0]-'a'] + sflag;
- n %= 12;
- // C D E F G A B C
- // 0 1 2 3 4 5 6 7 8 9 10 11 12
- // u m2 M2 m3 M3 4 tt 5 m6 m6 m7 M7 O
- // 1 3 5 6 7 9
- // Major: 0 4 7 11
- // Minor: 0 3 7 10 mflag=1
- // Aug: 0 4 8 10 aflag=1
- // Dim: 0 3 6 9 dflag=1
- // Cmaug C7maug
- /*
- 0 4 7 9 11 14
- Co C Eb Gb
- Co7 C Eb Gb Bbb
- Cm C Eb G
- Cm6 C Eb G A
- Cm7 C Eb G Bb
- Cm7 C Eb G Bb
- Cm9 C Eb G Bb D
- C C E G
- C6 C E G A
- C7 C E G Bb
- C9 C E G Bb D
- CM7 C E G B
- CM9 C E G B D
- C+ C E G#
- C+7 C E G# Bb
- */
- notes[n] = 1;
- notes[(n+4-(mflag|dflag))%12] = 3;
- notes[(n+7+aflag-dflag)%12] = 5;
- notes[(n+9)%12] = flag6 ? 6 : 0;
- notes[(n+11+Mflag-flag7-flag9-dflag)%12] = (flag7|flag9) ? 7 : 0;
- notes[(n+14)%12] = flag9 ? 9 : 0;
- printf( "%s", sflag < 0 ? bnames[n] : names[n] );
- if ( mflag ) printf( "m" );
- if ( flag6 ) printf( "6" );
- if ( flag7 ) printf( "7" );
- if ( flag9 ) printf( "9" );
- if ( aflag ) printf( "aug" );
- if ( dflag ) printf( "dim" );
- printf( ": " );
- for ( i = 0; i < 12; i++ )
- if ( notes[(i+n)%12] )
- printf( " %s", sflag < 0 ? bnames[(i+n)%12] : names[(i+n)%12] );
- printf( "\n" );
- if ( capo ) printf( "capo up %d frets\n", capo );
- for ( i = 0; i < 6; i++ )
- string( tune[i]+capo );
- }
- void string( int b )
- {
- int i;
- b %= 12;
- if ( notes[b] )
- printf( openfmt, notes[b] );
- else
- printf( " |" );
- for ( i=1,++b; i<maxfret; i++,b++ ) {
- b %= 12;
- if ( notes[b] )
- printf( fstrfmt, notes[b] );
- else
- printf( "%s", ustrfmt );
- }
- printf( "\n" );
- }
- int has( char * cp, char c )
- {
- while ( *cp )
- if ( *cp++ == c )
- return 1;
- return 0;
- }
- void retune( char * ap )
- {
- int i;
- for ( i = 0; i < 6; i++ ) {
- if ( ! *ap )
- break;
- tune[i] = *ap++ - 'a';
- if ( tune[i] < 0 || tune[i] > 7 )
- break;
- if ( *ap == '#' ) tune[i]++,ap++;
- if ( *ap == '-' ) tune[i]--,ap++;
- tune[i] = (tune[i]+12)%12;
- }
- }
- int getword( char * wp )
- {
- int c;
- while ( (c=getchar()) != EOF ) {
- if ( c == ' ' || c == '\t' || c == '\n' ) {
- *wp = 0;
- return 1;
- }
- *wp++ = c;
- }
- return 0;
- }
- #ifdef NOTDEF
- if ( argc == 1 ) {
- printf( "Usage: %s [options] chord ...\n", argv[0] );
- printf( "Options are:\n" );
- printf( " -cN: capo up N frets\n" );
- printf( " -tRSTUVW: strings tuned to R,S,T,U,V,W\n" );
- printf( " R,etc are note name with optional # or -\n" );
- printf( " to indicate sharp or flat. Order is string 1 to 6\n");
- printf( " -Td: strings 1 and 6 are tuned to D\n" );
- printf( " -n: Draw frets in narrower format\n" );
- printf( " -sN: transpose by N half steps\n" );
- printf( "chord is a note name {a,b,c,d,e,f,g}. The note name can be\n" );
- printf( "followed be the following modifiers, in any order:\n" );
- printf( " 7: 7th chord\n" );
- printf( " #: sharp\n" );
- printf( " b: flat\n" );
- printf( " m: minor\n" );
- exit(0);
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement