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

描述

前言

本片我们使用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占空比则可对应声音的大小,播放时间长度则可对应音节时长。

以两只老虎为例
代码

播放音乐需要三个参数

频率:beepfrep对应音调

声音大小: beepduty 占空比

播放时间: beeptime 对应节拍

简谱中可以看到

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

一分钟76拍。

代码

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

DO=523RE=587MI=659FA=698_SO=392SO=784LA=880SI=987NO=523DUTY0=0METERS=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, ]

代码

完整代码如下

importtimefrommachine import Pin, PWMpwm= PWM(Pin(21))DO=523RE=587MI=659FA=698_SO=392SO=784LA=880SI=987NO=523DUTY0=0METERS=76#拍数761分钟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):fori in range(len(beepfrep)):pwm.freq(beepfrep[i])pwm.duty_u16(beepduty[i])time.sleep(beeptime[i])

测试

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

PWM使用P21
代码

运行程序

代码

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分