1

我有一个 LV2 插件,我想使用 Python 来提取它的元数据 - 插件名称、描述、控制和音频端口列表以及每个端口的规范。

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

是否有任何 python 库可以使这项工作变得简单?

4

2 回答 2

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))
于 2012-08-16T00:38:11.700 回答
1

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

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

至少这是我在试图解决这个问题时得到的全部。

于 2013-01-28T05:54:53.553 回答