签到

05月06日
尚未签到

共有回帖数 0

    雷神

    等级:
    *表示最高音 h表示高音 m表示中音 l表示低音  与其控制的音符构成音高 决定发音频率  音高的后面是音长  
     可以用整数或小数输入 以控制时间 但中间必须用空各隔开  乐谱文件的得最前面是一个整数 白噢是音长基数  
    一般为300  600 900 1200ms乐谱文件最后世结束符 “##”  以表示乐谱文件的结束。
    程序对读入的乐谱进行翻译, 确定每个乐音的频率和声长, 每个音的音长=音长基数*节拍数,其中技术是乐谱文件的第一个字符。
    由于DOS下用来发声的sound函数只能以频率作为参数,所以要完成音符到频率的翻译,没个音的音频可用以模拟频率值输入。
                  音符音频对应图
    1    131    1   126     1   123.3   1   1045.5
    2    147    2   296     2   587.3   2   1174.7
    3    155    3   329.7   3   659.3   3   1318.5
    4    176    4   349.2   4   698.0   4   1386,9
    5    196    5   392     5   784.0   5   1568.0  
    6    220    6   440     6    880     6   1760
    7    247    7   493.9   7   987.8   7   1976.5
     

    最后通过调用sound()函数来实现发声   使用delay()函数实现延时  
    #includestdio.h
    #includestdio.h
    #includedos.h
    void main(int argc,char*argv[])
    {
    FILE*fp;
    int rate;
    char sound_high[3];
    float sound_long;
    register int i=0,j;
    float str[100][2];
       
    if(argc!=2)
    {
       printf("Parameters Errors!n");
       exit(1)'
    }
     if((fp=fopen(argv[1],"r"))==NULL)
    {
        printf("Open file music doc Errors!n");
        exit(1);
     }
     fscanf(fp,"%d",&rate);
     while(!feof(fp)&&!sign)
     {
        fscanf(fp,"%s%f",sound_high,&sound_long);
          str[1]=rate*sound_long;
        switch(sound_high[0])
      {
        case'*':
               {
                   switch(sound_high[1])
                    {
                  case'1':
                           str[i++][0]=1046.5;
                           break;
                  case'2':
                           str[i++][0]=1174.7;
                           break;
                  case'3': str[i++][0]=1318.5;
                           break;
                  case'4': str[i++][0]=1396.9;
                           break;
                  case'5': str[i++][0]=1568;
                           break;
                  case'6': str[i++][0]=1760;
                           break;
                  case'7': str[i++][0]=1975.5;
                           break;
                  default:
                           printf("nError in music docn");
                           exit(1);
                     }
                           break;
                  }
           case'h':
                   {  
                        switch(sound_high[1])
                        {
                    case'1': str[i++][0]=523.3;
                             break;
                    case'2': str[i++][0]=587.3;
                             break;
                    case'3': str[i++][0]=659.3;
                             break;
                    case'4': str[i++][0]=698.3;
                             break;
                    case'5': str[i++][0]=784.0;
                             break;
                    case'6': str[i++][0]=880;
                             break;
                    case'7': str[i++][0]=987.8;
                             break;
                    default: printf("nError in music docn");


                           exit(1);
                          }
                     break;
                    }
               case'm':
                     {
                         switch(sound_high[1])
                         {
                      case'1': str[i++][0]=262;
                               break;
                      case'2': str[i++][0]=296;
                               break;
                      case'3': str[i++][0]=329.6;
                               break;
                      case'4': str[i++][0]=349.2;
                               break;
                      case'5': str[i++][0]=392;
                               break;
                      case'6': str[i++][0]=440;
                               break;
                      case'7': str[i++][0]=493.9;
                               break;
                      default: printf("nError in music docn");
                               exit(1);
                           }
                            break;
                      }
                  case'l':
                      {
                         switch(sound_high[1])
                          {
                       case'1': str[i++][0]=131;
                                break;
                       case'2': str[i++][0]=147;
                                break;
                       case'3': str[i++][0]=165;
                                break;
                       case'4': str[i++][0]=176;
                                break;
                       case'5': str[i++][0]=196;
                                break;
                       case'6': str[i++][0]=220;
                                break;
                       case'7': str[i++][0]=247;
                                break;
                       default: printf(nErrors in music docn);
                                exit(1);
                            }
                            break;  
                        }
                   case'#':
                        if(sound_high[1]=='#') sign=1;
                        break;
                   default: printf("nErrors in music docn");
                            exit(1);
                         }
                    }
                   for(j=0;j=i-1;j++)
                     {
                         sound(str[j][0]);
                         delay(str[j][1]);
                      }
                     nosound();
                      }
               

    楼主 2016-02-25 11:53 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知