找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1652|回复: 3
打印 上一主题 下一主题
收起左侧

求问这串歌曲音调数组怎么算出来的?单片机音乐程序

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
匿名
跳转到指定楼层
楼主
匿名  发表于 2019-9-24 13:01 回帖奖励 |倒序浏览 |阅读模式
论坛内一个大佬的代码,这段百思不得其解怎么算出来115,102...这串数组的?
uchar code tone[]={115,102,91,86,77,68,61,57};                //歌曲音调
void main()                                                
{        
        uchar yd,temp;                                
        yd=0;                            //初始化t2
        while(1)
        {
                //演奏部分
                if(k1==0)                                
                {
                        while(!k1)                //如果键盘1被按下发音do
                        sound(0);
                        temp=1;yd=0;        
                }
                if(k2==0)                                //如果键盘2被按下发音ra
                {
                        while(!k2)        
                         sound(1);
                        temp=1;yd=1;
                }        
                if(k3==0)                                //如果键盘3被按下发音mi
                {
                        while(!k3)        
                         sound(2);
                        temp=1;yd=2;        
                }
                if(k4==0)                                //如果键盘4被按下发音fa
                {
                        while(!k4)        
                         sound(3);
                        temp=1;yd=3;        
                }
                if(k5==0)                                //如果键盘5被按下发音so
                {
                        while(!k5)        
                         sound(4);
                        temp=1;yd=4;        
                }
                if(k6==0)                                //如果键盘6被按下发音la
                {
                        while(!k6)        
                        sound(5);
                        temp=1;yd=5;        
                }
                if(k7==0)                                //如果键盘7被按下发音xi
                {
                        while(!k7)        
                         sound(6);
                        temp=1;yd=6;        
                }
                if(k8==0)                                //如果键盘8被按下发音do#
                {
                        while(!k8)         
                        sound(7);               
                        temp=1;yd=7;
                }
         }
}
void delay8um(uchar x)                                        //8ms延时函数
{
        uchar i,j;
        for(i=0;i<x;i++)
                for(j=0;j<1;j++);
}
void sound(uchar x)                                        //音调函数
{
        uchar i;
        for(i=0;i<60;i++)
        {
                buzzer=0;                                                                                       
                delay8um(tone[x]);                //开关频率。。从而产生节拍
                buzzer=1;
                delay8um(tone[x]);
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2019-9-24 18:25 | 只看该作者
delay8um()函数是8ms,假设需要播放的声音频率是fx,周期是1/fx,用1/fx/2/8,可得该值
回复

使用道具 举报

板凳
ID:213173 发表于 2019-9-25 07:22 | 只看该作者
音乐就是有比例关系的声音。首先要定调,1与高八度1正好频率翻倍,七个音阶频率比例关系(C调)如下:
1=262Hz
2=262*3/2Hz
3=262*5/4Hz
4=262*4/3Hz
5=262*9/8Hz
6=262*5/3Hz
7=262*15/8Hz
高音1=262*2Hz
这个数组是改变延时函数的延时时间的,也就改变了无源蜂鸣器的振荡频率,就能产生音乐。楼主可以根据这个原理定一个基调,按比例算出音阶,就可以随心所欲发出各种音乐。也许你就是未来的电子音乐合成大师。
回复

使用道具 举报

地板
ID:275826 发表于 2019-9-25 07:55 | 只看该作者
根据语调的频率与定时器定时时间计算
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表