我有一个LV2插件,我想使用Python来提取其元数据 - 插件名称,描述,控制和音频端口列表以及每个端口的规格。
使用LADSPA时,指令很清楚,虽然在Python中有点难以实现:我只需要调用ladspa_descriptor()函数。现在使用LV2,有一个.ttl文件,访问简单但解析起来更复杂。
是否有任何python库可以简化这项工作?
答案 0 :(得分: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:端口,*)。下面是一个示例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))
答案 1 :(得分:1)
这是如何获得每个插件支持的端口数量:
w = lilv.World()
w.load_all()
for p in w.get_all_plugins():
print p.get_name().as_string(), p.get_num_ports()
至少这是我在试图解决这个问题时得到的全部内容。