본문 바로가기
무언가 만들어보기/펭귄맨

펭귄맨 : MusicXML의 이해

by 도리언 옐로우 2024. 4. 10.

1. 서

본 프로젝트에서는 MusicXML 형식의 파일을 다루는 것이 큰 비중을 차지하고 있다. MusicXML 형식이 어떤 구성으로 이루어졌는지부터 파악해야 분류할 타겟을 정할 수 있고 그에 따라 데이터셋을 제작할 수 있기 때문에, MusicXML 파일의 형식과 구성을 이해하는 것으로 프로젝트를 시작한다.

 

2. MusicXML 이란

MusicXML은 이름에서 알 수 있듯이 XML을 기반으로 하는데, 음악 악보의 디지털 표현을 위한 표준 파일 포맷 중 하나이다. 줄글로 설명하는 것은 큰 의미가 없을 테니, 직접 MusicXML 형식의 파일을 제작해 보았다.

불후의 명곡

 

위 악보는 엘비스 프레슬리의 Can't Help Falling In Love의 시작부분 5마디를 MuseScore3로 나타낸 것이다. 5마디 밖에 되지 않으니까 파일의 크기도 컴팩트하지 않을까 하는 기대감을 갖고 MusicXML파일로 변환시켜 보았다.

 

5마디 악보의 MusicXML 파일의 아주 일부분

 

5마디의 악보인데 총 644줄이나 되는 마크업 언어로 된 문서가 튀어나왔다. 이 파일을 토대로 MusicXML의 기본 구조를 알아보자.

 

3. MusicXML파일의 구조

 

MusicXML 4.0

MusicXML Version 4.0 Latest editor's draft: Editor: Participate: Copyright © 2004-2021 the Contributors to the MusicXML Specification, published by the Music Notation Community Group under the W3C Community Final Specification Agreement (FSA). A human-rea

www.w3.org

(1) 기본 구조

한눈에 보기위해 몇몇 요소들을 접어놓았다

 

1) 선언부

위 사진에서도 바로 확인할 수 있는데, 첫째 줄은 XML 선언부로 XML 버전과 인코딩 방식을 명시하고 있고, 둘째 줄은 문서 타입 선언부로 MusicXML 파일임을 확인할 수 있는 부분이다. 눈여겨 볼 것은 없는 부분이다.

 

2) <score-partwise>

MusicXML 문서의 루트 요소로 MusicXML의 버전을 명시하고 있다. 구성요소로는 이하에서 살펴볼 주요요소외에, 작품에 대한 정보를 나타내는 <work>,  작곡가나 저작권 정보 등을 포함하는 <identification>, 악보의 기본 레이아웃을 나타내는 <defaults>, 악보의 제목 페이지나 특정 페이지에 표시될 추가적인 정보를 제공하는 <credit>등이 포함되는데 이들은 선택적 요소에 해당한다. 

 

2-1) <part-list>

문서 내의 모든 악기에 대한 목록을 정의하고 있다. 이번 프로젝트는 일단 피아노만을 다루기 때문에 하나의 score-part만 존재하게 된다.

 

2-2) <part>

part의 구성

실제 음악 노트, 가사 등이 포함된 부분으로, 각 part는 고유한 ID로 part-list에 연결되어 있다. 위 사진에서 5개의 measure가 들어있음을 확인할 수 있는데, measure는 마디를 나타낸다. 5개의 마디로 구성된 악보이기 때문에 measure도 5개가 들어있는 것이다.

 

(2) measure의 구성

measure가 핵심인듯 하다

1) <print>

<print> 요소는 MusicXML에서 특정 마디에 대한 시각적인 표현 정보를 제공하여 악보의 레이아웃이나 포매팅을 세밀하게 조정하는데 사용된다.

 

2) <attributes>

마디에 적용되는 박자, 조표, 박자표 등을 포함하여 마디의 속성을 정의하는 요소이다. 마디의 시작 부분에서 일반적으로 한번 나타나고 설정이 변경될때마다 나타나는 요소이다.

attributes의 구성

  • <divisions>는 음표의 지속시간을 나타내기 위해 사용되는 요소이다. 구체적으로는 4분음표당 분할 수를 나타낸다. 예를들어 divisions가 2이면 duration 1은 8분음표가 된다.
  • <keys>는 마디의 조표를 나타낸다. <fifth>속성의 값이 양수이면 #, 음수이면  의 개수를 나타낸다.
  • <time>은 마디의 박자를 나타낸다.
  • <staves>는 한 파트에서 사용되는 스태프의 수로, 피아노 악보는 일반적으로 두 개의 스태프를 사용한다.
  • <clef>는 악보의 음자리표를 정의한다. 높은음자리표는 G클래프, 낮은음자리표는 F클래프이다.

 

3) <direction>

악보의 dynamics(강약, 강조 등) 등의 연주 지시사항을 나타내는 요소이다.

 

4) <note> ★★★

MusicXML에서 개별 음표나 쉼표를 나타내는데 사용되는 요소로, 모델이 이것만 잘뽑아내도 90%는 성공이라고 할 수 있겠다. 

쉼표의 경우

쉼표를 나타내는 <note>의 구성은 위와 같이 <rest/>를 포함하고 있다. <type>은 선택적 요소로 쉼표의 유형(whole, half, quarter, eighth 등)을 나타낸다. 만약 <note measure="yes"/>와 같이 표기되어 있다면 마디 전체가 쉬묘로 채워져 있음을 의미한다.

 

음표의 경우

음표를 나타내는 <note>의 구성은 위와 같다. default-x,y 값은 구체적인 음표의 좌표값을 나타내는데, 세밀하게 직접 음표 위치를 지정하는 경우가 아니면 생략해도 되고, 생략시 프로그램의 알고리즘에 따라 자동으로 위치가 결정된다.

  • <pitch> 는 음표의 피치를 나타내는데, <step>은 음계상 위치, <octave>는 옥타브, <alter>는 음을 반음 올리거나 내리는 것을 나타낸다. 참고로 조표가 있어 # 등을 악보에서 생략하더라도 <alter>표시는 들어가는 것 같다.
  • <duration> 은 음표의 지속시간을 나타낸다. 값은 <divisions> 단위로 표현된다.
  • <type>은 음표의 유형 (whole, half, quarter, eighth 등) 을 나타낸다.
  • <stem>은 음표의 기둥 방향을 나타내는 것 같다.
  • <notations>은 음표와 관련된 다양한 연주 기호를 나타낸다.
  • <chord> 가 포함되어 있다면 해당 노트는 화음을 이루고 있다는 뜻이다. 즉, 여러 음이 동시에 눌러지는 경우를 말한다.
  • <beam>은 여러 음표를 빔으로 연결하는 표시를 나타낸다. "begin", "continue", "end", "forward hook", "backward hook" 의 상태가 존재한다.
  • <grace>는 해당 음표가 꾸밈음임을 나타내는 요소이다. slash="yes" 속성이 추가되면 일반적인 꾸밈음 보다 더욱 강하고 빠르게 연주되는 acciaccatura를 의미하고, 악보상에도 노트헤드위에 작은 슬래시로 표시된다.
  • <time-modification>은 실제 연주시간과 악보상의 표시 사이의 관계를 정의하는 요소로, 셋잇단 음표같은 경우에 사용된다.

음표가 8분 셋잇단음표 그룹의 일부임을 나타내는 표시

 

5) <backup>

여러 파트가 동시에 진행되는 경우에, 한 파트의 노트 입력을 마치고 <backup>으로 되돌아가 다른 파트의 노트를 입력하게 된다.

 

6) <barline>

마디의 끝을 나타내는 마디선을 의미한다. 생략시 기본적인 마디 구분을 나타내는 경우이다.

 

4. 결어

MusicXML 파일의 구조를 파악하는 과정을 통해, 구성하려는 모델에서 구체적으로 어떤 요소를 추출해야 할지 더욱 명확히 파악할 수 있게 되었다. 하지만 본격적인 모델 탐색에 앞서 아직 한가지 과정을 먼저 진행해야 하는데, 바로 spectrogram에 대한 이해이다. 다음 포스팅에서 관련된 내용을 다루도록 한다.