2012-08-06 2 views
0

필자는 LV2 플러그인을 보유하고 있으며 플러그인 이름, 설명, 제어 및 오디오 포트 목록 및 각 포트의 사양에 대한 메타 데이터 추출을 위해 Python을 사용하고자합니다.Python에서 LV2 ttl 파일을 읽는 방법?

LADSPA를 사용하면 지침이 상당히 명확 해졌지만 Python에서 구현하기가 다소 어려웠으나 이제는 ladspa_descriptor() 함수를 호출해야했습니다. 이제 LV2에는 .ttl 파일이 있습니다. 액세스 할 수 있지만 구문 분석하기가 더 복잡합니다.

이 작업을 단순하게 만들 파이썬 라이브러리가 있습니까?

+0

게시물을 편집하여 구문 분석 할 데이터 샘플을 추가 할 수 있습니까? 예를 들어를 사용하여 원하는 것을 쉽게 찾을 수 있습니다. 정규 표현식 ('re' 모듈) –

+1

거북이는 RDF 데이터의 구문입니다. [RDFlib] (https://github.com/RDFLib)를 사용해보십시오. –

+0

어쩌면 LILV와 같은 것을 찾아야 할 것입니다 : http://drobilla.net/software/lilv/ 네이티브 파이썬과 함께 가고 싶다면 터틀을 읽을 수있는 도구가 많이 있습니다. 이미 호출 할 수 있다면 LADSPA 기능을 사용하면 거북이를 파싱 한 후 LV2가 훨씬 쉽습니다. –

답변

2

LV2 문서 생성 도구는 RDFLib를 사용합니다. 아마도 거북이를 파싱하는 것 이상의 의미가 있지만 파이썬을위한 가장 널리 사용되는 RDF 인터페이스 일 것입니다. 성능에 문제가 없다면 좋은 선택이지만, 불행히도 은 정말입니다.

실제로 플러그인을 인스턴스화하고 사용해야하는 경우 기존 LV2 구현을 사용하는 것이 좋습니다. 스티브가 말했듯이, Lilv입니다. 정적 기본 위치에 국한되지 않고 LV2_PATH의 모든 위치를 볼 것입니다. Lilv를 호출하기 전에이 환경 변수를 원하는 값으로 설정할 수 있으며이 값은 해당 위치에서만 볼 수 있습니다. 또는 한 번에 단 하나의 번들만을로드하려면 lilv_world_load_bundle() 함수가 필요합니다.

Lilv에 포함 된 SWIG 기반 Python 바인딩이 있지만 실제로는 데이터 처리가 불가능합니다. 그러나 scipy 배열을 사용하여 오디오를 처리 할 수있는 Lilv를 감싸는 프로젝트가 있습니다 (이름에도 불구하고 실제로 Lilv 바인딩이고 이전의 SLV2에 대한 바인딩이 아닙니다)

정적 정보 만 가져와야하는 경우 터틀 파일에서 C 라이브러리를 사용하는 것이 아마도 가치보다 더 많은 문제 일 것입니다. 표준 데이터 파일을 사용하면 큰 장점 중 하나는 기존 도구를 사용하여 쉽게 사용할 수 있다는 것입니다. 플러그인의 포트 수를 얻으려면 패턴과 일치하는 트리플 수를 계산하면됩니다 (플러그인, lv2 : port, *). 여기에 플러그인의 포트의 수를 출력하는 예 파이썬 스크립트를 읽을 수있는 파일 및 명령 줄 인수로 플러그인 URI 주어진입니다 :

#!/usr/bin/env python 
import rdflib 
import sys 

lv2 = rdflib.Namespace('http://lv2plug.in/ns/lv2core#') 

path = sys.argv[1] 
plugin = rdflib.URIRef(sys.argv[2]) 

model = rdflib.ConjunctiveGraph() 
model.parse(path, format='n3') 

num_ports = 0 
for i in model.triples(plugin, lv2.port, None]): 
    num_ports += 1 

print('%s has %u ports' % (plugin, num_ports)) 
+0

이것은 많은 도움이되었지만 여전히 lilv는 엄청나게 복잡합니다.오랜 시간 해킹하고 API 문서 (독점적으로 사용 가능한 유일한 것)를 읽은 후에도, 플러그인이 지원하는 포트의 수와 같은 간단한 정보를 얻을 수 없습니다. Swig uint32_t 포인터 만 있으면되고 이제는 관련 번호를 읽으려면 swig에 대한 깊은 이해가 필요합니다 ... – lfagundes

+0

죄송합니다. swig 바인딩은 미성숙하고 널리 사용되거나 테스트되지 않습니다 (swig는 uint32_t를 마샬링 할 정도로 스마트하지 않습니다). 파이썬의 터틀 파일에서 정적 정보를 얻고 싶다면 적어도 Lilv를 사용하는 것이 가장 좋은 해결책은 아닐 것입니다. 나는 rdflib를 사용하여 순수 Python 솔루션을 예제로 추가했다. – drobilla

+0

나는 rdflib로 ttl을 마침내 파싱했다. 처음에는 잔인한 솔루션과 같은 느낌 이었지만 아이디어를 얻은 후에는 상당히 영리했습니다. 파일을 파싱 한 방식은 내가했던 방식보다 훨씬 간단합니다. 감사합니다! – lfagundes

1

이 각 플러그인이 지원하는 포트 수를 얻는 방법이다 :

w = lilv.World() 
w.load_all() 
for p in w.get_all_plugins(): 
    print p.get_name().as_string(), p.get_num_ports() 

적어도이 모든 것을 알아 내려고 노력하고 있습니다.