arduino编乐谱_基于Arduino的电子音乐发声器设计
作者 赵云娥1 吴振强2 1.青海建筑职业技术学院(青海 西宁 810012) 2.陕西师范大学计算机科学学院(陕西 西安 710119)本文引用地址:http://www.eepw.com.cn/article/201702/344566.htm
摘要:Arduino 是一块基于开放原始代码的Simple I/O平台,具有使用简单,功能多样,价格低廉等优点,广泛应用于电子系统设计和互动产品开发方面。系统以ArduinoUNO开发平台为控制核心,充分利用其内部Tone 库,以数组形式组织乐曲的音高和节拍数据,通过串口和外围无源蜂鸣器进行通信,实现了电子音乐播放,随音乐节拍亮灭的LED为设计添加了温馨感。本系统成本低廉,可靠性高,可实现乐曲DIY,有良好的扩展性。
引言
Arduino 是一个基于开放原始代码的Simple I/O平台,由硬件(MCU及外围电路)和软件(编程接口和语言)两部分组成。它基于单片机系统开发,具有使用简单,功能多样,价格低廉等优点,广泛应用于电子系统设计和互动产品开发方面。目前市场所见电子音乐发声器调节不便,价格较高,不能很好地实现和使用者的交互。本电子音乐发声器的设计以ArduinoUNO板为控制核心,在相关乐理基础知识上,充分利用Arduino编辑器自带Tone扩展库,以数组形式输出各音符的指定频率和节拍,送到无源蜂鸣器和彩色LED,实现了音乐播放和随音乐节奏亮灭的LED效果。在操作方面,可以通过简单修改数组数据(音高和节拍)实现电子音乐的DIY,在欣赏美妙音乐的同时,充分发挥使用者的创造性。
1 系统硬件设计
本发声器以ArduinoUNO为控制核心,外部电路包括控制电路、蜂鸣器电路、LED显示节奏电路,系统硬件电路图如图1所示。开关S1对整个电路起控制作用,当检测到开关按下,即D3端口为高电平时,电路开始工作。预先组织好的音符数据(音高和节拍)通过数字端口D8发送到5V无源蜂鸣器J1,无源蜂鸣器接收到特定频率的(即特定的音高)方波去驱动它,可以发出“Do Re Mi Fa Sol La Si”的音乐效果。各数据加上延时(即节拍数据)即可实现乐曲的播放。无源蜂鸣器的优点是声音频率可控,可以和LED复用一个控制口。所以,D8端口的数据同时加到LED1、LED2、LED3上时,其节奏性的亮灭实现了节拍的显示。
2 软件设计
2.1 乐曲播放原理
2.1.1 单音符的演奏原理
一首乐曲由若干音符组成。从物理的角度来说,每一个音符唯一对应一个发声频率。Arduino只要把这个频率数据发送给蜂鸣器或喇叭,就会发出对应的音符。Arduino IDE自带的头文件“pitches.h”中以宏定义的形式给出了各个音符和频率的对应关系表。例如“#define NOTE_C4 262”语句给出了钢琴标准键盘小字一组C4(唱名为Do)按键对应的频率是262Hz。因此,只要能够识别给定的乐谱,就能得到一组对应该乐曲的频率数据,即制作出其数组形式的韵律函数。
2.1.2 节拍
除了音高,构成旋律的另一个重要因素是节拍,即音符演奏的持续时间。它决定了音乐进行的快慢程度。本发声器的设计中,通过读取旋律的节拍速度,来确定基本的延时单位。如二分音符为一拍,每拍延时1/2秒,则四分音符延时1/4秒,八分音符延时为1/8秒,均为基本延时的偶数倍。最终,采用了noteDurations[thisNote]数组来存放每个音符的节拍数据。在应用过程中,我们也可以通过调节基本延时来调节乐曲速度。频率数据按照节拍数据的延时来驱动蜂鸣器,就实现了一首乐曲的播放。
2.2 乐曲播放的软件实现
ArduinoIDE包含的Tone库可以很方便地帮助用户制作音乐。本设计主要采用了Tone(pin, frequency, duration)函数来产生电子音乐。此函数中,pin表示频率数据的数字输出接口,int型;frequency是音符频率,int型;duration是节拍数据,单位是毫秒,unsigned long型。只要把上述频率和节拍数据连续赋值给Tone函数,就可以实现乐曲的播放,系统软件实现的程序流程图见图2。
Arduino语言是以setup( )开头,loop( )作为主体的一个程序构架。本发声器的软件实现过程中, loop( )函数内部包含了控制按键判断函数,乐曲播放函数和延时函数。其中,乐曲播放函数play( )是发声器软件实现的核心语句,函数内所有语句周而复始地循环执行。下面以《生日快乐歌》(简谱见图3)的第一小节为例,给出了play( )函数的实现过程。
int melody[] = {
NOTE_G4,//5
NOTE_G4,//5
NOTE_A4,//6
NOTE_G4,//5
NOTE_C5,//1.
NOTE_B4,//7
0,
……};
int noteDurations[] = {
8,8,4,4,4,4,
4,
……
};
void play()
{
for (int thisNote = 0; thisNote < 29; thisNote++)
{
int noteDuration = 1000/noteDurations[thisNote];
tone(8, melody[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(8);
}}
3 结论
本系统利用了目前较为流行的Arduino电子互动平台,通过对ARDUINO IDE平台进行软件开发来控制外围部件,实现了电子音乐的播放和节奏的显示。Arduino是基于源代码的软硬件平台,具有价格便宜,互动多样,支持实时ISP在线烧录等特点。因此,本发声器价格低廉,操作简单,编辑方便,节拍速度可以调节,灵活性较高。该发声器功能可以进一步拓展,如果使用者具有一定的音乐素养,可以实现电子音乐DIY,为生活添加乐趣。
参考文献:
[1]赵英杰.Arduino互动设计入门[M].北京:科学出版社,2014.
[2]Michael McRoberts,Begin Arduino[M].杨继志,郭敬译.北京:电子工业出版社,2013.
[3]杨继志,杨宇环.基于Arduino的网络互动产品创新设计[J].机电产品开发与创新,2012,25(1):99-100.
[4]蔡睿妍.Arduino 的原理及应用[J].电子工程设计,2012,20(16):155-157.
[5]赵云娥,陈学煌.基于AT89C51的电子节拍器设计[J].电子测量技术,2008,31(3):176-179.
本文来源于《电子产品世界》2017年第2期第36页,欢迎您写论文时引用,并注明出处。
arduino编乐谱_基于Arduino的电子音乐发声器设计相关推荐
- arduino编乐谱_【Arduino】用Arduino编首小曲子吧
本次我们需要用的材料不多,一块UNO板,一块扩展板,一个喇叭模块再加一张乐谱.主要的核心内容是我们用arduino来编写音乐的部分. 编写音乐,首先我们一定要知道其中的乐理知识,知道音乐是怎样编排的, ...
- arduino灯光装置_基于Arduino的智能家居灯控系统设计
&能应用 ------ T X 阵 W S 2 8 1 2 全 彩 灯 带 R X 工 G N D r 0 引言 智能家居的概念虽然已经有了几十年,但进入我国并取 得一定发展还是最近几年的事, ...
- arduino编码器计数_基于Arduino开发环境的光电编码器检测仪设计方案 - 全文
0 引言 Arduino是一款基于单片机系统的电子产品开发平台,它的软硬件系统都具有高度的模块化,而且软件系统是完全开源的.其硬件系统也是高度模块化的,在核心控制板的外围有开关量输入/输出模块.各种模 ...
- arduino 伸缩轨道_基于Arduino的多轨道Midi音序器的实现
基于 Arduino 的多轨道 Midi 音序器的实现 陈业欣,丰大军,张 蓓 [摘 要] 我国对于专业电声设备的研究相对落后,当今专业电声产品无一例外 均来自日本及欧美国家.通过对使用音乐合成器时声 ...
- arduino nano 蓝牙_基于Arduino的摩尔斯电码练习及无线收发报训练器
摘要:本文介绍一款基于Arduino NANO开发的,带2.4G无线收发报功能的摩尔斯电码训练器的系统设计思路.发射端通过NANO板的外部中断引脚采集电键输入的脉冲PPM序列同时驱动喇叭播放电键音,然 ...
- arduino编乐谱_把乐谱播出来,自制简谱播放库
关注我们微信的童鞋可能还记得,昨天我发了一章关于UNO+喇叭就可以播放歌曲的文章. 文章到最后也没有完成整个天空之城歌曲.因为实在是太麻烦了..于是今天就苦思冥想,想借此机会整理出一个简谱的播放程序. ...
- arduino灯光装置_基于Arduino的灯光秀
步骤1:准备木制框架 您可以按照您希望的任何方式构建框架或外壳.我选择木材是因为仅需使用基本工具即可轻松完成工作. 我已使用一些已打捞过的木板来搭建框架.我在长度为30厘米的木板上标记了4个干净的零件 ...
- arduino智能闹钟_基于arduino的震动闹钟
本帖最后由 cloverli 于 2020-7-10 15:24 编辑 参赛项目: 震动闹钟 参赛组员: cloverli 项目简介: 在叫醒自己的同时,不打扰到别人的闹钟.微型震动马达为闹铃装置,利 ...
- 基于android的电子词典设计_基于Android的电子词典的设计
本毕业设计课题主要分为两个模块:即英-汉查询模块和汉语查询模块.在此两模块都是使用的Sqlite数据库,且数据库为.db文件. 对于电子词典,自己会根据任务书下达的任务来一步一步完成,实现系统的设计与 ...
最新文章
- 如何在多Node版本的情况下公用一个npm
- php程序员面试题(持续补充,偏中级面试题)
- SublimeText3系列(1)-安装、设置、快捷键、常用插件
- Dependence Injection
- 高阶函数 实现sum(2)(3) 柯里化
- 【Web后端笔记】SQL Server与java数据类型对应
- 2021年三月上旬推荐阅读文章
- 链表的中间节点--快慢指针
- 如何提高计算机软件的性能,如何提高计算机性能?
- 自动驾驶横向控制 LQR 算法推导及仿真学习笔记
- 如何解决Flash “此Flash Player 与您的地区不相容,请重新安装Flash”的提示?
- 测试所用的技术(黑盒、白盒测试等)
- 对反游戏外挂技术的思考及实现
- Spring In Action 学习 第一章 Spring之旅
- iOS设备指纹的前世今生
- 自动监控Oracle 表空间信息并发送邮件脚本
- 谈谈如何通过需求文档产生工作排期
- 哈佛大学计算机专业研究生排名,2019USnews美国大学ece研究生专业新排名诞生
- 剑指 Offer17-21
- RealFlow在线教程翻译(2)——Foam with SPH Fluids(基于平滑粒子流体动力学算法(SPH)的流体泡沫)
热门文章
- 迦瓦栈队 团队第一周项目总结
- angular.min.js:80 Error: [$injector:unpr] http://errors.angularjs.org/1.2.9/
- ExtJS的History使用
- axios请求发送两次请求_vue使用axios发送请求,都会发送两次请求
- ansys一段时间后进入model报错:ansysWBU.exe encountered a problem.
- CF919C Seat Arrangements
- 测试-------性能测试(一)
- 多臂老虎机(Multi-armed bandit problem)
- Generating Summaries with Topic Templates and Structured Convolutional Decoders笔记
- vue echarts绘制市级地图下钻(带注释)