楽譜をプログラムで生成したり、解析したりするためのPythonライブラリにMusic21があります。
ここではMusic21の基本的な使い方と、生成音楽の例を紹介します。
1 ランダムなピッチを出力するコード
from music21 import stream, note, pitch, meter
import random
def make_random_notes(n=10, octaves=[3, 4, 5]):
pitch_classes = list(range(12)) # 0=C, 1=C#, ..., 11=B
# すべての可能な組み合わせを生成
all_combinations = [(pc, oc) for pc in pitch_classes for oc in octaves]
# nが可能数より大きい場合はエラー
if n > len(all_combinations):
raise ValueError(f"n={n} is too large; max is {len(all_combinations)}")
# 組み合わせからランダムにn個選ぶ
selected = random.sample(all_combinations, n)
# ストリームを作成
s = stream.Stream()
s.append(meter.TimeSignature(f'{n}/1'))
for pc, oc in selected:
p = pitch.Pitch()
p.pitchClass = pc
p.octave = oc
n_note = note.Note(p)
n_note.quarterLength = 4
s.append(n_note)
return s
s = make_random_notes()
s.show()
2 Figureについて
単旋律において、FigureとはPitchとRythmのパターンです。
PitchとRythmは独立に扱うことが出来るので、それぞれを別々に生成してあとから組み合わせられます。
3 Pitch
pitchの生成は様々な方法があります。
Schoenbergは音列、Xenakisは確率計算、Cageは易経を用いてpitchを生成しました。
現代のコンピュータであれば、より複雑で便利な方法でpitchを生成できます。
大切なのは、生成のアルゴリズムが作曲家の意図を反映していることです。
時に生成の結果に自身が驚かされることがあっても、それも作曲家の内から生まれたものであるべきです。
私はpitchの生成にごく単純なフラクタルを用いています。
このやりかたの良いところは、生成の実装の記述が極めてシンプルな点です。
シンプルなアルゴリズムでありながら、複雑な結果を生み出せる点が気に入っています。