1. 서
본 프로젝트에서는 MusicXML 형식의 파일을 다루는 것이 큰 비중을 차지하고 있다. MusicXML 형식이 어떤 구성으로 이루어졌는지부터 파악해야 분류할 타겟을 정할 수 있고 그에 따라 데이터셋을 제작할 수 있기 때문에, MusicXML 파일의 형식과 구성을 이해하는 것으로 프로젝트를 시작한다.
2. MusicXML 이란
MusicXML은 이름에서 알 수 있듯이 XML을 기반으로 하는데, 음악 악보의 디지털 표현을 위한 표준 파일 포맷 중 하나이다. 줄글로 설명하는 것은 큰 의미가 없을 테니, 직접 MusicXML 형식의 파일을 제작해 보았다.
위 악보는 엘비스 프레슬리의 Can't Help Falling In Love의 시작부분 5마디를 MuseScore3로 나타낸 것이다. 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는 고유한 ID로 part-list에 연결되어 있다. 위 사진에서 5개의 measure가 들어있음을 확인할 수 있는데, measure는 마디를 나타낸다. 5개의 마디로 구성된 악보이기 때문에 measure도 5개가 들어있는 것이다.
(2) measure의 구성
1) <print>
<print> 요소는 MusicXML에서 특정 마디에 대한 시각적인 표현 정보를 제공하여 악보의 레이아웃이나 포매팅을 세밀하게 조정하는데 사용된다.
2) <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>은 실제 연주시간과 악보상의 표시 사이의 관계를 정의하는 요소로, 셋잇단 음표같은 경우에 사용된다.
5) <backup>
여러 파트가 동시에 진행되는 경우에, 한 파트의 노트 입력을 마치고 <backup>으로 되돌아가 다른 파트의 노트를 입력하게 된다.
6) <barline>
마디의 끝을 나타내는 마디선을 의미한다. 생략시 기본적인 마디 구분을 나타내는 경우이다.
4. 결어
MusicXML 파일의 구조를 파악하는 과정을 통해, 구성하려는 모델에서 구체적으로 어떤 요소를 추출해야 할지 더욱 명확히 파악할 수 있게 되었다. 하지만 본격적인 모델 탐색에 앞서 아직 한가지 과정을 먼저 진행해야 하는데, 바로 spectrogram에 대한 이해이다. 다음 포스팅에서 관련된 내용을 다루도록 한다.
'무언가 만들어보기 > 펭귄맨' 카테고리의 다른 글
펭귄맨 : Spectrogram의 이해 (2) | 2024.04.14 |
---|---|
펭귄맨 : 음원의 푸리에 해석 (0) | 2024.04.12 |
펭귄맨 : GitHub 세팅 - part 2 (2) | 2024.04.08 |
펭귄맨 : GitHub 세팅 - part 1 (0) | 2024.04.08 |
펭귄맨 : 프로젝트 개요 (0) | 2024.04.01 |