//声明部分
#include<stdio.h>
#include<windows.h>
#define LENTH 300//音长标准
struct music
{
unsigned tune;//音调
unsigned tone;//音色
unsigned hold;//音长
};
typedef struct music* song;//结构体指针
static int size;//静态变量
void init(song S,int *I);//初始化结构体
void play(song S);//播放歌曲
int record(void);//曲目
void play_adv(song S);//高级播放
song test(void);//测试歌曲
song test_adv(void);//测试歌曲-高级
song happy(void);//欢乐颂
song star_adv(void);//小星星-高级
song sky(void);//天空之城
song mate(void);//同桌的你
song liangzu(void);//梁祝
//主函数部分
int main()
{
char c;
"[1].欢乐颂\n"
"[2].小星星\n"
"[3].天空之城\n"
"[4].同桌的你\n"
"[5].梁祝\n"
"[0].测试音调\n"
"******************\n");
do{
switch(record())//曲目选择
{
case 1: puts("--欢乐颂--"); play
(happy
());break;
case 2: puts("--小星星--"); play_adv
(star_adv
());break;
case 3: puts("--天空之城--"); play
(sky
());break;
case 4: puts("--同桌的你--"); play
(mate
());break;
case 5: puts("--梁祝--"); play
(liangzu
());break;
case 0: puts("--测试发声器--"); play
(test
());break;
default: puts("--高级测试发音--"); play_adv
(test_adv
());
}
}while(c!='q');
return 0;
}
void init(song S,int *I)//初始化结构
{
int i;
for(i=0;i<size;i++)
{
S[i].tune=I[i]/100;//音调
S[i].hold=I[i]%10;//音长
S[i].tone=(I[i]-S[i].tune*100)/10;//音色
}
}
void play(song S)//播放
{
int i;
unsigned pitch[3][7]={
//Do Re Mi Fa So La Si
{262,294,330,349,392,440,494},
{523,587,659,698,784,880,988},
{1046,1175,1318,1397,1568,1760,1967}
};
for(i=0;i<size;i++)
{
//播放功能的核心
Beep(pitch[S[i].tune-1][S[i].tone-1],S[i].hold*LENTH);
}
size=0;
}
int record(void)
{
int select;
while(!scanf("%d",&select
))
{
}
return select;
}
void play_adv(song S)//高级播放
{
//只能用于播放高级曲目
int i;
unsigned pitch[4][7]={
//Do Re Mi Fa So La Si
{131,147,165,175,196,220,247},//低度音
{262,294,330,349,392,440,494},//中度音
{523,587,659,698,784,880,988},//高度音
{1046,1175,1318,1397,1568,1760,1967}//高八度
};
for(i=0;i<size;i++)
{
Beep(pitch[S[i].tune-1][S[i].tone-1],S[i].hold);
}
size=0;
}
song test(void)
{
//数组尺寸必须手动填写
static struct music test[21];
int n[21]={
112,122,132,142,152,162,173,
212,222,232,242,252,262,273,
312,322,332,342,352,362,373
};
//普通曲目 百位-音调 十位-音调 个位-音长
size=21;
init(test,n);
//通过init函数进行解析
return test;
}
song test_adv(void)//高级曲目
{
//数组尺寸可以不填,利用sizeof计算
static struct music test[]={
{1,1,300},{1,2,300},{1,3,300},{1,4,300},{1,5,300},{1,6,300},{1,7,600},
{2,1,300},{2,2,300},{2,3,300},{2,4,300},{2,5,300},{2,6,300},{2,7,600},
{3,1,300},{3,2,300},{3,3,300},{3,4,300},{3,5,300},{3,6,300},{3,7,600},
{4,1,300},{4,2,300},{4,3,300},{4,4,300},{4,5,300},{4,6,300},{4,7,600}
};
//(音调,音色,音长)
size=sizeof(test)/sizeof(struct music);
//自动计算数组长度
return test;
}
song happy(void)
{
static struct music happy[62];
int n[62]={
232,232,242,252,252,242,232,222,212,212,222,232,232,222,223,
232,232,242,252,252,242,232,222,212,212,222,232,222,212,213,
222,222,232,212,222,231,241,231,212,222,232,242,231,211,212,222,253,
232,232,242,252,252,242,232,222,212,212,222,232,222,211,213
};
size=62;
init(happy,n);
return happy;
}
song star_adv(void)
{
static struct music star[]={
{3,1,500},{3,1,500},{3,5,500},{3,5,500},{3,6,500},{3,6,500},{3,5,1000},
{3,4,500},{3,4,500},{3,3,500},{3,3,500},{3,2,500},{3,2,500},{3,1,1000},
{3,5,500},{3,5,500},{3,4,500},{3,4,500},{3,3,500},{3,3,500},{3,2,1000},
{3,5,500},{3,5,500},{3,4,500},{3,4,500},{3,3,500},{3,3,500},{3,2,1000},
{3,1,500},{3,1,500},{3,5,500},{3,5,500},{3,6,500},{3,6,500},{3,5,1000},
{3,4,500},{3,4,500},{3,3,500},{3,3,500},{3,2,500},{3,2,500},{3,1,1000}
};
size=sizeof(star)/sizeof(struct music);
return star;
}
//附录:天空之城
song sky(void)
{
static struct music sky[118];
int n[117]={
261,271,312,271,312,332,272,231,231, 262,251,262,312,252,232,242,231,241,312,
232,311,311,311,272,241,241,272,272,261,271, 312,271,312,332,272,231,231,262,251,262,312,
252,221,231,242,311,271,271,311,312,321,321,331,311,312, 311,271,261,261,272,252,262,311,321,332,321,332,352,
322,251,251,312,271,312,332,332, 261,271,312,272,321,321,312,251,252,342,332,322,312,
332,332,362,352,352,331,321,312,311, 322,311,321,322,352,332,332,362,352,
331,321,312,311,322,311,321,322,272,262
};
size=117;
init(sky,n);
return sky;
}
//附录:同桌的你
song mate(void)
{
static struct music mate[98];
int n[98]={
251,251,251,251,231,241,252,272,261,261,261,261,241,261,252,252,
251,251,251,251,271,261,251,241,242,241,241,241,241,231,221,
212,212,251,251,251,251,231,241,252,272,261,261,261,261,241,261,252,252,
251,251,251,251,271,261,251,241,242,241,241,241,241,231,221,212,212,
311,311,311,311,251,261,312,332,321,321,321,321,311,271,
262,262,271,271,271,271,271,311,322,252,271,271,311,321,311,271,312,312
};
size=98;
init(mate,n);
return mate;
}
//附录:梁祝
song liangzu(void)
{
static struct music liangzu[100];
int n[99]={
271,261,271,252,261,241,231,221,231,241,231,252,231,221,231,251,221,231,242,231,221,213,251,171,221,161,211,153,161,211,153,
132,152,161,212,221,161,211,151,252,311,261,251,231,251,223,222,231,171,161,152,161,211,221,131,211,
161,151,161,211,153,232,251,171,221,161,211,152,131,151,131,151,161,171,221,163,151,161,212,221,251,231,221,231,221,
211,161,151,132,212,162,211,161,151,131,151,161,211,153//,231,251,221,231,221,211,171,161,153
};
size=99;
init(liangzu,n);
return liangzu;
}