[alt.sources] sounds w/o guitar/piano

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");
}