Pustaka python3 murni tanpa ketergantungan yang dimaksudkan untuk memfasilitasi pembuatan file Max patcher secara offline ( .maxpat
, .maxhelp
, .rbnopat
).
Jika Anda mencari eksternal python3 untuk Max/MSP, lihat proyek py-js.
Pembuatan file Max patcher secara offline dengan skrip menggunakan objek Python, yang sesuai, secara satu-ke-satu, dengan objek Max/MSP yang disimpan dalam format file berbasis .maxpat
JSON.
Konversi bolak-balik antara file (JSON) .maxpat
dengan tingkat bersarang sewenang-wenang dan objek Patcher
, Box
, dan Patchline
Python yang sesuai.
Berpotensi dapat menangani objek Max atau kelas max apa pun.
Banyak pengujian unit, cakupan ~99%.
Analisis dan modifikasi skrip offline dari patch Max dalam hal komposisi, struktur (sebagai grafik objek), properti objek, dan tata letak (menggunakan algoritma menggambar grafik).
Memungkinkan tata letak dan konfigurasi objek Max yang tepat.
Objek Patcher
memiliki metode umum seperti add_textbox
dan juga dapat memiliki metode khusus seperti add_coll
. Sebagai contoh, metode ini memiliki argumen dictionary
untuk memudahkan pengisian objek coll
(lihat py2max/tests/test_coll.py
).
Menyediakan fitur maxclassdb
yang mengingat konfigurasi default Max Objects.
Pembuatan file patcher dengan skrip.
Modifikasi batch file .maxpat yang ada.
Gunakan perpustakaan dan ekosistem standar python yang kaya untuk membantu membuat objek yang dapat diparametrikan dengan konfigurasi dari sumber offline. Misalnya, osilator wavetable unik yang dikonfigurasi dari file wavetable acak.
Pembuatan kasus uji dan file .maxhelp
selama pengembangan eksternal
Menghilangkan kesulitan dalam membuat objek dengan banyak parameter
Isi terlebih dahulu objek kontainer seperti objek coll
, dict
dan table
dengan data
Membantu menghemat waktu membuat banyak objek dengan argumen yang sedikit berbeda
Gunakan algoritma gambar grafik/tata letak pada patch yang dihasilkan.
Pembuatan patch generatif (-;
dll..
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 ()
Secara default, objek dikembalikan (termasuk patchline), dan outlet serta inlet patchline diatur ke 0. Meskipun objek yang dikembalikan berguna untuk menghubungkan, patchline yang dikembalikan tidak. Oleh karena itu, pernyataan di atas dapat ditulis lebih ringkas sebagai:
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 ()
Dengan alias bawaan ( .add
untuk metode tipe .add_*
dan .link
untuk .add_line
), contoh di atas dapat ditulis dalam bentuk yang lebih disingkat (dan dengan tata letak vertikal) sebagai:
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 ()
Selain itu, Anda dapat mengurai file .maxpat
yang ada, mengubahnya, lalu menyimpan perubahannya:
p = Patcher . from_file ( 'example1.maxpat' )
# ... make some change
p . save_as ( 'example1_mod.maxpat' )
Contoh lain dengan subpatcher:
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 ()
Perhatikan bahwa kelas Python pada dasarnya hanyalah pembungkus sederhana di sekitar struktur JSON dalam file .maxpat, dan hampir semua objek Max/MSP dan Jitter dapat ditambahkan ke file patcher dengan metode .add_textbox
atau .add
generik. Ada juga metode khusus dalam bentuk .add_<type>
untuk angka, parameter numerik, subpatcher, dan objek tipe container (lihat catatan desain di bawah untuk detail lebih lanjut).
Cara paling sederhana:
git https://github.com/shakfu/py2max.git
cd py2max
pip install . # optional
Perhatikan bahwa py2max tidak perlu diinstal untuk dapat digunakan, jadi Anda dapat melewati pip install .
bagian jika Anda mau dan cukup cd
ke direktori kloning dan mulai menggunakannya:
$ 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
memiliki rangkaian pengujian yang luas dengan pengujian ada di folder py2max/tests
.
Seseorang dapat menjalankan semua tes sebagai berikut:
pytest
Ini akan menampilkan hasil semua tes ke dalam folder outputs
.
Perhatikan bahwa beberapa pengujian mungkin dilewati jika paket yang diperlukan untuk pengujian tidak dapat diimpor.
Anda dapat memeriksa tes mana yang dilewati dengan cara berikut:
pytest -v
Untuk memeriksa cakupan tes:
./scripts/coverage.sh
yang pada dasarnya melakukan hal berikut
mkdir -p outputs
pytest --cov-report html:outputs/_covhtml --cov=py2max tests
Untuk menjalankan tes individual:
python3 -m pytest tests.test_basic
Perhatikan bahwa karena py2max
terutama berkaitan dengan pembuatan dan manipulasi json
, sebagian besar pengujian tidak memiliki ketergantungan karena json
sudah terpasang di stdlib.
Namun, banyak pengujian yang mengeksplorasi penerapan algoritma tata letak grafik ortogonal dan untuk ini, sejumlah paket telah digunakan, mulai dari yang terkenal hingga yang esoteris.
Seperti disebutkan di atas, pytest akan melewatkan pengujian jika paket yang diperlukan tidak diinstal, jadi ini sepenuhnya merupakan pengujian opsional.
Jika Anda bersikeras untuk terjun ke lubang kelinci, dan ingin menjalankan semua pengujian, Anda memerlukan paket berikut (dan dependensinya):
pip install networkx
pip install matplotlib
brew install graphviz
) -- lalu Anda dapat pip install pygraphviz
Dokumen API masih belum tersedia
Algoritme tata letak default saat ini masih sangat sederhana, namun ada beberapa arah yang menjanjikan dan Anda juga dapat melihat perbandingan visual tentang seberapa baik kinerja algoritme tata letak yang berbeda dalam konteks ini.
Meskipun pembuatan tidak menggunakan objek py2max, sayangnya Max tidak menyegarkan dari file saat dibuka, jadi Anda harus terus menutup dan membuka kembali Max untuk melihat perubahan pada pohon objek.
Untuk beberapa objek yang mempunyai metode sendiri, implementasi saat ini membedakan objek tilde dari objek non-tilde dengan menyediakan metode berbeda dengan akhiran _tilde
:
gen = p . add_gen ()
gen_tilde = p . add_gen_tilde ()
Format .maxpat
JSON sebenarnya cukup minimal dan hierarkis. Ini memiliki entri induk Patcher
dan Box
anak dan juga Patchlines
. Kotak tertentu berisi instance patcher
lain untuk mewakili subpatch dan gen~
patch yang disarangkan, dll.
Struktur di atas langsung dipetakan ke implementasi Python yang terdiri dari 3 kelas: Patcher
, Box
, dan Patchline
. Kelas-kelas ini dapat diperluas melalui **kwds
dan struktur __dict__
internalnya masing-masing. Sebenarnya, ini adalah bagaimana metode kelas .from_file
patcher diimplementasikan.
Ini ternyata merupakan cara yang paling mudah dipelihara dan fleksibel untuk menangani semua perbedaan antara ratusan objek Max, MSP, dan Jitter.
Semakin banyak metode patcher yang telah diterapkan untuk mengkhususkan dan memfasilitasi pembuatan kelas objek tertentu yang memerlukan konfigurasi tambahan:
.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
Ini adalah daftar singkatnya, tetapi metode add_textbox
saja dapat menangani hampir semua kasus. Yang lain sebenarnya hanya untuk kenyamanan dan menghemat pengetikan.
Secara umum, disarankan untuk mulai menggunakan py2max
melalui metode add_<type>
ini, karena metode tersebut memiliki sebagian besar parameter yang diperlukan di dalam metode dan Anda bisa mendapatkan dukungan penyelesaian IDE. Setelah Anda merasa nyaman dengan parameternya, gunakan bentuk singkatan umum: add
, yang lebih sedikit mengetik tetapi tradeoffnya adalah Anda kehilangan dukungan penyelesaian parameter IDE.
Proyek ini memiliki beberapa skrip yang mungkin berguna:
convert.py
: konversi maxpat
ke yaml
untuk kemudahan membaca selama pengembangancompare.py
: bandingkan menggunakan deepdiffcoverage.sh
: jalankan cakupan pytest dan buat laporan cakupan htmlPerhatikan bahwa jika Anda ingin membuat py2max sebagai roda:
pip install build
cd py2max
python3 -m build .
Roda kemudian harus berada di direktori dist
.
Ada cabang eksperimental dari proyek ini yang didasarkan pada proyek pydantic2.
Varian ini memiliki keunggulan sebagai berikut:
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 )]
Arah lain yang menjanjikan dari varian ini adalah membuat kelas khusus untuk objek yang memiliki maxclass
uniknya sendiri. Jadi dalam hal ini kalimat di atas akan berbunyi:
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 )]
Ada upaya awal untuk menyediakan akses atribut berbasis properti dan api yang lebih baik. Ini telah digantikan oleh cabang pydantic2
dan tidak akan dikembangkan lebih lanjut.
Semua hak dilindungi undang-undang untuk masing-masing penulis asli:
Steve Kieffer, Tim Dwyer, Kim Marriott, dan Michael Wybrow. HOLA: Tata Letak Jaringan Ortogonal Mirip Manusia. Dalam Visualisasi dan Grafik Komputer, Transaksi IEEE pada, Volume 22, Edisi 1, halaman 349 - 358. IEEE, 2016. DOI
Aric A. Hagberg, Daniel A. Schult dan Pieter J. Swart, “Menjelajahi struktur, dinamika, dan fungsi jaringan menggunakan NetworkX”, dalam Proceedings of the 7th Python in Science Conference (SciPy2008), Gäel Varoquaux, Travis Vaught, dan Jarrod Millman (Eds), (Pasadena, CA USA), hlm. 11–15, Agustus 2008
Teknik Menggambar Grafik Berarah Emden R. Gansner, Eleftherios Koutsofios, Stephen C. North, Kiem-phong Vo • IEEE TRANSACTIONS ON SOFTWARE ENGINEERING • Diterbitkan 1993
Gansner, ER, Koren, Y., Utara, S. (2005). Gambar Grafik dengan Majorisasi Stres. Dalam: Pach, J. (eds) Gambar Grafik. GD 2004. Catatan Kuliah Ilmu Komputer, vol 3383. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-540-31843-9_25
Sistem visualisasi grafik terbuka dan penerapannya pada rekayasa perangkat lunak Emden R. Gansner, Stephen C. North • PERANGKAT LUNAK - PRAKTEK DAN PENGALAMAN • Diterbitkan 2000