iOS中MusicXML的解析和使用

2020-04-09  本文已影响0人  shikaiming

iOS中MusicXML的解析和使用

MusicXML

维基上MusicXML的解释是:(英语:Music Extensible Markup Language,音乐扩展标记语言)是一个开放的基于XML的记录西式乐谱的文件格式。该格式是完全自由、开放记录的,并依据W3C社区的许可协议自由使用。
简单的来说,MusicXML其实就是XML,只不过承载的是乐谱信息的XML。在我们需要绘制或者创建六线谱之类的时候,可以通过MusicXML来记录我们需要绘制或者创建的信息。目的是为音乐符号创造一种通用格式。(本文是基于MusicXML 3.0和2.0,所以可能会有一些出入。)因为项目中用到的是吉他谱,就以吉他谱的含义来进行说明和解释。

一 文件解析

MusicXML本质也是XML,所以文件上的解析可以按XML的解析来。
XML的解析在iOS里面有两种解析方式,一个SAX解析,一个DOM解析。

方式一:SAX解析

SAX解析的特点是逐行进行解析。也就是一边读取一边处理。对于大文件,极大的提高了解析效率。

方式二:DOM解析

DOM解析的特点是通过节点解析。需要一次性读取整个XML文件并形成一个节点树,通过遍历树结构可以检索任意XML节点,读取它的属性和值。
比如第三方:GDataXMLNode

在这里我用的SAX解析,具体可以去看下这里,是我之前用来解析MusicXML文档写的。

二 属性解析

MusicXML本质上还是XML,所以文件结构是和XML一样的,这个是XML文档所需要的XML声明。声明用的xml版本是1.0和xml传输数据的时候的字符编码。(假如文档里有中文,编码方式不是UTF-8,显示上就会乱码)

<?xml version="1.0" encoding="UTF-8" ?>

这里是说明当前使用的MusicXML版本是什么,标签里面包含的内容就是MusicXML的内容

 <score-partwise version =“ 3.0”>
  ...
 </score-partwise>

score-partwise元素里面的有几个大元素:

  1. work元素,work-title里面内容是这个xml的名字

     <work>
        <work-title>Aloha oe</work-title>
     </work>
    
  2. identification,这里是文档的一些编辑信息,比如编辑日期,是用什么软件编辑的

     <identification>
         <encoding>
          <encoding-date>2019-10-08</encoding-date>
          <software>Guitar Pro 7.0.9</software>
          <encoder></encoder>
         </encoding>
     </identification>
    
  3. defaults,这里是一些页面的宽高信息

     <defaults>
          <scaling>
           <millimeters>6.4</millimeters>
           <tenths>40</tenths>
          </scaling>
          <page-layout>
           <page-height>1850</page-height>
           <page-width>1310</page-width>
          </page-layout>
     </defaults>
    
  4. part-list,这里面是一些乐器类型,MIDI信息

    <part-list>
      <score-part id="P1">
       <part-name>Ukulele</part-name>
       <part-abbreviation>uke.</part-abbreviation>
       <midi-instrument id="P1">
        <midi-channel>1</midi-channel>
        <midi-bank>1</midi-bank>
        <midi-program>25</midi-program>
        <volume>80</volume>
        <pan>0</pan>
       </midi-instrument>
    </score-part>
    
  5. part,这里面是音符信息,默认是只有一个part的,所以大多数MusicXML里面是只有一个part元素,比如:

    <score-partwise>
         <part id="P1">
            ...
         </part>
     </score-partwise>
    
    但有可能会出现多个part,具体看制谱的时候是怎么做的,比如:
    <score-partwise>
        <part id="P1">
            ...
        </part>
        <part id="P2">
            ...
        </part>
    </score-partwise>
    
            ```
             <notations>
             <tuplet type="start" number="1" bracket="yes" placement="below"/>
             <notations>
            ```
        * slide:滑弦,开始音品数大于终止音品数,则是下滑音,否则是上滑音。
            * type:滑音的开始或者结束,start,stop。
            * number:标识。
            
        * slur:连接符,这里一般特指滑音或者击勾弦的连接符,实际使用中貌似可以忽略它的存在,因为slide或者hammer-on元素里面的type属性已经能完整的告诉我们他们的开始和结束了。可能我还没遇到slur的特定情况吧。
            * type:连接的开始或者结束。
        
            ```
             <notations>
             <slur type="start"/>//连接符
             <slide number="5" type="start"/>
             </notations>
            ```
        * tied:这里的tied元素含义和外层tie元素意思是一样的,都是用来表示连音的开始和结束。
                        
            ```
             <notations>
                <tied type="start"/>
             </notations>
            ```
        * technical:这个元素里面是几弦几品,手指,推弦,泛音等一些信息。
            
            ```
             <technical>
              <string>3</string>
              <fret>2</fret>
             <fingering>2</fingering>
             <pluck></pluck>
             </technical>
            ```

            * string:告诉我们这个音符是几弦。
            * fret:告诉我们这个音符是几品。
            * fingering:告诉我们按哪个手指。
            * pluck:左手哪根手指。
            * bend:推弦,推全音或者推半音
                    * bend_alter:推半音还是全音标识,全音2,半音1,回原位0
                    * isRelease:推弦回原位标识,有这个标识是会原位,否则不会。
                    
                    <technical>
                      <bend>
                       <bend-alter>2</bend-alter>
                      </bend>
                      <bend>
                       <bend-alter>0</bend-alter>
                       <release/>
                      </bend>
                     </technical>
                    
            * harmonic,natural:泛音。
                
                ```
                <technical>
                  <harmonic>
                   <natural/>
                   <base-pitch/>
                  </harmonic>
                 </technical>
                ```
            * hammer-on:击勾弦,用的是同一个字段,<fret>品数由小到大是击弦,品数由大到小是勾弦。也可以直接根据hammer-on元素中的内容判断,是`H`基本上就是击弦;勾弦的话内容就是`P`的标识。
                * number:标识。
                * type:击勾弦的开始结束,start,stop。
                比如下面这个,是一个击弦,
        ```
        <note>
            <notations>
             <technical>
              <hammer-on number="1" type="start">H</hammer-on>
              <string>2</string>
              <fret>0</fret>
             </technical>
             <slur type="start"/>
            </notations>
        </note>
        <note>
            <notations>
             <technical>
              <hammer-on number="1" type="stop"/>
              <string>2</string>
              <fret>2</fret>
             </technical>
             <slur type="stop"/>
            </notations>
         </note>
        ```

基本能用到的大多数就是这么多了,更多详细的可以查看MusicXML的官网文档

三 (六线谱)吉他谱绘制

绘制的话,看具体的需求了,可以尝试在layer上异步绘制,然后在需要的情况下再渲染到view上。比如用CAShapeLayer,轻量,性能又好。

上一篇下一篇

猜你喜欢

热点阅读