世纪电源网社区logo
社区
Datasheet
标题
返回顶部
原创

【原创:DIY】+单片机的“灵魂”之弹奏音乐

[复制链接]
查看: 5830 |回复: 15
1
liguanghui2588
  • 积分:9171
  • |
  • 主题:55
  • |
  • 帖子:2435
积分:9171
版主
  • 2021-10-23 19:41:38
       好长时间没来论坛逛逛,为啥呢,主要是因为原创迟迟不来,都等到北方的2021的第一场雪来临了。2021真的不同寻常,疫情,百年不遇的洪水,天工不作美,早早的就下雪了。
   原创的你来了吗?我来了,电工们都来了
   单片机的“灵魂”之弹奏音乐,演奏何方音乐?古典 流行的?摇滚乐?等等等!
   首先看单片机来如何跳动字符,演奏音乐

   
   
   
      







评分

参与人数 121币 +5收起理由
xkw1cn + 5

查看全部评分

liguanghui2588
  • 积分:9171
  • |
  • 主题:55
  • |
  • 帖子:2435
积分:9171
版主
  • 2021-10-23 19:58:35
 
首先我们对谱曲简单了解一下
计算机谱曲是C语言程序设计的重要应用,涉及到C语言的几个重要的数据类型和三种控制结构。通过对简谱的分析,要用计算机谱曲必须解决以下几个问题:
首先,如何表示并发出28个不同的音即音高(或音调)。简谱涉及的基本音名是12345677个音,英文用CDEFGAB表示,自然大调式中则采用七个基本音级分别唱作doremifasollasi(ti),而每个音名有低音、中音、高音和最高音之分,共为28个音,每个音对应一个固定的频率,C语言中可用函数sound(频率)来实现。
第二,如何表示和控制每个音的音长(或节拍)。在确定音调以后,接下来就是确定音拍即音的长度,C语言中可以通过延时函数delay(时间)来控制。
第三,乐谱的表示与演唱。如果,我们把上面的音调和音拍合起来称成为一个音,用C语言的一个结构体来表示,那么,一首歌即一首曲子可以看成是一串音组成的,C语言中可以用这些音的数组来表示,即一个结构数组。顺序发出数组中的每个元素所代表的音,便完成了一首优美歌曲的演唱。

举个简单例子

下面是歌曲《生日快乐》中的一段曲子:
130.png

用C语言表示如下:
SOUND  music[11]={{5,M,0.5},{5,M,0.25},{5,M,0.25},{6,M,1},{5,M,1},{1,M,1}};
5·表示为{5,M,0.5},{5,M,0.25}。5表示音名为5,音调为中音M,二分之一节拍。点表示为延续其自身的一半的节拍,就是二分之一的二分之一,为四分之一节拍{5,M,0.25}

要演唱一首乐曲,首先要实现单音的发声。一个单音由两部分控制,一部分是音调(或音高),一部分是节拍(或时值)。音调又由7个音名值和4个音高升降值确定,分别对应28个不同的频率。
下表为音调和频率的对应表:
131.png



cq852
  • cq852
  • 离线
  • LV6
  • 高级工程师
  • 积分:738
  • |
  • 主题:1
  • |
  • 帖子:32
积分:738
LV6
高级工程师
  • 2021-12-3 15:23:42
  • 倒数5
 
写的不错,顶一下!
xkw1cn
  • 积分:131263
  • |
  • 主题:37517
  • |
  • 帖子:55603
积分:131263
版主
  • 2021-10-24 22:22:00
 
鼎一下!略表支持!
liguanghui2588
  • 积分:9171
  • |
  • 主题:55
  • |
  • 帖子:2435
积分:9171
版主
  • 2021-10-25 09:02:23
 
是不是带点声音采集,FFT计算,通过麦克把接收到的声音还原播放出来级更带劲了,就是大力支持?
Vegard137017878
  • 积分:11335
  • |
  • 主题:127
  • |
  • 帖子:704
积分:11335
LV10
总工程师
  • 2021-10-25 17:54:39
 
驱动的是什么来发出声音呢?
liguanghui2588
  • 积分:9171
  • |
  • 主题:55
  • |
  • 帖子:2435
积分:9171
版主
  • 2021-10-26 13:08:46
 
单片机的PWM或者DA输出
liguanghui2588
  • 积分:9171
  • |
  • 主题:55
  • |
  • 帖子:2435
积分:9171
版主
  • 2021-11-12 17:07:53
  • 倒数10
 
播放声音这块大致有三种方式
1 PWM+SPI PWM模拟时钟时序,SPI传输数据,采用PCM编码方式,然后接放大器+喇叭;
2 DAC DAC+放大器+喇叭,一般语音芯片都是用这种方式做的,但是应该是专用的DAC语音芯片;
3 IIS+语音解码芯片

liguanghui2588
  • 积分:9171
  • |
  • 主题:55
  • |
  • 帖子:2435
积分:9171
版主
  • 2021-11-29 19:38:20
  • 倒数9
 
待更新
liguanghui2588
  • 积分:9171
  • |
  • 主题:55
  • |
  • 帖子:2435
积分:9171
版主
  • 2021-11-29 20:30:32
  • 倒数8
 
今天晚上加加班把这个做完,

liguanghui2588
  • 积分:9171
  • |
  • 主题:55
  • |
  • 帖子:2435
积分:9171
版主
  • 2021-11-30 08:46:30
  • 倒数7
 
Vegard137017878
  • 积分:11335
  • |
  • 主题:127
  • |
  • 帖子:704
积分:11335
LV10
总工程师
  • 2021-12-3 15:18:40
  • 倒数6
 
不错了
liguanghui2588
  • 积分:9171
  • |
  • 主题:55
  • |
  • 帖子:2435
积分:9171
版主
  • 2021-12-4 10:27:26
  • 倒数4
 
前面是单片机模拟电子琴,但是不会自己想我们一样可以说话,今天看下单片机如何自己说话一、音频二进制文件生成
生产wav文件
221.png

转化C文件
打开WavToC软件,导进来我们刚才生成的WAV文件,有几个音频的关键参数需要注意,采样速率、输出采样率、输出压缩级别,采样率、采样位宽是从WAV生成软件设置而来的,输出采样率跟采样速率有关系,一般满足奈奎斯特采样定律
    奈奎斯特采样定理:奈奎斯特采样定理解释了采样率和所测信号频率之间的关系,阐述了采样率fs必须大于被测信号感兴趣最高频率分量的两倍。该频率通常被称为奈奎斯特频率fN。
fs>2*fN
    WAV文件的采样频率为16K理论上,输出采样频率应该<8000,所以可以选择6400或者8000,大家可以试试不同的采样率下声音的还原效果,我选择的是6400的输出采样率,还原度还是挺高的。

225.png



keil工程里调用
226.png

DAC输出既可以
336.png
我们就听到单片机讲话了


伊野城
  • 积分:109
  • |
  • 主题:1
  • |
  • 帖子:11
积分:109
LV2
本网技师
  • 2022-11-21 10:48:30
  • 倒数3
 
大神的作品现在有的吃不透,记号一下
littlecarl
  • 积分:213
  • |
  • 主题:0
  • |
  • 帖子:3
积分:213
LV3
助理工程师
  • 2023-1-6 09:12:37
  • 倒数2
 
优秀如你
dazuieyu
  • 积分:110
  • |
  • 主题:0
  • |
  • 帖子:2
积分:110
LV2
本网技师
最新回复
  • 2024-1-7 13:10:03
  • 倒数1
 
辛苦 谢谢分享
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号