music21 パッケージを使うためのTips

http://web.mit.edu/music21/

エラーの対処方法

https://musescore.org/en から MuseScore (2021/09/18現在の最新版は MuseScore-3.6.2.548021803-x86_64.msi ) をダウンロードしてインストールする。

  • MuseScore.exeのパス: C:\Program Files\MuseScore 3\bin\MuseScore3.exe
  • Anaconda のインストールパス: D:\sys\Anaconda3
  • python仮想環境のパス:{Anacondaのパス}\envs\generative
  • music21パッケージのパス:{generative}\Lib\site-packages\music21
  • subConverters.pyのパス: {music21}\converter\subconverters.py

subconverters.py の最初の方に 'import subprocess' を追加し、890行目のos.system(musescoreRun)をsubprocess.run(musescoreRun)に変更する。

$ diff -C 2 subConverters_org.py subConverters.py
*** subConverters_org.py    2021-09-18 11:42:02.579792600 +0900
--- subConverters.py    2021-09-18 11:42:53.247017100 +0900
***************
*** 25,28 ****
--- 25,29 ----
  import sys
  import unittest
+ import subprocess

from music21 import common *************** *** 888,892 **** fileLikeOpen = io.StringIO() sys.stderr = fileLikeOpen ! os.system(musescoreRun) fileLikeOpen.close() sys.stderr = storedStrErr --- 889,894 ---- fileLikeOpen = io.StringIO() sys.stderr = fileLikeOpen ! #os.system(musescoreRun) ! subprocess.run(musescoreRun) fileLikeOpen.close() sys.stderr = storedStrErr

</code>

In [32]:
import os
print(os.name)
nt
In [10]:
from music21 import environment

if os.name == 'nt':       # Windows
    us = environment.UserSettings()
    us['musescoreDirectPNGPath']='C:/Program Files/MuseScore 3/bin/MuseScore3.exe'
    us['musicxmlPath']='C:/Program Files/MuseScore 3/bin/MuseScore3.exe'
In [12]:
from music21 import note
note = note.Note("C4", quarterLength=1)
note.show()
In [8]:
from music21 import converter, note, chord
In [9]:
converter.parse("tinynotation: 3/4 c4 d8 f g16 a g f#").show()

[自習] music21

music21 (a toolkit for computer-aided musicology)の 公式サイト から ユーザガイド で使い方を学ぶ。

以下で利用するxmlファイルは こちらからダウンロードした bmw 65-2.xmlである。

Chapter 1: Installing and Getting Started with music21

http://web.mit.edu/music21/doc/usersGuide/usersGuide_01_installing.html

J.S. Bach のコラールの楽譜全体を表示する.

In [1]:
from music21 import *
s = converter.parse('bwv65-2.xml')
s.analyze('key')
s.show()
In [2]:
from music21 import note

dir(note)
Out[2]:
['GeneralNote',
 'Lyric',
 'LyricException',
 'NotRest',
 'NotRestException',
 'Note',
 'NoteException',
 'Rest',
 'SpacerRest',
 'Test',
 'TestExternal',
 'Unpitched',
 '_DOC_ORDER',
 '_MOD',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 'base',
 'beam',
 'common',
 'copy',
 'duration',
 'environLocal',
 'environment',
 'exceptions21',
 'expressions',
 'interval',
 'noteheadTypeNames',
 'pitch',
 'stemDirectionNames',
 'style',
 'tie',
 'unittest',
 'volume']
In [7]:
f = note.Note("F5")
print(f.name)
print(f.octave)
print(f.pitch)
print(f.pitch.frequency)
print(f.pitch.pitchClassString)
F
5
F5
698.456462866008
5
In [8]:
f.show()
In [9]:
f.show('midi')
In [10]:
r = note.Rest()
In [11]:
r.show()
In [30]:
b_flat = note.Note("B-4")  # - はフラットを表す
b_flat.show()

Chapter 3: Pitches, Durations, and Notes again

The Pitch object

In [13]:
from music21 import pitch
p1 = pitch.Pitch('b-4')
print(p1.octave)
print(p1.pitchClass)
print(p1.name)
print(p1.accidental.alter)
print(p1.nameWithOctave)
print(p1.midi)
4
10
B-
-1.0
B-4
70

Carving time with Duration objects

note (音符)が一定の時間持続する時間を duration と呼ぶ。

In [15]:
# 2分音符の duration (長さ)
from music21 import duration

halfDuration = duration.Duration('half')
print(halfDuration)
<music21.duration.Duration 2.0>

Back to Notes

In [16]:
n1 = note.Note()
print(n1.pitch)
print(n1.duration)
C4
<music21.duration.Duration 1.0>
In [17]:
n1.pitch.nameWithOctave = 'E-5'
n1.duration.quarterLength = 3.0

Chapter 4: Lists, Streams (I) and Output

In [18]:
from music21 import note

note1 = note.Note("C4")
note2 = note.Note("F#4")

noteList = [note1, note2]
print(noteList)
[<music21.note.Note C>, <music21.note.Note F#>]
In [20]:
note3 = note.Note("B-2")

noteList.append(note3)
print(noteList)
[<music21.note.Note C>, <music21.note.Note F#>, <music21.note.Note B->, <music21.note.Note B->]

Introduction to Streams

Stream オブジェクトとそのサブクラス (Score, Part, Measure) は、 Note, Chord, Clef, TimeSignature オブジェクトと同様に基本オブジェクトである。

ストリームはpythonのリストのようなものである。

ストリームに格納されているオブジェクトは、時間的に間隔が空けられている。 ストリームの先頭から四分音符の数を表すオフセットがある。 2つの2分音符の4/4 measure (小節) では、最初の音符はoffset 0の位置にあり、 2番目の音符はoffset 2の位置にある。

ストリームの中にストリームを格納できる。2つの4/4小節のオブジェクトを格納すると、最初の小節はoffset 0の位置にあり、2番目の小節はoffset 4の位置にある。

Stream オブジェクトのサブクラスには Score (楽譜), Part (パート), Measure (拍子、小節)が含まれる。

1つの music21 オブジェクトは、複数のストリーム (の参照)を保存できる。 measures()メソッドを用いて抽出して新しいストリームを取得できるが、これは同じオブジェクトへの参照であることに注意すること(変更すると元のオブジェクトも変更される)。

Creating simple Streams

In [23]:
from music21 import stream

stream1 = stream.Stream()
stream1.append(note1)
stream1.append(note2)
stream1.append(note3)

stream1.show()
In [25]:
stream1.show('text')
{0.0} <music21.note.Note C>
{1.0} <music21.note.Note F#>
{2.0} <music21.note.Note B->
In [22]:
stream2 = stream.Stream()
n3 = note.Note('D#5')
stream2.repeatAppend(n3,4)
stream2.show()

Chapter 7: Chords

Chords (コード、和音)は、複数の Pitch (音程) オブジェクトを一つのstem (符尾、音符の棒)にまとめたものである。

In [27]:
from music21 import chord

cMinor = chord.Chord(["C4", "G4", "E-5"])  # -はフラットを表す
cMinor.duration.type = 'half'
print(cMinor.quarterLength)
2.0
In [28]:
print(cMinor.pitches)
(<music21.pitch.Pitch C4>, <music21.pitch.Pitch G4>, <music21.pitch.Pitch E-5>)
In [ ]: