多语言展示
当前在线:1870今日阅读:100今日分享:18

用C语言做一个可以播放音乐的八音盒

原理:可以用Beep( )函数控制蜂鸣器发出不同声调,利用蜂鸣器发出Do Re Mi Fa So La Si 组成一首音乐;频谱   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    1967Beep(音频(0~2000),音长(以毫秒计));例:Beep(523,1000);//发出Do声调一秒钟_beep( );和Beep( );      函数通用,按实际情况使用;Ps:蜂鸣器的发声效果没有音响好,该程序仅可以输出简单曲谱,不要过分苛求;
工具/原料
1

#Iinclude Beep( )函数

2

曲谱简谱,频谱对照表

3

结构储存简谱( tune音调,tone音色,hold音长)

4

功能函数(播放,初始化music结构,创建单曲,列表选择)

方法/步骤
1

//声明部分#include#include#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);//小星星-高级

2

//主函数部分int main(){    char c;    printf('*******曲目********\n'            '[1].欢乐颂\n'            '[2].小星星\n'            '[0].测试音调\n'            '******************\n');    do{    printf('\n');    switch(record())//曲目选择    {        case 1: puts('--欢乐颂--'); play(happy());break;        case 2: puts('--小星星--'); play_adv(star_adv());break;        case 0: puts('--测试发声器--'); play(test());break;        default: puts('--高级测试发音--'); play_adv(test_adv());    }    printf('要继续吗(q退出)?');    c=getch();//自动获取输入    }while(c!='q');    puts('\n--结束--\n');    return 0;}

3

void init(song S,int *I)//初始化结构{    int i;    for(i=0;i

4

//附录:天空之城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;}

5

//附录:同桌的你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;}

6

//附录:梁祝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;}

注意事项
1

size最大尺寸不能超过数组实际容量(否则程序停止运行)

2

音长不宜过短,否则蜂鸣器会罢工

3

添加新曲目,要三处改动(新曲目函数声明,switch选择标签,新曲目函数定义)

4

程序优化工作(调用频谱只需一次,传递指针避免拷贝,避免不必要的计算,具有可更新性)

5

当曲谱较长时,利用printf('%d',sizeof(数组n)/sizeof(int);快速得知size大小

6

结构数组必须声明为静态变量,否则函数结束后内存会释放掉

7

普通曲目:填写方便 ,音调三档(低中高),音长三档(越大音长越长)

8

高级曲目:信息准确 ,频谱更广(低中高八),音长任意(0~2000)

推荐信息