本节将把上述MusicXML的信息挖掘方法,应用于用户录入乐谱后的音乐信息有效性评估。当用户利用音乐软件制作乐谱时,通常会出现一些录入误差,比如音高输入错误、音符多输或漏输等,不能保证音乐信息的完整性。特别是在刚刚学习制谱的学员中,会出现大量音乐信息的录入误差;另有不少的音乐专业学生选修制谱课程,在学习制谱的过程中,无意间也会录入一些错误的信息,以下探讨如何利用MusicXML来评判制谱的有效性。
当用户录入乐谱时(特别是在学习制谱时),通常会根据指定的乐谱进行录入,录入的时候,尽量完整地体现指定乐谱的所有音乐信息和谱面信息,如所有音符都要录入正确,每行乐谱在谱面上要对齐等,那么如何利用MusicXML信息挖掘技术判断是否完成了这些任务?
如果指定乐谱和录入乐谱都是以MusicXML音乐格式存储,那么问题就简单变为:一个是指定乐谱的MusicXML文件,另一个是录入乐谱的MusicXML文件,如何判断录入乐谱的正确性。在以下讨论中,指定乐谱称为样板乐谱和样板MusicXML文件。下面先讨论三个关键知识点。
第一个关键知识点:多样性。MusicXML文件有两种不同的格式,即“score-partwise”和“time-partwise”,这两种分别以声部优先和时序优先的格式都能完整地表达音乐信息,并能良好地相互转化。所以,在对样板MusicXML文件和录入MusicXML文件进行有效性评判时,首先要把它们转化为统一的格式。
第二个关键知识点:选择性。在MusicXML3.0版本中,出现了多达682个不同的标签,这些标签中大多数是不常使用的(图4-4);不同的标签在MusicXML文件中出现的方式不同,有些是单独标签,有些是组合标签,如音高(‘pitch’)标签和休止符(‘rest’)标签的母标签都是音符(‘note’)标签,它们是组合出现的;每个在MusicXML文件中出现的标签都带有有用的音乐信息、结构信息和谱面信息;不同的应用场景,对这些标签携带内容的处理方式不同,如在教学中,学生掌握知识点是循序渐进的,某一时段,学习掌握的知识点数量有限,其他知识点不需要考虑是否掌握,对应到MusicXML文件中,就是某一时段的若干知识点对应的若干标签,只要这些标签携带的内容有效,那就表示已经掌握了对应的知识点。
第三个关键知识点:时序性。音乐是时间艺术,不同音符在乐谱中出现是有先后顺序的;同样的音符,在不同乐谱中出现,所表达的音乐语义不同,如图4-10所示,图4-10(a)是某乐谱的开始几个音符,图4-10(b)是另一乐谱的开始几个音符,它们都包含有5个音,都使用了小字一组的CEG三个音,但它们的旋律性音乐语义完全不同。所以在有效性评判中,不仅要考虑音乐信息的正确性,还要考虑音乐信息的时序性。
图4-10 不同时序的音符谱例
时序性评判不仅要处理当前对应位置的音乐信息是否正确,还要处理音乐信息的前后次序是否一致。换句话说,样板乐谱和录入乐谱都是音乐信息的有序序列,录入正确性评判就是两个序列的正确性评判。两个序列的正确性评判最简单的算法是一一对应算法,就是从第一个音乐信息开始,样板乐谱的第一个音乐信息和录入乐谱的第一个信息比较,样板乐谱的第二个音乐信息和录入乐谱的第二个信息比较,以此类推,逐个比较,可以计算出正确录入的音乐信息数量,进而计算出录入的正确率。以图4-10为例,如果图4-10(a)乐谱是样板乐谱,而图4-10(b)乐谱是录入乐谱,那么样板乐谱的前5个音的音名序列是{CEGEC},而录入乐谱的前5个音的音名序列是{CGECE},如果采用一一对应算法进行评判,那么显然只有第1个音名输入是正确的,其他输入都错误,这几个音的录入正确率为20%。
但是,由于图4-10(b)乐谱是录入乐谱,有可能出现这种情况,用户漏录入了样板乐谱的第2个音,如果是这样,样板乐谱后面的第3~5个音在录入乐谱中都出现了,这时,如果用户在第1个音符后插入一个新音符(音名E),那么样板乐谱的前5个音都正确了。如果样板乐谱本身就只有这5个音符,那么录入乐谱的最后一个音符是多录入的。
总之,在录入乐谱中,需要考虑三种情况,第一种是某个位置的音乐信息输入错误,第二种是某个位置的音乐信息多输,第三种情况是某个位置的音乐信息漏输。而一一对应算法只能处理第一种情况,无法处理第二和第三种情况。
这里利用求最长公共子序列的动态规划算法来求出两个音乐信息序列的最长公共子序列,在前面章节中,已经对最长公共子序列的算法进行了详细的描述,最长公共子序列是指由两个序列中的共同元素构成的序列,最长公共子序列中的所有公共元素在这两个序列中都有,而且这些公共元素中任何两个元素的先后次序在最长公共子序列和两个序列中都相同。
如图4-11所示的两个乐谱的音名序列{CEGEC}和{CGECE},它们的最长公共子序列为{CGEC},由4个音名构成,首先,这4个音名在两个乐谱的音名序列中都存在,其次,这4个音名的任何2个音名的前后次序在三个序列中都一样,如{GE}两个音名,在三个序列中都是前后次序关系。如果这两个乐谱都只包含这5个音符,那么录入乐谱的录入正确率为4/5=80%,相对于一一对应算法的20%的正确率,更接近于实际情况。
下面定义录入正确率的计算公式:
其中,M和E分别为两个序列,LCS是M和E的最长公共子序列,length()是求变量的长度,γ是录入正确率。
利用求录入乐谱与样板乐谱音乐信息的最长公共子序列的方法,来评判录入乐谱音乐信息的有效性,分两种应用场景,第一种是MusicXML音乐文件全部标签的音乐内容都要评判,第二种是MusicXML音乐文件指定标签的音乐内容需要评判。
第一种场景,适合全部标签评判场景,如制谱考试,这时需要对录入乐谱与样板乐谱的所有音乐信息进行评判,根据评判结果计算录入正确率。
第二种场景,适合指定标签评判场景,如单元测试或课程作业,先选择出待考察的知识点对应的标签,然后提取出这些标签在录入乐谱与样板乐谱的音乐内容,最后对音乐内容进行评判,根据评判结果计算录入正确率。
图4-11 制谱教学中样板乐谱和录入乐谱的录入正确率计算流程图
图4-11为针对制谱教学中,学生录入的乐谱和教师的样板乐谱的MusicXML文件进行正确率计算的流程图,其中虚线椭圆部分使用于针对特定知识点的单元测试或课程作业。具体实现步骤如下:
(1)首先对两个MusicXML文件进行格式判断,然后把它们统一为“score-partwise”格式。
(2)在指定标签评判场景下,选择待考察的知识点集合对应的标签,如谱号知识点对应的标签是“clef”,得到标签集合。
(3)在全部标签评判场景下,利用XML的信息挖掘技术,挖掘出两个MusicXML文件所有的乐谱信息,这些信息包括音乐信息、文件结构信息、控制信息和谱面信息,得到两个乐谱信息序列。在指定标签评判场景下,对标签集合中的每个标签,利用XML的信息挖掘技术,挖掘出每个标签在两个MusicXML文件中的内容信息,得到每个标签的信息序列。(www.xing528.com)
(4)在全部标签评判场景下,先对两个乐谱信息序列进行处理,把每个序列分割成由最小的音乐语义元素构成,然后通过比较这些最小的音乐语义元素,求出最长公共子序列。在指定标签评判场景下,需要对每个标签进行处理,针对挖掘出的每个标签信息序列,先对两个标签信息序列进行处理,把每个序列分割成由最小的音乐语义元素构成,然后通过比较这些最小语义元素,求出每个对应标签的最长公共子序列。
(5)在全部标签评判场景下,直接利用公式(4-2)计算出录入正确率。在指定标签评判场景下,先利用公式(4-2)计算出每个标签的录入正确率,然后根据不同标签的权重,计算出平均正确率。计算公式如下:
其中,n为标签数量,wi为第i个标签的权重,γi是第i个标签的录入正确率,φ为平均正确率。
下面对MusicXML文件的标签内容信息和最小音乐语义元素分别进行解析。首先利用Finale Demo软件(版本号:25.3.0.276)对图4-10(a)乐谱第一小节中的4个乐音进行录入,存为MusicXML格式的文件,然后用记事本打开此MusicXML音乐文件,把其中描述4个乐音的MusicXML代码提取出来,并对每个标签里的音乐信息进行解析,结果如图4-12所示。在图中左边是4个乐音的MusicXML代码,右边是标签里音乐信息的解析。
标签“<step>”携带的是音名信息,标签“<octave>”携带的是音组信息,标签“<duration>”携带的是时值信息,标签“<voice>”携带的是力度信息,标签“<type>”携带的是乐音类别,标签“<stem>”携带的是乐音符干的朝向。其中第1个乐音的对应音乐语义信息分别是“音名C”“音组4”(小字一组)、“时值2”(八分音符为1,这个乐音是四分音符,所以是2)、“力度1”“四分音符”和“符干向上”。
这几个MusicXML标签携带的音乐语义信息都是不可再分割的最小音乐语义元素(音名、音组、时值、力度、类别、朝向等),我们把MusicXML文件里的最小音乐语义元素称为MusicXML语义元素。图4-10(a)乐谱的第一个乐音(音名C)的标签“<step>”携带的MusicXML语义元素是{C},这样,第1个乐音可以表示为一个MusicXML语义序列,即为{C421quarterup};进而,图4-10(a)乐谱第一小节4个音符的MusicXML语义序列可以表示为MusicXML语义元素的序列,记为M={C421quart erupE421quarterupG421 quarterupE421quarterup}。同样,可以利用这个方法,得到图4-10(b)乐谱第一小节4个音符的MusicXML语义序列,记为E={C421quarterup G421 quarterupE421quarterupC421quarterup}。
事实上,MusicXML语义序列M和E都是由字母和数字组成,是两个字符串,如果直接利用动态规划算法求出这两个字符串的最长公共子序列,那么可以得到一个字符串,记为S1={C421quarterup421quarterup421quarterup 421quarterup},这个字符串的长度是49。而根据图4-10(a)和图4-10(b)乐谱的第一小节的音名序列为{CEGE}和{CGEC},它们的最长公共子序列为{CGE},对应的MusicXML语义序列为:S2={C421quarterupG421quarterupE421 quarterup},显然S1和S2是不同的。就是说两个音名序列的最长公共子序列的MusicXML语义序列和两个MusicXML语义序列的最长公共子序列是不相同的,出现这个问题的原因是,最长公共子序列是以序列的单个字符为处理对象的,所以,像“quarter”这样1个MusicXML语义元素,却在求最长公共子序列的过程中被看作7个字符单元,这是不合理的。
因此,在求两个MusicXML语义序列的最长公共子序列时,应该以MusicXML语义元素为处理对象,通过比较2个MusicXML语义元素是否相同为评判标准。
图4-12 MusicXML代码的标签内容的音乐语义解析
由于每个MusicXML语义元素都是字符串,如“四分音符”的MusicXML语义元素是“quarter”,“小字一组”的MusicXML语义元素是“4”,它们都是由字母或数字组成的字符串,因此求两个MusicXML语义序列的最长公共子序列,就是求两个都由字符串组成的序列的最长公共子字符串序列。
下面用来实现求两个MusicXML语义序列的最长公共子序列的长度的PHP代码见附录【代码4-9】,此代码是一个函数,函数的返回值是两个字符串数组的最长公共子字符串序列的字符串个数,传递过来的参数是两个字符串数组。
实验选用图4-10的两首乐曲,假定这两首乐曲的音乐信息已由图4-10全部包含,即都包含两个小节的音乐信息,下面对这两首乐曲的MusicXML语义序列进行评判。
实验的具体步骤为:
(1)全部标签评判场景选择全部顶层MusicXML标签的MusicXML语义序列,而指定标签评判场景则选择音高(“pitch”)标签的MusicXML语义序列。
(2)此两首乐曲的全部顶层MusicXML标签包括“Identification”“defaults”“part-list”和“part”,其中“Identification”标签包含创建MusicXML文件的软件说明等信息,“defaults”标签包含谱面大小、边距、线条宽度等信息,“part-list”标签包含各声部的乐器、MIDI轨道说明等信息,“part”标签包含有每个声部的具体音乐信息。音高(“pitch”)标签是三级标签,它的母标签和祖标签分别是“note”和“part”。
(3)利用getContent($xmlFileName,$tag)函数可以得到MusicXML文件某个标签的内容,从而得到了两首乐曲全部标签评判场景的每个顶层MusicXML标签(这里分别是“Identification”“defaults”“part-list”和“part”)的MusicXML语义序列,和指定标签评判场景的音高(“pitch”)标签的MusicXML语义序列;这样得到的图4-10(a)乐谱的“part”标签的数组只有1个元素(因为此乐曲是单声部的),而乐谱的“pitch”三级标签的数组有5个元素,对应5个乐音,其中“part”标签的这个元素的字符串内容如图4-13所示:
图4-13 图4-10左子图乐谱的“part”标签的MusicXML语义序列(一个元素)
(4)对MusicXML语义序列的每个元素进行预处理,主要是删除一些与MusicXML音乐信息无关且属于XML标记语言的字符,如空格字符、回车符等。如图4-13所示,获取的“part”标签的MusicXML语义元素字符串中包含有许多空格字符和回车符,这将对后续处理带来不利,必须删除。许多语言提供了查找替换功能,可以把空格字符“”替换成空字符“”,把回车符替换成空字符,如PHP语言的替换函数是str_replace函数,具体实现方法是:
【noindent】上述两个语句分别删除了回车符和空格字符;
(5)利用代码4-9,计算出相应的两首乐曲的同一标签的MusicXML语义序列的最长公共子序列,然后利用公式(4-2)和(4-3)计算录入正确率。
对于“pitch”标签而言,这两首乐曲的g=0.8。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。