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>
总结:各部分协作流程
- 头部信息 → 定义乐谱的元数据和全局显示规则
- 乐器定义 → 声明声部数量和MIDI配置
- 乐谱内容 → 按小节组织音符和演奏标记
关键元素解析
主要针对第三部分中乐谱部分所涉及的元素进行讲解。
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> 为小节标识, 也是乐谱的基本组成。在乐谱上,一个小节可以理解为五线谱中的一个部分。

一般在第一个小节中,会有整个小节的属性<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>为音符类型标识,用来表示当前这个音符是四分音符、八分音符还是全音符等。这里给出常见的音符类型和取值:
32nd32分音符16th16分音符eighth8分音符quarter4分音符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,我们就已经可以知道最基本的演奏内容了,并可以着手写程序来演奏这段乐曲了。

浙公网安备 33010602011771号