前面我们制作了一块简单的线路板——单片机电子琴,小小满足了一下成为音乐“家”的梦想(也就是在自己家里弹奏音乐的梦想)。
可是就这么完事是不是太草率了?不行!我们还得给它增加新的功能。
今天我们一起聊聊如何让单片机播放一段音乐,请跟我来。。。
如何翻译简谱给单片机?
单片机播放音乐——分析简谱思维导图
单片机没有眼睛,他只认识程序代码,所以我们要把有用的东西翻译给他使用,这样单片机才能为我们演奏一段音乐。
通过上面的图片,我们知道有用的两样东西是频率和节拍。
解决频率和节拍问题:
解决频率问题:
前面几篇文章中,我们在设计单片机电子琴的时候已经解决了这个问题。就是利用单片机的定时器,通过改变定时器的初装值来改变输出音频信号的频率,产生相应频率的声音。
解决节拍问题:
参照简谱,我们把一秒作为参考时间长度,然后把1/32秒作为最小单位,制作一个节拍表。同样利用单片机的另一个定时器来产生不同的时间,对应到每个频率所占用的时间节拍长度。
单片机播放音乐——节拍表
回顾以前制作的频率表(表中增加了休止符):
单片机播放音乐——频率表
单片机程序设计思路:
我们要用到的是两张表的索引号。
节拍表的索引号0对应的是1/32节拍(31.25约32毫秒),索引号1、2、3分别对应的是1/16(62.5约63)、1/8(125)、1/4(250),以此类推。
频率表的索引号已经在图中标注好了。
下面我们节选周杰伦的歌曲《菊花台》中的一段简谱说明一下如何制作音乐数据表:
单片机播放音乐——简谱翻译详解示例图
从图中我们能够看出来,蓝色的数字是两个一组的,第一个数字是频率的索引号,第二个数字是节拍的索引号。
单片机是如何演奏这段音乐的呢?首先读取第一组数字,通过索引号查《频率表》,把《频率表》中的值“0xa6,0X6b”赋值给定时器0的初装值寄存器,单片机就会连续输出中音“3”的声音;紧接着通过第二个数字索引号查《节拍表》的定时参数为250毫秒(1/4节拍),根据参数用定时器2进行计时,直到计时到了参数对应的时间,就完成了第一个音符的音频输出。接下来读取第二组数字。。。以此类推,直到演奏完所有音符。
以上就是用单片机演奏音乐的一种设计思路。
今天就聊到这里,如果您感兴趣,记得关注头条号/春天说,欢迎在评论区留言,或者分享给更多朋友。。。