站内搜索
发作品签到
专业版

小小简谱转换音乐

工程标签

517
0
0
0

简介

本项目使用STC8H单片机,采用硬件PWM输出频率和占空比可调的PWM,控制蜂鸣器奏响音乐,并通过片上ADC实现电压采集,通过电位器旋转分压实现输出声音大小调整,实物小巧可作为钥匙挂件随身携带。

简介:本项目使用STC8H单片机,采用硬件PWM输出频率和占空比可调的PWM,控制蜂鸣器奏响音乐,并通过片上ADC实现电压采集,通过电位器旋转分压实现输出声音大小调整,实物小巧可作为钥匙挂件随身携带。
复刻成本:19

开源协议

GPL 3.0

创建时间:2025-02-26 20:58:24更新时间:2025-03-05 14:30:07

描述

本项目已通过验证,实物图为封面和下文配图。

项目原理:无源蜂鸣器可发出不同频率的声音,主要看驱动设备,驱动设备发出的驱动信号可受程序控制,基本上可以实现随心所欲。

        我们学过谱子,知道每一拍有不同的音色,每一拍不同的音色持续的时间不同,所以将简谱编为程序,将最重要的音色和持续时间记录下来,放到程序中,再由程序定时执行和演奏,故可以将简单的谱子演奏出来。这里粘贴一些个人学习笔记仅供参考:CSDN简谱笔记

        我们先将不同音符对应的频率用数组存起来备用,从低音256Hz-中音523Hz到高音1046都存起来。注意这是C调,D调F调等其他调另有不同频率。

        我们将简谱的音符用1-7表示出来,升音降音用+7和-7表示,谱子默认4分音符,设定为500ms持续时间,设其代表时间为1,其他时间成比例,2分音符用2倍表示持续500x2=1000ms,8分音符用0.5表示500/2=250ms,16分音符用0.25表示500/4=125ms,依照这个规律,中音5,4分音符可以这样表示{5,1}同理,高音3,8分音符可以表示为:{3+7,0.5}。将简谱的音符放在二维数组中就形成了如下的数组,其中{0,0.1}代表每个节拍演奏完之后的停顿。

        将简谱存起来之后,我们编写一个PWM代码,可以传入频率并输出即可。在主程序中,每演奏一拍给变量计数就可以知道当前演奏到哪里了,然后根据数组调用规律将数组嵌套,把不同拍的频率取出来放进PWM输出函数里,然后设置延时时间,延时比例也从数组里取出来并x500ms基准时长就是延时时间。这样一拍就轻松演奏了出来,每拍结束记得要跟个停顿哦,你可以将停顿写在数组里,就像我上面那样,你也可以写死在主函数里,但是遇到复杂简谱,3个甚至4个音符连贯起来表示一个音的时候就不好弄了。就像“敢问路在何方”这个谱子一样

        至于调音量,就可以用PWM占空比调节,本项目是用ADC读取电位器分压,然后将电压值映射到0-100%,这样就可以作为占空比传给PWM生成函数啦。当然由于我的蜂鸣器太响了,我就映射到了0-15%,不然太响了。本项目写入了几首歌曲,像同桌的你、美丽的神话、敢问路在何方等,下面我将代码奉上。程序下载就是那几个排针口,应该不用说。

        当然歌曲切换可能就要动动脑子了,怎么随意切换演奏不同数组,这个方法应该有很多,只要能实现就是最好。

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
11 PWM播放音乐.zip
31
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航