MusicXML格式与基本功能

参考文献:
[1]杨万钧.从MIDI到MusicXML——计算机乐谱信息交换格式的发展[J].演艺科技,2014,(07):45-49.
MusicXML 4.0
了解MusicXML

MusicXML文件结构

基本文档结构

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE score-partwise PUBLIC
    "-//Recordare//DTD MusicXML 3.1 Partwise//EN"
    "http://www.musicxml.org/dtds/partwise.dtd">
<score-partwise version="3.1">
  <!-- 文档内容 -->
</score-partwise>

score head(头部部分)

存储乐谱的元数据、创作信息和默认排版参数,确保文件在不同软件中打开时保持一致的显示效果。

<identification>
  <creator type="composer">Ludwig van Beethoven</creator>
  <rights>© 2023 Music Publisher</rights>
  <encoding>
    <software>MuseScore 3.6</software>
    <encoding-date>2023-07-15</encoding-date>
  </encoding>
</identification>

<defaults>
  <scaling>
    <millimeters>7.05556</millimeters>
    <tenths>40</tenths>
  </scaling>
  <page-layout>
    <page-height>1683.78</page-height>
    <page-width>1190.55</page-width>
  </page-layout>
</defaults>

关键点​

  • scaling 定义乐谱的缩放比例,影响所有坐标和尺寸的计算。
  • page-layout 确保打印或显示时页面尺寸一致。
  • music-font 指定默认音符字体,避免不同软件显示差异

乐器/声部定义 (Part List)

声明乐谱中包含的所有乐器(声部),并关联 MIDI 配置,为多声部乐谱提供结构化描述。

<part-list>
  <score-part id="P1">
    <part-name>Piano</part-name>
    <part-abbreviation>Pno.</part-abbreviation>
    <score-instrument id="P1-I1">
      <instrument-name>Acoustic Grand Piano</instrument-name>
    </score-instrument>
    <midi-instrument id="P1-I1">
      <midi-channel>1</midi-channel>
      <midi-program>1</midi-program>
    </midi-instrument>
  </score-part>
</part-list>

关键点​​:

  • score-part 的 id 必须与后续 <part> 标签的 id 对应。
  • midi-instrument 定义播放时的音色和通道,影响电子播放效果。
  • 多乐器乐谱(如四重奏)会在此列出所有声部。

乐谱内容 (Parts and Measures)

存储实际的音符、节奏、演奏标记等音乐数据,是乐谱的核心部分

eg

<part id="P1">
  <measure number="1">
    <attributes>
      <divisions>96</divisions>
      <key>
        <fifths>0</fifths>
        <mode>major</mode>
      </key>
      <time>
        <beats>4</beats>
        <beat-type>4</beat-type>
      </time>
      <clef>
        <sign>G</sign>
        <line>2</line>
      </clef>
    </attributes>
    
    <note>
      <pitch>
        <step>C</step>
        <octave>4</octave>
      </pitch>
      <duration>96</duration>
      <type>quarter</type>
      <voice>1</voice>
      <stem>up</stem>
    </note>
    <!-- 更多音符... -->
  </measure>
</part>
<measure number="1">
  <part id="P1">
    <!-- 音符内容 -->
  </part>
  <part id="P2">
    <!-- 其他声部内容 -->
  </part>
</measure>

总结:各部分协作流程​

  1. ​头部信息​​ → 定义乐谱的元数据和全局显示规则
  2. ​乐器定义​​ → 声明声部数量和MIDI配置
  3. ​乐谱内容​​ → 按小节组织音符和演奏标记

关键元素解析

主要针对第三部分中乐谱部分所涉及的元素进行讲解。

scorewise & timewise

MusicXML的根节点有两个类型,一个是<score-partwise>, 一个为 <score-timewise>partwise 表明当前乐谱是以声部或演奏单元为单位进行记录的。

timewise 表明当前的乐谱是以时间为单位进行记录。这两个不同类型可以相互转换。之所以有这两个类型,是以乐谱的用途角度考虑。

part-list 声部、乐器、行标识

<part-list> 为声部或乐器部分的列表, 主要用来表示当前乐谱共有多少个声部或者乐器。每一个 list 照片中有对应的 id , id 作为部分的唯一表示来标识所有部分的乐谱。
eg:

<score-partwise version="3.0">       <!-- 根节点: score-partwise -->
    <part-list>                        <!-- 行(分谱,声部,乐器)列表 -->
        <score-part id="P1">
            <part-name>Piano</part-name>   <!-- 钢琴 -->
        </score-part>
        <score-part id="P2">
            <part-name>Guitar</part-name>  <!-- 吉他 -->
        </score-part>
    </part-list>
    <part id="P1">                     <!-- 钢琴部分的乐谱  -->    
        ...
    </part>
    <part id="P2">                     <!-- 吉他部分的乐谱  -->    
        ...
    </part>
</score-partwise>

measure 小节标识

<measure> 为小节标识, 也是乐谱的基本组成。在乐谱上,一个小节可以理解为五线谱中的一个部分。
assets/MusicXML格式与基本功能/image-20250606155804311.png
一般在第一个小节中,会有整个小节的属性<attributes><attributes>中包含了该小节中的若干特性,一般一个声部下的所有小节属性都是相同的,因此<attributes>只会出现在每行的第一个小节中。当然,对于若干行的首部,虽然都有<attributes>,但他们的信息在绝大多数下是相同的。它包含了以下常用的属性:

  • <divisions> 小节中的一个四分音符的标准长度(时间长度),这里会在note标识中详细介绍
  • <key> 调号,例如:C大调,D大调
  • <time> 节拍信息,例如4/2拍
  • <clef> 谱号信息,例如高音谱号

<key>为调号,我们常见的D大调、E大调等都是在这里定义的。例如:

<key>                        <!-- D大调标识 -->
    <fifths>2</fifths>       <!-- D调 -->
    <mode>major</mode>       <!-- major为大调,minor为小调  -->
</key>

<time>为节拍信息,我们经常说的4/2拍、4/3拍等,在这里标识,例如:

4/4拍可以表示为:

<time>                         <!-- 4/4 拍 -->
    <beats>4</beats>           <!-- 每小节有4拍 -->
    <beat-type>4</beat-type>   <!-- 以四分音符为基准 -->
</time>

<clef>为谱号信息,我们常见的乐谱有高音谱号和低音谱号,它们是在该标识中表示的。

常见的高音谱号和低音谱号如下: 

他们的表示方式为:

<clef>
    <sign>G</sign>
    <line>2</line>             <!-- 高音谱号(G谱号) -->
</clef>

note 音符标识

<note>为音符标识,它是<measure>下的一个重要子节点。如果你要读取一个乐谱的所有音符,那么note就是你的目标。简单来说,<note>是乐谱中的一个音符,就是我们常说的五线谱中的一个“蝌蚪”,如果一个小节中5个音符,那么你就可以在当前的<measure>中找到5个<note>。note下有一些常用的子节点属性用于表示当前音符的不同特性:

  • <pitch> 音高,我们常说的do, re, mi,以及所在的八度
  • <duration> 音长,还记得上一章节中说的<divisions>么?这里要用到
  • <type> 音符类型,例如四分音符,八分音符等
  • <staff> 所属行
  • <beam> 音符之间的连线
  • <dot> 音符后面的点

下面专门介绍一下<pitch>音高标识

pitch 音高标识

首先,一个“蝌蚪”在五线谱上有自己的音高,<pitch>标识用来表示当前这个音符在五线谱上的位置,它还有若干子节点来表示音高和其他属性:

  • <step> 音阶,C, D, E, F, G, A, B。在C大调中,他们的唱名分别是:do, re, mi, fa, so, la, ti
  • <octave> 八度。以钢琴为例,钢琴一共有88键,涉及8个八度,我们常说的标准音do是在钢琴上是第四个8度
  • <alter> 升降调。例如C的升调为C#,对应钢琴的C键右侧的黑键。

例如中央C:可以表示为:

<note>
    <pitch>
        <step>C</step>        <!-- C:do -->
        <octave>4</octave>    <!-- 位于第四个八度 -->
    </pitch>
    ...
</note>

duration 音长标识

<duration>音长标识用来表示当前音演奏时长。它与<attrbute>中的<divisions>相互配合,来表达当前音符总共演奏多长时间。我们来看下面这个例子:

<measure>
    <attributes>
        <divisions>100</divisions>     <!-- 标准4分音符长度 -->
        ...
    </attributes>
    <note>
        <pitch>
            <step>C</step>
            <octave>4</octave>
        </pitch>
        <duration>50</duration>        <!-- 演奏长度为标准长度的一半 -->
        ...
    </note>
</measure>

我们可以看到 divisions 为100,当前note的音符的 duration 为50,这就表明,当前这个音的演奏时间为标准时间的一半。如果,我们设置程序标准4分音符的时间长度为500ms,那么当前这个音的演奏长度就是250ms (50 / 100 * 500ms)。

由此看来,每个note的 <duration> 都代表了当前这个音符的演奏长度,它的演奏时长为<duration>/<divisions> 标准时长。当然,标准时长是程序或开发者自己控制的。

其他

<type>为音符类型标识,用来表示当前这个音符是四分音符、八分音符还是全音符等。这里给出常见的音符类型和取值:

  • 32nd 32分音符
  • 16th 16分音符
  • eighth 8分音符
  • quarter 4分音符
  • half 半音符
  • whole 全音符

<staff>为所属行。我们常见的乐谱可能分为高低声部等,每一个声部都会有自己独立的一行五线谱,<staff>用来表示当前这个音符属于哪个五线谱上。在下面这个情况下,<staff>就显得非常重要了。

<beam>为音符之间的连线,我们经常看到乐谱中将有两个相邻的八分音符,通常的做法是将这两个八分音符链接起来,<beam>就是为链接两个音符而存在的标识。例如:

标识为:

<measure>
    <note>
        <pitch>
            <step>G</step>
            <octave>4</octave>
        </pitch>
        ...
        <beam number="1">begin</beam>    <!-- 一个连线,number为1,它是起点 -->
    </note>
    <note>
        <pitch>
            <step>G</step>
            <octave>4</octave>
        </pitch>
        ...
        <beam number="1">end</beam>      <!-- number为1的连线,它是终点 -->
    </note>
</measure>

<dot>为音符后面的点,用来表示当前音符延长当前音符的一半的长度。例如:

小结一下

上面介绍了一些基本MusicXML的标识意义,由于它的标识有很多,这里不能全面介绍,你可以参考MusicXML Element来了解所有的标识和意义。是时候总结一下上面的基本内容了,下面给出一个两小节的乐谱,并给出它的基本MusicXML的示例。(注意,由于MusicXML中的内容和标记非常多,因此只给出上面介绍的内容。当然,有这些内容就已经足够让你的程序演奏出基本的音调了)。

生日快乐歌

上面这三个小节是“生日歌”的第一句“happy birthday to you”的乐谱,用我们刚才介绍的MusicXML标识可以写为:

<score-partwise>
    <measure number="1" width="62">
        <attributes>
            <divisions>6720</divisions>         <!-- 标准四分音符基准 -->
            <time>                              <!-- 4/3拍 -->
                <beats>3</beats>
                <beat-type>4</beat-type>
            </time>
            <clef number="1">                   <!-- 高音谱 -->
                <sign>G</sign>
                <line>2</line>
            </clef>
        </attributes>
    </measure>
    <measure number="2">
        <note>
            <pitch>                             <!-- 第一个音符,G4 -->
                <step>G</step>
                <octave>4</octave>
            </pitch>
            <duration>3360</duration>           <!-- 演奏长度为标准的一半 -->
            <type>eighth</type>                 <!-- 这是一个八分音符 -->
            <beam number="1">begin</beam>    
               <!-- 上面有个连线,这是开始 -->
        </note>
        <note>
            <pitch>                             <!-- 第二个音符,G4 -->
                <step>G</step>
                <octave>4</octave>
            </pitch>
            <duration>3360</duration>
            <type>eighth</type>
            <beam number="1">end</beam>         <!-- 上面的连线结束 -->
        </note>
        <note>
            <pitch>                             <!-- 第三个音符A4 -->
                <step>A</step>
                <octave>4</octave>
            </pitch>
            <duration>6720</duration>           <!-- 演奏长度为标准长度 -->
            <type>quarter</type>                <!-- 这是一个四分音符 -->
        </note>
        <note>
            <pitch>
                <step>G</step>
                <octave>4</octave>
            </pitch>
            <duration>6720</duration>
            <type>quarter</type>
        </note>
    </measure>
    <measure number="3">
        <note>
            <pitch>
                <step>C</step>
                <octave>5</octave>
            </pitch>
            <duration>3360</duration>
            <type>eighth</type>
            <beam number="1">begin</beam>
        </note>
        <note>
            <pitch>
                <step>C</step>
                <octave>5</octave>
            </pitch>
            <duration>3360</duration>
            <type>eighth</type>
            <beam number="1">end</beam>
        </note>
        <note>
            <pitch>
                <step>B</step>
                <octave>4</octave>
            </pitch>
            <duration>13440</duration>
            <type>half</type>
        </note>
    </measure>
</score-partwise>

上面的示例中省去了其他非必要的数据和内容,根据上述的基本MusicXML,我们就已经可以知道最基本的演奏内容了,并可以着手写程序来演奏这段乐曲了。

posted @ 2025-06-06 18:18  RunTimeErrors  阅读(340)  评论(0)    收藏  举报