基于MATLAB软件GUI界面的可编程电音合成器软件
2019-04-13 13:11发布
生成海报
基于MATLAB软件GUI界面的可编程电音合成器软件
概要: 本文基于MATLAB及其GUI界面设计了一个基可编程电音合成器软件。利用MATLAB的GUI控件及相关算法,实现了多种音 {MOD}电子音的合成,做到了音长、音 {MOD}、音调可控和显示的多样化。基本音调包含了钢琴88键的频率,音 {MOD}可选范围有正弦、方波、锯齿波、四段包络的正弦波、KarplusStrong合成波等。另外,软件还实现了midi文件的编解码,用户可通过对midi数组的编程自行设计电音曲目。
关键字: 知识测试;MATLAB; 图形用户界面设计
1 总体设计
1.1 设计思路
软件首先设计了Synthesizer界面,将音频的音频显示坐标、频域显示坐标、数据输入输出界面集成到一起,实现电音合成与播放的基本功能;再设计子界面mymidi,通过该界面读取midi文件并播放。用户可以自行设计midi矩阵以实现个性化的设计。
1.2 软件运行
本软件运行在MATLAB上,打开MATLAB,在工作路径下粘贴本软件源代码、和一个音频信号作为提示音,点击运行即可出现用户交互界面。通过操作界面内一系列按钮以及快捷键即可使用本软件。
2 软件功能说明
2.1 软件界面
设计了如图1和图2所示的显示界面:
图 1 软件显示界面(1)
图2 软件显示界面(2)
2.1.1 菜单栏
界面Synthesizer有6个下拉菜单
“开始”菜单有2个子菜单,分别为“读取midi文件”和“创作midi文件”。点击“读取midi文件”后,弹出mymidi界面;点击“创作midi文件”后,显示出“创作一”和“创作二”子文件,分别对应另个midi曲目。如图3所示。
图3 “开始”菜单
“显示”菜单有8个子菜单,分别为“ {MOD}彩”、“线型”、“线宽”、“标记点型”、“标记点边缘 {MOD}”、“标记点表面 {MOD}”、“标记点尺寸”和“恢复默认”。它们各自都有若干子菜单,作用是设置对应的图像属性。如图4所示。
图4 (1)
图4 (2)
图4 (3)
图4 (4)
图4 (5)
图4 (6)
图4 (7)
图4 (8)
图4 “显示”菜单的8个子菜单
“音 {MOD}”菜单设置所合成的单音音 {MOD},有5个子菜单,分别为“无包络锯齿波”、“无包络方波”、“无包络正弦”、“四段包络正弦”、“KarplusStrong合成”。如图5所示。
图5 “音 {MOD}”菜单
“音高”菜单设置所合成的单音的音高,按照钢琴键盘的分类,将音高分为以下9个音组,也就是对应的子菜单,分别为:“大字二组”、“大字一组”、“大字组”、“小字组”、“小字一组”、“小字二组”、“小字三组”、“小字四组”、“小字五组”。如图6所示。
图6 “音高”菜单
“音长”菜单设置所合成的单音的音长,默认每个单音音符0.6s,每次改变0.1s,或增加或减少。如图7所示。
图7 “音长”菜单
“帮助”菜单有2个子文件夹,分别为“版本说明”和“使用说明”,分别介绍软件的基本情况。如图8所示。
图8 “帮助”菜单
2.1.2 工具栏
GUI的工具栏内有11个工具,它们从左到右依次是:“显示网格线”、“放大”、“缩小”、“数据游标”、“增加线宽”、“减小线宽”、“增加标记点尺寸”、“减小标记点尺寸”、“增加单音节时长”、“缩短单音节时长”和“恢复默认”。如图9所示。
图9 工具栏
“显示网格线”工具的功能是在时域频域图中显示或隐藏网格线;
“放大”、“缩小”工具的功能是缩放图像。
“数据游标”工具的功能是显示波形图中各点的横纵坐标。
“增加线宽”、“减小线宽”、“增加标记点尺寸”、“减小标记点尺寸”、“增加单音节时长”、“缩短单音节时长”和“恢复默认”工具的功能对应的菜单功能相同。
2.1.3 MySynthesizer界面
MySynthesizer界面有2个坐标轴,一个参数显示框和一组单音节键盘框,2个坐标轴分别显示当前合成的单音的时域、频域波形;参数显示框显示当前合成的单音的频率值、所属音组、音 {MOD}、音长、显示线宽和标记点尺寸等参数;单音组键盘有12个按键可选,表示待合成的按键音。通过对音 {MOD}、音长等参数的选择,可以合成多音 {MOD}、多频率、多音长的单音,还可以通过对显示参数的选择从多角度观察信号。其中,KarplusStrong合成算法对高频音的合成效果不佳,因此,当选择此音 {MOD}时,设置高频音组“小字三组”、“小字四组”和“小字五组”为无效。由于KarplusStrong合成算法的特殊性,对于同一音符会有多种频谱,但是其基音频率都是相同的。
2.1.4 mymidi界面
点击“开始”->“读取midi文件”之后会弹出mymidi界面。
mymidi界面有2个菜单、2个工具和2张坐标。
“打开”菜单为读取.mid文件,并将其解码为一个一维数组,并包含有音轨、声道、采样率等基本音频信息。同时,解码得到的信号将在第一张坐标(上侧)上显示,在第二张坐标(下侧)上显示其对应的自动打孔纸卷图,颜 {MOD}代表了每个音符的响度。
“合成音 {MOD}”有5个子菜单,设置读取并解码的音频文件的合成音 {MOD}。如图10所示。
图10 mymidi界面的“合成音 {MOD}”菜单
工具栏中有2个工具,分别为“保存音频”和“播放”。其中“保存音频”工具将读取的.mid文件保存为一般音频文件.wav格式,“播放”工具用以播放解码后的音频。
2.2 所需文件
运行本软件需要至少18个文件:15个源代码文件,2个GUI图形界面文件和至少1个midi文件。如图11所示:
图11 软件运行所需文件
其中,.m文件是源代码文件,.fig文件是图形界面文件,.mid是midi文件。
2.3 软件运行效果
软件可调参数丰富,包括音长、音高、音 {MOD}和多样化的显示参数。下面将作简要演示。
2.3.1 单音合成效果
图12到图15展示的是在不同音长、音 {MOD}、音高和不同显示模式下的单音的时域频域图像。
图12:音长1.2s,四段包络正弦波,小字一组c1键(261.626Hz),波形蓝 {MOD},线宽0.5;无标记点;
图13:音长0.2s,四段包络正弦波,大字一组C1键(32.703Hz),波形蓝 {MOD},线宽1.5;有标记点,标记点型为向上的三角,尺寸为4, {MOD}彩为蓝 {MOD};
图12
图13
图14:音长0.5s,KarplusStrong合成,大字一组E1键(41.203Hz),波形红 {MOD},线宽0.5,有标记点,标记点型为圆圈,尺寸为2, {MOD}彩为蓝 {MOD};
图15:音长0.2s,无包络方波,大字组F键(87.307Hz),波形红 {MOD},线宽0.5,有标记点,标记点型为空心五角星,尺寸为8, {MOD}彩为蓝 {MOD};
图14
图15
2.3.2 读取midi文件
图16展示的是读取midi文件之后的时域图和自动打孔纸卷图。
图16(1):时域图。读入“jesu.mid”,音 {MOD}为KarplusStrong。
图16(2):自动打孔纸卷图。读入“jesu.mid”,音 {MOD}为KarplusStrong。
图16 (1)
图16 (2)
2.3.3 设计个性化曲目
用户可以通过写一特定矩阵实现个性化的编曲,用户需要输入的信息包括音符数目、每一个音符的编号、响度、音轨、声道、开始时间和结束时间。
如,编写曲目为:
N = 21; % 音符数目
M = zeros(N,6);
M(:,1) = 1; % 音轨1
M(:,2) = 1; % 声道1
M(:,3) = (70:90)’; % 音符(只能取0-127)中央C:第60号
M(:,4) = round(linspace(60,120,N))’; % 设置每个音符的响度:80->120
M(:,5) = (0.5:0.5:10.5)’; % 每个音符的开始时间
M(:,6) = M(:,5) + 1.5; % 每个音符的结束时间
则表示:产生21个音符,所有音符在1号音轨,在1号声道输出,取编号为70-90的21个音符,响度设置为在60-120区间线性分布,每个音符的开始时间相隔0.5s,每个音符延续1.5秒。
则在不同的音 {MOD}选择下,会出现多种音频曲线,其产生的人耳听觉效应也不同。图17(1)-(5)分别表示在5中不同音 {MOD}下的音频曲线。
图17(1):无包络锯齿波;图17(2):无包络方波;图17(3):无包络正弦波;图17(4):四段包络正弦波;图17(5):KarplusStrong合成。
图17 (1)
图17 (2)
图17 (3)
图17 (4)
图17 (5)
图17 同一曲调5种不同音 {MOD}下的音频曲线
图18所示为该曲目的自动打孔纸卷图。
图18 该曲目对应的自动打孔纸卷
用户也可按此方法设计自己的个性化曲目。
3 后记
这是我大三下学期做的项目,前前后后花了大约一周时间。说来有趣,某一天我在整理MATLAB目录时发现了大一暑期做的一个名为“基于MATLAB软件GUI界面的自制简单电子琴”的课程设计,(相关内容已经整理到了我的SCDN博客上,点击链接即可查看),一看才发现当年做的项目真是相当简陋,于是我对它进行了一些改进。总地来说在原来的基础上变得更加美观、功能也更加丰富了。
本项目中midi编解码的部分主要参考了Ken Schutte的工作,相关代码见其个人网页。
出于对知识产权和他人智力劳动成果的尊重,我在此仅分享此项目中我个人贡献的代码。读者可根据上文中图11的描述从两处找全所有的文件并成功运行程序。当然,如果有读者对此尤其感兴趣或者有需要帮助的地方,我也十分欢迎大家与我联系。
转载时务必注明来源及作者。尊重知识产权从我做起。
代码已上传至网络,欢迎下载,密码是23cy。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮