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

2025-11-06 23:28:33

1、//声明部分

#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);//小星星-高级

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<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);

        putchar('*');

    }

    puts("\n演奏结束\n");

    size=0;

}

int record(void)

{

    int select;

    printf("请输入选择的曲目:");

    while(!scanf("%d",&select))

    {

        printf("请输入数字!\n");

        getchar();

    }

    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);

        putchar('*');

    }

    puts("\n演奏结束\n");

    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;

}

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;

}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢