这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sdo2025年第3期—音乐播放

共1条 1/1 1 跳转至

Let'sdo2025年第3期—音乐播放

助工
2025-12-09 18:13:29     打赏

该任务需要用到DFRobot音频 1738-1142-ND,其数据手册如下

DFR0032_Web.pdf

根据文档中对音频的接线定义,使用PWM对蜂鸣器的声音频率进行控制

image.png

选择ESP32-S3 Reverse TFT Feather的D10引脚作为PWM输出

buzzer = pwmio.PWMOut(
    board.D10,
    duty_cycle=0,
    frequency=440,
    variable_frequency=True   # 允许后续更改频率(否则会报 Invalid variable_frequency)
)

定义do re mi fa so la si do八个音对应的频率

NOTES = {
    "C4": 261.63,
    "D4": 293.66,
    "E4": 329.63,
    "F4": 349.23,
    "G4": 392.00,
    "A4": 440.00,
    "B4": 493.88,
    "C5": 523.25,
}

每个音发声300ms,每个音间隙50ms,定义播放函数

DURATION_SEC = 0.30  # 每个音发声 300 ms
GAP_SEC      = 0.05  # 音间隙 50 ms

def play_note(freq, dur):
    buzzer.frequency = int(freq)   # 变更为目标音高(Hz)
    buzzer.duty_cycle = 32768      # 50%占空比(0..65535)
    time.sleep(dur)
    buzzer.duty_cycle = 0          # 关掉蜂鸣器

在主循环中,循环播放这八个音

while True:
    for name in ["C4","D4","E4","F4","G4","A4","B4","C5"]:
        play_note(NOTES[name], DURATION_SEC)
        time.sleep(GAP_SEC)

根据这个原理,可以播放音乐,首先定义常用音对应的频率

# 常用音名到频率(Hz),十二平均律
N = {
    "C4": 261.63, "D4": 293.66, "E4": 329.63, "F4": 349.23,
    "G4": 392.00, "A4": 440.00, "B4": 493.88,
    "C5": 523.25, "D5": 587.33, "E5": 659.25, "F5": 698.46, "G5": 783.99
}

设定音乐的节奏

# 设定速度与时值
TEMPO_BPM   = 120             # 每分钟 120 拍
BEAT_SEC    = 60.0 / TEMPO_BPM
QUARTER     = BEAT_SEC        # 四分音符时长
EIGHTH      = BEAT_SEC / 2.0  # 八分音符
HALF        = BEAT_SEC * 2.0  # 二分音符
REST        = 0.03            # 音符之间的断开(Legato/断奏间隙,可按需微调)

编写一个数组,用于存放歌曲《一闪一闪亮晶晶》的旋律

MELODY = [
    ( "C4", QUARTER), ( "C4", QUARTER), ( "G4", QUARTER), ( "G4", QUARTER),
    ( "A4", QUARTER), ( "A4", QUARTER), ( "G4", HALF),

    # How I wonder what you are,
    ( "F4", QUARTER), ( "F4", QUARTER), ( "E4", QUARTER), ( "E4", QUARTER),
    ( "D4", QUARTER), ( "D4", QUARTER), ( "C4", HALF),

    # Up above the world so high,
    ( "G4", QUARTER), ( "G4", QUARTER), ( "F4", QUARTER), ( "F4", QUARTER),
    ( "E4", QUARTER), ( "E4", QUARTER), ( "D4", HALF),

    # Like a diamond in the sky.
    ( "G4", QUARTER), ( "G4", QUARTER), ( "F4", QUARTER), ( "F4", QUARTER),
    ( "E4", QUARTER), ( "E4", QUARTER), ( "D4", HALF),

    # A' 段(回到开头)
    ( "C4", QUARTER), ( "C4", QUARTER), ( "G4", QUARTER), ( "G4", QUARTER),
    ( "A4", QUARTER), ( "A4", QUARTER), ( "G4", HALF),

    ( "F4", QUARTER), ( "F4", QUARTER), ( "E4", QUARTER), ( "E4", QUARTER),
    ( "D4", QUARTER), ( "D4", QUARTER), ( "C4", HALF),
]

定义音乐播放函数

def play(freq_hz: float, dur_s: float, duty=0.5):
    """在给定频率下发声 dur_s 秒;duty 为占空比(0..1)。"""
    buzzer.frequency  = int(freq_hz)
    buzzer.duty_cycle = int(65535 * duty)
    time.sleep(dur_s - REST)     # 留出一点断奏间隙
    buzzer.duty_cycle = 0
    time.sleep(REST)

在主循环中,循环播放《一闪一闪亮晶晶》

while True:
    for note, dur in MELODY:
        if note is None:
            # 休止符(当前示例没有用到)
            buzzer.duty_cycle = 0
            time.sleep(dur)
        else:
            play(N[note], dur, duty=0.45)  # 适当降低占空比,让声音更柔和
    time.sleep(1.0)  # 一遍结束,停顿再来

由于不能放视频,音乐播放将在成果帖中展示

代码内容如下

task3.zip




关键词: 拾色播放器     蜂鸣器     ESP32S3    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]