Music21と生成的な作曲手法

楽譜をプログラムで生成したり、解析したりするための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の生成にごく単純なフラクタルを用いています。
このやりかたの良いところは、生成の実装の記述が極めてシンプルな点です。
シンプルなアルゴリズムでありながら、複雑な結果を生み出せる点が気に入っています。

3.1 フラクタル

4 Rythm