본문 바로가기
  • 우당탕탕속의 잔잔함
Programming/Sound Analysis

[Toolkit] 음악학에 활용되는 Music21 사용 방법

by zpstls 2023. 2. 6.
반응형

 

 

이번 포스트에서는 음악과 관련된 작업을 수행할 때 활용되는 Python Toolkit인 Music21에 대해 다뤄볼 것입니다.

Music21이란 무엇인지, 어떻게 활용하면 좋을지 등에 관해 작성해봅니다.

 

Music21이란, 음악과 관련된 작업을 쉽고 빠르게 제공해 주기 위한 Tool이라고 공식 홈페이지에서는 소개하고 있습니다만, 좀 애매하게 소개되어 있긴 합니다...ㅎ

어찌 되었든, Music21는 MIDI 음악을 기초로 하여, 음악을 생성하거나 음성 데이터를 분석하거나 음성과 관련된 작업을 자동화하는 등의 음악과 관련된 전반적인 작업을 수행할 수 있게 해 줍니다.

 

Music21의 공식 홈페이지는 다음과 같습니다.

 

music21: a Toolkit for Computer-Aided Musicology

What is music21? Music21 is a set of tools for helping scholars and other active listeners answer questions about music quickly and simply. If you’ve ever asked yourself a question like, “I wonder how often Bach does that” or “I wish I knew which b

web.mit.edu

 

 

GitHub - cuthbertLab/music21: music21 is a Toolkit for Computational Musicology

music21 is a Toolkit for Computational Musicology. Contribute to cuthbertLab/music21 development by creating an account on GitHub.

github.com

 

Music21은 비교적 쉽게 사용할 수 있습니다. 수행할 수 있는 작업의 전부를 다루기에는 너무 광범위하기에... 몇 가지 사용 방식에 대해서만 다뤄보도록 하겠습니다.

 

 

Installation

우선, Music21을 설치해야 합니다. Python 3.x은 이미 설치되어 있다고 가정하고 진행해 보겠습니다.

다음 명령어를 통해 쉽게 설치할 수 있습니다.

>> pip install music21

허무하게도 이게 끝입니다. ^^

이 상태로도 music21을 이용할 수는 있지만, 악보를 생성하거나 음성 데이터를 플레이하려고 .show()를 하게 되면 Error가 발생합니다. 이는 해당 데이터를 출력하기 위한 프로그램이 없기 때문에 발생하는 것이데, 해결하기 위해서는 MuseScore, Finale 또는 Sibelius라는 프로그램을 설치하고 music21과 연결시켜주어야 합니다.

 

저는 MuseScore라는 프로그램을 사용했습니다. 해당 프로그램은 다음 링크에서 다운로드할 수 있습니다.

 

Free music composition and notation software | MuseScore

I found this wonderful program by googling 'how do you compose music'? It's easy to use.

musescore.org

설치한 후에 다음과 같은 코드를 작성해서 실행시켜 줍니다.

from music21 import *
configure.run()

실행시키면 글이 쫙 나옵니다. 뭔가 글을 마무리한 것 같지 않다는 느낌이 드실 텐데... 그게 맞습니다. 한참 기다려줍니다. 그러면 설치된 MuseScore 프로그램을 찾아주고 해당 프로그램을 .show()할 때 사용할 것인지 묻습니다.

사용하고자 하는 프로그램을 선택해 주면 설정이 완료됩니다. 

Set Configuration For .show()

이제 .show()를 하게 되면 MuseScore 프로그램이 실행되면서 생성한 악보와 음성 데이터 파일을 확인해 볼 수 있습니다.

그러면 본격적으로 music21을 다뤄보도록 하겠습니다.

 

 

 

 

 

Basic Usages

저는 음악에 대한 지식이... 별로 없긴 하지만, 음악에 있어서 가장 기본이 되는 것은 Notes라고 생각합니다. music21에서는 Notes를 다음과 같은 방식을 통해 사용할 수 있습니다.

from music21 import *

c = note.Note("C4")

print(c)			# <music21.note.Note C>
print(c.name)			# C
print(c.octave)			# 4
print(c.pitch.accidental)	# None
print(c.pitch.frequency)	# 261.62556~

cSharp = note.Note("C#4")
cSharp.duration.type = 'whole'	# whole, half, quarter, eighth, sixteenth

bFlat = note.Note("B-2")

rest = note.Rest()
rest.duration = duration.Duration(1)

stream = stream.Stream()
stream.append(c)
stream.append(cSharp)
stream.append(bFlat)
stream.append(rest)

stream.show()
stream.show('midi')
stream.show('midi', fp='test.mid')
stream.clear()

어렸을 때 음악을 시작하면 "도"부터 시작하곤 하죠. 이때의 "도"가 미국식 음계로는 C입니다. 이는 note.Note("C")를 통해 지정해 줄 수 있으며 이에 대한 Data를 위 코드와 같이 확인할 수 있고 .show()를 통해 Draw 할 수 있습니다. 이외로 #이나 플랫, 쉼표 등을 지정하고 해당 음계의 길이 등을 설정해 줄 수 있습니다.

생성한 음계에 해당하는 악보가 그려지고 프로그램의 오른쪽 상단의 Play 버튼을 통해 음성을 들어볼 수 있습니다. 또한 .mid 파일로 결과를 저장할 수도 있습니다.

 

음계 아래에 가사를 넣는 방법은 다음과 같습니다.

from music21 import *

c4 = note.Note("C4")
c4.lyric = 'C4'
c4.show()

단순히 lyric에 사용하고자 하는 문자열을 지정해 주면 됩니다. 줄 바꿈을 사용하고 싶다면 문자열 구성과 동일하게 "C4\nC4"와 같은 방식으로 사용하면 됩니다.

 

앞서 음계와 가사를 각각 지정하여 구성했었습니다. 그러나 다음과 같이 음계를 한 번에 지정해서 생성하는 방법도 있습니다.

from music21 import *

c = converter.parse("""tinynotation: 4/4
C4 D E F G A B c d e f g a b r2
C4_C4 D_D E_E F_F G_G A_A B_B c_c d_d e_e f_f g_g a_a b_b r2
""")
c.show()

짧은 길이의 악보라면 위와 같이 한번에 써서 사용하는 것도 나쁘지 않을 것 같습니다.

 

여러 개의 음을 합쳐서 사용하는 코드의 경우는 다음과 같이 사용할 수 있습니다.

from music21 import *

cMinor = chord.Chord(["C4","G4","E-5"])
print(cMinor.duration.type)
print(cMinor.quarterLength)
print(cMinor.pitches)
print(cMinor.isMajorTriad())
print(cMinor.isMinorTriad())
print(cMinor.inversion())

cMajor = chord.Chord(["E3","C4","G4"])
print(cMajor.inversion())
print(cMajor.root())
print(cMajor.bass())
print(cMajor.third)
print(cMajor.fifth)

stream = stream.Stream()
stream.append(cMinor)
stream.append(cMajor)
stream.show()
stream.clear()

C Minor와 C Major를 선언하고 해당 Chord의 세부 요소들에 대해 확인할 수 있습니다.  

 

그러면, 이번에는 악보 파일(.mid)을 읽고 활용하는 방법에 대해 다뤄봅니다.

from music21 import *
import numpy as np

midi = converter.parse("Final_Fantasy_Matouyas_Cave_Piano.mid")
notes_to_parse = midi.flat.notes

print(np.shape(notes_to_parse))
for e in notes_to_parse[:10] :
    print(e, e.offset)

위와 같은 방식을 통해 .mid 파일을 Read 하고 Data를 저장한 후 활용할 수 있습니다.

"Final_Fantasy_~"라는 mid 파일을 Read 하였고 해당 파일에서 음계를 읽어 10개만 출력한 결과는 다음과 같습니다.

Note와 Chord들이 출력되는 것을 확인할 수 있습니다.

각각의 데이터들의 세부 요소들을 추출하고 이를 통해 분류해서 저장하거나 악보에서 사용되는 음정을 활용해 Dictionary화 하여 저장하는 등의 Processing 과정을 수행하여 Deep Learning 등에 활용할 수 있을 것입니다.

 

 

이로써 Music21을 설치하고 간단하게 사용해 보았습니다.

지금 다룬 범위는 정말 아주 작은 Music21에 해당하는 기능입니다. 그러나 이 정도 내용만으로도 Deep Learning에 Music21을 활용하기엔 충분합니다.

세부적인 내용은 Music21의 User Guide에서 찾아보면 될 것 같습니다.

 

향후 Music21과 Deep Learning을 융합하여 사용해 볼 예정입니다.

이번 포스팅은 여기서 마무리하도록 하겠습니다.

 

 

반응형

댓글