tommi@stekt.oulu.fi (Tommi V. Kaikkonen ti) (09/03/90)
/************************************************************************** * * * sointu.c - to examine sounds of guitar with or without one * * (C) Tommi Kaikkonen 1990 * * InterNet: tommi@stekt.oulu.fi * * * **************************************************************************/ #define C0Frequency (261.6250) #define MFrequency (1.05946309434) char Frequency[56][10]; #include <stdio.h> int String[6]={4, 9, 14, 19, 23, 28 }; int BinPow[8]={1, 2, 4, 8, 16, 32, 64, 128 }; int abs(i1) int i1; { int r=0; if(i1<0) r=-i1; if(i1>0) r=i1; return(r); } char sgn(i1) int i1; { char r; if(i1<0) r='-'; if(i1>=0) r='+'; return(r); } pianok(i1,i2,c1) int i1; char *c1; { c1[0]=' '; if(i1&BinPow[i2]) c1[0]='O'; else if(i1) c1[0]='.'; } add_oct(s1,i1) char *s1; int i1; { int i; i=strlen(s1); s1[i]='1'+i1; s1[i+1]='\000'; } main(argc,argv) int argc; char *argv[]; { int i,j; int previous; char abuffer[80]; char m; int piano[12]; float freq; int Note[56][6]; /* #C #D #F #G #A */ /* C D E F G A B */ /* 0 2 4 5 7 9 11 */ for(i=0;i<12;i++) piano[i]=0; for(i=0;i<55;i++) { j=i%12; switch(j) { case 0:strcpy(Note[i],"C"); break; case 1:strcpy(Note[i],"#C"); break; case 2:strcpy(Note[i],"D"); break; case 3:strcpy(Note[i],"#D"); break; case 4:strcpy(Note[i],"E"); break; case 5:strcpy(Note[i],"F"); break; case 6:strcpy(Note[i],"#F"); break; case 7:strcpy(Note[i],"G"); break; case 8:strcpy(Note[i],"#G"); break; case 9:strcpy(Note[i],"A"); break; case 10:strcpy(Note[i],"#A"); break; case 11:strcpy(Note[i],"B"); break; default:perror("sointu: Strange error..."); exit(3); } add_oct(Note[i],i/12); } freq=C0Frequency; for(i=0;i<55;i++) { sprintf(abuffer,"%4.4f",freq); strncpy(Frequency[i]," ",9-strlen(abuffer)); strcat(Frequency[i],abuffer); freq=freq*MFrequency; } if(argc<7) { puts("sointu - (C) Tommi Kaikkonen 1990, tommi@stekt.oulu.fi"); puts(" Usage:"); puts("sointu <E1-string> <A1-string> <D2-string> <G2-string> <B2-string> <E2-string>"); puts(" If the string is played freely give 0 as input for it."); puts(" If the string is not played at all give X or - as input for it."); puts(" For example sound C is entered for this program in the following way:"); puts("sointu 0 3 2 0 1 0"); perror("sointu: Not enough input for the strings."); exit(1); } for(i=1;i<7;i++) { if(argv[i][0]!='X'&&argv[i][0]!='x'&&argv[i][0]!='-'&& argv[i][0]!='0'&&(atoi(argv[i])<1||atoi(argv[i])>24)) { sprintf(abuffer,"sointu: Incorrect formula of the state of a string."); for(j=1;j<7;j++) { strcat(abuffer," "); if(j==i) strcat(abuffer,"(_"); strcat(abuffer,argv[j]); if(j==i) strcat(abuffer,"_)"); } strcat(abuffer,"\""); perror(abuffer); exit(2); } } puts("The sound with guitar:"); previous=0; for(i=1;i<7;i++) { if(argv[i][0]!='x'&&argv[i][0]!='X'&&argv[i][0]!='-') { printf ( " \"%s\": %2d %c %2d = %2d (%3s) / %4s Hz\n", Note[String[i-1]], previous, sgn(String[i-1]+atoi(argv[i])-previous), abs(String[i-1]+atoi(argv[i])-previous), String[i-1]+atoi(argv[i]), Note[String[i-1]+atoi(argv[i])], Frequency[String[i-1]+atoi(argv[i])] ); piano [ (String[i-1]+atoi(argv[i]))%12]|=BinPow[(String[i-1]+atoi(argv[i]))/12 ]; previous=String[i-1]+atoi(argv[i]); } } puts("The sound on piano keyboard;"); printf("_C1_D__E__F__G__A__B__C2_D__E__F__G__A__B__C3_D__E__F__G__A__B_\n"); printf("| | || | | | || || | | | || | | | || || | | | || | | | || || | \n"); /* |1|1||3| | |6||8||1| |2|1||3| | |6||8||1| |3|1||3| | |6||8||1| */ /* |O|_||_| | |_||_||0| |O|_||_| | |_||_||0| |O|_||_| | |_||_||0| */ /* |0 |2 |4 |5 |7 |9 |11|0 |2 |4 |5 |7 |9 |11|0 |2 |4 |5 |7 |9 |11 */ /* |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__ */ for(i=0;i<3;i++) { pianok(piano[1],i,&m); printf("| |%c",m); pianok(piano[3],i,&m); printf("||%c",m); pianok(piano[6],i,&m); printf("| | |%c",m); pianok(piano[8],i,&m); printf("||%c",m); pianok(piano[10],i,&m); printf("||%c| ",m); } printf("\n| |_||_| | |_||_||_| | |_||_| | |_||_||_| | |_||_| | |_||_||_| \n"); for(i=0;i<3;i++) { for(j=0;j<12;j+=2) { if(j==6) j--; pianok(piano[j],i,&m); printf("|%c ",m); } } printf("\n|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__\n"); }