Max 패치 프로그램 파일( .maxpat
, .maxhelp
, .rbnopat
)의 오프라인 생성을 용이하게 하기 위한 종속성이 없는 순수 python3 라이브러리입니다.
Max/MSP용 python3 외부 요소를 찾고 있다면 py-js 프로젝트를 확인하세요.
.maxpat
JSON 기반 파일 형식으로 저장된 Max/MSP 개체와 일대일로 대응하는 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 )]
이 변형의 또 다른 유망한 방향은 고유한 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: 인간과 유사한 직교 네트워크 레이아웃. 시각화 및 컴퓨터 그래픽, 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 (Eds), (미국 캘리포니아주 패서디나), pp. 11–15, 2008년 8월
방향성 그래프를 그리는 기법 Emden R. Gansner, Eleftherios Koutsofios, Stephen C. North, Kiem-phong Vo • 소프트웨어 엔지니어링에 대한 IEEE 트랜잭션 • 1993년 출판
Gansner, ER, Koren, Y., North, S. (2005). 스트레스 주요화에 의한 그래프 그리기. In: Pach, J. (eds) 그래프 그리기. GD 2004. 컴퓨터 과학 강의 노트, vol 3383. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-540-31843-9_25
개방형 그래프 시각화 시스템 및 소프트웨어 엔지니어링에 대한 응용 프로그램 Emden R. Gansner, Stephen C. North • 소프트웨어 - 실습 및 경험 • 2000년 출판