什么是MIDI音乐
MIDI音乐的产生原理
编写MIDI音乐
代码解读

什么是MIDI音乐

HIDI(Musical Instrument Digital Interface)乐器数字接口
是20世纪80年代初为解决电声乐器之间的通信问题而提出的。
MIDI是编曲界最为广泛的音乐标准格式,可称为“计算机能理解的乐谱”。
它用音符的数字控制信号来记录音乐。一首完整的MIDI音乐只有几十KB大,
而能包含数十条音乐轨道。几乎所有的现代音乐都是用MIDI加上音色库来制作合成的。MIDI传输的不是音乐信号,而是音符、控制参数等指令,它指示MIDI设备要做什么,怎么做,如演奏哪个音符,多大音量等、。它们被统一表示成MIDI消息。
传输时采用异步串行通信,标准通信波特率32.25×(1±0.01)Kbaud。

MIDI音乐的产生原理

MIDI音乐的产生的原理和上一节蜂鸣器发声的原理相同,都是让单片机控制蜂鸣器的端口产生高低变化的方波,来产生一定的频率周期,通过频率周期的改变发出不同音调的声音和改变周期的数量来改变声音的长短,把不同频率的声音组合在一起,就组成了声音的长短。

编写MIDI音乐

如果要编写某个MIDI音乐,我们需要找到该音乐的音乐简谱,把简谱上的每一个音符转换为相应的频率,再根据每一个音符的节拍,来控制该音符发出时间的长短,然后让单片机按照声音的顺序以此播放(依次输出高低电平,控制方波),如此便放出相应的MIDI音乐了。

相应程序的大致思路如下:
通常音符转换为的频率存放在数组中,以及该频率的音符执行时间的长短均放在数组中,二者相邻,然后对数组进行操作即可
利用双重循环:
第一个循环代表有多少个音符需要播放。
第二个循环代表该音符需要执行时间的长短

例子如下(出自洋桃电子)

uc16 music1[78]={ //音乐1的数据表(奇数是音调,偶数是长度)
330,750,
440,375,
494,375,
523,750,
587,375,
659,375,
587,750,
494,375,
392,375,
440,1500,
330,750,
440,375,
494,375,
523,750,
587,375,
659,375,
587,750,
494,375,
392,375,
784,1500,
659,750,
698,375,
784,375,
880,750,
784,375,
698,375,
659,750,
587,750,
659,750,
523,375,
494,375,
440,750,
440,375,
494,375,
523,750,
523,750,
494,750,
392,750,
440,3000
};void MIDI_PLAY(void){ //MIDI音乐u16 i,e;for(i=0;i<39;i++){for(e=0;e<music1[i×2]×music1[i×2+1]/1000;e++){GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0delay_us(500000/music1[i*2]); //延时      GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1delay_us(500000/music1[i*2]); //延时    }   }
}

代码解读如下:

  • 该数组定义了39个音符,并且数组内部偶数项是对应音符的频率,紧跟频率后面的选择项便是该频率的声音持续的时间。因此第一个for循环是按照顺序播放不同频率的声音,第二个for循环内部是利用stm32延时函数先产生一个完整周期频率的矩形波(该矩形波高低电平各占周期时间的一半,占空比为50%),时间为该频率声音震动一次所需要的时间(即第二个for循环内部执行一次便是该频率声音振动一次所需时间),类似于PWM的调制(delay精准计时,未用定时器和专门的PWM模块),第二个for循环的执行条件music1[i×2]×music1[i×2+1]/1000,代表的意思是要求该频率振动一定时间一共振动的次数,如此以来,第二个for循环便是控制该频率声音持续的时间长短。

STM32学习100步之第三十二步——MIDI音乐程序相关推荐

  1. 离职跳槽再启航——三十二岁C++老程序员两年来的心路历程(一)

    2023年2月14日,天气阴,偶尔有太阳出没,刮风,比较冷,冬天还在持续,最近一两周的时间里没有一个像样的晴天. 去银行办了新公司的工资卡,提交了所有入职材料,整理了新租的房间,熟悉周围环境,为明天开 ...

  2. 【100题】第三十二 数组、规划

    一,题目:有两个序列a,b,大小都为n,序列元素的值任意整数,无序:要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小.       例如:               ...

  3. ballerina 学习 三十二 编写安全的程序

    ballerina编译器已经集成了部分安全检测,在编译时可以帮助我们生成错误提示,同时ballerina 标准库 已经对于常见漏洞高发的地方做了很好的处理,当我们编写了有安全隐患的代码,编译器就已经提 ...

  4. 深度学习入门(三十二)卷积神经网络——BN批量归一化

    深度学习入门(三十二)卷积神经网络--BN批量归一化 前言 批量归一化batch normalization 课件 批量归一化 批量归一化层 批量归一化在做什么? 总结 教材 1 训练深层网络 2 批 ...

  5. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  6. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  7. JavaScript学习(三十二)— Keycode常用键位码对照表

    JavaScript学习(三十二)- Keycode常用键位码对照表 (一).字母和数字键的键码值(keyCode) (二).控制键键码值(keyCode) (三).多媒体键码值(keyCode)

  8. 1709 ltsb 内存占用_「正点原子STM32Mini板资料连载」第三十二章 内存管理实验

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第三十二章 内存管理实验 上一章,我 ...

  9. 【Visual C++】游戏开发笔记三十二 浅墨DirectX提高班之一 DirectX大局观认知篇

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:  http://blog.csdn.net/zhmxy555/article/details/8172615 作者:毛星云(浅 ...

最新文章

  1. 亿级商城计价中心 - 从容应对复杂场景价格计算
  2. 这个 GitHub Trending 让我在腾讯会议中“换脸成”任何人!来唠唠如何上手
  3. Android进阶知识:事件分发与滑动冲突(一)
  4. 开发实习生做什么_实习生月薪6W,还有住房补贴!投行前台到底是做什么的?...
  5. 一台加密货币ATM机月营收额高达3万美金
  6. 启明云端分享 | Sigmastar SSD201\SSD202D核心板在智能料理机方案的应用(4.3寸彩屏应用)
  7. python如何测试仪器_如何测试pytest设备本身?
  8. 《程序员面试金典》合法括号判断
  9. java rc4_nodejs 和 java 进行 rc4 加密得到的结果不一样
  10. AutoLISP 绘制表情图案
  11. MySQL 数据库 like 语句通配符模糊查询小结
  12. 【转载】雨更大了的飞鸽传书
  13. 安卓学习笔记25:常用控件 - 下拉列表
  14. java笔记之字符串,字符串数组,ListString的相互转换
  15. 《全面软件质量管理》核心观点摘录
  16. 中国现代书画家——鞠宗霖
  17. Pytorch 之torch.nn初探
  18. Python数据分析入门书籍推荐!!!强烈推荐,新手必看
  19. 怎么修改开龙软件里服务器名称,开龙设置服务器备份
  20. 面试:WebSocket相关

热门文章

  1. 100个线程同时向一个银行账户中存入1元钱
  2. pdfBox在pdf指定位置添加表格和内容
  3. 如何使用ICA(独立成分分析)来去除伪影
  4. Java集合类之List的ArrayList之删除指定学生
  5. ExternalInterface.addCallback for HTML5 target? anyone?
  6. 【AHK】如何实现通达信电脑端 核按钮清仓
  7. impala入门(一篇就够了)
  8. linux高级路由与流量控制,linux高级路由与流量控制
  9. 解决idea中不能输出中文问题
  10. ASP.NET验证控件之RangeValidator