共有回帖数  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 回复
						 
						 
           
          
          
         
   
         
      
 
   
             
                  
                  
 
 
 
     
	 
  
	Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知