本程序使用了文件指针,字符串数组,Beep蜂鸣函数等完成。
不用依靠单片机,我们依然可以实现音乐的演奏,此程序设计较为简单,仅支持在四分音符以上,六拍以下的音乐使用,也可以自行更改曲谱的延长时间实现更长或者更短的演奏。
Sleep函数:Sleep(T)表示在运行时停留T毫秒。
Beep函数:Beep(X,T);X和T分别代表发声频率和发声时长。
我个人使用了歌曲《上邪》作为示例。
1简谱
2频率表
3源程序
采用"d","z","g"表示低音,中音和高音,每个音阶有7个音,没有制作升音,本程序使用第5八度作为中音,如果歌曲音阶跨幅太大,也可以自己补充频率。
#include <stdio.h>
#include<iostream>
#include <windows.h>
#include<string>
#include<math.h>
#include<stdlib.h>void fayin (char ch, char kh, char time, char ting);
int main()
{FILE *p;char zongci[99999]="你嫁衣如火灼伤了天涯/从此残阳烙我心上如朱砂/都说你眼中开倾世桃花/却如何一夕桃花雨下/问谁能借我回眸一眼/去逆流回溯遥迢的流年/循着你为我轻咏的上邪/再去见你一面/在那远去的旧年/我笑你轻许了姻缘/是你用尽一生吟咏上邪/而我转身轻负你如花美眷/那一年的长安飞花漫天/我听见塞外春风泣血/轻嗅风中血似酒浓烈/耳边兵戈之声吞噬旷野/火光里飞回的雁也呜咽/哭声传去多远/那首你咏的上邪/从此我再听不真切/敌不过的哪是似水流年/江山早为你我说定了永别/于是你把名字刻入史笺/换我把你刻在我坟前/飞花又散落在这个季节/而你嫁衣比飞花还要艳烈/你启唇似又要咏遍上邪/说的却是我愿与君绝/";//zongci字符串存储歌词,歌词存储最好不要有符号。 int i;p = fopen("shangye.txt","r");//编写文本时,用了五个字符,例如z420T的形式编写,z4代表中音fa,20分别代表持续半拍,暂停0拍,T或t表示需要显示歌词(一个字)。 if(p==NULL){printf("文件无法打开!");exit(1);}printf("正在播放...\n上邪 小曲儿\n"); //歌名在这里可以更改 char ch,kh,time,ting;//ch,kh,time,ting分别代表发什么音阶,什么音调,什么时长,停止多久 char chang[6];int fl=1;//建立标志,文件读入结束时退出 int sl=0,k=0;Sleep(1500); //播放之前先停留1.5秒 for(;;){sl=0;for(i=0;;i++){chang[i]=fgetc(p);if(chang[i]=='\n' || chang[i]=='*')//不读取\n和*,为编写文档的时候方便在某个地方写上‘*’做标记 {i--;}if(chang[i]==EOF){fl=0;break;}if(chang[i]=='/'){sl=1;//读取成功标志 break;}}int zi=0;if(sl==1){ch=chang[0];kh=chang[1];time=chang[2];ting=chang[3]; for(int chu=4;chang[chu]!='/';chu++){if(chang[chu]=='T' || chang[chu]=='t'){zi++;//一次显示多少个字,取决于文件中'/'前T的个数 }//显示歌词 }}if(!fl) break;//读取完成,fl=0,文件退出 if(sl==1) //发音并打字{if(zi>=1){ char ci[16];int ing=0;for(ing=0;ing<(zi*2);ing++){if(zongci[k]!='/'){ci[ing]=zongci[k++];}else{printf("\n");k++;ing--;}}ci[ing]='\0';printf("%s",ci);}fayin(ch,kh,time,ting);}}if(fclose(p)){printf("文件无法关闭!");exit(1);}printf("\n播放完成!");Sleep(60000);return 0;
}
void fayin (char ch, char kh, char time, char ting)//发音函数
{int tm,tg;//时长转换需要用到的变量int jizhun=210;//基准时间,通过更改它可以改变曲速 if(time=='1') tm=jizhun*1;else if(time=='2') tm=jizhun*2;else if(time=='3') tm=jizhun*3;else if(time=='4') tm=jizhun*4;//一拍 else if(time=='5') tm=jizhun*5;else if(time=='6') tm=jizhun*6;else if(time=='7') tm=jizhun*7;else if(time=='8') tm=jizhun*8;//两拍 else if(time=='9') tm=jizhun*9;else if(time=='a') tm=jizhun*10;else if(time=='b') tm=jizhun*11;else if(time=='c') tm=jizhun*12;//三拍 else if(time=='d') tm=jizhun*13;else if(time=='e') tm=jizhun*14;else if(time=='f') tm=jizhun*15;else if(time=='g') tm=jizhun*16;//四拍 else if(time=='h') tm=jizhun*17;else if(time=='i') tm=jizhun*18;else if(time=='j') tm=jizhun*19;else if(time=='k') tm=jizhun*20;//五拍 else if(time=='l') tm=jizhun*21;else if(time=='m') tm=jizhun*22;else if(time=='n') tm=jizhun*23;else if(time=='o') tm=jizhun*24;//六拍;延长时间if(ting=='0') tg=0;else if(ting=='1') tg=jizhun*1;else if(ting=='2') tg=jizhun*2;else if(ting=='3') tg=jizhun*3;else if(ting=='4') tg=jizhun*4;else if(ting=='5') tg=jizhun*5;else if(ting=='6') tg=jizhun*6;else if(ting=='7') tg=jizhun*7;else if(ting=='8') tg=jizhun*8;else if(ting=='9') tg=jizhun*9;else if(ting=='a') tg=jizhun*10;else if(ting=='b') tg=jizhun*11;else if(ting=='c') tg=jizhun*12;else if(ting=='d') tg=jizhun*13;else if(ting=='e') tg=jizhun*14;else if(ting=='f') tg=jizhun*15;else if(ting=='g') tg=jizhun*16;else if(ting=='h') tg=jizhun*17;else if(ting=='i') tg=jizhun*18;else if(ting=='j') tg=jizhun*19;else if(ting=='k') tg=jizhun*20;else if(ting=='l') tg=jizhun*21;else if(ting=='m') tg=jizhun*22;else if(ting=='n') tg=jizhun*23;else if(ting=='o') tg=jizhun*24;//停止时间 if(ch=='d'){if(kh=='1'){Beep(261,tm);}else if(kh=='2'){Beep(293,tm);}else if(kh=='3'){Beep(329,tm);}else if(kh=='4'){Beep(349,tm);}else if(kh=='5'){Beep(392,tm);}else if(kh=='6'){Beep(440,tm);}else if(kh=='7'){Beep(493,tm);}}else if(ch=='z'){if(kh=='1'){Beep(523,tm);}else if(kh=='2'){Beep(587,tm);}else if(kh=='3'){Beep(659,tm);}else if(kh=='4'){Beep(698,tm);}else if(kh=='5'){Beep(784,tm);}else if(kh=='6'){Beep(880,tm);}else if(kh=='7'){Beep(987,tm);}}else if(ch=='g'){if(kh=='1'){Beep(1046,tm);}else if(kh=='2'){Beep(1174,tm);}else if(kh=='3'){Beep(1318,tm);}else if(kh=='4'){Beep(1396,tm);}else if(kh=='5'){Beep(1568,tm);}else if(kh=='6'){Beep(1760,tm);}else if(kh=='7'){Beep(1975,tm);}}Sleep(tg);
}
4歌谱(歌谱是以txt形式保存在与源文件同目录的地方的)
g510/g310/z688/g510/g310/g18a/
z320T/z660T/g120T/g230T/z730T/z520T/z530T/z320T/
z730T/z641T/**z620T/z520T/z642T/g120T/z721T/z531T/
z120T/z230T/z320T/z521T/z351T/**z320T/z660T/g120T/
g230T/z730T/z520T/g330T/z720T/g221T/g132T/**z620T/g120T/g230T/g330T/g120T/z730T/z530T/z320T/
z688T/****z330T/z130T/d620T/z230T/d732T/z130T/d730T/d520T/
d642T/**d620T/z160T/d710T/z110/z230T/d730T/d520T/
z430T/z330T/z220T/z342T/**z320T/z460T/z420T/z430T/z330T/z220T/z330T/z220T/
z330T/z141T/**d620T/z260T/z320T/z242T/z140T/z395T/**z520T/z672/z720T/z620T/z530T/z330T/z220T/z142T/**z120T/z430T/z530T/z620T/z630T/g130T/z620T/
z794T/****z320T/z660T/g120T/g230T/z730T/z520T/z530T/z320T/
z730T/z641T/**z620T/z520T/z642T/g120T/z721T/z531T/
z120T/z230T/z320T/z521T/z351T/**z320T/z660T/g120T/
g230T/z730T/z520T/g330T/z720T/g221T/g132T/**z620T/g120T/g230T/g330T/g120T/z730T/z530T/z320T/
z688T/****d540/d682/z120/z220/z320/d782/d520/d320/
d720/d651/d710/z110/z220/z120/z220/z620/
z530/z362/d620/z120/z384/z640/z571/z271/
z171/d740/d540/d688/z330T/z130T/d620T/z230T/d732T/z130T/d730T/d520T/
d642T/**d620T/z160T/d710T/z110/z230T/d730T/d520T/
z430T/z330T/z220T/z342T/**z320T/z460T/z420T/z430T/z330T/z220T/z330T/z220T/
z330T/z141T/**d620T/z260T/z320T/z242T/z120T/z397T/**z520T/z672/z720T/z620T/z530T/z330T/z220T/z142T/**z120T/z430T/z530T/z620T/g130T/g230T/z620T/
z794T/****z320T/z660T/g120T/g230T/z730T/z520T/z530T/z320T/
z730T/z641T/**z620T/z520T/z660T/g120T/z721T/z530T/
z320/z230TT/z320T/z520T/z351T/**z320T/z660T/g120T/
g230T/z730T/z520T/g330T/z720T/g221T/g132T/**z620T/g120T/g230T/g330T/g120T/z730T/z530T/z320T/
z664T/****z320T/z660T/g120T/g230T/z730T/z520T/z530T/z320T/
z730T/z641T/**z620T/z520T/z660T/g120T/z721T/z530T/
z320T/z230T/z320T/z520T/z351T/**z320T/z660T/g120T/
g230T/z730T/z520T/g330T/z720T/g221T/g132T/**z620T/g120T/g230T/g330T/g120T/z730T/g130T/z720T/
z688T/****
注意,歌谱是写在与代码相同的文件夹里,并且是以txt文本的形式保存的。文本名字与程序里fopen后面的名字相同,所以上方的文本名字应该是”shangye.txt“,如果想用其他的命名,需要源代码里面的txt前的名字保持一致,如果文本叫”gupu.txt“,那么fopen对应的文件名也应该是”gepu.txt“。不能在文件中写入歌词,会因为编码混乱而导致输出乱码。歌词存储于zongci字符串中,每条'/'会在程序内对应实现换行,如果需要更改歌名,在对应位置改变即可。
5最后再附上一首歌曲《牵丝戏》
#include <stdio.h>
#include<iostream>
#include <windows.h>
#include<string>
#include<math.h>
#include<stdlib.h>void fayin (char ch, char kh, char time, char ting);
int main()
{FILE *p;char zongci[99999]="嘲笑谁恃美扬威/没了心如何相配/盘铃声清脆/帷幕间灯火幽微/我和你最天生一对/没了你才算原罪/没了心才好相配/你褴褛我彩绘/并肩行过山与水/你憔悴我替你明媚/是你吻开笔墨/染我眼角珠泪/演离合相遇悲喜为谁?/他们迂回误会/我却只由你支配/问世间哪有更完美?/兰花指捻红尘似水/三尺红台/万事入歌吹/唱别久悲不成悲/十分红处竟成灰/愿谁记得谁/最好的年岁/你一牵我舞如飞/你一引我懂进退/苦乐都跟随/举手投足不违背/将谦卑温柔成绝对/你错我不肯对/你懵懂我蒙昧/心火怎甘心扬汤止沸?/你枯我不曾萎/你倦我也不敢累/用什么暖你一千岁?/风雪依稀秋白发尾/灯火葳蕤/揉皱你眼眉/假如你舍一滴泪/假如老去我能陪/烟波里成灰/也去得完美/风雪依稀秋白发尾/灯火葳蕤/揉皱你眼眉/假如你舍一滴泪/假如老去我能陪/烟波里成灰/也去得完美";//zongci字符串存储歌词,歌词存储最好不要有符号。 int i;p = fopen("qiansixi.txt","r");//编写文本时,用z420T的形式编写,z4代表中音fa,20分别代表持续半拍,暂停0拍,T表示需要显示歌词(一个字)。 if(p==NULL){printf("文件无法打开!");exit(1);}printf("正在播放...\n牵丝戏 银临\n"); //歌名在这里可以更改 char ch,kh,time,ting;//ch,kh,time,ting分别代表发什么音阶,什么音调,什么时长,停止多久 char chang[6];int fl=1;//建立标志,文件读入结束时退出 int sl=0,k=0;Sleep(1500); //播放之前先停留1.5秒 for(;;){sl=0;for(i=0;;i++){chang[i]=fgetc(p);if(chang[i]=='\n' || chang[i]=='*')//不读取\n和*,为编写文档的时候方便在某个地方写上‘*’做标记 {i--;}if(chang[i]==EOF){fl=0;break;}if(chang[i]=='/'){sl=1;//读取成功标志 break;}}int zi=0;if(sl==1){ch=chang[0];kh=chang[1];time=chang[2];ting=chang[3]; for(int chu=4;chang[chu]!='/';chu++){if(chang[chu]=='T' || chang[chu]=='t'){zi++;//一次显示多少个字,取决于文件中'/'前T的个数 }//显示歌词 }}if(!fl) break;//读取完成,fl=0,文件退出 if(sl==1) //发音并打字{if(zi>=1){ char ci[16];int ing=0;for(ing=0;ing<(zi*2);ing++){if(zongci[k]!='/'){ci[ing]=zongci[k++];}else{printf("\n");k++;ing--;}}ci[ing]='\0';printf("%s",ci);}fayin(ch,kh,time,ting);}}if(fclose(p)){printf("文件无法关闭!");exit(1);}printf("\n播放完成!");Sleep(60000);return 0;
}
void fayin (char ch, char kh, char time, char ting)//发音函数
{int tm,tg;//时长转换需要用到的变量int jizhun=186;//基准时间,通过更改它可以改变曲速 if(time=='1') tm=jizhun*1;else if(time=='2') tm=jizhun*2;else if(time=='3') tm=jizhun*3;else if(time=='4') tm=jizhun*4;//一拍 else if(time=='5') tm=jizhun*5;else if(time=='6') tm=jizhun*6;else if(time=='7') tm=jizhun*7;else if(time=='8') tm=jizhun*8;//两拍 else if(time=='9') tm=jizhun*9;else if(time=='a') tm=jizhun*10;else if(time=='b') tm=jizhun*11;else if(time=='c') tm=jizhun*12;//三拍 else if(time=='d') tm=jizhun*13;else if(time=='e') tm=jizhun*14;else if(time=='f') tm=jizhun*15;else if(time=='g') tm=jizhun*16;//四拍 else if(time=='h') tm=jizhun*17;else if(time=='i') tm=jizhun*18;else if(time=='j') tm=jizhun*19;else if(time=='k') tm=jizhun*20;//五拍 else if(time=='l') tm=jizhun*21;else if(time=='m') tm=jizhun*22;else if(time=='n') tm=jizhun*23;else if(time=='o') tm=jizhun*24;//六拍;延长时间if(ting=='0') tg=0;else if(ting=='1') tg=jizhun*1;else if(ting=='2') tg=jizhun*2;else if(ting=='3') tg=jizhun*3;else if(ting=='4') tg=jizhun*4;else if(ting=='5') tg=jizhun*5;else if(ting=='6') tg=jizhun*6;else if(ting=='7') tg=jizhun*7;else if(ting=='8') tg=jizhun*8;else if(ting=='9') tg=jizhun*9;else if(ting=='a') tg=jizhun*10;else if(ting=='b') tg=jizhun*11;else if(ting=='c') tg=jizhun*12;else if(ting=='d') tg=jizhun*13;else if(ting=='e') tg=jizhun*14;else if(ting=='f') tg=jizhun*15;else if(ting=='g') tg=jizhun*16;else if(ting=='h') tg=jizhun*17;else if(ting=='i') tg=jizhun*18;else if(ting=='j') tg=jizhun*19;else if(ting=='k') tg=jizhun*20;else if(ting=='l') tg=jizhun*21;else if(ting=='m') tg=jizhun*22;else if(ting=='n') tg=jizhun*23;else if(ting=='o') tg=jizhun*24;//停止时间 if(ch=='d'){if(kh=='1'){Beep(261,tm);}else if(kh=='2'){Beep(293,tm);}else if(kh=='3'){Beep(329,tm);}else if(kh=='4'){Beep(349,tm);}else if(kh=='5'){Beep(392,tm);}else if(kh=='6'){Beep(440,tm);}else if(kh=='7'){Beep(493,tm);}}else if(ch=='z'){if(kh=='1'){Beep(523,tm);}else if(kh=='2'){Beep(587,tm);}else if(kh=='3'){Beep(659,tm);}else if(kh=='4'){Beep(698,tm);}else if(kh=='5'){Beep(784,tm);}else if(kh=='6'){Beep(880,tm);}else if(kh=='7'){Beep(987,tm);}}else if(ch=='g'){if(kh=='1'){Beep(1046,tm);}else if(kh=='2'){Beep(1174,tm);}else if(kh=='3'){Beep(1318,tm);}else if(kh=='4'){Beep(1396,tm);}else if(kh=='5'){Beep(1568,tm);}else if(kh=='6'){Beep(1760,tm);}else if(kh=='7'){Beep(1975,tm);}}Sleep(tg);
}
z610/z710/g110/g210/g330/z650/z710/g120/z720/z520/z383/
z610/z710/g110/g210/g330/z650/z710/g120/z720/z520/z330/
g120/z720/z520/z341/
z610/z710/g110/g210/g330/z631/z710/g120/z720/z530/
g510/g320/g552/
z710/g110/z710/z510/z330/z630/z320/z551/z530/
z682/****z160t/d720t/d540t/d520t/d320t/d530t/d658t/*
z160t/d720t/d540t/d520t/d320t/z230t/z354t/*
z320t/z520t/z260t/z320t/z240t/*
z120t/d720t/z120t/d720t/z120t/z210t/z350t/*
z220t/z310t/d650t/z220t/z310t/d650t/d540t/d688t/*z160t/d720t/d540t/d520t/d320t/d530t/d658t/*
z160t/d720t/d540t/d520t/d320t/z230t/z354t/*
z320t/z520t/z240t/z320t/z510t/z250t/*
z120t/d720t/z120t/d720t/z120t/z210t/z350t/*
z220t/z310t/d650t/z220t/z310t/d650t/d540t/d6c0t/**
d620t/z120t/z230t/z330t/d620t/z240t/*
d620t/z120t/d730t/d530t/d320t/d540t/*
d620t/z120t/z230t/z330t/d620t/z230t/z330t/z520t/z384tt/*
d620t/z120t/z230t/z330t/d620t/z240t/*
z120t/d720t/z120t/d720t/z120t/z210t/z350t/*
z220t/z310t/d650t/z220t/z310t/d650t/d540t/d682tt/****z320t/z520t/z320t/z260t/z320t/z240t/z120t/d640/z362t/*
z320t/z520t/z320t/z260t/z320t/z240t/z520t/z640t/z362t/*
z220t/z320t/z520/z620t/z520t/z320t/z520t/z240t/*
z320t/z220t/z120t/z220t/z320t/z520t/d640t/*
d620t/z120t/z220t/z320t/d640t/z220t/z320t/d620t/d540t/d6a0t/****d320/z320/z230/z330/d520/d640/d520/z320/z230/z330/d520/d360/
z320/z230/z330/d620/d530/d630/d740/d3a0/d320/z320/z230/z330/
z520/z280/z230/z330/z120/d640/d320/d520/d620/z320/z620/g320/
g260/z520/z6g0/z160t/d720t/d540t/d520t/d320t/d530t/d658t/*
z160t/d720t/d540t/d520t/d320t/z230t/z354t/*
z320t/z520t/z260t/z320t/z240t/*
z120t/d720t/z120t/d720t/z120t/z210t/z350t/*
z220t/z310t/d650t/z220t/z310t/d650t/d540t/d6c0t/**
d620t/z120t/z230t/z330t/d620t/z240t/*
d620t/z120t/d730t/d530t/d320t/d540t/*
d620t/z120t/z230t/z330t/d620t/z230t/z330t/z520t/z384tt/*
d620t/z120t/z230t/z330t/d620t/z240t/*
z120t/d720t/z120t/d720t/z120t/z210t/z350t/*
z220t/z310t/d650t/z220t/z310t/d650t/d540t/d682tt/****z320t/z520t/z320t/z260t/z320t/z240t/z120t/d640/z362t/*
z320t/z520t/z320t/z260t/z320t/z240t/z520t/z640t/z362t/*
z220t/z320t/z520/z620t/z520t/z320t/z520t/z240t/*
z320t/z220t/z120t/z220t/z320t/z520t/d640t/*
d620t/z120t/z220t/z320t/d640t/z220t/z320t/d620t/d540t/d662t/****
z320t/z520t/z320t/z260t/z320t/z240t/z120t/d640/z362t/*
z320t/z520t/z320t/z260t/z320t/z240t/z520t/z640t/z362t/*
z220t/z320t/z520/z620t/z520t/z320t/z520t/z240t/*
z320t/z220t/z120t/z220t/z320t/z520t/d640t/*
d620t/z120t/z220t/z320t/d640t/z220t/z320t/d620t/d540t/d6e0t/****
将对应的txt文件以qiansixi命名放在与源代码的相同目录下即可播放。