MakeMusic
SmartMusic Finale Garritan MusicXML

Poster Session

Representing Music Using XML

Michael Good
Recordare

Poster Session presented at the
International Symposium on Music Information Retrieval
October 23-25, 2000
Plymouth, Massachusetts, USA
Abstract also online

Copyright © 2000 Michael Good

Why Use XML to Represent Musical Scores?

  • People need a more powerful interchange format than MIDI
  • XML provides a simple, common, text format for complex structured data
  • Like HTML and MIDI, simple to learn with real-world power
  • Uses Unicode for multilingual data
  • Huge momentum behind using XML for data interchange within the computer industry
  • Many software development tools available

MusicXML: An Interchange Language

  • Supports notation, analysis, retrieval, and performance applications
  • Based on MuseData and Humdrum
  • Designed for common western musical notation, both classical and popular
  • Current Windows software:
    Reads/writes 100% of MuseData
    Writes to Standard MIDI, Sibelius, Finale
    Reads from Finale ETF and NIFF

MusicXML Example (first note of logo)

Recordare logo in 2000

                    <?xml version="1.0" standalone="no" ?>
                    <!DOCTYPE score-partwise PUBLIC
                        "-//Recordare//DTD MusicXML Partwise//EN"
                        "http://www.musicxml.org/dtds/partwise.dtd">
                    <score-partwise>
                        <part-list>
                            <score-part id="P1">
                                <part-name>Mezzo-soprano</part-name>
                            </score-part>
                        </part-list>
                        <part id="P1">
                            <measure number="1">
                                <attributes>
                                    <key>
                                        <fifths>-1</fifths>
                                    </key>
                                    <divisions>2</divisions>
                                    <clef>
                                        <sign>G</sign>
                                        <line>2</line>
                                     </clef>
                                </attributes>
                                <note>
                                    <pitch>
                                        <step>A</step>
                                        <octave>4</octave>
                                    </pitch>
                                    <duration>4</duration>
                                    <tie type="start"/>
                                    <type>half</type>
                                    <stem>up</stem>
                                    <notations>
                                        <slur type="start" number="1"/>
                                        <tied type="start"/>
                                     </notations>
                                 </note>

clear

MusicXML DTD Sample: pitch and slur

                    <!ELEMENT pitch (step, alter?, octave)>
                    <!ELEMENT step (#PCDATA)>
                    <!ELEMENT alter (#PCDATA)>
                    <!ELEMENT octave (#PCDATA)>

                    <!-- Slur is an empty element with attributes -->
                    <!ENTITY % beam-level "(1 | 2 | 3 | 4 | 5 | 6)">
                    <!ENTITY % start-stop "(start | stop)">
                    <!ELEMENT slur EMPTY>
                    <!ATTLIST slur type %start-stop; #REQUIRED>
                    <!ATTLIST slur number %beam-level; "1">

clear

Duration Distribution in Bach BWV 6, 2nd Movement

Screenshot of duration distribution program

Sample of Distribution Analysis Code in Visual Basic

                    Set oNodes = oRoot.selectNodes("//note | //divisions")
                    Do    ' nDivisions already computed as a product of all divisions
                        Set oNote = oNodes.NextNode
                        If oNote Is Nothing Then Exit Do
                        If oNote.tagName = "divisions" Then
                            nMultiplier = nDivisions \ CLng(oNote.Text)
                        Else
                            Set oTmp = oNote.selectSingleNode("duration")
                            If Not oTmp Is Nothing Then  ' Exclude grace and cue notes
                                nDuration = CLng(oTmp.Text) * nMultiplier
                                nCounts(nDuration) = nCounts(nDuration) + 1
                            End If
                        End If
                    Loop

clear