Max パッチャー ファイル ( .maxpat
、 .maxhelp
、 .rbnopat
) のオフライン生成を容易にすることを目的とした、依存関係のない純粋な Python3 ライブラリ。
Max/MSP 用の Python3 外部を探している場合は、py-js プロジェクトをチェックしてください。
.maxpat
JSON ベースのファイル形式で保存された Max/MSP オブジェクトに 1 対 1 で対応する、Python オブジェクトを使用した Max パッチャー ファイルのスクリプト化されたオフライン生成。
任意のレベルのネストを持つ (JSON) .maxpat
ファイルと、対応するPatcher
、 Box
、およびPatchline
Python オブジェクト間のラウンドトリップ変換。
潜在的に任意の Max オブジェクトまたは maxclass を処理できます。
多数の単体テスト、最大 99% のカバー率。
構成、構造(オブジェクトのグラフとして)、オブジェクトのプロパティおよびレイアウト(グラフ描画アルゴリズムを使用)に関するMaxパッチの分析およびオフラインでのスクリプトによる変更。
Max オブジェクトの正確なレイアウトと構成が可能になります。
Patcher
オブジェクトにはadd_textbox
などの汎用メソッドがあり、 add_coll
などの特殊なメソッドを持つこともできます。例として、このメソッドには、 coll
オブジェクトの事前設定を容易にするためのdictionary
引数があります ( py2max/tests/test_coll.py
を参照)。
Max Objects のデフォルト設定を呼び出すmaxclassdb
機能を提供します。
スクリプト化されたパッチャー ファイルの作成。
既存の .maxpat ファイルのバッチ変更。
豊富な Python 標準ライブラリとエコシステムを使用して、オフライン ソースからの構成を使用してパラメータ化可能なオブジェクトを作成できます。たとえば、ランダムなウェーブテーブル ファイルから構成された独自のウェーブテーブル オシレーターです。
外部開発中のテスト ケースと.maxhelp
ファイルの生成
多くのパラメータを使用してオブジェクトを作成する手間を省きます。
coll
、 dict
、 table
オブジェクトなどのコンテナ オブジェクトにデータを事前入力します。
わずかに異なる引数を持つ多数のオブジェクトを作成する時間を節約するのに役立ちます
生成されたパッチにグラフ描画/レイアウト アルゴリズムを使用します。
生成パッチの生成(-;
等..
p = Patcher ( 'my-patch.maxpat' )
osc1 = p . add_textbox ( 'cycle~ 440' )
gain = p . add_textbox ( 'gain~' )
dac = p . add_textbox ( 'ezdac~' )
osc1_gain = p . add_line ( osc1 , gain ) # osc1 outlet 0 -> gain inlet 0
gain_dac0 = p . add_line ( gain , dac , outlet = 0 , inlet = 0 )
gain_dac1 = p . add_line ( gain , dac , outlet = 0 , inlet = 1 )
p . save ()
デフォルトでは、オブジェクト (パッチラインを含む) が返され、パッチラインのアウトレットとインレットは 0 に設定されます。返されたオブジェクトはリンクに役立ちますが、返されたパッチラインは役に立ちません。したがって、上記は次のようにより簡潔に書くことができます。
p = Patcher ( 'my-patch.maxpat' )
osc1 = p . add_textbox ( 'cycle~ 440' )
gain = p . add_textbox ( 'gain~' )
dac = p . add_textbox ( 'ezdac~' )
p . add_line ( osc1 , gain )
p . add_line ( gain , dac )
p . add_line ( gain , dac , inlet = 1 )
p . save ()
組み込みエイリアス ( .add_*
タイプのメソッドの場合は.add
、 .add_line
の場合は.link
) を使用すると、上記の例は次のようにさらに短縮された形式 (および垂直レイアウト) で記述することができます。
p = Patcher ( 'out_vertical.maxpat' , layout = 'vertical' )
osc = p . add ( 'cycle~ 440' )
gain = p . add ( 'gain~' )
dac = p . add ( 'ezdac~' )
p . link ( osc , gain )
p . link ( gain , dac )
p . link ( gain , dac , 1 )
p . save ()
さらに、既存の.maxpat
ファイルを解析し、変更して、変更を保存することができます。
p = Patcher . from_file ( 'example1.maxpat' )
# ... make some change
p . save_as ( 'example1_mod.maxpat' )
サブパッチャーを使用した別の例:
p = Patcher ( 'out.maxpat' )
sbox = p . add_subpatcher ( 'p mysub' )
sp = sbox . subpatcher
in1 = sp . add ( 'inlet' )
gain = sp . add ( 'gain~' )
out1 = sp . add ( 'outlet' )
osc = p . add ( 'cycle~ 440' )
dac = p . add ( 'ezdac~' )
sp . link ( in1 , gain )
sp . link ( gain , out1 )
p . link ( osc , sbox )
p . link ( sbox , dac )
p . save ()
Python クラスは基本的に .maxpat ファイル内の JSON 構造の単純なラッパーであり、ほとんどすべての Max/MSP および Jitter オブジェクトは.add_textbox
または汎用の.add
メソッドを使用してパッチャー ファイルに追加できることに注意してください。数値、数値パラメーター、サブパッチャー、およびコンテナー タイプのオブジェクト用の.add_<type>
形式の特殊なメソッドもあります (詳細については、以下の設計ノートを参照してください)。
最も簡単な方法:
git https://github.com/shakfu/py2max.git
cd py2max
pip install . # optional
py2max を使用するためにインストールする必要はないので、 pip install .
必要に応じて一部を削除し、クローンされたディレクトリにcd
移動して使用を開始します。
$ cd py2max
$ ipython
In [1]: from py2max import Patcher
In [2]: p = Patcher.from_file( " tests/data/simple.maxpat " )
In [3]: p._boxes
Out[3]: [Box(id= ' obj-2 ' , maxclass= ' ezdac~ ' ), Box(id= ' obj-1 ' , maxclass= ' newobj ' )]
py2max
は広範なテスト スイートがあり、テストはpy2max/tests
フォルダーにあります。
すべてのテストは次のように実行できます。
pytest
これにより、すべてのテストの結果がoutputs
フォルダーに出力されます。
テストに必要なパッケージをインポートできない場合、一部のテストがスキップされる場合があることに注意してください。
どのテストがスキップされたかは、次の方法で確認できます。
pytest -v
テストカバレッジを確認するには:
./scripts/coverage.sh
これは基本的に次のことを行います
mkdir -p outputs
pytest --cov-report html:outputs/_covhtml --cov=py2max tests
個別のテストを実行するには:
python3 -m pytest tests.test_basic
py2max
主にjson
生成と操作を処理するため、 json
すでに stdlib に組み込まれているため、ほとんどのテストには依存関係がないことに注意してください。
ただし、直交グラフ レイアウト アルゴリズムのアプリケーションを調べるための多数のテストが行われ、このために、よく知られたものから難解なものまで、さまざまなパッケージが使用されています。
上で述べたように、必要なパッケージがインストールされていない場合、pytest はテストをスキップするため、これらは完全にオプションのテストです。
どうしてもウサギの穴に飛び込み、すべてのテストを実行したい場合は、次のパッケージ (およびその依存関係) が必要になります。
pip install networkx
pip install matplotlib
brew install graphviz
経由で実行できます) -- その後、 pip install pygraphviz
実行できます。API ドキュメントはまだ利用できません
現在のデフォルトのレイアウト アルゴリズムは非常に初歩的ですが、いくつかの有望な方向性があり、このコンテキストでさまざまなレイアウト アルゴリズムがどの程度うまく機能するかを視覚的に比較することもできます。
生成では py2max オブジェクトは消費されませんが、残念なことに、Max が開いているときにファイルから更新されないため、オブジェクト ツリーへの変更を確認するには、Max を閉じたり再度開いたりする必要があります。
独自のメソッドを持ついくつかのオブジェクトについては、現在の実装では、 _tilde
サフィックスを付けた別のメソッドを提供することで、チルダ オブジェクトと非チルダ オブジェクトを区別しています。
gen = p . add_gen ()
gen_tilde = p . add_gen_tilde ()
.maxpat
JSON 形式は実際には非常に最小限で階層的です。これには、親Patcher
と子Box
エントリ、およびPatchlines
あります。特定のボックスには、ネストされたサブパッチャーやgen~
パッチなどを表す他のpatcher
インスタンスが含まれています。
上記の構造は、 Patcher
、 Box
、およびPatchline
の 3 つのクラスで構成される Python 実装に直接マップされます。これらのクラスは、それぞれの**kwds
および内部__dict__
構造を介して拡張可能です。実際、これは.from_file
パッチャー クラスメソッドの実装方法です。
これは、数百の Max、MSP、および Jitter オブジェクト間のすべての違いを処理する最も保守しやすく柔軟な方法であることがわかります。
追加の構成を必要とするオブジェクトの特定のクラスの作成を特殊化し、容易にするために実装されたパッチャー メソッドのリストは増加しています。
.add_attr
.add_beap
.add_bpatcher
.add_codebox
.add_coll
.add_comment
.add_dict
.add_floatbox
.add_floatparam
.add_gen
.add_intbox
.add_intparam
.add_itable
.add_message
.add_rnbo
.add_subpatcher
.add_table
.add_textbox
.add_umenu
これは短いリストですが、 add_textbox
メソッドだけでほぼすべてのケースに対応できます。他のものは、実際には利便性と入力の手間を省くためだけに存在します。
一般に、これらのadd_<type>
メソッドを介してpy2max
の使用を開始することをお勧めします。これは、必要なパラメータのほとんどがメソッドに組み込まれており、IDE 補完サポートを取得できるためです。パラメータに慣れたら、一般的な省略形add
使用します。これは入力の手間が少なくなりますが、その代わりに IDE パラメータ補完サポートが失われます。
プロジェクトには、役立つと思われるスクリプトがいくつかあります。
convert.py
: 開発中に読みやすくするためにmaxpat
yaml
に変換しますcompare.py
: deepdiff を使用して比較しますcoverage.sh
: pytest カバレッジを実行し、HTML カバレッジ レポートを生成します。py2max をホイールとしてビルドする場合は、次のようにすることに注意してください。
pip install build
cd py2max
python3 -m build .
ホイールはdist
ディレクトリにあるはずです。
このプロジェクトには、pydantic2 プロジェクトに基づいた実験的なブランチがあります。
このバリアントには次の利点があります。
In [ 1 ]: from py2max import Patcher
In [ 2 ]: p = Patcher ( path = 'outputs/demo.maxpat' )
In [ 3 ]: msg = p . add_message ( 'set' )
In [ 4 ]: p . boxes
Out [ 4 ]: [ Box ( id = 'obj-1' , text = 'set' , maxclass = 'message' , numinlets = 2 , numoutlets = 1 , outlettype = [ '' ], patching_rect = Rect ( x = 48.0 , y = 48.0 , w = 66.0 , h = 22.0 ), patcher = None )]
このバリアントのもう 1 つの有望な方向性は、独自の一意のmaxclass
を持つオブジェクト用の特殊なクラスを作成することです。したがって、この場合、上記は次のようになります。
In [ 4 ]: p . boxes
Out [ 4 ]: [ Message ( id = 'obj-1' , text = 'set' , maxclass = 'message' , numinlets = 2 , numoutlets = 1 , outlettype = [ '' ], patching_rect = Rect ( x = 48.0 , y = 48.0 , w = 66.0 , h = 22.0 ), patcher = None )]
プロパティベースの属性アクセスと改良された API を提供するための初期の取り組みがありました。これはpydantic2
ブランチに取って代わられ、これ以上開発されることはありません。
すべての権利はそれぞれの原著者に留保されます。
スティーブ・キーファー、ティム・ドワイヤー、キム・マリオット、マイケル・ウィブロー。 HOLA: 人間のような直交ネットワーク レイアウト。 「Visualization and Computer Graphics」、IEEE Transactions on、第 22 巻、第 1 号、349 ~ 358 ページ。IEEE、2016 年。DOI
Aric A. Hagberg、Daniel A. Schult、Pieter J. Swart、「NetworkX を使用したネットワーク構造、ダイナミクス、機能の探索」、第 7 回 Python in Science Conference (SciPy2008) 議事録、Gäel Varoquaux、Travis Vaught、Jarrod Millman (編集)、(米国カリフォルニア州パサデナ)、11–15 ページ、2008 年 8 月
有向グラフを描くテクニック Emden R. Gansner、Eleftherios Koutsofios、Stephen C. North、Kiem-phong Vo • ソフトウェア エンジニアリングに関する IEEE トランザクション • 1993 年発行
Gansner、ER、Koren、Y.、North、S. (2005)。ストレスメジャー化によるグラフ描画。掲載: Pach, J. (編) グラフ描画。 GD 2004。コンピュータ サイエンスの講義ノート、第 3383 巻。シュプリンガー、ベルリン、ハイデルベルク。 https://doi.org/10.1007/978-3-540-31843-9_25
オープン グラフ視覚化システムとそのソフトウェア エンジニアリングへの応用 Emden R. Gansner、Stephen C. North • ソフトウェア - 実践と経験 • 2000 年出版