首页 理论教育 音乐数据分析书籍-音乐数据分析

音乐数据分析书籍-音乐数据分析

时间:2023-11-18 理论教育 版权反馈
【摘要】:在MusicMXL文件中,包含大量的音乐数据,这些音乐数据表示不同的音乐知识,如谱号、拍号、调式调性、旋律、乐段、和声等音乐信息。本节将采用数据挖掘技术,在MusicMXL文件中搜索音乐标签,再利用可视化技术来体现音乐数据的统计特征和分布情况。按上述过程准备完MusicXML数字音乐文件后,可进入下一步的挖掘建模和可视化过程。

音乐数据分析书籍-音乐数据分析

数据挖掘是知识发现的过程,通过对大容量数据的分析,利用一定模式模型来找出数据间存在的关联性、显示数据的分布情况、体现数据的统计特征等。在MusicMXL文件中,包含大量的音乐数据,这些音乐数据表示不同的音乐知识,如谱号、拍号、调式调性、旋律、乐段、和声等音乐信息。本节将采用数据挖掘技术,在MusicMXL文件中搜索音乐标签,再利用可视化技术来体现音乐数据的统计特征和分布情况。

在MusicXML文件分析阶段,主要说明了MusicXML文件的数据来源和数据预处理过程,在基于标签的音乐信息挖掘阶段,主要描述音乐数据挖掘模型建模和音乐知识可视化结果。

一、音乐数据源—Finale的MusicXML文件分析

1.乐曲文件选取

本节MusicXML文件的数据来源是MakeMusic公司的网站(www.finalemusic.com/)提供的免费试用软件—Finale Demo软件(版本号:25.3.0.276),在这个试用软件中,提供了一些乐谱谱例方便用户使用,它们分散在目录“Tutorials”和“Worksheets and Repertoire”中,这两个目录下一共包含有1236个乐谱谱例,它们的前二层目录树结构如图4-3所示。

图4-3 Finale Demo软件乐谱谱例目录树前二层结构

这两个目录下的子目录最深有六层结构,这个最深目录的位置在“Worksheets and Repertoire”目录→“Repertoire”目录→“HolidayPatriotic”目录→“Instrumental”目录→“Suite from Nutcracker”目录→“Nutcracker Solos”目录→“Nutcracker Bass”目录。

这里从“Tutorials”和“Worksheets and Repertoire”两个目录选取了610个乐谱谱例,它们分布在不同的目录下,不同目录下的文件数量见表4-6。不同目录下选取的文件数不同,其中古典钢琴曲最多,有57首。

表4-6 不同目录下选取的文件数量

2.文件格式转换

这些文件是Finale Demo软件的乐谱谱例,它们的存储格式是Finale软件专有的数字音乐格式,文件的后缀名为“.musx”。“.musx”文件格式需要转换为通用的“.xml”文件格式,这样才能成为MusicXML音乐文件,转换工具是利用Finale软件提供的功能,转换的步骤如下:

(1)运行Finale文件。

(2)打开“.musx”文件:点击软件菜单栏“File”选项,然后点击弹出的下拉菜单中的“Open……”(或者按键盘中的“Ctrl”键,再按字母“o”键),在弹出窗口中,选取需要转换的“.musx”文件,如“Tutorials/EntryExercises.musx”,点击“Select”,软件就会打开此文件。

(3)输出为“.xml”文件:点击软件菜单栏“File”选项,然后点击弹出的下拉菜单中的“Export”(或者按键盘中的“Ctrl”键,再按字母“t”键),在弹出的下拉子菜单中,点击“MusicXML”选项(或者按键盘中字母“x”键),在弹出窗口中,选择存放转换后的“.xml”文件的目录,然后输入“.xml”文件的文件名,再点击弹出窗口中的“Save”按钮,转换完毕。

二、基于标签的音乐信息挖掘

在数据挖掘的过程中,数据初期的准备往往会占用整个数据挖掘项目工作量的70%左右。按上述过程准备完MusicXML数字音乐文件后,可进入下一步的挖掘建模和可视化过程。因为数据挖掘本身融合了统计学数据库和机器学习等学科的综合知识,这里利用MySQL数据库技术、统计学方法、PHP编程语言和Matlab提供的可视化工具,来挖掘MusicXML数字音乐文件的音乐信息和图形化分析结果。

1.数据库创建、数据导入与生成

MusicXML文件是基于用户标签的XML格式文件。由上文可知,在MusicXML3.0的“MusicXML_index.xls”文件中,标签数量达到682个,为了方便数据分析,根据“MusicXML_index.xls”文件的内容,利用SQL语句创建MySQL数据表,用于存储此文件中的字段内容,数据表名为“ME_MusicXML_Index”,SQL语句见附录【代码4-2】。其中,数据表中的字段与“MusicXML_index.xls”文件的字段一一对应,“Name”表示标签名称,“File”表示标签来自哪个系统文件,“Type”表示标签的类别,“Since”表示标签在哪个版本中首次出现,“Description”对标签进行了详细描述。

这里利用这682个标签对上述610个MusicXML数字音乐文件进行信息挖掘,为了存储挖掘结果,利用SQL语句创建MySQL数据表,用于存储从这些文件中挖掘出的各个标签的内容与标签出现次数,数据表名为“ME_XMLFileTagInfoForFinale”,SQL语句见附录【代码4-3】。其中,“XMLFile_SerialNumber”字段表示文件序号,范围在0~609,“Name”字段表示标签名称,“XMLFileInfo_SaveName”字段表示MusicXML数字音乐文件的文件名,“XMLFileTagInfo_StatNumber”字段表示“Name”字段里存储的标签在当前文件中出现的次数,“XMLFileTagInfo_Content”字段表示“Name”字段里存储的标签当前文件中对应的所有内容。

创建完这两个MySQL数据表后,第一步需要把“MusicXML_index.xls”文件的内容导入数据表“ME_MusicXML_Index”中,首先利用微软公司的Office办公套件中的Excel软件把“MusicXML_index.xls”文件另存为“MusicXML_index.csv”格式文件,然后利用MySQL管理平台中的数据导入功能把“MusicXML_index.csv”文件信息导入“ME_MusicXML_Index”数据表中。

随后利用“ME_MusicXML_Index”数据表的每个标签对610个MusicXML数字音乐文件进行内容提取与次数统计。具体步骤如下:

(1)获取610个MusicXML数字音乐文件的列表到一个文本文件,命名这个文本文件为:FinaleXMLFileNameList.txt。

(2)读取“ME_MusicXML_Index”数据表中存储在“Name”字段中的所有标签到一个数组,记为:TagArray。

(3)构成一个二层嵌套循环的循环语句,外层逐个循环610个MusicXML数字音乐文件,内层逐个循环682个标签。

(4)二层循环的循环语句包括二条语句,一条语句获取某个标签中一个MusicXML数字音乐文件的内容(存储到一个数组,记为:TagContentInOneMusicXML),另一条语句获取数组TagContentInOneMusicXML包含的元素个数。

(5)把标签名称、MusicXML数字音乐文件名、此标签在此文件中的内容、此标签在此文件中出现次数等信息插入数据表“ME_XMLFileTagInfoForFinale”中。

下面分别利用PC计算机的DOS命令、SQL语句和PHP代码来实现上述五个步骤。

第1步用DOS命令实现:先点击PC计算机Win7系统桌面的“开始”菜单,出现一个输入框(搜索程序或文件),在输入框中输入“CMD”并回车,进入命令行模式。在命令行中依次输入“cd\”并回车,回到根目录,输入610个MusicXML数字音乐文件所在的磁盘的盘符,如“D:”并回车,然后多次利用cd命令,依次进入到610个MusicXML数字音乐文件所在的顶级目录下,最后在命令行中输入“dir/s>FinaleXMLFileNameList.txt”并回车,这样就在当前目录下出现了一个“FinaleXMLFileNameList.txt”文件。

第2步用PHP语言和SQL语句实现,见附录【代码4-4】。其中PHP代码的第1行是SQL语句,第2行是在MySQL数据库中执行这条SQL语句,第3行是执行SQL语句后,获取的结果数据中的记录数量,第4行是循环处理每条记录,第5行是获取一条记录信息,第6行是把当前记录的标签名称赋值给数组的当前元素。

第3、4、5步用PHP语言实现,见附录【代码4-5】。其中在函数getAllTagStatAn-dContentForAllXMLFile()中,一共有8行语句,调用了7个函数,其中第1行语句是从文本文件中获取文件名数组到$FileArr,第2行语句是从数据表获取所有标签到数组$TagArray,第3行和第4行语句是二层嵌套循环,外循环对文件数组进行循环,内循环对标签数组进行循环,第5行语句是获取一个文件中某个标签的出现次数,第6行语句是获取一个文件中某个标签的内容数组,并把这个内容数组转换为JSON字符串,第7行判断标签出现的次数是否大于零,如果是,则运行第8行语句,否则不运行第8行语句,第8行语句把信息写入数据表中。

被调用的7个函数中,有2个函数是PHP的内部函数,即函数count()和函数json_encode(),其他5个函数为用户函数,其中一个已经在上面描述,剩下4个函数的实现方法见附录【代码4-6】。

2.数据统计与分析

在上述“乐曲文件选取”部分,通过数据生成,在数据表“ME_XMLFileTagInfoForFinale”中插入了610个MusiaXML文件的682个标签的内容和出现的次数,下面先利用MySQL管理工具,通过运行SQL语句对数据表“ME_XMLFileTagInfoForFinale”的数据进行统计分析

(1)获取“ME_XMLFileTagInfoForFinale”表的记录总数,SQL语句:

运行结果:56897。

说明:数据表一共有56897条记录,每条记录的“Name”字段的标签在此记录的文件中至少出现1次。

(2)获取“ME_XMLFileTagInfoForFinale”表的所有记录中,字段“XMLFileTag Info_StatNumber”的值最大的记录信息,SQL语句:

运行结果:“Name”字段值为“duration”,“XMLFileTagInfo_StatNumber”字段的值为4183,“XMLFileInfo_SaveName”字段的值为“Mozart Eine Kleine Nachtmusik.xml”。

说明:在MusicXML文件“Mozart Eine Kleine Nachtmusik.xml”中包含的标签“duration”数为4183次,是所有610个MusicXML文件中出现次数最多的标签。

(3)在610个MusicXML文件中,所有标签出现总次数最多的文件,SQL语句:

运行结果:“SUM(XMLFileTagInfo_StatNumber)”的值为17760次,文件名字段“XMLFileInfo_SaveName”的值为“Beethoven Polonaise.xml”。

说明:在所有610个MusicXML文件中,文件“Beethoven Polonaise.xml”中包含的所有标签出现的总次数最多,为17760次。

(4)在所有MusicXML文件中出现次数最多的标签,SQL语句:

运行结果:“SUM(XMLFileTagInfo_StatNumber)”值为227528,对应的“Name”字段为“duration”,出现的不同标签的数量为235个。

说明:时值标签在所有610个MusicXML文件中出现的总次数最多,为227528次。

同时利用此SQL语句,发现MusicXML3.0的682个标签在这610个文件中只出现了235个不同的标签,所有标签的出现总次数为2185606次,每个标签出现的平均次数为9300.4511。表4-7是利用这个SQL语句得到的在这610个文件中出现总次数排前18位的标签和它们出现的总次数。

再次,通过观察发现,有些标签在610个MusicXML文件中出现的次数相同,说明它们在MusicXML文件中是以组合形式出现的,这些标签和它们出现的总次数见表4-8,很显然,出现相同总次数多以标签组合形式出现的可能性大,反之则小,为了方便观察,相邻两个不同总次数用粗体字体间隔显示。

表4-7 出现总次数排前18位的标签和出现总次数

表4-8 出现总次数相同的标签列表和它们出现的总次数

一些常见的音乐符号在MusicXML文件中会被频繁使用,这里利用MySQL平台设计SQL语句,对谱号、调号、调性、拍号、音高音符、休止符、升降号、力度等标签的出现次数进行统计。

统计音高音符标签的SQL语句为:(www.xing528.com)

上述语句中,“WHEREName='pitch'”部分的'pitch'分别改为'clef'、'key'、'time'、'rest'、'alter'、'voice'、'mode',就可以得到相应标签谱号、调号、拍号、休止符、升降号、力度和调性等统计信息,见表4-9。

表4-9 常见音乐符号的在610个MusicXML音乐文件中出现次数统计

由表4-9分析得知,谱号标签在每个MusicXML音乐文件中都出现,音高音符标签出现的总次数最多,力度标签总次数次之,调性标签总次数最少,而且调性标签出现的文件数和出现总次数都少于调号标签。

利用下面SQL语句得到610个MusicXML音乐文件中'pitch'标签的所有内容,利用MySQL平台的下载工具把所得的结果存入一个“.csv”文件,然后利用微软公司Office套件中的Excel软件的数据导入功能,导入此“.csv”文件,随后利用“替换”功能,对音名进行替换,替换后可以得到替换的次数,这个次数就是对于音名出现的总次数。在MusicXML3.0中,音组对应的标签是“octave”,不同音高所在音组的“octave”标签的值用数字表示,其中小字一组对应的数字是4,统计结果见表4-10。

由表4-10可知,各个音名在610个MusicXML音乐文件中出现的总次数比较接近,出现最多的G音和出现最少的E音的次数比为21:25。不同音组出现的总次数相差悬殊,总体上,小字一组的总次数最多,向上和向下方向都逐次递减。

表4-10 音组和音名在610个MusicXML音乐文件中出现的总次数

3.分析结果的可视化

可视化(Visualization)是显示数据挖掘结果的图形图像技术,它将数据转换成图形或图像在屏幕上显示出来,并能进行交互处理。它是研究数据表示、数据处理决策分析等一系列问题的综合技术。可视化可以使数据被用户一目了然地理解,方便做出决策,有时候数据较多,表格等无法显示数据的变化趋势时,可以用图形来表示。

首先对标签的数据统计结果进行可视化显示。在微软公司Office套件中Excel软件的两个单元格中分别输入235和447两个数字,然后利用Excel的绘图工具,制作饼图,得到图4-4。如图4-4所示,在610个MusicXML数字音乐文件中,“musicxml_index.xls”文件中的标签有多少个出现,有多少个未出现。很明显,未出现的标签扇形较大,而出现的标签扇形较少,出现的标签数量大约占“musicxml_index.xls”文件中标签总数的1/3左右(34.46%)。

图4-4 标签出现和未出现的个数显示图

接着利用上述“数据统计与分析”中第(4)部分SQL语句运行得到的235个标签,在610个MusicXML数字音乐文件中出现的总次数的倒序排序结果。把排序结果复制到微软公司Office套件的Excel软件,然后选中这235个标签出现的总次数的倒序排序结果,利用Excel软件的绘图工具,制作折线图,可视化结果如图4-5所示。

图4-5 不同标签出现总次数倒序排序的变化趋势

如图4-5所示,横坐标为出现的235个标签的序号,纵坐标为每个标签出现的总次数,由此可知,出现次数的变化趋势很明显,当序号小于20左右时,曲线下降很快,当序号大于20以后,曲线逐次递减得很平稳。

在MySQL环境中运行SQL语句:

可以得到610个MusicXML数字音乐文件中出现的所有标签总次数,把每个文件名和它们对应出现的总次数,写入一个“.csv”文本文件,然后利用微软公司Office套件的Excel软件的数据导入功能,把文件名和总次数导入Excel单元格中然后选中出现总次数的所有单元格,利用Excel软件的绘图工具,制作散点图,可视化结果如图4-6所示。

图4-6 不同目录下标签出现的次数

如图4-6所示,横坐标是先按文件的目录顺序,再按目录内文件名排序,所获得的610个MusicXML文件的序号,纵坐标是每个MusicXML文件中出现的标签总次数。观察发现,一些“爬虫”状的散点聚集在坐标系中,这些文件可能处于同一目录,文件创建的目的类似,所以文件包含的音乐信息数量也近似,因而会出现这一现象。

最后,我们来观察可视化610个MusicXML音乐文件在235个不同标签中出现次数的分布情况,由于相关的系数有610个文件的序号、235个不同标签和数量不等的出现次数,需要表示的是三个维度的信息,所以需要一个三维立体图进行可视化结果展示。

首先在MySQL环境中运行SQL语句:

此SQL语句可以得到610个MusicXML数字音乐文件中每个标签的出现次数,一共有56897条记录,利用MySQL平台提供的工具,把这些记录写入一个数据“.csv”文本文件。

SQL语句:

此SQL语句可以得到235个出现在610个MusicXML数字音乐文件中的不同标签,利用MySQL平台提供的工具,把这些记录写入一个标签列表“.csv”文本文件。

SQL语句:

此SQL语句可以得到610个MusicXML数字音乐文件中的文件名,利用MySQL平台提供的工具,把这些记录写入一个文件列表“.csv”文本文件。

利用Matlab7.0进行可视化编程,可视化实现的步骤如下:

(1)先预处理三个“.csv”文本文件,利用Windows自带的记事本软件打开此文件,然后用替换功能,把文件中的所有引号“"”替换为读取空串“”,然后把文件中的所有空格“”替换为空串“”,最后把所有的逗号“,”替换为空格“”,保存关闭文件。注意:标签列表和文件名列表的“.csv”文本文件只需要完成第一步替换就可以了。

(2)读取标签列表“.csv”文本文件,把235个不同标签导入到一个标签数组,记为TagName。

(3)读取文件列表“.csv”文本文件,把610个不同文件名导入到一个文件名数组,记为FileName。

(4)读取数据“.csv”文本文件,并对每行信息进行分割,分成三部分信息,分别对应的Name、XMLFileTagInfo_StatNumber、XMLFileInfo_SaveName三列数据。

(5)创建二维结果数组,记为TagFile,初始化所有元素值为0。

(6)扫描数据“.csv”文本文件,每行提取XMLFileTagInfo_StatNumber字段的值,对二维结果数组TagFile进行赋值:根据当前行的XMLFileInfo_SaveName和Name列的值,在标签数组TagName和文件数组FileName中分别查找出它们在彼此数组中的下标,记为i和j,再利用当前行XMLFileTagInfo_StatNumber列的值对二维结果数组TagFile对应下标的元素进行赋值;

(7)利用Matlab7.0的绘图函数,把二维数组TagFile绘制成三维立体图。

具体的Matlab代码如下:

上述步骤的Matlab代码见附录【代码4-7】。

如图4-7所示是附录【代码4-7】Matlab代码运行结果,由图可知,三维图看起来类似于“夜色中的城市森林”,在Y轴上的X轴方向有一些类似“街道”的直线型平地,它们是出现次数为0的标签。

事实上,在二维结果数组TagFile中,两个维度的长度分别是235和610,数组的大小容量为是143350,而其中只有56897个元素被赋值,大量元素的值为0,非零元素占比只有39.69%,因此数组TagFile是稀疏数组。

图4-7 235个标签在610个MusicXML文件中出现的次数图

下面利用上述得到的TagFile的值,用Matlab代码绘制二维散点图,形象地显示出不同标签在MusicXML音乐文件中出现的状况。

Matlab代码如下:

代码运行的结果如图4-8所示。

图4-8 各个标签在文件中的出现的散点图

如图4-8所示,有很多黑色的纵向线条,说明对应的标签在610个MusicXML中出现较多,有些是白色的纵向带状线条,这些线条对应的标签在610个文件中出现次数较少,当然235个标签的每个标签至少出现了1次。

下面来考察具体的音符出现规律,根据表4-10中9个音组出现的总次数,来计算其与正态分布的相关性,正态分布的概率密度函数是:

其中x是实数,μ为位置参数,σ为概率分布的尺度参数。当μ=0、σ=1时,为标准正态分布。

利用Matlab分别可视化9个音组和63个国际标准音A2~C5的占总次数比率散点图,并同时画上带位置偏移的正态分布曲线。

图4-9比率散点图的Matlab代码见附录【代码4-8】,带位置偏移的标准正态分布曲线的代码如下:

运行结果如图4-9所示。

图4-9 各音组出现次数占总次数比率与标准正态分布曲线

图4-9(a)为9个音组的出现概率和对应的正态分布曲线,图4-9(b)为63个国际标准音的出现概率和对应的正态分布曲线;图4-9(a)正态分布曲线的参数分别是a=5、s=1,a偏移量是5,正是第1音组到第9音组的中间音组,s参数为1,说明是标准正态分布曲线;图4-9(b)正态分布曲线的参数分别是a=32、s=8,a偏移量是32,正是63个乐音的中间一个乐音。

观察图4-9(a),大字一组、小字组、小字二组、小字四组等音组比率与标准正态分布曲线对应的函数值很接近,其他音组的比率也在曲线上下不远处波动。由此可以得出结论:所有乐谱中出现的音组概率分布符合以小字一组为对称中心的标准正态分布。观察图4-9(b),出现次数最多的是小字一组的G音,G音及其高于G音的所有乐音的比率很接近正态分布曲线。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈