科学・技術
Xenharmlib(音楽理論ライブラリ)が純正律(Just Intonation)のサポートを追加
Xenharmlib (music theory library) adds support for Just Intonation (xenharmlib.readthedocs.io)
要約
音楽理論ライブラリのXenharmlibがバージョン0.4.0で大幅な進化を遂げ、純正律(Just Intonation)を含む多様な音律システムを数学的に表現できるようになりました。これにより、古代から現代までの様々な音楽伝統の正確な分析が可能になり、既存の分析ツールもこれらの音律システムに適用できるようになります。また、インターバル算術やシーケンス、インターバルファンといった新しい機能も追加されています。
全文翻訳
xenharmlib 0.4.0の新機能は?¶ 新機能に関しては、バージョン0.4.0は一歩ではなく、飛躍です。xenharmlibのコアはリファクタリングされ、等分割調律だけでなく、複数の生成元インターバルを持つ調律も可能になりました。これは、純正律(Just Intonation)を含む、レギュラー調律の全範囲をサポートできるようになったことを意味します。不規則調律(例:「ヴェルクマイスター調律」)を除けば、xenharmlibはついに音楽伝統の宇宙全体を数学的な形で表現できるようになりました。これにより、ビザンチン帝国、ヨーロッパのルネサンス、インド古典音楽、インドネシアのガムラン音楽、アラビアのマカーム、そして20世紀アメリカの実験音楽(例:ハリー・パーチやベン・ジョンストンの作品)の音楽の正確な分析に使用できるようになりました。包括的なアプローチに沿って、xenharmlibは、数学的に互換性がある限り、既存の分析ツールをすべてのレギュラー調律に使用できるようにします。例えば、プライムフォームやノーマルフォームの計算も、(多次元の)レギュラー調律に対して実行できます。さらに、ドキュメントは完全に刷新されました。機能例は調律と記譜法別に整理され、すべてのハーモニックプリミティブに対して包括的で専用のドキュメントが提供されています。上記の(およびその他の)機能の概要を以下に示します。(完全な変更履歴はこちらをご覧ください)
純正律 / プライムリミット調律¶
純正律とは、「純粋なインターバル」に基づいた調律を指します。純粋なインターバルは、2つの整数の分数で特徴付けられます。例:
歴史的に、ほとんどの調律システムは純正律に基づいていました。18世紀から19世紀にかけて、等分割調律システムが実用的に広く受け入れられるようになったのは、ごく最近のことです。xenharmlibは現在、プライムリミット調律(Prime Limit Tuning)という構成で純正律のサポートを導入しています。
from xenharmlib import PrimeLimitTuning
limit11 = PrimeLimitTuning(11)
例えば、ピタゴラス音階の12音クロマチック音階は、ルートピッチから5つの上昇純五度と6つの下降純五度を積み重ねることで生成できます。
from xenharmlib import PrimeLimitTuning
from xenharmlib import periodic
pythagorean = PrimeLimitTuning(3)
C0 = pythagorean.rs_pitch('1/1')
P5 = pythagorean.rs_interval('3/2')
iseq_a = pythagorean.interval_seq([P5] * 5)
iseq_b = pythagorean.interval_seq([-P5] * 6)
chromatic_scale = ( C0.scale(iseq_a) | C0.scale(iseq_b) ).pcs_normalized()
print(chromatic_scale)
# PrimeLimitPitchScale([1, 256/243, 9/8, 32/27, 81/64, 4/3, 1024/729, 3/2, 128/81, 27/16, 16/9, 243/128], 3-Limit)
ほとんどのソフトウェアプログラムは、純正律の関数を完全な算術システムとしてではなく、スカラー移調のシステムとして実装しています。例えば、五度による移調の場合、クロマチック音階の定義(上記で言及されたもの)が通常基盤として使用され、移調は7つの音階度数のシフトとして理解されます。
for i in range(0, 12):
pitch = chromatic_scale[i]
result = periodic.scalar_transpose(chromatic_scale, pitch, 7)
interval = pitch.interval(result)
print(f'{pitch.short_repr} --> {result.short_repr} ({interval.short_repr})')
# 1 --> 3/2 (3/2)
# 256/243 --> 128/81 (3/2)
# 9/8 --> 27/16 (3/2)
# 32/27 --> 16/9 (3/2)
# 81/64 --> 243/128 (3/2)
# 4/3 --> 2 (3/2)
# 1024/729 --> 512/243 (3/2)
# 3/2 --> 9/4 (3/2)
# 128/81 --> 64/27 (3/2)
# 27/16 --> 81/32 (3/2)
# 16/9 --> 8/3 (3/2)
# 243/128 --> 2048/729 (262144/177147)
最後の音程の出力(
)でわかるように、ピタゴラスクロマチック音階での音階度数による移調は、必ずしも問題のインターバルの実際の移調結果にはなりません。これは、1オクターブあたりの音の数が限られている鍵盤楽器(ピアノやチェンバロなど)を調律する際の一般的な問題です。数学的に言えば、この五度による移調の定義は不規則です。五度のサイズは、開始点としてどの音を選ぶかによって変化します。鍵盤楽器とは異なり、フレットのない弦楽器や人間の声は、音の選択肢が限られているという問題はありません。したがって、xenharmlibはデフォルトの移調をスカラー移調ではなく、レギュラー移調として実装しており、その結果、上記の音階の最後の音を移調した結果のピッチクラスは、もはやスケール自体では表現されないものになります。
for i in range(0, 12):
pitch = chromatic_scale[i]
result = pitch.transpose(P5)
interval = pitch.interval(result)
try:
scale_degree = periodic.index(chromatic_scale, result)
except ValueError:
scale_degree = 'not in scale'
print(f'{pitch.short_repr} --> {result.short_repr} ', end='')
print(f'({interval.short_repr}) - degree: {scale_degree}')
# 1 --> 3/2 (3/2) - degree: 7
# 256/243 --> 128/81 (3/2) - degree: 8
# 9/8 --> 27/16 (3/2) - degree: 9
# 32/27 --> 16/9 (3/2) - degree: 10
# 81/64 --> 243/128 (3/2) - degree: 11
# 4/3 --> 2 (3/2) - degree: 12
# 1024/729 --> 512/243 (3/2) - degree: 13
# 3/2 --> 9/4 (3/2) - degree: 14
# 128/81 --> 64/27 (3/2) - degree: 15
# 27/16 --> 81/32 (3/2) - degree: 16
# 16/9 --> 8/3 (3/2) - degree: 17
# 243/128 --> 729/256 (3/2) - degree: not in scale
この定義は、数学的に(単一で一貫した五度の定義を持つため)より健全であるだけでなく、利用可能な調律空間を最大限に活用する、単なるクロマチックな音の選択ではない作曲を扱うことも可能にします。
カスタムレギュラー調律¶
カスタムレギュラー調律は、新しく導入されたマルチジェネレーターチューニング(Multi-Generator Tunings)を使用して設計できるようになりました。例えば、シンタクトニックコンマの4分の1だけ三度を平坦化するクォーターコンマ・メルトーン調律(Quarter-Comma-Meantone Temperament)は、次のように構築できます。
from fractions import Fraction
from xenharmlib import MultiGenTuning
from xenharmlib import FrequencyRatio
g3 = FrequencyRatio(3) * FrequencyRatio(80, 81) ** Fraction(1, 4)
qcm = MultiGenTuning( (FrequencyRatio(2), g3), eq_diff_vec=(1, 0) )
完全なインターバル算術¶
多くの理論的応用にとって不可欠な機能 — xenharmlibから長らく欠けていた — が、バージョン0.4.0で導入されました。それはインターバル算術です。
from xenharmlib import WesternNotation
western = WesternNotation()
m3 = western.shorthand_interval('m', 3)
M3 = western.shorthand_interval('M', 3)
print(m3 + M3)
print(M3 - m3)
print(3 * M3)
# WesternNoteInterval(P, 5)
# WesternNoteInterval(A, 1)
# WesternNoteInterval(A, 7)
インターバルに関する専用ページを参照してください。
追加のハーモニックプリミティブ¶
バージョン0.4.0には、分析ツールボックスに2つの新しいハーモニックプリミティブが付属しています。
シーケンス(Sequences)は、「音の連続」を概念化することを可能にします。例えば、セグメント分析においてです。シーケンスには、逆行(retrograde)や転回(inversion)のような典型的な変換メソッドが付属しています。
from xenharmlib import WesternNotation
western = WesternNotation()
# "marry had a little lamb"の冒頭のメロディの流れ
seq = western.seq(western.note(pcs, 4) for pcs in 'EDCDEEE')
print(seq)
print(seq.retrograde())
print(seq.inversion())
# WesternNoteSeq([E4, D4, C4, D4, E4, E4, E4])
# WesternNoteSeq([E4, E4, E4, D4, C4, D4, E4])
# WesternNoteSeq([E4, F#4, G#4, F#4, E4, E4, E4])
インターバルファン(Interval Fans)では、シーケンスやスケールの要素と調中心との相対的な距離を記述する新しいタイプの抽象スケールオブジェクトが導入されています。
from xenharmlib import WesternNotation
western = WesternNotation()
# "marry had a little lamb"の冒頭のメロディの流れ
seq = western.seq(western.note(pcs, 4) for pcs in 'EDCDEEE')
# C4のトニックに対する相対距離を計算
tonic = western.note('C', 4)
ifan = seq.to_interval_fan(tonic)
print(ifan)
# WesternNoteIntervalFan([M3, M2, P1, M2, M3, M3, M3])
インターバルクラスベクトル¶
スケール分析、特にポストトナル分析の不可欠なツールとして、xenharmlibは現在インターバルクラスベクトルの計算をサポートしています。
from xenharmlib import EDOTuning
from xenharmlib.setc import ic_vector
edo31 = EDOTuning(31)
scale = edo31.index_scale([0, 5, 11, 15, 17, 21