16314|6

253

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

【行空板 Python编程学习主控板】使用蜂鸣器和屏幕,将行空板变身MID播放器 [复制链接]

在行空板的屏幕背后,有一颗蜂鸣器,而官方的PinPong硬件库中,又专门提供了操作蜂鸣器的调用。

 

蜂鸣器具体的位置如下:

 

要让蜂鸣器想起来,基本的用法如下:

# -*- coding: utf-8 -*-

import time
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *

Board().begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别

buzzer.set_tempo(4,60) #设置每一拍音符数,每分钟节拍数
buzzer.play(buzzer.DADADADUM, buzzer.OnceInBackground) #后台播放音乐一次

buzzer.pitch(494, 4) #播放音符

buzzer.pitch(494) #后台播放音符
time.sleep(4) #延时
buzzer.stop() #停止后台播放

buzzer.play(buzzer.ENTERTAINER, buzzer.ForeverInBackground) #后台永久播放音乐

 

如上面的演示代码所示,在扩展库中,提供了如下的预定于快捷码可以快速调用:

    DADADADUM = 0
    ENTERTAINER = 1
    PRELUDE = 2
    ODE = 3
    NYAN = 4
    RINGTONE = 5
    FUNK = 6
    BLUES = 7
    BIRTHDAY = 8
    WEDDING = 9
    FUNERAL = 10
    PUNCHLINE = 11
    BADDY = 12
    CHASE = 13
    BA_DING = 14
    WAWAWAWAA = 15
    JUMP_UP = 16
    JUMP_DOWN = 17
    POWER_UP = 18
    POWER_DOWN = 19

 

上述名称,代表了一段音符,可以直接使用buzzer.play(一段音符名称)来进行播放。

 

然后,还提供了一个对照表:

    music_map = {
      "C3": 131,
      "D3": 147,
      "E3": 165,
      "F3": 175,
      "G3": 196,
      "A3": 220,
      "B3": 247,
      "C4": 262,
      "D4": 294,
      "E4": 330,
      "F4": 349,
      "G4": 392,
      "A4": 440,
      "B4": 494,
      "C5": 523,
      "D5": 587,
      "E5": 659,
      "F5": 698,
      "G5": 784,
      "A5": 880,
      "B5": 988,
      "C#3": 139,
      "D#3": 156,
      "F#3": 185,
      "G#3": 208,
      "A#3": 233,
      "C#4": 277,
      "D#4": 311,
      "F#4": 370,
      "G#4": 415,
      "A#4": 466,
      "C#5": 554,
      "D#5": 622,
      "F#5": 740,
      "G#5": 831,
      "A#5": 932
       }

实际上,就是MID的频率。

 

然后,还提供了节拍数的定义:

    BEAT_1 = 4
    BEAT_1_2 = 2
    BEAT_1_4 = 1
    BEAT_3_4 = 3
    BEAT_3_2 = 6
    BEAT_2 = 8
    BEAT_3 = 12
    BEAT_4 = 16

 

 

例如,如果要播放出来哆来咪发索拉西,就可以使用:

buzzer.set_tempo(4,60) #设置每一拍音符数,每分钟节拍数
buzzer.pitch(buzzer.music_map["C3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["D3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["E3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["F3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["G3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["A3"], buzzer.BEAT_1) #后台播放音乐一次
buzzer.pitch(buzzer.music_map["B3"], buzzer.BEAT_1) #后台播放音乐一次

 

 

有一首很有名的儿歌,一闪一闪亮晶晶,简谱如下:

 

 

那么使用蜂鸣器播放,就可以用如下的代码了:

# -*- coding: utf-8 -*-
import time
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
from unihiker import GUI   #导入包

Board().begin()#初始化
gui=GUI()  #实例化GUI类

note_tone_map = dict()
note_tone_map[1] = buzzer.music_map["C3"]
note_tone_map[2] = buzzer.music_map["D3"]
note_tone_map[3] = buzzer.music_map["E3"]
note_tone_map[4] = buzzer.music_map["F3"]
note_tone_map[5] = buzzer.music_map["G3"]
note_tone_map[6] = buzzer.music_map["A3"]
note_tone_map[7] = buzzer.music_map["B3"]

note_beat_map = dict()
note_beat_map[1] = buzzer.BEAT_1_2
note_beat_map[2] = buzzer.BEAT_1

soundtone =(
1,1,5,5,6,6,5,4,4,3,3,2,2,1,
5,5,4,4,3,3,2,5,5,4,4,3,3,2,
1,1,5,5,6,6,5,4,4,3,3,2,2,1
)
 
soundlong = (
1,1,1,1,1,1,2,1,1,1,1,1,1,2,
1,1,1,1,1,1,2,1,1,1,1,1,1,2,
1,1,1,1,1,1,2,1,1,1,1,1,1,2
)

while True:
    print("")
    gui.clear()

    print("一闪一闪亮晶晶   1=C 2/4")
    gui.draw_text(x=10, y=20, text="一闪一闪亮晶晶   1=C 2/4", font_size=13)

    buzzer.set_tempo(4,60) #设置每一拍音符数,每分钟节拍数

    beat_total = 0

    x=10
    y=80

    for i in range(0,len(soundtone)):
        s_tone = soundtone[i]
        s_long = soundlong[i]
        freq = note_tone_map[s_tone]
        beat = note_beat_map[s_long]
        if beat == buzzer.BEAT_1:
            str = "%d-" % s_tone
            print(str, end="", flush=True)
            gui.draw_text(x=x, y=y, text=str, font_size=8)
            x = x + 16
        else:
            str = "%d" % s_tone
            print(str, end="", flush=True)
            gui.draw_text(x=x, y=y, text=str, font_size=8)
            x = x + 8

        beat_total = beat_total + beat
        if beat_total % 4 == 0 :
            str = "|"
            if i == len(soundtone)-1:
                str = "||"
            print(str, end="", flush=True)
            gui.draw_text(x=x+2, y=y-4, text=str, font_size=10)
            x = x + 10

        if beat_total % 32 == 0 :
            print("")
            y = y + 30   
            x = 10

        buzzer.pitch(freq, beat) #后台播放音乐一次

    time.sleep(5)

 

上述代码的主要逻辑,就是根据简谱,取对应的频率,然后播放一定的节拍市场。

当前所取得的简谱,会同步打印输出,并在屏幕显示,音乐和输出同步,将行空板变身MID播放器

 

具体效果如下:

mid

 

最新回复

什么是“行空板”,没听过这个概念。就是蜂鸣器效果不太理想  详情 回复 发表于 2023-7-19 11:21
点赞 关注

回复
举报

6841

帖子

11

TA的资源

版主

沙发
 
老师的才能是非常的高,可惜这蜂鸣器不给力呀!

点评

能响就很不错了  详情 回复 发表于 2022-12-5 11:55
 
 

回复

253

帖子

4

TA的资源

纯净的硅(初级)

板凳
 
lugl4313820 发表于 2022-12-5 09:07 老师的才能是非常的高,可惜这蜂鸣器不给力呀!

能响就很不错了

 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

4
 
#在这里快速回复# 老师的才能是非常的高,可惜这蜂鸣器不给力呀!
 
 
 

回复

4771

帖子

12

TA的资源

版主

5
 

蜂鸣器播放midi 怕不是比较不那么悦耳啊~

 
 
 

回复

1463

帖子

0

TA的资源

五彩晶圆(初级)

6
 
路过学习一下路过学习一下路过学习一下路过学习一下
 
 
 

回复

1463

帖子

0

TA的资源

五彩晶圆(初级)

7
 
什么是“行空板”,没听过这个概念。就是蜂鸣器效果不太理想
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表