全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

【FireBeetle 2 ESP32-S3开发板测评】MIDI音乐播放器

时间:2023-07-23 09:01

人气:

作者:admin

标签: MIDI  播放器  开发板  ESP32 

导读:本片我们使用PWM输出不同频率占空比的信号来驱动喇叭,实现MIDI音乐播放器的Demo。...

前言

本片我们使用PWM输出不同频率占空比的信号来驱动喇叭,实现MIDI音乐播放器的Demo。

PWM驱动喇叭原理

PWM驱动喇叭有两种方法

一种是PWM-ADC方法,即控制PWM占空比实现不同电压等级的输出,来模拟DAC的输出;

一种是控制PWM频率,直接播放数字MIDI音乐即不同频率代表不同的音调。

我们这里采用第二种方式来实现音乐播放。

以国际标准音A-la-440HZ为准:

do的频率为261.6HZ,

re的频率为293.6HZ,

mi的频率为329.6HZ,

fa的频率为349.2HZ,

sol的频率为392HZ,

la的频率为440HZ,

si的频率为493.8HZ。

我们升一个八度则

Do频率为261.6x2=523.2Hz,其他的类推。

控制PWM频率就可以输出上述音调,控制PWM占空比则可对应声音的大小,播放时间长度则可对应音节时长。

以两只老虎为例
图片16.png

播放音乐需要三个参数

频率:beepfrep对应音调

声音大小: beepduty 占空比

播放时间: beeptime 对应节拍

简谱中可以看到

2/4拍子 4分音符一拍 每小节2拍

一分钟76拍。

图片17.png

于是可以定义音调和上述参数如下

DO = 523

RE = 587

MI = 659

FA = 698

_SO = 392

SO = 784

LA = 880

SI = 987

NO = 523

DUTY0 = 0

METERS = 76 #拍数76 1分钟76拍 每拍60/76秒

#2/4  4分音符一拍 每小节2拍

NOTE_4 = (60/METERS) #先定一拍对应的音符 4分音符

NOTE_8 = (NOTE_4/2) # 8分音符 一个下划线

NOTE_16 = (NOTE_8/2) # 16分音符 二个下划线

beepfrep = [DO,RE,MI,DO,

DO,RE,MI,DO,

MI,FA,SO,NO,

MI,FA,SO,NO,

SO,LA,SO,FA,MI,DO,

SO,LA,SO,FA,MI,DO,

DO,_SO,DO,NO,

DO,_SO,DO,NO]

beepduty = [400,400,400,400,

400,400,400,400,

400,400,400,DUTY0,

400,400,400,DUTY0,

400,400,400,400,400,400,

400,400,400,400,400,400,

400,400,400,DUTY0,

400,400,400,DUTY0,

]

beeptime = [NOTE_8,NOTE_8,NOTE_8,NOTE_8,

NOTE_8,NOTE_8,NOTE_8,NOTE_8,

NOTE_8,NOTE_8,NOTE_8,NOTE_8,

NOTE_8,NOTE_8,NOTE_8,NOTE_8,

NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,

NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,

NOTE_8,NOTE_8,NOTE_8,NOTE_16,

NOTE_8,NOTE_8,NOTE_8,NOTE_16,

]

代码

完整代码如下

import time
from machine import Pin, PWM
pwm = PWM(Pin(21))

DO = 523
RE = 587
MI = 659
FA = 698
_SO = 392
SO = 784
LA = 880
SI = 987
NO = 523
DUTY0 = 0
METERS = 76 #拍数76 1分钟76拍 每拍60/76#2/4  4分音符一拍 每小节2拍
NOTE_4 = (60/METERS) #先定一拍对应的音符 4分音符
NOTE_8 = (NOTE_4/2) # 8分音符 一个下划线
NOTE_16 = (NOTE_8/2) # 16分音符 二个下划线

beepfrep = [DO,RE,MI,DO,
DO,RE,MI,DO,
MI,FA,SO,NO,
MI,FA,SO,NO,
SO,LA,SO,FA,MI,DO,
SO,LA,SO,FA,MI,DO,
DO,_SO,DO,NO,
DO,_SO,DO,NO]

beepduty = [400,400,400,400,
400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
400,400,400,400,400,400,
400,400,400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
]

beeptime = [NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
]

while(1):
    for i in range(len(beepfrep)):
        pwm.freq(beepfrep[i])
        pwm.duty_u16(beepduty[i])
        time.sleep(beeptime[i])

测试

接上喇叭,这里使用了功放

PWM使用P21
图片18.png

运行程序

图片19.png

可以听到演奏的效果,详细见视频

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信