音乐OLED彩光yeelight灯

2020-05-064963
AI 快速预览详细 收起
本文介绍了一个基于树莓派的音乐项目,通过播放音乐并结合OLED显示屏显示乐谱,同时控制yeelight彩光灯随音乐变化颜色。项目包括准备基本音阶声音文件、创建音乐列表和颜色列表、设置yeelight灯以及循环读取和播放音乐。适合初学者,特别是对音乐和编程感兴趣的孩子们。
完整视频地址:https://mp.weixin.qq.com/s/p1K3nIepECMDAaQ8Wfs6Dw
长时间以来,用树莓派弹奏靠谱、着调的音乐是很多树莓派初学者的梦想。本文用语音播放的形式配合纯正的钢琴音实现了乐谱的演奏,同时,借助OLED显示屏实时显示正在弹奏的乐谱,让彩光灯随音乐一起翩翩起舞!
视频地址:
一、文件准备
1、准备基本音阶声音文件
音乐OLED彩光yeelight灯图1

音阶文件中有7个mp3文件,猜猜1-7分别代表什么意思?别告诉我你没有音乐细胞呀!
2、把声音文件夹拷贝到树莓派/home/pi/下。如图:
音乐OLED彩光yeelight灯图2

树莓派传输文件的方法有很多,最常用的是远程控制,当然还有FTP和SFTP的方法。先学会一种方法,操作熟练了,再去试试其他方法,不要总问为什么?不同方法各有优劣,多一种方法,你就就会多一条成功的道路。
二、音乐处理
1、寻找合适的乐谱
这里我选择的是简单易用的儿歌小星星。如果你选择的是较为复杂的乐谱,那么第一大步中基本的音阶就不够用了,你需要增加另外音阶的声音文件。
音乐OLED彩光yeelight灯图13

2、分析乐谱
儿歌非常简单,我把它分解成对称的6个部分。每一个部分用1个列表来描述,全歌共有6个列表,把整个的歌曲存储为1个大列表。
3、创建第1部分列表:
创建变量1,赋值为列表使用。
音乐OLED彩光yeelight灯图3

4、依次创建其他5部分的列表
分别命名为2、3、4、5、6。
各部分积木与第1部分类似,最终完成6个列表。
音乐OLED彩光yeelight灯图4

5、创建音乐列表
创建音乐列表,将6个部分的列表赋值给音乐列表。
现在我们就建立了一个二维列表。大列表是音乐列表,其中又包含了6个小列表,每一个小列表中存储了每一部分的乐谱。
音乐OLED彩光yeelight灯图5

三、创建颜色列表
1、查找单色RGB值
借助百度搜索引擎,查找红、橙、黄、绿、蓝、靛、紫七种颜色的RGB,如下所示:
音乐OLED彩光yeelight灯图7

2、单色列表
创建红、橙、黄、绿、蓝、靛、紫七种颜色的列表,输入其RGB值。红色列表如下图,其他颜色类似。
音乐OLED彩光yeelight灯图6

3、创建颜色列表
将七色列表赋值给颜色列表,如下图:
音乐OLED彩光yeelight灯图10

四、yeelight灯设置
1、搜索yeelight灯的设备IP列表
音乐OLED彩光yeelight灯图8

2、输出设备IP列表
3、实例化一个yeelight为实例,命名为yeelight
实例化是面向对象编程的常用方法,简单说,就是先创建一个类,然后为这个类添加属性和方法,当你需要用到这个类时,只需要实例化一个对象,然后就可以调用这个类的属性和方法了。
将上一步获取的设备IP正确填写。
4、先关闭yeelight灯,再重新打开yeelight灯,以便后面程序调用。
音乐OLED彩光yeelight灯图9

五、创建初始化函数
创建初始化函数,将以上所有的积木封装起来,如下图:
音乐OLED彩光yeelight灯图12

将其折叠:
音乐OLED彩光yeelight灯图11

今天我们的程序比较大,在一个页面上显示有些困难,通过封装的形式,把已经完成的积木封装成一个函数,是一个良好的习惯。用封装的方法打包程序,增加程序的可读性,今后我们会反复运用。
六、循环读取音乐列表中的每一部分
1、打开OLED屏
2、初始化OLED屏
参数采用默认设置。
3、创建1-6的循环,步长为1
音乐列表中一共有6个小列表,故循环6次。
4、从音乐列表读取第i个元素
获取第i个列表元素,如果i为1时,读取的是第1个小列表,即第1部分的小列表,并将其赋值为当前列表。
至此,我们通过循环来读取对应i值的小列表,并赋值给当前列表。
5、创建变量X0并赋值为0
这个X0,在后续的OLED显示中作为它的横坐标,这个横坐标在每读取一次音乐小列表时,都需要从0开始。
6、新建图片并赋值给变量图片
参数采用默认设置。
第六部分程序如下:
音乐OLED彩光yeelight灯图17

七、循环读取每一个音符
1、创建从1到7的j循环
在我们的音乐小列表中,已经存储了7个音符,通过循环的方法依次获取每一个音符。
2、创建当前音符变量
从当前列表中取出第j个音符,并赋值给当前音符。
3、动态更新X0坐标
将X0加上14后,重新赋值给X0。
后面OLED要显示每一个当前音符,通过这条积木实现相邻音符间隔14个像素。
4、如果j是第7个,显示内容为当前音符再增加一个延长线-
5、如是j不是第7个,显示内容为当前音符
音乐OLED彩光yeelight灯图15

八、播放显示当前音符
1、为图片添加文字
显示当前音符,大小是18个像素。
2、把图片显示到OLED屏
3、设置yeelight灯的颜色
根据当前音符获取颜色列表中的对应颜色。
如当前音符为1时,对应的颜色是红色。再如当前音符是7时,对应的颜色是紫色。从而实现了灯光颜色随音符而改变。
4、获取当前音符的文件地址
建立字符串使用,动态取得当前音符对应的mp3文件地址,并将其赋值给文件地址变量。
5、播放音乐
音乐OLED彩光yeelight灯图18

6、时值延长
通过观察乐谱,我们发现,最后一个音符的时值是前面音符的2倍。处理方法如下:
1、如果当前音符是第7个音符,其播放时间为1秒。
2、如果当前音符不是第7个音符,其播放时间为0.5秒 。
音乐OLED彩光yeelight灯图14

一点说明,我们的乐谱比较简单,不同音符的时值只有两种情况,这里我们做了简化处理。如果复杂的乐谱怎么办?当然有办法,写两个列表,一个列表是音符,另一个列表是音符的时值,逐个对应进行调用即可。
至此,我们的音乐OLED彩光yeelight灯就全部结束了。最终程序如下:
音乐OLED彩光yeelight灯图16

完整视频地址:https://mp.weixin.qq.com/s/p1K3nIepECMDAaQ8Wfs6Dw

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(3)
txm派瑞深山锹🐛🐜🐞🦂
txm派瑞深山锹🐛🐜🐞🦂
好教程,学习啦!
txm派瑞深山锹🐛🐜🐞🦂
txm派瑞深山锹🐛🐜🐞🦂
好!真漂亮~
DFrJ5KYVQaH
DFrJ5KYVQaH
好,学习中
- 没有更多了 -