NotePad

MusicXML 4.0 Tutorial - "Hello World"

졸려질려 2022. 9. 20. 15:42
반응형

본 글은 W3c 의 MusicXML 4.0 문서를 기반으로 작성하였습니다.

링크 : https://www.w3.org/2021/06/musicxml40/tutorial/introduction/ 

 

Introduction | MusicXML 4.0

MusicXML 4.0 > Tutorial > Introduction Introduction MusicXML is a digital sheet music interchange and distribution format. The goal is to create a universal format for common Western music notation, similar to the role that the MP3 format serves for record

www.w3.org


1. Introduction

 MusicXML 은 디지털 악보의 교환 및 배포를 위한 형식을 의미한다. MP3 형식이 음원을 위해 사용되는 것처럼, MusicXML 은 일반적인 서양 음악의 표기법을 위한 공용적인 형식이 되는 것을 목표로 한다. 표기법 프로그램, 시퀀서 등 퍼포먼스 프로그램 뿐만 아니라 음악 교육 프로그램, 음악 데이터베이스 등에서도 사용될 수 있도록 설계되었다.

 MusicXML 은 음악 악보를 XML 형식으로 표기하는 오픈 포맷이다. Recordare 사에서 개발해 2004년 1월에 1.0이 발표된 후, 2005년 5월에 버전 1.1이, 2007년 6월에 2.0이 발표되었다. 확장자는 .mxl 이다. 많은 프로그램이 MusicXML 포맷을 지원하고 있고, 변환 플러그인이 다수 개발되었기 때문에 현재 존재하는 대부분의 음악 프로그램에서 입출력이 가능하다.
- 출처: 위키백과 (https://ko.wikipedia.org/wiki/MusicXML)

2. "Hello World" in MusicXML

 개발자들이라면 "Hello World" 라는 문구를 많이 봤을 것이고, 해당 문구가 어떤 의미를 가지고 있는지 알고있다. 바로, 프로그래밍 언어의 첫 단추를 뜻한다. 다만, MusicXML 은 악보를 파일로 저장하기 위한 형식일 뿐, 프로그래밍 언어가 아니므로 "Hello World" 를 직접 출력하지는 않을 것이다. 대신, MusicXML 의 첫 단추, 입문을 하기 위한 간단한 예시와 그에 담긴 MusicXML 문법에 대해 알아본다.

 아래 예시는 "높은음자리표4분의 4박자 1마디 안에 C(도) 음" 을 표기한 MusicXML 이다.

출처 : https://www.w3.org/2021/06/musicxml40/tutorial/hello-world/

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE score-partwise PUBLIC
    "-//Recordare//DTD MusicXML 4.0 Partwise//EN"
    "http://www.musicxml.org/dtds/partwise.dtd">
<score-partwise version="4.0">
  <part-list>
    <score-part id="P1">
      <part-name>Music</part-name>
    </score-part>
  </part-list>
  <part id="P1">
    <measure number="1">
      <attributes>
        <divisions>1</divisions>
        <key>
          <fifths>0</fifths>
        </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>4</duration>
        <type>whole</type>
      </note>
    </measure>
  </part>
</score-partwise>

이제 위 예시 코드에서 하나씩 살펴보도록 한다.

2-1) XML Declaration

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

 XML 선언부는 모든 XML 문서에서 필요한 부분이다. 문자의 인코딩 방식을 함께 명시한다.


2-2) Document Type Declaration

<!DOCTYPE score-partwise PUBLIC
    "-//Recordare//DTD MusicXML 4.0 Partwise//EN"
    "http://www.musicxml.org/dtds/partwise.dtd">

 문서 타입 선언부는 XML Document Type Definitions(DTDs) 를 사용하는 애플리케이션을 위해 필요한 부분이다. 해당 선언부를 통해 애플리케이션은 현재 파일이 MusicXML 파일임을 알 수 있다. 그리고 문서 타입 선언부를 사용할 때는 위의 XML 선언부에서 "standalone" 값을 "no" 로 설정해야한다. MusicXML 파일은 외부 파일의 정의를 사용할 것이기 때문이다.

 사실 문서 타입 선언부를 사용하는 주 목적인 DTD 는 Deprecated 되었다. 대신, MusicXML 4.0 부터는 W3C Schema Definition(XSD) 를 사용하고 있다. 그러나 여전히 DTD 를 사용하는 애플리케이션이 많고, MusicXML 파일을 작성할 때, XSD 나 DTD 를 기반으로 하는 모든 애플리케이션이 MusicXML 파일의 적합성 판단을 할 때 더 쉽기 때문에 문서 타입 선언부는 계속 써주는 것이 좋다.

 예시에 있는 것처럼 PUBLIC 문서 타입 선언부는 DTD 의 인터넷 경로를 포함한다. 위 예시의 URL 은 단순히 참조용이다. 대부분의 애플리케이션은 MusicXML 파일인 것을 알고 있으며, MusicXML schemas 의 자체 로컬 복사본에 대해 유효성을 검사하기를 원할 것이다. 네트워크를 통해 XSD 나 DTD 정의를 읽어오는 것보다는 MusicXML 의 XML catalog 를 로컬 카피본에 대한 유효성 검사로 사용하는 것이 좋다.


2-3) Root Doument Type

<score-partwise version="4.0">
  ...
</score-partwise>

 Root Document Type 은 크게 <score-partwise> 와 <score-timewise> 가 있다. 위 예시 코드처럼 <score-partwise> 는 그 안에 <part> 들로 이루어져 있으며, 각 <part> 는 <measure> 로 이루어져 있다. 반면에, <score-timewise> 는 <measure> 로 이루어져있고, 각 <measure> 안에 <part> 들이 존재한다.


2-4) Header (part-list)

  <part-list>
    <score-part id="P1">
      <part-name>Part 1</part-name>
    </score-part>
  </part-list>

 Root Doument Type 이 <score-partwise> 이거나 <score-timewise> 이더라도, MusicXML 파일은 스코어(score, 총 악보) 에서 다른 음악 파트를 나열하는 헤더로 시작해야한다. 위 예시는 최소한의 <part-list> 이며, 하나의 <score-part> 요소를 가지고 있다. <score-part> 요소에 "id" 속성은 필수적이며, 내부에 <part-name> 요소를 1개 이상 가지고 있어야한다.


2-5) <Part>

  <part id="P1">

 위에서 언급했듯이, <score-partwise> 의 내부는 1차적으로 <part> 들로 구성이 되고, <part> 안에 <measure> 들이 존재한다. 그 중에 <part> 는 "id" 속성 값을 가지고 있어야한다. 그리고 "id" 값은 위의 <score-part> 에서 정의한 "id" 값을 사용해야한다. 현재 예시는 하나의 <part> 만 있지만, 대부분의 악보는 여러 개의 <part> 요소들이 존재한다. 그리고 모든 <part> 에는 "id" 속성값이 존재해야하며, "id" 값은 "P1", "P2", "P3" 같이 "P" 와 파트 번호를 결합한 형식으로 만든다.


2-6) <measure>

    <measure number="1">

 <score-partwise> 의 <measure> 은 <part> 를 구성하는 요소로, <note>, <attribute>, <print> 등의 기본적인 음악 데이터를 가진다. 각 <measure> 의 id 값으로 "number" 속성을 필수적으로 사용한다. 


2-7) <attributes> (partwise)

      <attributes>

 <attributes> 는 <score-partwise> 의 <measure> 내부에서, <score-timewise> 의 <part> 내부에서 사용된다.  현재 <attributes> 는 <measure> 내부에서 사용되며, <measure> 안에서 형식적으로 변화하는 음악 정보들을 담고 있다. 내부에 포함하는 음악 정보는 조표(key), 박자표(time signature), 음자리표(clef), 조옮김(transpositions), staving 이 있다. <attributes> 가 mid-measure 에서 변경되면, MusicXML 의 순서가 아니라 악보의 순서에 영향을 주게 된다.


2-8) <divisions>

        <divisions>1</divisions>

 MusicXML 에서 각 노트(note)는 <duration> 을 가진다. <divisions> 는 4분음표(Quarter Note) 당 divisions 의 관점에서 <duration> 의 측정 단위를 제공한다. 현재 예시 코드에서 있는 음표는 2분음표로 한마디를 꽉 채우기 때문에, 4분음표로 나눌 필요가 없다. 따라서, <divisions> 의 값은 1로 설정된다.

보통 음의 길이(Musical Duration)는 "4분의 1 (Quarter)" 이나 "8분의 1 (Eighth)" 같이 분수의 형태로 표시한다. MusicXML 도 다르지 않다. 음의 길이에서 분모는 거의 변할 일이 없으므로, <divisions> 에 별도로 표시한다. 그리고 분자는 각 note 에 표시한다. MIDI 에서 노트 길이를 나타내는 형식과 비슷하다.


2-9) <key>

        <key>
          <fifths>0</fifths>
        </key>

 <key> 는 조표를 표시할 때 사용되는 요소이다. 예시 코드는 아무런 조표가 없는 다장조(C major)이므로, <fifths> 의 값은 0 이다. 만약 라장조(D major) 의 악보라면, 샾(#) 이 2개 이므로 <fifths> 의 값은 "2" 가 된다. 다른 예시로, 플랫(b) 1개의 마장조(F major) 는 <fifths> 의 값이 "-1" 이 된다.

 "fifths" 라는 이름은 오도권(the circle of fifths)을 따라 조표를 표시하는 것에서 따온 것이다. 이를 통해 조표를 표시하기 위해 플랫과 샾을 따로 표시할 필요 없이 하나의 요소만으로 표시할 수 있다.


2-10) <time>

        <time>
          <beats>4</beats>
          <beat-type>4</beat-type>
        </time>

 <time> 은 박자표(time signature)를 표현한다. 내부에 2가지 종류의 element 를 가지고 있으며, <beats> 와 <beat-type> 은 각각 분자와 분모를 뜻한다. 만약, 8분의 6박자라면, <beats> 의 값은 6, <beat-type> 의 값은 8 로 세팅한다.


2-11) <clef>

        <clef>
          <sign>G</sign>
          <line>2</line>
        </clef>

 MusicXML 은 오늘날 잘 사용되지 않는 것까지 다양한 음자리표(clef)를 지원한다. 현재 예시에 사용된 음자리표는 높은음자리표(the standard treble clef)로, 오선지의 아래에서 2번째 줄이 G(솔) 음이라는 것을 나타낸다. 그래서 위의 <clef> 예시 코드에 <sign> 의 값은 G, <line> 의 값은 2 라 설정되어있다. 만약, 낮은음자리표(F clef)를 표현하고 싶다면, <sign> 값은 F, <line> 값은 4 로 설정하면 될 것이다. 음자리표에 대한 지식이 없어서 <clef> 의 내용이 이해하기 어려울 경우 다음 글을 참고하면 좋을 듯하다.

 

[음악] 음자리표 (Time Signature)

 본 글은 MusicXML 을 공부하던 중, 에 대한 이해를 위해서 "음자리표" 와 관련된 지식이 필요하다 생각되어 따로 정리하게 되었다. 혹시나 음악과 관련된 배경 지식이 전무하거나 잘 모르는 개발

choboit.tistory.com


2-12) <note>

      </attributes>
      <note>

 지금까지는 <measure> 의 속성 값들을 설정하는 <attributes> 의 내용에 대해 기술하였다. 이제 <attributes> 를 끝내고, 음에 대한 정보를 담고 있는 <note> 에 대해 기술한다. <note> 안에는 음 하나에 넣을 수 있는 데이터 요소들을 담을 수 있다. 현재 예시에서는 <pitch>, <duration>, <type> 이 있다.


2-13) <pitch>

        <pitch>
          <step>C</step>
          <octave>4</octave>
        </pitch>

 <note> 내부의 첫번째 요소는 <pitch> 이다. <pitch> 는 <step> 과 <octave> 를 반드시 포함하고 있어야한다. 그 외에 플랫(b) 이나 샾(#) 같이 임시 조표가 붙는다면, <alter> 을 필요에 따라 포함시킬 수 있다. 해당 요소들은 연주되는 음정을 나타내므로, 조표에 변화가 있더라도 필요에 따라 반드시 <alter> 을 포함하고 있어야한다.


2-14) <duration>

        <duration>4</duration>

 현재 예시 코드의 <divisions> 값은 1 이다. 따라서 <duration> 의 값이 4인 것은 4분음표 4개의 길이를 의미한다. <duration> 은 특정 퍼포먼스에서 더 길어지거나 짧아지지 않고, 의도한 음 길이가 그대로 반영되어야 한다. 상위 요소인 <note> 는 "attack" 과 "release" 속성을 가지며, 해당 속성은 note 의 시작 시간과 종료 시간이 <duration> 동안 어떻게 변하는지를 명시하는 속성이다.


2-15) <type>

        <type>whole</type>

 예시에 나온 <type> 은 해당 Note 가 "온음표(Whole note)" 임을 나타낸다. <type> 이 없더라도, 위의 <duration> 을 통해 현재의 note 가 온음표 인 것을 알 수 있다. 그렇다면 두 개 다 쓸 필요가 없을 것 같은데 왜 같이 쓰는 것일까? 만약 표기법과 연주 데이터가 별도로 표현된다면, 표기법과 연주 애플리케이션이 모두 아는 것이 더 좋기 때문이다.

  지금까지 나온 <note> 내부의 요소는 <pitch>, <duration>, <type> 이 있다. 이 3개는 각기 다른 정보를 담고 있기 때문에 순서와 상관없이 <note> 내부에 넣기만 하면 될 것 같아보인다. 하지만, 위의 순서처럼 <pitch> -> <duration> -> <type> 순서로 나열해야한다. 자세한 정보는 공식 문서에 정의되어 있다.


 이렇게 MusicXML 의 예시를 보면서 어떻게 구성되어있는지 간단히 알아보았다. Android App 을 개발할 때는 MusicXML 을 악보로 출력해주는 라이브러리를 사용해서 MusicXML 에 깊이 파고들 생각을 하지 못했다. 하지만, 이번 기회에 입문 하게 되면서, MusicXML 에 더 자세한 정보들이 담겨져 있다는 것을 느꼈다. CustomView 스터디를 위해 목표로 삼았던 Android 악보뷰를 만드는 것도 가능할 것만 같은 기분이 든다. 하지만, 아직 찍먹 단계 밖에 안되기 때문에 공식 문서를 기반으로 더 공부를 해봐야할 것 같다.

반응형