본 글은 W3C 의 MusicXML 공식 문서를 기반으로 작성한다. 이전 글은 MusicXML 의 기초적인 내용을 정리했다. 이번 글에서는 MusicXML 의 구조에 대해 알아보고, 더 많은 MusicXML 문법을 정리한다.
1. Adapting Musical Scores to a Hierarchy
이전 글에서 다뤄봤던 예시 악보는 한마디만 있는 간단한 악보였다. 이번에는 더 많은 Part 와 더 많은 Measure(마디) 로 이루어진 악보를 예시로 삼아서 학습한다. 보통 XML 은 계층구조로 데이터를 표시하지만, 실제 악보는 계층 구조보다는 격자(Lattice) 구조에 가깝다. 그렇다면 MusicXML 은 XML 과 실제 악보 간의 구조적 차이를 어떻게 극복하였는지 알아보자.
MusicXML 은 2가지의 형식으로 악보를 나타낼 수 있으며, 2가지의 형식을 의미하는 Root Element 가 존재한다.
<score-partwise>
<score-partwise> 는 악보의 각 Part(파트)가 주(Primary) 가 되고, 그 안에 Measure(마디)들이 포함되어있는 구조를 뜻한다.
<score-timewise>
<score-timewise> 는 각 Measure(마디)가 주(Primary) 가 되고, 그 안에 Part(파트)들이 포함되어있는 구조를 뜻한다.
2가지 형식을 지원한다면, 두 형식 간에 전환도 자유롭게 이루어지는 것이 좋을 것이다. MusicXML 은 두 형식의 스위칭이 원활히 이루어질 수 있도록 "XSLT" 스타일시트를 제공한다. parttime.xsl 스타일시트는 <score-partwise> 를 <score-timewise> 로 변환한 것이고, timepart.xsl 스타일시트는 <score-timewise> 를 <score-partwise> 로 변환한 것이다.
애플리케이션은 어떤 형식으로 MusicXML 을 읽을지 결정하고, Document Type 을 확인한다. 만약 선택한 형식이 MusicXML 파일의 Root Element 와 동일하다면, 그대로 다음 단계를 진행하면 된다. 반면에, 선택한 형식과 MusicXML 파일의 Root Element 가 다를 경우, MusicXML 에 다른 Root Element 가 있는지 확인한다. 만약 선택한 형식과 같은 Root Element 가 존재한다면, 원하는 형식의 새로운 MusicXML 문서를 생성하기 위해 적절한 XSLT 스타일시트를 적용한다. 만약 선택한 형식이 MusicXML 파일에 전혀 존재하지 않는다면, 에러 메시지가 반환될 것이다.
애플리케이션이 MusicXML 을 쓸 때는, 필요한 형식을 쓰는 것이 가장 적절하다. 변환해야 한다면, MusicXML 을 읽는 애플리케이션이 변환 하도록 한다. 오늘날에는 대부분 <score-partwise> 를 많이 사용한다.
2. Top-Level Element
Root element 는 각각 음악 관련 데이터를 포함한 "score header" 라 불리는 element 의 그룹을 가지고 있다. 두 Root element 의 차이점이라면, <part> 가 먼저 나오느냐, <measure> 가 먼저 나오느냐의 차이이다. <score-partwise> 는 다수의 <measure> 을 포함하는 <part> 들을 가지고 있고, <score-timewise> 는 다수의 <part> 를 포함하는 <measure> 들을 가지고 있다.
어느 Root element 라 하더라도, 결국 하위 단계에는 음악 데이터와 관련된 element 들을 그룹단위로 가지게 된다. 악보에 따라 없는 경우도 있겠지만, 모든 경우에 다음 요소들이 하나씩은 있을 것이다.
- <note>
- <backup>
- <forward>
- <direction>
- <attributes>
- <harmony>
- <figured-bass>
- <print>
- <sound>
- <listening>
- <barline>
- <grouping>
- <link>
- <bookmark>
"score header" 는 다음 요소들을 포함한다.
- <work>
- <movement-number>
- <movement-title>
- <identification>
- <defaults>
- <credit>
- <part-list> (Required)
3. Score Header
Score Header 는 악보의 제목, 작곡가 이름 등과 같은 악보에 대한 기본적인 메타데이터를 담고 있다. 그리고 악보에 있는 파트나 악기 구성에 대한 리스트를 <part-list> element 안에 명시한다.
아래 예시는 슈베르트(Franz Schubert) 의 가곡, "겨울나그네(Winterreise)" 의 24곡 중 22번째 곡인 "용기(Mut)" 의 악보를 MusicXML 로 인코딩한 것이다. 그 중에서 Score Header 부분이다.
<work>
<work-number>D. 911</work-number>
<work-title>Winterreise</work-title>
</work>
<movement-number>22</movement-number>
<movement-title>Mut</movement-title>
<identification>
<creator type="composer">Franz Schubert</creator>
<creator type="poet">Wilhelm Müller</creator>
<rights>Copyright © 2001 Recordare LLC</rights>
<encoding>
<encoding-date>2002-02-16</encoding-date>
<encoder>Michael Good</encoder>
<software>Finale 2002 for Windows</software>
<encoding-description>MusicXML 1.0 example</encoding-description>
</encoding>
<source>Based on Breitkopf & Härtel edition of 1895</source>
</identification>
<part-list>
<score-part id="P1">
<part-name>Singstimme.</part-name>
</score-part>
<score-part id="P2">
<part-name>Pianoforte.</part-name>
</score-part>
</part-list>
위 예시 코드를 보면 "Score Header" 부분에는 5가지의 element 들이 있다. <work>, <movement-number>, <movement-title>, <identification>, <part-list> 가 있으며, <part-list> 만 필수 요소이고 나머지는 요소들은 필요에 따라 추가하는 것이다.
3-1) <work>
<work>
<work-number>D. 911</work-number>
<work-title>Winterreise</work-title>
</work>
MusicXML 에서 한 곡에 악장(movement)들이 있을 경우, 분리하여 각 악장의 파일로 만든다. 그 때, 각 악장의 파일들이 하나의 곡임을 알리기 위해 <work> 를 사용한다. <work-number> 는 곡 번호를 명시하고, <work-title> 에서는 악장의 이름이 아닌 모든 악장을 아우르는 곡의 제목을 명시한다.
3-2) <movement-number>
<movement-number>22</movement-number>
예시로 든 슈베르트의 "겨울나그네" 라는 곡은 총 24개의 곡들로 구성되어있다. "movement" 라는 단어는 "악장" 이라는 뜻인데, 보통 교향곡에서 사용하는 단어이다. "베토벤 9번 교향곡 4악장", "차이코프스키 6번 교향곡 1악장" 등과 같이 사용하지만, MusicXML 에서는 "겨울나그네" 같이 소규모의 곡들로 하나의 전체곡이 이루어지는 경우에도 "movement" 키워드를 사용한다. 현재 예시 악보는 "겨울 나그네"의 "22"번째 곡인 "Mut" 이므로, <movemnet-number> 에 22 가 설정되어있다.
3-3) <movement-title>
<movement-title>Mut</movement-title>
3-2) 와 비슷하게 <movement-title> 은 악장의 제목을 담는 element 이다. 만약, 악장이나 부분 노래들로 이루어진 곡이 아닌 단일 곡이라면, 해당 곡의 제목을 <movement-title> 에 넣어도 된다.
3-4) <identification>
<identification>
<creator type="composer">Franz Schubert</creator>
<creator type="poet">Wilhelm Müller</creator>
<rights>Copyright © 2001 Recordare LLC</rights>
<encoding>
<encoding-date>2002-02-16</encoding-date>
<encoder>Michael Good</encoder>
<software>Finale 2002 for Windows</software>
<encoding-description>MusicXML 1.0 example</encoding-description>
</encoding>
<source>Based on Breitkopf & Härtel edition of 1895</source>
</identification>
<identification> 은 Dublin Core 에 기반한 기본적인 메타데이터를 담고 있다. 대부분의 곡들은 1개 이상의 <creator> 를 가지고 있다. 예시 코드는 "composer" 와 "poet" 에 대한 2개의 <creator> 를 가지고 있다. <creator> 는 곡을 만든 작곡가나 작사가에 대한 정보를 담으며, type 속성을 통해 <creator> 의 유형을 구별할 수 있다.
<rights> 는 저작권에 대한 정보를 담는다. 저작권 명시를 여러개 해야한다면, <rights> 도 필요에 따라 다수 사용할 수 있다.
<encoding> 은 MusicXML 파일이 어떻게 만들어졌는지에 대한 정보가 명시된다. <encoding> 내부에 사용할 수 있는 element 는 위 예시에 있는 4가지이다. <encoding-date> 는 MusicXML 를 만든 날짜, <encoder> 는 MusicXML 을 만든 사람의 이름, <software> 는 MusicXML 을 인코딩한 소프트웨어의 이름, <encoding-description> 은 기타 넣고 싶은 내용을 넣는다. 그 외에 <supports> element 를 사용하여 해당 MusicXML 이 특정 MusicXML element 를 지원한다는 것을 명시할 수 있다.
<source> 는 곡의 에디션이 여러개 존재할 때, 어떤 에디션인지 명시하고자 할 때 사용한다.
그 외에 <miscellaneous> element 도 필요에 따라 사용할 수 있다.
3-5) <part-list>
<part-list>
<score-part id="P1">
<part-name>Singstimme.</part-name>
</score-part>
<score-part id="P2">
<part-name>Pianoforte.</part-name>
</score-part>
</part-list>
<part-list> 는 모든 MusicXML 의 Score Header 부분에서 반드시 필요한 element 이다. <part-list> 는 <score-part> 로 구성되며, 각각의 <score-part> 는 "id" 속성을 반드시 넣어줘야하며, <part-name> element 를 내부에 담고 있어야한다. 관습적으로 <score-part> 의 "id" 속성값은 "P1", "P2" 처럼 "P" 뒤에 숫자를 붙이는 형식으로 네이밍을 한다.
<part-name> 과 같이 <score-part> 안에 넣을 수 있는 element 는 다음과 같다.
- <identification> : 특정 파트가 다른 소스에서 온 것일 때, 사용할 수 있다.
- <part-link> : Score(총보) 문서에서 파트 부분을 링크하고 싶을 때 사용한다.
- <part-name-display> : Part 의 이름의 정확한 형식을 위해 사용한다.
- <part-abbreviation> : 주로 Score(총보)의 시작 부분에 명시하는 이름은 <part-name> 을 사용하고, 뒤에 이어서 사용할 파트의 이름을 약어로 쓰고 싶을 때 사용한다.
- <part-abbreviation-display> : <part-abbreviation> 에 있는 이름을 정확한 형식으로 쓰고 싶을 때 사용한다.
- <group> : 다른 파트가 다른 목적으로 사용될 때 사용한다. 다른 목적이라 함은, 출력된 스코어, 출력된 파트, 미디 사운드 파일, 데이터 분석 등등이 있다.
- <score-instrument> : 악기 소리와 가상 음악 세팅을 설명하고 <score-part> 내에서 여러 악기를 정의하는 데 사용한다. MIDI 악기 변경을 위한 참조 포인트가 될 수 있다.
- <player> : Listening 어플리케이션에서 쓰기 위해 사용한다.
- <midi-device> : 다중 포트 설정에서 사용되는 MIDI 기기나 포트를 구별하기 위해 사용한다. 여러 장치를 사용하게 되면 MIDI 1.0 의 16채널 장벽을 넘을 수 있다.
- <midi-instrument> : 파트의 각 <score-instrument> 를 위한 최초 MIDI 셋업을 명시하는 데 사용한다.
본 글에서는 MusicXML 파일의 구조에 대해 알아보았다. MusicXML 의 구조는 파일의 맨 위에 Score Header 를 통해 정의되므로, 그 부분에 대해 집중적으로 글이 정리되었다. 다음 글에서는 실제 파트 내에 마디마다 어떻게 표현하는지 알아보도록 한다.
'NotePad' 카테고리의 다른 글
[MediaPipe] Hand Landmark 적용 과정 정리 (0) | 2023.11.17 |
---|---|
Kotlin 으로 JWT 를 Decode 하기 (0) | 2022.11.09 |
MusicXML 4.0 Tutorial - "Hello World" (0) | 2022.09.20 |
[음악] 음자리표 (Time Signature) (0) | 2022.09.20 |
[Angular] AngularJS 와 Angular 2~14 (0) | 2022.09.06 |