775浏览
查看: 775|回复: 3

音乐OLED彩光yeelight灯

[复制链接]
完整视频地址:https://mp.weixin.qq.com/s/p1K3nIepECMDAaQ8Wfs6Dw
长时间以来,用树莓派弹奏靠谱、着调的音乐是很多树莓派初学者的梦想。本文用语音播放的形式配合纯正的钢琴音实现了乐谱的演奏,同时,借助OLED显示屏实时显示正在弹奏的乐谱,让彩光灯随音乐一起翩翩起舞!
视频地址:
一、文件准备
1、准备基本音阶声音文件
音乐OLED彩光灯001.png

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

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

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

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

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

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

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

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

四、yeelight灯设置
1、搜索yeelight灯的设备IP列表
音乐OLED彩光灯010.png

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

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

将其折叠:
音乐OLED彩光灯013.png

今天我们的程序比较大,在一个页面上显示有些困难,通过封装的形式,把已经完成的积木封装成一个函数,是一个良好的习惯。用封装的方法打包程序,增加程序的可读性,今后我们会反复运用。
六、循环读取音乐列表中的每一部分
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彩光灯014.png

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

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

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

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

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

DFrJ5KYVQaH  中级技匠

发表于 2020-5-6 13:43:02

好,学习中
回复

使用道具 举报

txm派瑞深山锹  高级技师

发表于 2020-5-6 14:29:38

好!真漂亮~
回复

使用道具 举报

txm派瑞深山锹  高级技师

发表于 2020-5-6 15:00:17

好教程,学习啦!
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail