home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 1 / 1804 < prev    next >
Internet Message Format  |  1990-12-28  |  5KB

  1. From: tommi@stekt.oulu.fi (Tommi V. Kaikkonen ti)
  2. Newsgroups: alt.sources
  3. Subject: sounds w/o guitar/piano (sointu.c)
  4. Message-ID: <TOMMI.90Sep3040820@stekt.oulu.fi>
  5. Date: 3 Sep 90 01:04:17 GMT
  6.  
  7. /**************************************************************************
  8. *                                                                         *
  9. *  sointu.c - to examine sounds of guitar with or without one             *
  10. *             (C) Tommi Kaikkonen 1990                                    *
  11. *             InterNet: tommi@stekt.oulu.fi                               *
  12. *                                                                         *
  13. **************************************************************************/
  14. #define C0Frequency (261.6250)
  15. #define MFrequency (1.05946309434)
  16. char Frequency[56][10];
  17.  
  18. #include <stdio.h>
  19. int String[6]={4, 9, 14, 19, 23, 28 };
  20. int BinPow[8]={1, 2, 4, 8, 16, 32, 64, 128 };
  21.  
  22. int abs(i1)
  23. int i1;
  24. {
  25.   int r=0;
  26.   if(i1<0) r=-i1;
  27.   if(i1>0) r=i1;
  28.   return(r);
  29. }
  30.  
  31. char sgn(i1)
  32. int i1;
  33. {
  34.   char r;
  35.   if(i1<0) r='-';
  36.   if(i1>=0) r='+';
  37.    return(r);
  38. }
  39.  
  40. pianok(i1,i2,c1)
  41. int i1;
  42. char *c1;
  43. {
  44.   c1[0]=' ';
  45.   if(i1&BinPow[i2]) c1[0]='O';
  46.     else if(i1) c1[0]='.';
  47. }
  48.  
  49. add_oct(s1,i1)
  50. char *s1;
  51. int i1;
  52. {
  53.   int i;
  54.   i=strlen(s1);
  55.   s1[i]='1'+i1;
  56.   s1[i+1]='\000';
  57. }
  58.  
  59. main(argc,argv)
  60. int argc;
  61. char *argv[];
  62. {
  63.   int i,j;
  64.   int previous;
  65.   char abuffer[80];
  66.   char m;
  67.   int piano[12];
  68.   float freq;
  69.   int Note[56][6];
  70.   /*  #C #D    #F #G #A   */
  71.   /* C  D  E  F  G  A  B  */
  72.   /* 0  2  4  5  7  9  11 */
  73.   for(i=0;i<12;i++) piano[i]=0;
  74.   for(i=0;i<55;i++)
  75.   {
  76.     j=i%12;
  77.     switch(j)
  78.     {
  79.       case 0:strcpy(Note[i],"C");
  80.     break;
  81.       case 1:strcpy(Note[i],"#C");
  82.     break;
  83.       case 2:strcpy(Note[i],"D");
  84.     break;
  85.       case 3:strcpy(Note[i],"#D");
  86.     break;
  87.       case 4:strcpy(Note[i],"E");
  88.     break;
  89.       case 5:strcpy(Note[i],"F");
  90.     break;
  91.       case 6:strcpy(Note[i],"#F");
  92.     break;
  93.       case 7:strcpy(Note[i],"G");
  94.     break;
  95.       case 8:strcpy(Note[i],"#G");
  96.     break;
  97.       case 9:strcpy(Note[i],"A");
  98.     break;
  99.       case 10:strcpy(Note[i],"#A");
  100.     break;
  101.       case 11:strcpy(Note[i],"B");
  102.     break;
  103.       default:perror("sointu: Strange error...");
  104.     exit(3);
  105.     }
  106.     add_oct(Note[i],i/12);
  107.   }
  108.   freq=C0Frequency;
  109.   for(i=0;i<55;i++)
  110.   {
  111.     sprintf(abuffer,"%4.4f",freq);
  112.     strncpy(Frequency[i],"    ",9-strlen(abuffer));
  113.     strcat(Frequency[i],abuffer);
  114.     freq=freq*MFrequency;
  115.   }
  116.  
  117.   if(argc<7)
  118.   {
  119.     puts("sointu - (C) Tommi Kaikkonen 1990, tommi@stekt.oulu.fi");
  120.     puts("  Usage:");
  121.     puts("sointu <E1-string> <A1-string> <D2-string> <G2-string> <B2-string> <E2-string>");
  122.     puts("  If the string is played freely give 0 as input for it.");
  123.     puts("  If the string is not played at all give X or - as input for it.");
  124.     puts("  For example sound C is entered for this program in the following way:");
  125.     puts("sointu 0 3 2 0 1 0");
  126.     perror("sointu: Not enough input for the strings.");
  127.     exit(1);
  128.   }
  129.   for(i=1;i<7;i++)
  130.   {
  131.     if(argv[i][0]!='X'&&argv[i][0]!='x'&&argv[i][0]!='-'&&
  132.        argv[i][0]!='0'&&(atoi(argv[i])<1||atoi(argv[i])>24))
  133.     {
  134.       sprintf(abuffer,"sointu: Incorrect formula of the state of a string.");
  135.       for(j=1;j<7;j++)
  136.       {
  137.     strcat(abuffer," ");
  138.     if(j==i) strcat(abuffer,"(_");
  139.     strcat(abuffer,argv[j]);
  140.     if(j==i) strcat(abuffer,"_)");
  141.       }
  142.       strcat(abuffer,"\"");
  143.       perror(abuffer);
  144.       exit(2);
  145.     }
  146.   }
  147.   puts("The sound with guitar:");
  148.   previous=0;
  149.   for(i=1;i<7;i++)
  150.   {
  151.     if(argv[i][0]!='x'&&argv[i][0]!='X'&&argv[i][0]!='-')
  152.     {
  153.       printf
  154.       (
  155.         "  \"%s\": %2d %c %2d = %2d (%3s) / %4s Hz\n",
  156.         Note[String[i-1]],
  157.         previous,
  158.         sgn(String[i-1]+atoi(argv[i])-previous),
  159.         abs(String[i-1]+atoi(argv[i])-previous),
  160.         String[i-1]+atoi(argv[i]),
  161.         Note[String[i-1]+atoi(argv[i])],
  162.         Frequency[String[i-1]+atoi(argv[i])]
  163.       );
  164.       piano
  165.       [
  166.         (String[i-1]+atoi(argv[i]))%12]|=BinPow[(String[i-1]+atoi(argv[i]))/12
  167.       ];
  168.       previous=String[i-1]+atoi(argv[i]);
  169.     }
  170.   }
  171.   puts("The sound on piano keyboard;");
  172.   printf("_C1_D__E__F__G__A__B__C2_D__E__F__G__A__B__C3_D__E__F__G__A__B_\n");
  173.   printf("| | || | | | || || | | | || | | | || || | | | || | | | || || | \n");
  174.   /*      |1|1||3| | |6||8||1| |2|1||3| | |6||8||1| |3|1||3| | |6||8||1|  */
  175.   /*      |O|_||_| | |_||_||0| |O|_||_| | |_||_||0| |O|_||_| | |_||_||0|  */
  176.   /*      |0 |2 |4 |5 |7 |9 |11|0 |2 |4 |5 |7 |9 |11|0 |2 |4 |5 |7 |9 |11 */
  177.   /*      |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__ */
  178.   for(i=0;i<3;i++)
  179.   {
  180.     pianok(piano[1],i,&m);
  181.     printf("| |%c",m);
  182.     pianok(piano[3],i,&m);
  183.     printf("||%c",m);
  184.     pianok(piano[6],i,&m);
  185.     printf("| | |%c",m);
  186.     pianok(piano[8],i,&m);
  187.     printf("||%c",m);
  188.     pianok(piano[10],i,&m);
  189.     printf("||%c| ",m);
  190.   }
  191.   printf("\n| |_||_| | |_||_||_| | |_||_| | |_||_||_| | |_||_| | |_||_||_| \n");
  192.   for(i=0;i<3;i++)
  193.   {
  194.     for(j=0;j<12;j+=2)
  195.     {
  196.       if(j==6) j--;
  197.       pianok(piano[j],i,&m);
  198.       printf("|%c ",m);
  199.     }
  200.   }
  201.   printf("\n|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__\n");
  202. }
  203.