2012-08-06 107 views
0

我有一个LV2插件,我想用Python来提取其元数据 - 插件名称,描述,控制和音频端口列表以及每个端口的规格。如何在Python中读取LV2 ttl文件?

使用LADSPA的指令非常清晰,但在Python中实现有点困难:我只需要调用ladspa_descriptor()函数。现在用LV2有一个.ttl文件,访问简单但解析起来更复杂。

是否有任何python库,这将使这项工作简单?

+0

你可以编辑你的文章来添加你想分析的数据样本吗?这可能是因为你可以简单地找到你想要的东西,例如,正则表达式('re'模块) – 2012-08-11 15:42:11

+1

Turtle是RDF数据的语法。试试[RDFlib](https://github.com/RDFLib)。 – 2012-08-06 20:10:08

+0

也许你应该看看像LILV这样的东西:http://drobilla.net/software/lilv/如果你想用本地python,那么有很多工具可以阅读Turtle,如果你已经可以打电话了一旦你解析了龟,LADSPA函数然后LV2就更容易了。 – 2012-08-07 15:34:27

回答

2

LV2文档生成工具使用RDFLib。它可能是Python最受欢迎的RDF接口,但不仅仅是解析Turtle。如果性能不是问题,这是一个不错的选择,但不幸的是确实是慢。

如果您需要实际实例化和使用插件,您可能需要使用现有的LV2实现。正如史蒂夫所说,Lilv是为此。它不限于任何静态默认位置,但会查看LV2_PATH中的所有位置。您可以在调用Lilv之前将此环境变量设置为任何您想要的值,并且只会查看这些位置。或者,如果您想一次只专门加载一个包,则有一个函数:lilv_world_load_bundle()。

在Lilv中包含了基于SWIG的Python绑定,但它们并没有真正允许您处理数据。然而,有一个项目可以包装Lilv,允许使用scipy数组处理音频:http://pyslv2.sourceforge.net/(尽管它们的名称确实是Lilv绑定,而不是它的前任SLV2的绑定)

这就是说,如果您只需要获取静态信息从Turtle文件中,涉及到C库可能比它更值得麻烦。使用标准数据文件的一大优势是易于使用现有工具。要获得插件上的端口数,只需计算与模式匹配的三元组数(插件,lv2:port,*)即可。下面是打印插件的端口数的例子Python脚本,赋予读取文件和插件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 2012-08-21 11:29:27

+0

对不起,swig绑定有点不成熟,没有广泛使用或测试过(像swig这样的声音不够智能,无法编组uint32_t)。如果你真的需要从Python中的Turtle文件中获得静态信息,使用Lilv可能不是最好的解决方案,至少现在是这样。我已经使用rdflib添加了一个示例纯Python解决方案。 – drobilla 2012-09-15 03:04:49

+0

我终于用rdflib解析了ttl。它起初就像一个矫枉过正的解决方案,但一旦我明白了这个想法是非常聪明的。你解析文件的方式比我的方式简单得多,谢谢! – lfagundes 2012-09-15 14:54:09

1

这是如何获得端口,每个插件支持的数量:

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

至少这是我得到所有,而试图找出这一点。