世界を動かす技術を、日本語で。

Xenharmlib: 非西洋和声体系をサポートする音楽理論ライブラリ

概要

xenharmlib は、従来の12平均律以外の音楽理論を扱うPythonライブラリ。 西洋音楽 からマイクロトーナル、マクロトーナルまで幅広い調律や記譜法に対応。 作曲家・研究者 向けで、スコア作成ツールやシーケンサーではない。 関数型設計 を重視し、オブジェクトは不変、メソッドは新しいオブジェクトを返す。 拡張性・直感的操作 が特徴で、科学的な調性探究に最適。

xenharmonic(ゼンハーモニック)とは

  • 12平均律 によらない、独自の響きを持つ音楽の形容詞
  • Ivor Darreg による定義
  • 西洋音楽以外 やマイクロトーナル音楽への応用
  • 新しい音楽表現 の追求

xenharmlibの概要

  • 従来の西洋音楽理論 から非西洋ハーモニー、マイクロ・マクロトーナル調律に対応
  • ダイアトニックポストトーナルセット理論、非標準記譜法もサポート
  • 直感的で拡張性の高い API設計
  • Python で簡単に利用・拡張可能

主な機能例

  • Equal division tunings (例:Western、Modern Arabic、Turkish Makam、Bohlen-Pierce、Gamma Scale)
  • 西洋記譜法 (インターバル命名含む)
  • Up/Down Notation (西洋記譜法の上位互換)
  • インターバルやスケールの解析、相互関係の分析
  • 群論的解析 (整数ピッチ、ピッチクラス等)
  • インターバル列パターンマッチング
  • 任意転調のモジュレーション提案
  • 基本的なポストトーナル分析 (normal/prime form, 反転等)

サンプルコード

  • スケール間の転調トライアド探索

    from xenharmlib import WesternNotation
    from xenharmlib.periodic import mod_connectors
    n = WesternNotation()
    d_minor = n.pc_scale(['D', 'E', 'F', 'G', 'A', 'Bb', 'C'])
    g_major = n.pc_scale(['G', 'A', 'B', 'C', 'D', 'E', 'F#'])
    for c in mod_connectors(d_minor, g_major, (0, 2, 4)):
        print(c)
    
    • I-III-Vトライアド による dマイナーとgメジャー 間のモジュレーション
    • WesternNoteScale で結果表示
  • 31音平均律でのコード生成・再生

    from xenharmlib import EDOTuning, play, UpDownNotation
    edo31 = EDOTuning(31)
    n_edo31 = UpDownNotation(edo31)
    d_down = n_edo31.note('vD', 4)
    SM3 = n_edo31.shorthand_interval('^M', 3)
    P5 = n_edo31.shorthand_interval('P', 5)
    m7 = n_edo31.shorthand_interval('m', 7)
    chord = n_edo31.scale([
        d_down,
        d_down.transpose(SM3),
        d_down.transpose(P5),
        d_down.transpose(m7),
    ])
    print(chord)
    play(chord, duration=1, play_as_chord=True)
    
    • 31-EDOsupermajor7コード 作成・再生
    • UpDownNoteScale で表記
  • Bohlen-Pierce調律の群論的分析

    from xenharmlib import EDTuning, FrequencyRatio
    bp = EDTuning(13, FrequencyRatio(3))
    p1 = bp.pitch(4)
    p2 = bp.pitch(18)
    i1 = bp.interval(p1, p2)
    print(p1.pc_index)
    print(p2.pc_index)
    print(i1.frequency_ratio)
    dist = i1.get_generator_distance(bp.pitch(7))
    print(dist)
    
    • Bohlen-Pierce 調律のピッチ、インターバル、発生器距離の算出

対象ユーザー・設計思想

  • Pythonの基礎知識 を持つ作曲家・研究者が対象
  • スコア作成ツールやシーケンサー は目指さない
  • 科学的なハーモニー探究 のためのツールセット提供
  • オブジェクト指向 だが、 関数型設計 重視
    • オブジェクトは不変
    • メソッドは新しいオブジェクトを返す

主なサポート機能

  • 多様な平均分割調律 (西洋・中東・現代等)
  • 拡張記譜法 (Up/Down Notation等)
  • インターバル・スケール・群論的解析
  • モジュレーション・パターンマッチング
  • ポストトーナル理論 の基本分析

今後の開発予定(ロードマップ)

  • 西洋音楽テンプレート
  • スコアレンダリング用プラグインインターフェース
  • 高度なポストトーナル分析 (インターバルベクター、z-Relation等)
  • Rothenberg propriety・インターバル行列
  • MOSスケール生成
  • 純正律・素数制限調律
  • 拡張Helmholtz-Ellis JI記譜法
  • Odd Limit調律
  • Arel-Ezgi-Uzdilek記譜法

ライセンス・サポート

  • GNU Public License v3 で公開
  • Gitlab.com でソース管理
  • Xenharmonic Alliance Discord で開発者と交流可能
  • バグ報告・機能要望 はGitlab Issueページへ

コントリビューションガイド

  • Pull Request歓迎
    • conventional commits によるコミットメッセージ
    • black によるコードフォーマット(string normalization無効、最大行長79)
    • シングルクオート :データ、 ダブルクオート :人間向け情報、 トリプルダブルクオート :ドックストリング
    • pytest でテスト必須(分岐網羅)
    • 型アノテーション 推奨(例外あり)
    • 関数型設計 遵守(初期化以外で内部状態を変えない)

ドキュメント・ユーザーガイド内容

  • クイックスタート
  • インストール方法
  • 調律・ピッチ・インターバル・スケール
  • 記譜法・ノート・ノートインターバル
  • 再生・エクスポート機能
  • 高度なスケール操作・正規化・反転・セット演算
  • パターンマッチング・モジュレーション
  • APIドキュメント (コアAPI・エクスポートAPI・記譜法API・periodicパッケージ等)
  • 変更履歴・インデックス・検索ページ

まとめ

  • xenharmlib は、 非標準ハーモニーマイクロトーナル音楽 の探究に最適なPythonライブラリ
  • 関数型設計拡張性 で、先進的な音楽理論の研究・作曲に役立つ
  • 幅広い記譜法・調律理論 をカバーし、今後も機能拡張予定

Hackerたちの意見

面白いね!実は僕も似たようなプロジェクトに取り組んでるんだ。僕のこの取り組みの名前は「music-i18n」で、世界の言語や地域をサポートするためのソフトウェアレイヤーを追加するのと同じようなものだと思ってる。特に以下のことについて君の計画や考えを聞いてみたいな:

  • 非ET調律のサポート
  • テトラコードや他のスケールの構成要素(アラビアのアジナスみたいな)
  • MusicXMLのインポート/エクスポート
  • MIDIへのエクスポート ありがとう!

こんにちは!順番に答えてみるね:

  1. ジャストインターボーションと非線形テンペラメントはロードマップに入ってるけど、音の間隔が不均一な場合の転調に関する定義を一貫させる方法をまだ考えなきゃいけないんだ。多次元調律を使うと、例えば5制限調律の3次元では、2つの音から得られる間隔を他の音に適用できるんだけど、1次元に減らすと、すべての音に適用できない間隔を形成する2つの音ができちゃうんだ。
  2. テトラコードはすでにサポートされていて、スケールオブジェクトを使って簡単に定義できるよ。まだ四分音符の記譜はないけど、Up/Down Notationで満足できるなら、EDOTuning(24)をベースにアラビアのアジナスを分析できるよ。今のところピッチ/ノートシーケンスオブジェクトはないから、マカームでの下行スケールの動きは正しく定義できないけど、ハーモニックな特性だけに興味があるなら、スケールで十分だと思う。
  3. MusicXMLは残念ながら非12-EDO調律のサポートがあまり良くないんだ。四分音符のアクセントを定義するために浮動小数点数(例えば0.5)を使うことはできるけど、24-EDO以外のことをしようとするとどんどん難しくなる。トルコのマカームのアクセントをサポートしているMEIフォーマットも調べたけど、任意のEDOに対する一般的な意味の定義は、当面は難しそうだね。ただ、24-EDOや53-EDOのいくつかの調律をサポートすることは考えられるかも。
  4. MIDIも少し難しい。個々のノートのベンドを許可するMPE仕様があるけど、今のところPythonライブラリではサポートされてないみたい。チャンネルピッチベンドを使って何かをハックすることはできるけど、同時に16ノートまでしか再生できない制限があるよ。まだ貢献者を探してるから、これらのことに興味があれば気軽に連絡してね ;)

ちょっと脱線するけど、最近xenharmonicに関連したライブラリも作ったよ。視覚的なハーモニースペースに焦点を当ててるんだ: https://github.com/bntre/cs-rationals/blob/master/RationalsE... デモ作品はこちら: https://www.youtube.com/watch?v=y_x4vtS_I7w

おお、いいね :) これめっちゃクールだね。xenharmlibの次のバージョンでは、可視化プラグイン用のフックを追加する予定だから、構造をJupyterLabでレンダリングできるようにするつもりだよ。もしかしたら、君も貢献したいと思うかもしれないけど、JIのサポートにはちょっと時間がかかるかも。

実際の質問なんだけど、作曲にxenharmlibを使ってる?これが君のアルバムだと思うけど: https://fabianvallon.bandcamp.com/album/a-different-path-for... その中でxenharmlibは使われたの?それとも他のソフト?

うん、使ってるよ。実際の楽譜作成にはAbletonを使ったけど、xenharmlibはマイクロトーナルスケールを定義するためのSCLファイルをエクスポートできるから、それをAbletonにインポートできるんだ(他のDAWやVSTもこのフォーマットをサポートしてるよ)。でも、ほとんどの場合、音楽の理論的な側面を考えるためにxenharmlibを使ってる。数年前に「31等分音律」に興味を持ったんだけど、その心理音響的な可能性に惹かれたんだ。ただ、31-EDOでの和音やモード、記譜について考えると頭が痛くなったから、質問に答えるためにライブラリを作ったんだ。

基本的な音楽理論を学ぶための良いリソースはある?A、B、Cなどの文字が何を意味するのか、そしてそれらが実際の音楽を作るためにどう組み合わさるのかを学びたいんだけど。

参考にしてたのはこれだよ: https://musictheory.pugetsound.edu/mt21c/MusicTheory.html

C++に似たものってあるのかな?これめっちゃ便利なんだけど、VSTとかって大体C++で作られてるよね。例えば、JUCEフレームワークを使ってエミュレーターを作るのもC++だし、そう考えるとこういうツールには実用的な言語だと思うな(記事の最後にデジタル楽器やDSPで使えるって書いてあったし、完全に同意!)

xenharmlibはPythonで書かれてるから、リアルタイムオーディオには向いてないよね。インタープリタ言語の遅延があるから。誰かがやる気になれば、ライブラリをCかRustに移植するのは割と簡単だと思う。例外を除けば、コーディングスタイルは機能的でステートレスだし。AFAIK、RustにはVSTインターフェースを提供するライブラリもあるよ。

すごい!でも、名前をXenharmoniclibに変えた方がいいと思う。harmlibって聞くと…なんか有害な感じがするんだよね。

Xenハイパーバイザーを利用するライブラリにはぴったりの名前だね。

これには社会主義、共産主義、バナナ共和国の独裁的な調和システムも含まれてるの?