赞
踩
本程序使用了文件指针,字符串数组,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命名放在与源代码的相同目录下即可播放。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。