커뮤니티
DSP/SPEECH
제목:    Music21 패키지 활용 기본
  3969   김윤중

from music21 import *
https://web.mit.edu/music21/doc/index.html

#악보처리용 프로그램 추가 (한번만 하면ok)
#https://musescore.org 에서 다움로드 및 install


us=environment.UserSettings()
us["musescoreDirectPNGPath"]="C:/Program Files/MuseScore_3/bin/MuseScore3.exe"
us["musicxmlPath"]="C:/Program Files/MuseScore_3/bin/MuseScore3.exe"

#악보를 로드하고 화면에 출력 및 재생하기
s = corpus.parse('bach/bwv65.2.xml')    #악보로드
s.analyze('key')                     #악보의 키 분석
s.show()                              #악보 출력 
s.show('midi')                        #음악 재생 
s.write('midi', fp='bwv65.mid')   #'bwv65.mid'으로 저장

#음표를 입력 및 작곡에 유용한 기본 명령어 사용방법
note1 = note.Note("C4")         #4옥타브 도 4분음
note2 = note.Note("F#")         #4옥타브 파반올림 4분음
note3 = note.Note("B3")         #3옥타브 시 4분음
note4 = note.Note("C")           #5옥타브 도음 4분음
note4.duration.type='eighth'     #whole,half,quarter,eighth,sixteenth
note4.pitch.octave=5               #1,2,3,4,5,6,7 4:default

note5 = note.Note("D")           #4옥타브 레음 (half+quarter)음
note5.duration=duration.Duration(3) #half+quarter,  3박자 quarter 3개
note5.pitch.octave=5           #1,2,3,4,5,6,7 4:default
note6 = note.Rest()            #쉼표
note6.duration=duration.Duration(1) #1박자


stream1 = stream.Stream()
stream1.append(note1)
stream1.append(note2)
stream1.append(note3)
stream1.append(note4)
stream1.append(note5)
stream1.append(note6)

stream1.show('text')
#{0.0} <music21.note.Note C>
#1.0} <music21.note.Note F#>
#{2.0} <music21.note.Note B>
#{3.0} <music21.note.Note C>
#{3.5} <music21.note.Note D>
#{6.5} <music21.note.Rest rest>

stream1.show()            #display score(악보)
stream1.show('midi')     #play music

for i,thisNote in enumerate(stream1):
     if thisNote.name == 'rest' :print(i,'Rest')
     else :print(i,thisNote.step,thisNote.nameWithOctave)

#0 C C4
#1 F F#
#2 B B3
#3 C C5
#4 D D5
#5 Rest

stream1.show()                   #display score(악보)        
stream1.show('midi')            #play music                    
stream1.show('midi', fp='test0.mid') #save midi format        
print(stream1.index(note3))  #2
#2
stream1.pop(stream1.index(note3))
for i,thisNote in enumerate(stream1):
     if thisNote.name == 'rest' :print(i,'Rest')
     else :print(i,thisNote.step,thisNote.nameWithOctave)
#0 C C4
#1 F F#
#2 C C5
#3 D D5
#4 Rest

stream1.show()               #display score(악보)        
stream1.show('midi')        #play music                   
stream1.show('midi', fp='test1.mid') #save
stream1.clear()