这些单片机代码根据曲谱怎么写出来的,求大神详细教啊!

这个是单片机代码的,资料是从网上下载的,里面的代码是最炫名族风的曲谱写出来的,运行单片机仿真会唱最炫名族风,但是我就是不懂那些代码是怎么写出来,求教!1对应三十二分音符,... 这个是单片机代码的,资料是从网上下载的,里面的代码是最炫名族风的曲谱写出来的,运行单片机仿真会唱最炫名族风,但是我就是不懂那些代码是怎么写出来,求教!
1对应三十二分音符,32对应全音符,这句是什么意思,
{N,8},{N,8},{O,8},{P,8},{P,8},{O,8},{N,8},{M,8},{L,8},{L,8},{M,8},{N,8},{N,12},{M,4},{M,8},{0xff,8},这类有是怎么写出来的?
展开
 我来答
衷琪EN
2013-12-21 · TA获得超过185个赞
知道答主
回答量:92
采纳率:0%
帮助的人:102万
展开全部
哈哈,LZ有求知欲很好嘛!其实原理是这样的:
首先,音乐有哪几个最基本的要素?
1,音高(频率) 2,节拍(音符长度)3,强度。

其次,单片机演奏音乐的原理?
1,硬件方面:以I/o口输出方波,驱动无源蜂鸣器震动,方波频率与乐谱中音符的频率对应(实现了音乐的第1要素)
2,软件方面,有两点
(1)如何产生某一频率的方波?通过定时器产生周期性中断,在中断里将IO口的电平翻转即可,中断周期(即定时器应赋的初值)可以由需要的频率计算得到。
(2)如何控制音符的长度(即音乐的第2要素)?从程序结构上来讲,有几种实现途径,我能想到的:再使用一个定时器,它的中断周期固定,以它作为长度的基准。比如,定为10ms中断一次,中断100次就是1秒,那么演奏节拍为2/4拍一分钟60拍的二分音符小字一组A(440Hz),就是200次中断。定时器0控制I/O口输出频率440Hz的方波,并等定时器1中断 200次之后,就切换到下一音符。这样就实现了乐音输出。
3.当然,这样的音乐是控制不了强弱的,无法实现音乐的要素3。非常简陋,只能将就。

程序最下面的数组就是单片机的“乐谱”,每一对元素,前面是音高(对应的宏给其对应的在音阶里的位置进行了编号,后面是音符长度)。m_note数组存储的就是演奏某一频率的乐音对应的定时器中断周期。
追问
我还是不懂,可以再详细点吗?就根据上面的乐谱来说,就比如{N,8}中的N 和8是怎么计算得来的,我真的很差,请不要介意。乐谱中的1234567用到哪里去了,怎么用?m_note数组后面的数又是怎么算出来的
追答
程序一开始,
#define N 16 //中音3

所以{N,8}就是{16,8}

这个16并不是频率,频率是从m_note里查到的。也就是说m_note[16]={252,219}对应的周期,它得频率就是中音3得频率。我看252,219分别应该对应的是定时器得高8位和低8位。

至于说定时器中断周期如何与乐音对应?比如,基准音小字一组A是440Hz,对应的方波周期显然是1/440秒,如果系统时钟是1MHz,那么定时器应该计数1000000/440/2=1136次中断一次并在中断服务函数里翻转IO口电平,因此应赋定时器初值65536-1136=64400,即定时器高8位=0xFB,低8位=0x90..希望你明白了。。
我觉得你应该先去了解一下乐理知识。比如按十二平均律,基准音是小字一组A(440HZ),高一个8度就是频率增加一倍,一个八度的频率被平分为12个半音,这样就能算出频率了。至于调性什么的我觉得你还是自己去学习一下吧。。
百度网友ebc48ea
2013-12-21
知道答主
回答量:19
采纳率:0%
帮助的人:17.3万
展开全部
中断时间的长短
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式