基于LabVIEW的便携式按键钢琴
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
虚拟仪器技术及应用
--基于LabVIEW的便携式按键钢琴
班级:
姓名:
学号:
成绩:
一、设计要求:
基本功能要求:便携式按键钢琴
思路: 利用myDAQ的8个数字I/O通道作为琴键输入,通过LabVIEW编程合成出所需频率的声音,经过D/A变换后通过Audio Out端口放大输出。
程序中通过设置不同的谐波组合可以最终混合出不同乐器的音色。
说明:除了数字I/O的信号采集和模拟信号输出之外,这个题目的主要工作在软件方面的数字信号处理与合成(比如,如果同时按下两个按键,出来的效果应该是两个音的叠加;同时还要考虑针对不同乐器不同音色所对应增加的谐波比例)。
软件上还可以增加其他功能,例如可以选择将PC音频输出的音乐通过myDAQ的Audio In端采集后增加混音或重低音效果等然后再通过Audio Out端播放出来。
在硬件方面,可以扩展的一些工作包括琴键输入开关的毛刺滤除电路设计、音频输出后再做一级放大电路等。
由于myDAQ只有8个数字I/O端口,因此只能做一个八音阶。
衍生功能要求:便携式曲目练习器
思路:播放一首歌曲的同时,在PC界面上显示乐谱(或者当前的音阶和拍长),练习者需要按下对应的按键,这些按键连接到myDAQ的数字I/O端口,从而计算机可以判断是否正确,乐曲结束后根据按键的正确性和节奏的正确性给于相应评分。
说明:本题目硬件与上一题目基本相同,在练习时可以播放原有旋律,同时记录练习者的按键顺序和时长,合成成乐声在练习结束后播放,并与原旋律比较。
相比上一题目,需要在软件中记录数字键输入的顺序和时长。
此外,可以设置不同的难度级别。
本程序功能规划:
根据已有的功能要求,我们需要制定一下我们电子琴程序的方向,究竟要做到什么地步,要做哪些功能,经过小组内的讨论,以及与指导老师的交流,再就是根据我们目前对MyDaq以及LabView的掌握情况,我们制定了如下的具体要求:
1.图形界面模块:一个非常形似电子琴的图形界面,做到界面整洁美观,有区分度,交互通俗易懂
2.发声模块:电子琴的基本发声功能,做到不同音调,音色,音量
3.控制方式模块:做到能用鼠标,键盘和基于MYDAQ的机械按键控制
4.扩展模块:
①曲目练习器模块:考虑到现有设备的局限性以及知识的局限性,我们现在把曲目练习模块简化为:通过文件IO读取歌曲TXT曲谱,根据曲谱控制钢琴的按键的变色从而作为演奏提示,最后不考虑节奏只考虑曲谱声调的正确率做打分。
②自动播放模块:该模块做到根据TXT曲谱来自动演奏钢琴乐。
③除此之外,由于涉及曲目练习,我们还要做歌曲的曲谱以及声音文件。
二、模块实现:
在做本次程序之前,我们进行了充分的调研工作,包括:
●LabVIEW图形界面系列-色彩搭配;
●八度音阶频率关系对应表;
●乐器音色的原理;
●钢琴音色的制作;
●曲目曲谱的设计及制作;
●LabVIEW文件IO及属性节点的使用;
●MYDAQ设备的基本使用及设备可实现功能;
下面将按搭建顺序一一介绍每一个模块的具体实现,最后介绍每个模块之间是如何联系起来的。
⏹发声模块
◆播放正弦波
要做电子琴,理所当然我们第一步想的就是如何发声,想到以前在《数字信号处理》课程中做过语音信号的处理相关编程,知道播放固定频率的正弦波可以发出声音,再查看LabVIEW所支持的函数,定下了初步的思路,即:首先产生一定频率的正弦波,设置好采样频率以及时长,送播放波形函数,如下图1.1:
图1.1 播放正弦波图1.2 播放三角波
于是,我们马上做了一个布尔按钮做测试,利用条件结构(布尔变量为真送一个数字,如266,到正弦波产生函数的输入参数-频率中)实现了发声,但有两个问题:
①音质很差(主要因为音色)
②有很强的尾音(声音突然停止产生的刺耳噪声)
但无论如何我们成功实现了发声。
◆播放三角波
为了解决第一个问题,之后查阅了相关内容,知道:不同音色是由某一基频的正弦波叠加上一定比例的谐波成分实现;
于是我们做了如下处理:
如图1.2,先同样方法产生一定频率的三角波,再通过低通滤波器,我们知道周期的三角波一定可以分解为基波和谐波相加,经过低通滤波器滤除高频后,出来的声音与正弦波是不同的音色
结果正如我们所想,出来的音色不同,音色更像电子音,但尾声仍存在。
◆播放公式波形
为了解决尾声的问题,我们想如果能让音的尾部音量变小就好了,于是找到了公式波形,将正弦波的幅度随时间改变,开始和末尾的幅度偏小,中间幅度最大,用了如下的公式:
sin(w*t)*sin(m*t);
幅度A(t)= sin(m*t),使
π/m = 采样数/ 采样频率
我们设计的采样数为5000,采样率为11025,那么差不多m = 2π;于是设计的第三种音色如图1.3:
图1.3 播放公式波形图1.4 播放WAV文件
效果比之前两个都好,音色像管弦乐器,尾音更小。
播放文件
公式波形仍然不能满足我们对完美音色的要求,于是我们决定用另外一种发声机制-播放文件,在网上找了很久没有发现好的八度音阶音色后,我们开始了自己制作相关的音色,还好本组同学中之前有对音乐软件的了解,用
++ =
制作出了所需的WAV文件。
我们并用如图1.4的结构实现了WAV播放,由于是外部音,所以效果很好,只是第一次载入有些慢。
至此,我们实现了四种音色,接下来就要讨论如何控制发声
⏹控制模块
由于调试的需要(调试时基本都用鼠标),以及DAQ设备的抢手,我们最初只做了两种控制模式,鼠标控制,以及机械按钮控制。
◆鼠标控制
原理上很简单,无论是鼠标控制的8个布尔按钮,还是MYDAQ采集到的面包板上8个按键,输出的都是一个1D的长度为8的布尔数组,通过对布尔数组的每一位做检索,为1则发声,为0则不发声。
程序框图如图2.1
图2.1 鼠标控制发声的结构
图中显示的是把鼠标控制的八个布尔按钮(实际鼠标可以控制13个按钮,但因为机械按键只有8个,这里只说八个)集中到一个簇中,在转换为布尔数字,检索布尔数组每一位,如果为1则发出对应频率的声,此处我们查询了音调和频率对应表,如图2.2,得出下面对印关系
Duo re mi fa suo na xi dou+
261.63 293.66 329.63 349.23 392 440 493.88 523.25 (HZ)
图2.2 八度音阶与频率对应关系
那么当我们按下DUO按钮时,布尔数组第一个值为真,控制发出261.63Hz的声音,同理按下NA按钮时,布尔数组第六个值为真,控制发出440Hz的声音,如此,实现了鼠标控制;
测试鼠标控制发音正常。
并行结构的好处:为什么我们要按这种并行检测每一位然后分别播放的结构?实际上是为了解决多个按钮同时按下的时候,能两个音同时发出的需求。
◆机械按键控制
机械按键控制与鼠标控制的后面发声部分完全一样,只是前面的簇改为了DAQ 助手,DAQ助手选用的是端口采样PORT0,外围硬件接线很简单,用共阳极结构,将MYDAQ的PORT的8个端口分别接面包板上八个按钮的一端,8个按钮另
一端接+5V电压高电平,此处没有图。
因此,DAQ助手输出的是十进制数,将其转换为2进制数后,后续操作同上。
程序如图2.3
图2.3 机械按键控制发声
机械按键控制的问题
机械按键的发声测试播放波形时,效果正常;
但是播放文件时,由于DAQ助手采样很快,所以按下按钮时,WAV文件会播放很多次,导致声音混叠,我们的解决方法时采用延迟一小段时间的方法,播放文件条件分支里用的是层叠结构,在后面的帧里设置延迟0.1秒,如图2.4
图2.4 播放波形条件分支中的延迟
至此不算扩展功能,我们的基本功能已经实现。
图形界面模块
前面提及了基本发音及控制,为了实现扩展功能,必须把程序的大体结构和前面板的界面作介绍,前面板如图3.1
图3.1 前面板
前面板结构:
左边是曲谱的提示部分;中上是选择控制部分;右上是提示面板(演奏时才有变化);右下是鼠标控制的布尔按钮(设置快捷键之后可以键盘控制)
前面板以蓝色为背景,黑白为主色,其他颜色为辅色做提示,整个布局提示在左,操作在右,控制在上,钢琴按键的制作只需将布尔按钮拉长之后用工具选板做变色处理,简单但美观。
后面板介绍
演奏方式控制模块:对应前面板的演奏方式按钮,控制是否自动播放,以及鼠标/键盘控制,还是机械按钮控制。
如图3.2
图3.2 演奏方式控制
歌曲选择控制模块:对应前面板的歌曲选单,决定演奏/自动播放那首歌如图3.3
图3.3 歌曲选择控制
曲目演奏主模块,包括打分主程序,颜色提示主程序,演奏时的变量控制如图3.4
图3.4 曲目演奏主模块
自动播放模块,自动播放的实现程序,如图3.5
图3.5 自动播放模块以及之前提到的播放声音模块,如图3.6
图3.6 播放声音模块曲谱文件的读取模块,如图3.7
图3.7 文件读取模块
这里只对每一个模块做一个说明,对应到具体的扩展应用时,再将具体的结构加以说明,下面将介绍扩展功能的实现
曲谱练习(扩展)
曲谱练习模块的基本原理就是选择完曲目后,程序会从TXT文件里面读取相应的曲谱,读取到的内容输出为字符串,每弹奏一次时,把弹奏的按键对应的数与曲谱中即将弹奏的音对应的数作比较,如果为真,加1分,如果为假,不加分,同时用一个变量记录剩余曲谱的长度,剩余曲谱长度为0时,把总的得分除以曲谱的长度,得到最终的得分。
由于程序太过庞大,无法展示所有的条件分支
下面以一个流程说明程序的工作
①程序运行后选择以下控制方式
选择鼠标控制,钢琴音,歌曲练习,歌曲选“我的歌声里”
那么歌曲谱变量内容变为“我的歌声里”,如下图4.1:
图4.1 歌曲谱的改变
此时先从TXT中读取字符串,歌曲列表为0时(对应下拉框选择第一个选项“我的歌声里”),把已经读取的字符串送入歌曲谱,那么界面左边的歌曲谱发生了改变,同时做了图4.2的初始化,包括即将演奏音阶的读取,前面板进度条总长度的自适应,歌曲谱送入剩余歌曲谱,即将演奏的第一个音为“3”,长度为“99”。
图4.2 选择歌曲后的初始化
②按下乐谱的一个音“1”(举例为“1”也可为其他)
那么程序先判断是否按下
按下时,比较的结果为假,把“1”送入当前演奏音阶和演奏记录
接下来把剩余曲谱中的第一个音“3”送入当前乐谱音阶
剩余乐谱减一
建议后的剩余乐谱第一个送入即将演奏音阶
接着作比较“1”和“3”比较,不相等,于是正确数目不加1,否则加1
图4.1 加分的判断
③提示按键的变色
由于之前比较“1”和“3”,沿线演奏错误,于是把红色属性(代表错误)送到“1”
对应的前面板中右上角键盘“1”对应按键的属性节点-颜色中实现变色,延迟
0.5秒后,把白色属性重新送入该按键
、
之后,把黄色属性(代表下一个音)送到即将演奏音阶对应的按钮中,等到下一次按键判断完后,恢复白色
如此循环,直到把谱子中所有音阶演奏完后,做判断,弹窗提示你的得分
这就是一个大致的流程。
谱子系统,变色系统
刚才提到了许多关于“1”“3”变色等内容,他们属于我们定义的规则,那么接下来把谱子系统变色系统作介绍
1~9:分别代表duo,re,mi,fa,suo,na,xi,duo+,re+;
S:suo- ;
N:na- ;
X:xi-;
M:mi+;
回车:延迟0.4秒
空格:延迟0.15秒
“-”:延迟0.05秒
变红色:演奏错误
变黄色:此音阶时下一个要演奏的音阶
变绿色:演奏正确
变白色:默认颜色
其实单单一个流程远没有把,程序框图中的每个部分都介绍到,由于要考虑到程序的完整性,细节处理很多,此处提一个比较重要的细节处理
空格处理:在计算得分的时候,我们用演奏正确的数目除以总长度,此处的总长度并非为曲谱长度,而是去除了空格回车之后的曲谱长度因此要做如下图的处理,即将演奏为“默认”时空格个数加1,“默认”表示非音阶字符串。
最后除以的是谱子长度与空格个数只差。
下面将介绍自动演奏模块。
自动演奏模块
三、总结展望:
从此次课设中我们学到了很多东西,对LavVIEW的理解又上升了一个档次,对条件结构的使用更加娴熟,对属性节点,层序结构使用更为熟练,电子琴本身项目的原因也让我们扩充了多方面的知识,不论是从编程,理论知识,设计,其他软件使用方面都对我们有所锻炼,但是即便如此,我们的程序仍有很大的提升空间,比如,我们可以扩展无线控制模块,MATLAB声音处理模块,等更多系统的扩展,但是这也需要我们积累更多的知识之后才能完成,最后感谢老师对我们的指导与帮助。