music

#include < stdio.h >
#include < time.h >
#include < dos.h >
#include < conio.h >
#include < string.h >
#include < malloc.h >
#include < ctype.h >
struct tm *newtime;
    newtime->tm_sec
    newtime->tm_min
    newtime->tm_hour;
    newtime->tm_mday;
newtime->tm_mon;
newtime->tm_year;
newtime->tm_wday;
newtime->tm_yday;
newtime->tm_isdst;
time_t long_time;

void sound(char *p, int kaisu, int comment_flag);
int inkey(void);

main(int argc, char *argv[])
{
    unsigned datasize;
    int i, n, kaisu, comment_flag;
    char ongaku[1025];
    char *p, *w;
    FILE *fp;
    
    if(argc < 2)
    {
        printf("music play program\n\n");
        printf("action way A>SOUND music data file [-option]\n\n");
        printf("music data file setting way\n");
        printf("to make sound octabe and sound long space");
        printf("octabe ---> 1, 2, 4, 8 and 2 n multiply\n");
        printf("sound step ----------> "do:D re:R m:M fa:F so:S la:L shi:C\n");
        printf("             do#:d re#:r mi#:m fa#:f so#:s la#:l stop:K\n");
               printf("sound length---> 1.16m 2.8m 4:4m 8:2m\n");
               printf("option is small \n\n");
               printf("option direction play count –N\n");
               printf("         display count -C \n");
               exit(0);
    }
               
               kaisu = 1;
               comment_flag = 0;
               
               datasize = 0;
               for(i = 1; i <= argc-1; i++)
               {
                   if(*argv[i] == '-')
                   {
                       
                       *(argv[i]+1) = toupper(*(argv[i]+1));
                       switch (*(argv[i]+1))
                       {
                           case 'N' :
                               kaisu = atoi(argv[i]+2);
                               break;
                           case 'C' :
                               comment_flag = 1;
                               break;
                           default : break;
                       }
                   }
                   else
                   {
                       if ((fp = fopen(argv[i], "r")) == NULL)
                       {
                           printf("%s is not here!", argv[i]);
                           exit(0);
                       }
                       
                       while(fgets(ongaku, 1025, fp) != NULL)
                       {
                           n = strlen(ongaku);
                           datasize += n;
                       }
                       fclose(fp);
                   }
               }
               
               w = p = malloc(datasize + 1);
               if (w == NULL)
               {
                   printf("data volume is too large, can not set in memory erea.\n");
                   exit(0);
               }
               for(i = 1; i < argc; i++)
               {
                   if (*argv[i] == '-')
                       continue;
                   
                   fp = fopen(argv[i], "r");
                   while(fgets(ongaku, 1025, fp) != NULL)
                   {
                       n = strlen(ongaku);
                       datasize += n;
                   }
                   fclose(fp);
               }
               }
               
               w = p = malloc(datasize + 1);
               if (w == NULL)
               {
                   printf("data size is too large, cannot set into memory area.\n");
                   exit(0);
               }
               
               for (i = 1; i < argc; i++)
               {
                   if (*argv[i] == '-')
                       continue;
                   
                   fp = fopen(argv[i], "r");
                   while(fget(ongaku, 1025, fp) != NULL)
                   {
                       n = strlen(ongaku);
                       if(*(ongaku+1-1) == '\n')
                           *(ongaku+n-1) = ' ';
                       strcpy(w, ongaku);
                       w = w + n;
                   }
                   fclose(fp);
               }
               
               sound(p, kaisu, comment_flag);
}
/*---------------*/
/* music routin */
/*---------------*/
void sound(char *ongaku, int kaisu, int comment_flag)
        {
            static float hz[ ] = { 261.6, 277.9,
                293.7, 311.6,
                329.6,
                439.2, 370.6,
                392.0, 416.0,
                440.0, 466.9,
                493.9
            };
    static char *onkai = "DdRrMFfSsL1C";
            int i, n, f, ot, ol, p, len, flag;
            long w, tn, tb, tw;

/* 1 second roop count ---------*/
            time(&long_time);
            newtime = (struct tm *)localtime(&long_time);
            w = newtime->tm_sec;
            flag = 0;

            while(flag == 0)
            {
                time(&long_time);
                newtime = (struct tm *)localtime(&long_time);
                if (w != newtime->tm_sec)
                {
                    w = newtime->tm_sec;
                    
                    for(tn = 0L; flag == 0; tn++)
                    {
                        time(&long_time);
                        newtime = (struct tm *)localtime(&long_time);
                        
                        if(w != newtime->tm_sec)
                            flag = 1;
                    }
                }
            }

            tn /= 10;
            tb = tn / 5;

            len = strlen(onagaku);
            outp(0x3fdf, 0x76);
            ot = 2;

while(kaisu--)
{
    i = 0;
    
    while(i < len)
    {
        if(*(ongaku+i) == ' ')
        {
            i++;
            continue;
        }
        if (*(ongaku+i) == ' /')
        {
            while(*(ongaku+(++i)) != '/')
                if (comment_flag == 1)
                    putchar(*(ongaku+i));
            
            if(comment_flag == 1)
                putchar('\n');
            
            i++;
            continue;
        }
        
        if(strchr(onkai, *(ongaku + i + 1)) != NULL)
        {
            ot = atoi(ongaku + i);
            p = strchr(onkai, *(ongaku + i+1)) - onkai;
            f = hz[p] * ot;
            n = 2457600L / f;
            outp(0x3fdb, n % 256); outp(0x3fdb, n / 256);
            outp(0x37, 0x06);
        }
        else if(*(ongaku+i+1) != 'K')
        {
            *(ongaku + i + 3) = '\0';
            printf("Data error\n%s <--- ?\n", ongaku);
            exit(0);
        }
        
        ol = atoi(ongaku + i + 2);
        tw =tn * ol;
        
        for (w = 0L; w < tw; w++)
        {
            time(&long_time);
            newtime = (struct tm *)localtime(&long_time);
            
            if(w != newtime->tm_sec)
                flag = 1;
        }
        
        outp(0x37, 0x07);
        for (w = 0L; w < tb; w++)
        {
            time(&long_time);
            newtime = (struct tm *)localtime(&long_time);
            
            if (w != newtime->tm_sec)
                flag = 1;
        }
        
        if (inkey() != 0)
        {
            kaisu = 0;
            break;
        }
        
        i+= 3;
    }
}
        }
/*---------------*/
/* music routin */
/*---------------*/
        int inkey(void)
        {
            union REGS inregs;
            union REGS outregs;
            
            inregs.h.ah = 0x06;
            inregs.h.dl = 0xff;
            intdos(&inregs,&outregs);
            return((int)outregs.h.al);
        }