模拟电子琴键盘输入的乐谱生成软件设计与实现
2017-06-30李社蕾
李社蕾
【摘 要】论文的关键就是要实现输出4个高八度以上的音域范围,并有相应的伴音输出。具体要实现三个要求:(1)按对应的键,输出该键对应的音;(2)按下即发声,松开声音即停止,按键多长时间,发出多长时间的声音;(3)根据输入,显示音符简谱以及对时值的附加显示。实现多音色,可调节音量,键盘及鼠标输入并发声的电子琴(钢琴)制谱软件。
【关键词】模块功能;模块处理
0 引言
随着计算机技术的发展进步,人性化软件逐渐成为我们生活中很重要的一部分,我们都会应用大量的人性化软件来满足人们日益增长的精神文化需求。制谱软件是现代电子科技与音乐结合的产物,是新时代的催生物。它在现代音乐扮演着重要的角色,C#语言因为其本身独特的衍生方式,而具有强大的控制功能和灵活的编程实现特性,它已经融入现代人们的生活中成为人类计算机应用中不可替代的一部分。越来越多的人工智能产品都是由C#语言编写程序控制的, C#语言简单易懂,而且也较易于对硬件进行操作,所以它成了编写人工智能产品程序的首选。论文关键就是应用C#语言的Winmm库来实现多音色,可调节音量,键盘及鼠标输入并发声的电子琴(钢琴)制谱软件。
1 模块功能介绍及其设计
1.1 输入部分
输入情况设计为以下3种:(1)键盘输入,通过对键盘输入的监听,完成对按键状态的记录储存,并发声,同时将按键对应的音频音符(简谱)输出显示;(2)鼠标输入,通过对鼠标位置,鼠标左键状态的同步监听,完成对鼠标操作相关的音频文件的发声,以及音频音符(简谱)输出显示;(3)Windows窗体中其他控件的鼠标操作[14]。
1.2 琴键定义部分
(1)通过定义琴键类,将所有可能发生的琴键操作全部在这个类中表示出来,包括键名,热键,琴键状态;
(2)琴键面板类,通过开发环境中提供的画板控件的相关操作,省去通过图片建立模拟琴键的方式,直接将模拟琴键以图画的形式生动地绘画出来,包括面板中琴键对应的音符(简谱),黑键(伴音)的音符(国际标准),通过构造函数(初始化)的方式,定义并完善琴键画板类所要实现的各种事件监听及响应功能;
(3)功能类,定义一个声音集合,用于实现多种乐器音色模拟。在这三者中琴键面板类将作为本次设计的核心,该类将直接作用于用户体验。见图1琴键的分布以及图2音符分布图。
论文选用的4组高八度音阶,是winmm库中对人类听觉舒适度最适中的国际标准音阶,在琴键位置的设计上,为了满足4个八度,以及可能出现的多重和弦特别将1',2',1'',2'',3''增加一个,这样不仅能有效缓解和弦问题,同时提高了键盘模拟电子琴演奏的舒适度,本设计并没有将黑键(伴音)添加键盘输入,仅仅设置了鼠标输入的方式,根本原因有两个:(1)开发是所用电脑键盘大小有限,不便于实现双排4阶的八度按键排列方式;(2)在实际演奏中黑键的使用频率远低于白键,所以没有纳入键盘排列。
1.3 输出显示部分
输出结果是琴键对应的标准音符音高的简谱既琴键标示名内容中的简谱,通过对窗体模块的编程,添加文本空间,获取按键对应的简谱信息以及按键持续的时值,以文本形式输出,在相应模块给出相应的显示,并且通过在窗体界面上添加控件的方式,对不同控件进行编辑,以实现多种附加功能。
详见图3窗体设计图
2 各模块处理流程
(1)键盘定义部分:就是定义好所用到的计算机键盘按键,模拟48键电子琴(钢琴)的MIDI琴键,其中包括MIDI琴键类,琴键面板类两大部分,通过对这两部分的设计,完成了课题主体的架构设计。琴键面板类如图4所示。
其实键盘定义就是简单的在电脑键盘上找出4组合适的按键,以满足课题中要求的4組高八度的音符,定义好每个按键对应的发声音符,这种定义要尽量满足实际的键盘分布。然后,每个音符对应的键盘热键也要定义好。以上流程就是键盘定义的工作流程。其中省略了部分按键的重复定义部分。
(2)输入部分:实际上就是弹奏的时候,判断被按下的是哪个按键,接收原理其实是每个按键都对应一个键盘值,如果哪个按键被按下,该键的值就会送入相应的程序处理模块,对扫描码进行响应的处理,致使发声。输入部分流程图如图3.7所示。
首先定义每个按键所对应的热键,然后循环不断的监控接收被按下键的值;接收到一个按键的值,先判断按键状态,进一步做后续处理,包括发出声音和在屏幕上显示音符的字符样式。
(3)发声部分:C#语言的WinMM库中提供的函数已经把对该硬件电路部分的操作封装好,编程人员可以直接调用,只是要根据需要的不同而有所不同,发声部分的难点在于多音色的定义,调用WinMM库实现连续发生这两点。
(4)显示部分:论文最终不仅要实现音符声音的输出,为了声文并茂,还要在计算机屏幕上显示出按下的键对应的声音来。比如按下“Z”键,它所对应的声音是低音的Do(.1),在发声的时候同时在屏幕上显示“.1”这样的字符,同时,通过对按键状态的监听获取到KeyDown到KeyUp过程所经过的时间。这两项就是需要输出显示的内容。输出显示部分流程图如图3.3.5输出显示部分流程图。首先程序要循环扫描计算机键盘是否有键被按下,如果有则开始计时,截至到按键弹起,计时结束,输出按键对应音符(简朴)以及发声时值,同时发出连续声音。输出部分的不容易掌握的部分集中在按键长按状态的单次字符输出,为了解决这一问题,本文采用了调用System.Diagnostics.Stopwatch sw的方法,在按键按下式开始计时,在按键抬起时结束计时,同时将字符输出的时间点延后在按键抬起时,这样的设计不仅解决的连续发生的问题,也将单次输出按键音符(简谱)的目的轻松完成,同时还实现了对发生时值的计便于将其直接输出在窗体中文本控件中。
3 程序实现
3.1 总程序流程
(1)做好键盘定义部分,即电脑按键和音节的对应关系。
(2)编写程序接收键盘输入,先判断被按下的按键是否是琴键定义中的部分,如果是,获取按键值监听按键状态。对琴键定义部分中的相关按键,做相应处理,发出对应的声音。例如按下的“Z”键,则调用发声函数,MidiKeys[m].isDown = true;发出“Z”键对应的标准音。
(3)输出显示,就是在电脑屏幕上显示按下的键对应的音符的字符样式以及发音时值。
最后,是完善程序的用户体验,既所谓的附加功能模块,用于窗体中其他控件的可操作性编辑,包括:音色选择,音量选择,Richtextbox中的内容存储文本(.txt格式),打开文本(.txt格式)的附加功能等。
3.2 程序运行主要界面如图5所示。
至此,模拟电子琴键盘输入的乐谱生成软件设计与实现已经基本完成。通过运行,该设计可以顺利实现4组标准音的输出(低音、中音、次高音、高音的7个标准音),持续发音也得到了很好的解决,声音不但可以很连续的输出,而且还实现了多重音色选择,音量控制,乐谱文本保存,打开演奏帮助文本的功能。
【参考文献】
[1]陈爱萍,李聪.基于FPGA的乐器数字接口音乐FM合成器[J].电声技术,2008.
[2]黄静.MIDI系统在幼儿园音乐教学中的运用[J].小学科学:教师,2012.
[3]董景.数字录音的发展[J].音响技术,2001,01.
[4]王春明.MIDI技术的发展及其存在问题的解决[J].电声技术,2004.
[5]曹玉娟.音乐喷泉交互设计平台[D].浙江大学,2007.
[责任编辑:朱丽娜]