武汉理工大学 袁 帅 熊绍潘 付天纯
音乐历史悠久,是人类情感的重要载体,是人类智慧的结晶。音乐记谱,是根据一段音乐写出其相应的乐谱。一般的乐音爱好者将乐谱演奏出音乐不是一件很困难的事情,但是反过来将音乐记录成对应的乐谱却非常困难。手工音乐记谱,更是需要非常专业的乐理知识。基于Android 的自动音乐记谱,就是让移动终端具有音乐家的这种记谱能力,而音高估计是自动绘谱研究的核心。
音高估计有两个基本任务,一是对频率分析并解析成音符,这可由乐理的相关知识得到[1],二是估计乐音的频率,即基音周期。国内有很多学者在基音周期的提取方面进行了研究。高戈等提出了一种基音周期估计算法,以实现甚低码率下的透明质量语音编码[2]。黄海亮等利用人工神经网络和动态规划算法提出了一种高精度的基音提取方案[3]。徐国庆等提出了一种音乐识别方法,为实现自动作曲系统提供了较高的识别精度[4]。成新民等通过线性变换等方法将求取“最小谷值点”转换为求取最大值,实现了精确的基音检测[5]。翟景瞳等基于自相关处理和快速傅里叶变换(FFT)提出了一种的改进的单音音高识别算法[6]。夏殿松等进一步对平均幅度差函数(AMDF)和短时自相关函数(ACF)进行研究[7]。
本文研究的主要内容是,基于Android平台的听曲绘谱的研究及实现,主要包括以下内容。第一,选择合适的音高提取算法,在保证音符识别效果的前提下,满足移动端的计算能力;其次,对由频率转换为音高的算法进行研究,生成乐谱数据;最后,对在Android平台的乐谱表示系统进行设计并实现听曲绘谱功能。
听曲绘谱系统的概念设计如图1所示,音乐采集模块使用Android的录音设备进行乐音输入,并将音频文件存入存储器中,特征提取模块获取音频文件,进行特征频率计算,由乐谱生成模块进行音符映射和小节划分,形成乐谱数据,最后将传入乐谱显示模块中进行显示。同时乐谱优化模块提供对自动生成的乐谱的校正功能,以提高听曲绘谱系统的实用性。
图1 听曲绘谱系统模块设计
在Android系统上实现听曲绘谱的基本流程,主要是录音采集,基音周期提取,频率音高映射和乐谱在UI界面显示,如图2所示。
图2 听曲绘谱系统算法流程图
在录音的过程中,将录音缓存数据以四分之一节拍时值的长度分发到图1中的特征提取模块,进行基音周期提取,然后由乐谱生成模块进行频率音高映射,判定该四分之一节拍的音符值,存入乐谱数据中。由乐谱显示模块进行乐谱数据的再处理和实时显示新生成的乐谱数据。
基音周期提取算法是特征提取模块的核心,所选取的基音周期提取算法需要进行时间复杂度和基音周期提取准确率上的权衡,以达到在Android移动终端的计算能力之内进行准确的音高判别,进而实现实时的乐谱绘制效果。在文献[8]中提到了短时平均幅度差函数基音周期提取法在计算上要比短时自相关函数法更为简单,并且也更易于实现。
设模块输入语音信号的时间序列为x(n),首先消去语音信号的直流分量,再进行幅值归一化处理。在之后的短时时域分析中,经加窗和分帧处理后得到第帧的语音信号xi(m),定义xi(m)的短时平均幅度差函数Di(k)为:
其中,下标 i 表示第 i 帧,每帧长度表示为N。对于周期性乐音信号,Di(k)呈现出与乐音周期相一致的周期特性,即在乐音的基音周期的各个整数点上达到谷值。根据Di(k)的这种特性,可以估计出乐音信号的基音周期。
在使用平均幅度差函数检测基音周期时,是进行谷值点搜寻,而寻求峰值更容易计算。在文献[5,8]中,提出了一种通过线性变换(公式)把寻找谷值改为寻找峰值的办法:
经分析可以发现,平均幅度差函数的周期性都发生在谷值点的位置上,而且前两个谷值相接近,容易在基音周期计算中误判为基音周期的倍频。而在MAMDF中,把谷值变换成峰值,并且前两个峰值的大小明显区分出来了,可以有效减少误判。
声音是由振动产生的,声音的传播形式是具有一定频率的声波。我们所听到的各种周期性乐音,如钢琴音、笛音等,在演奏中具有相同的频率,在乐谱中的表示即为音高。
在音乐的表示系统中,通常使用的是十二平均律,又被称作“十二等程律”,是把一组音(一个八度)分成十二个半音音程的律制,各相邻两个音律之间的频率之比完全相等,即将八度的音程按频率等比例地分成十二等份[1]。以A4与A5为例,A4与A5之间的频率比是1:2,其间被分为12个半音,每隔半音间的频率之比都为半音比。可得由A4计算出任意音高频率的方程[9]:
根据将方程进行逆运算,可得方程:
其中,f1为1939年国际标准协会通过的现行的国际标准音高A4=440Hz,f 2为计算出来的乐音频率,p为半音比,n为所求的音高与标准音高A4的距离。
我们选择音乐简谱[10]作为我们的目标乐谱表示系统,并对其在Android移动终端上的表示进行设计。
为了能够对简谱表示进行设计,首先构建简谱表示的简单模型。在简谱表示中,对于每个音符,其具体的音符表示有:,依次代表低音、中音和高音的四分之一拍、二分之一拍、四分之三拍和一拍,这样设计的目的是,便于将按时间序列进行差别得到的音高序列转换成对应的乐谱。
将以上音符模型按时值由短到长,音高由低到高从零开始进行编号,形成一套完成的音符映射系统,便于乐谱显示模块调用。将由频率音高映射得出的乐谱数据进行大调转换,然后按设计的音符映射体系进行映射,从音符集合中取出对应的音符表示,输出至Android移动终端的屏幕上。
当乐谱绘制完成后,根据用户设定的每拍的时长和每小节的拍数,进行自动小节划分,添加小节线,并将连续相同的音符进行合并,按合并后的时长更新其音符表示,形成完整的乐谱,图 1中的乐谱优化模块提供对生成的乐谱进行音符的增删改操作,以提取最终输出乐谱的正确性。
本文研究的主要内容是,基于Android平台的听曲绘谱的研究及其实现,主要包括以下内容。第一,选择改进的平均幅度差函数法进行基音周期提取,可以在Android移动终端的计算能力之内,实时的进行准确音高判别。第二,对频率到音高的映射关系进行了总结。第三,对音乐简谱进行建模表示,并设计出一套适合于在Android系统上使用的简谱表示系统。工作的不足之处在于,所设计的简谱格式并不完备,仅考虑了乐音的音高和时值,未考虑音乐的节奏问题,并且只实现了只有一种乐音存在的自动绘谱,而针对多音音乐的自动绘谱问题仍有待研究。
[1]李重光.音乐理论基础[M].人民音乐出版社,2006.
[2]高戈,李明,胡瑞敏.基音周期估计算法研究[J].声学学报,2003(06)∶540-544.
[3]黄海亮等.一种高精度的基音提取方案[J].计算机工程,2004(S1)∶343-345+372.
[4]徐国庆等.乐音识别方法及应用[J].计算机应用,2005(04)∶968-970.
[5]成新民,曾毓敏,赵力.一种改进的AMDF求取语音基音的方法[J].微电子学与计算机,2005(11)∶ 164-166+169.
[6]翟景瞳,王玲,杜秀伟.改进的音高识别算法[J].计算机工程与应用,2009(20)∶228-230+242.
[7]夏殿松,胡淼,洪夏俊.一种基于AMDF和ACF的基音周期提取算法研究[J].军事通信技术, 2009(01)∶27-31.
[8]宋知用.MATLAB在语音信号分析与合成中的应用[M].北京航空航天大学出版社,2013.
[9]编曲资源,音高与频率的对应关系,2016.
[10]董丽丽,邓小峰.读谱与乐理[M].武汉理工大学出版社,2007.