當前位置:首頁 » 編程軟體 » 怎麼編程樂譜

怎麼編程樂譜

發布時間: 2025-09-25 04:01:40

1. c語言怎麼寫插入音樂的程序

http://..com/question/231143472.html?push=core
http://..com/question/24018920.html

實訓項目三 樂譜播放程序設計
2009-03-19 21:25
一、實訓目的
1、用C語言開發音樂程序,寫自己喜歡或創作的音樂,使在沒有樂器的情況下聽到自己創作的音樂。
2、鞏固文件讀取和數組的有關知識。
3、學習使用PC機揚聲器的兩個控制函數。
二、功能要求
自己創作樂曲,將其轉換為計算機程序能夠識別的電子文本格式,利用PC機揚聲器的功能播放該樂曲。
三、編程參考
1、發聲原理
編寫音樂程序時,首先需要製作被演奏音樂的樂譜文件。製作樂譜文件可用不同的符號標記,只要所編制的程序易於識別即可。
下面是編制樂譜文件的一種規則:最高音在每個音的前面加「*」:高音,在每個音的前面加「h」;中音,在每個音的前面加「m」;低音,在每個音的前面加「l」。
「*」,「h」,「m」,「l」 與其控制的音符構成音高,決定發聲頻率。音高的後面是音長,可用整數或小數輸入,以控制延時,但中間必須用空格分開。樂譜文件的最前端是一個整數,表示音長基數,一般為300的倍數。樂譜文件的最末端是樂譜文件結束符「##」,以表示樂譜文件結束。
每個音的音長=音長基數*節拍數,其中,音長基數是樂譜文件的第一個字元,如上面樂譜文件為3600,每個音的音頻可用一模擬頻率值輸入。下面是中央C及其前後4個8度中各個音符的頻率值
低8度 1 2 3 4 5 6 7
131 147 165 176 196 220 247
中央C 1 2 3 4 5 6 7
262 296 329.7 349.2 392 440 493.9
高8度 1 2 3 4 5 6 7
523.3 587.3 659.3 698.5 784.0 880 987.8
2、PC機揚聲器的兩個控制函數
sound() 以指定頻率打開PC機的揚聲器,頻率以赫茲為單位。
nosound() 關閉揚聲器。
3、樂譜實例
巴赫的《小步舞曲》:
600 h2 4 m5 1 m6 1 m7 1 h1 1 h2 4 m5 4 m5 4 h3 4 h1 1 h2 1 h3 1 h4 1 h5 4 m5 4 m5 4 h1 4 h2 1 h1 1 m7 1 m6 1 m7 4 h1 1 m7 1 m6 1 m5 1 m4 4 m5 1 m6 1 m7 1 m5 1 m6 6 l2 1 m1 1 l7 1 l6 1 h2 4 m5 1 m6 1 m7 1 h1 1 h2 4 m5 4 m5 4 h3 4 h1 1 h2 1 h3 1 h4 1 h5 4 m5 4 m5 4 h1 4 h2 1 h1 1 m7 1 m6 1 m7 4 h1 1 m7 1 m6 1 m5 1 m6 4 m7 1 m6 1 m5 1 m4 1 m5 10 ##
四、拓展訓練
1、製作選曲菜單,使其可以播放多首樂曲;
2、修改某些參數,改變樂曲播放速度。
源程序
#include<stdio.h>
#include<stdlib.h>
#include<dos.h>
void main(int argc,char *argv[])
{ FILE *fp;
int rate;
char sound_high[3];
int sound_long;
register int i=0,j;
int sign=0;
float str[200][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%d",sound_high,&sound_long); /*得到音頻,音長的數值*/
str[i][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("\nErrors in music.doc\n");
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.5;
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("\nErrors in music.doc\n");
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("\nErrors in music.doc\n");
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.doc\n");
exit(1);
}
break;
case'#':
if(sound_high[1]=='#')sign=1;
break;
default:
printf("\nErrors in music.doc\n");
exit(1);
} }
for(j=0;j<=i-1;j++)
{ sound(str[j][0]); /*按頻率發出歌曲的音調*/
delay(str[j][1]);
} nosound(); /*關閉揚聲器*/
}

熱點內容
vcado資料庫使用 發布:2025-09-25 13:59:39 瀏覽:141
md解算布料需要什麼電腦配置 發布:2025-09-25 13:53:17 瀏覽:167
mysql存儲圖片資料庫中 發布:2025-09-25 13:52:31 瀏覽:791
java遍歷是什麼意思 發布:2025-09-25 13:30:19 瀏覽:621
go動態庫編譯 發布:2025-09-25 13:06:18 瀏覽:633
c語言s在scanf 發布:2025-09-25 13:04:52 瀏覽:186
linuxserver命令 發布:2025-09-25 13:03:05 瀏覽:23
file上傳圖片html 發布:2025-09-25 12:52:28 瀏覽:716
禁止訪問視頻網站 發布:2025-09-25 12:50:03 瀏覽:687
別克昂科威什麼配置有電動尾門 發布:2025-09-25 12:42:19 瀏覽:486