ART-Pi 实现音乐播放器 -- 播放《天空之城》

721 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

庐州月光,撒在心上,月下的你不复当年模样。太多的伤,难述衷肠,叹一句当时只道是寻常 。 -- 许嵩《庐州月》

一、开发环境

在这里插入图片描述

  • 1.1、软件环境

    • RT-Thread Studio: V1.1.5
    • RT-Thread版本:V4.0.2
    • STM32 CubeMX: V6.0.1
  • 1.2、硬件环境

    • 芯片:STM32H750XBH6
    • 开发板:ART-Pi
    • 模块:无源蜂鸣器

(注:本文是在基于文章《应用 RT-Thread 实现蜂鸣器播放器》来实现的,详细的实现过程,该篇文章已经非常非常详细,我就重复了,只是说说关键的地方)

二、一些乐理的基本知识

我们知道,声音的三要素是:响度、音色、音调。利用这三个要素就可以演奏不同的音乐。

一般说来,蜂鸣器演奏音乐只能是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。因此蜂鸣器奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。十二平均律就规定了每一个音符的标准频率。 十二平均律,是一种音乐定律方法,将一个纯八度平均分成十二等份,每等分称为半音,是最主要的调音法。十二平均律中各音的频率: C: 262 Hz、#C: 277 Hz、D: 294 Hz、#D: 311 Hz、E: 330 Hz、F: 349 Hz、#F: 370 Hz、G: 392 Hz、#G: 415 Hz、A: 440 Hz、#A: 466 Hz、B: 494 Hz 在这里插入图片描述 下面是两只老虎的简谱 在这里插入图片描述 其中1=E 表示乐谱的曲调,就是说,“这歌曲唱E调”。那么 1(do) 的频率就为 330 HZ,同样 2 = F,3 = G依次类推。后面 4/4 是用来表示节拍的,它表示乐谱中以四分音符为节拍,每一小结有四拍。比如第二行的第二小节,其中5、6 为一拍,5、4为一拍,3为一拍,1为一拍共四拍。5、6的时值为四分音符的一半,即为八分音符长。 简谱里音符下面加一道横线表示该音减少一半时值,即该音符为半拍;加两道横线表示该音在减少一半时值基础上再减一半时值,即该音符为四分之一拍。附点音符,时值是原音符的长加上这个音长的一半。 那么一拍到底该唱多长呢?一般说来,如果乐曲没有特殊说明,一拍的时长大约为400—500ms 。我们以一拍的时长为400ms为例,则当以四分音符为节拍时,四分音符的时长就为400ms,八分音符的时长就为200ms,十六分音符的时长就为100ms ---- 来源《应用 RT-Thread 实现蜂鸣器播放器》

十二平均律给出了“do re mi fa so la si”对应的频率值,也就是说我们通过改变输出pwm的频率让蜂鸣器发出不同频率的声调,就能得到谱成乐谱的“do re mi fa so la si”,从而实现音乐播放的效果。

三、实现过程

  • 3.1、首先要配置ART-Pi的输出引脚(本实例使用的是PH10)为pwm模式,用于控制蜂鸣器发出不同频率、不同音量。参考文章《使用RT-Thread Studio 实现PWM设备底层配置 (RT-thread && RT-thread Studio && ART-Pi)》

  • 3.2、网上找到天空之城的乐谱。 在这里插入图片描述

  • 3.3、利用 MusicEncode (对简谱进行编码的软件)来获取编码(编码的具体意义看《应用 RT-Thread 实现蜂鸣器播放器》,这里就不解释了)。 根据乐谱点击1位置的符号,能够得到2处的谱子,点击开始转换,得到3处的编码,就是要放入我们程序的东西。 在这里插入图片描述

  • 3.4、通过上一步我们得到了编码,单片机利用这些编码就能得到要输出的频率和停顿时间,也就是能奏响音乐。 直接使用《第 4 节:音乐数据的编码与解码》里面的解码文件。 在这里插入图片描述

  • 3.5、将示例中的红框部分更换成我们利用软件生成的编码(也就是那个3位置的那个数组) 在这里插入图片描述

  • 3.6、下载到ART-Pi就可以听到音乐响起。

  • 3.7、还怪好听的,OVER。

四、参考资料