MusicXML 在音乐游戏中的应用---Cocos2d-x xml解析

用 tinyxml2 解析 xml

Cocos2d-x 已经加入了 tinyxml2 用于 xml 的解析。具体用法用例参见官方文档

需要说明的是不同的乐谱软件导出的 MusicXML 可能有所区别,可能其中有些信息并不是 MusicXML 所规定的,而是乐谱软件根据自身需要出发所添加的。解析的话我根据我游戏的需求以及难度,只解析了必要的信息。

MusicXML 解析思路整理

divisions 这个元素把我搞得很晕,简单来说 divisions 的值确定了整个乐谱的最小单位。而音符的时值 duration 的值就是根据最小单位来的。divisions = 1 的话,则最小单位是四分音符;divisions = 2 的话,则最小单位是四分音符,以此类推。举例来说,同样都是全音符,在 division = 1 的乐谱中,全音符的 duration = 4;在 division = 2 的乐谱中,全音符的 duration = 8.

所以呢:

最小单位 = (4 * divisions)分音符 = 1 / (4 * divisions)

一拍的duration = 一个beat-type分音符的duration = (4 / beat-type)个四分音符的duration = 4 * divisions / beat-type

一小节的duration = beats * 4 * divisions / beat-type

一个全音符的duration = 4 * divisions

tinyxml2 loadFile 真机下失败问题(原文链接

直接用tinyxml2的loadFile,加载一个XML文件,在WIN PC下是可以的,但在真机下失败:

const char* filepath = "test.xml";
tinyxml2::XMLDocument* xmlfile = new tinyxml2::XMLDocument();
auto ret = xmlfile->loadFile(filepath);  //这里失败

改为:

const char* filepath = "test.xml";
tinyxml2::XMLDocument* xmlfile = new tinyxml2::XMLDocument();
auto content = CCFileUtils::getInstance()->getDataFromFile(filepath);
auto ret = xmlfile->Parse((const char*)content.getBytes(), content.getSize());