diff options
author | David Robillard <d@drobilla.net> | 2012-02-08 04:56:24 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2012-02-08 04:56:24 +0000 |
commit | ed78bbe5ba12be1f9bcc736f14c51da6b4f639f3 (patch) | |
tree | 653a2dfe33f3923da45a38fc04ed2106f93528f3 /lv2/lv2plug.in/ns/lv2core | |
parent | b617875c6f3ad439d25ae166da79df839ebfdc71 (diff) | |
download | lv2-ed78bbe5ba12be1f9bcc736f14c51da6b4f639f3.tar.xz |
Rearrange tree so top level can be used as an include path for standard style LV2 includes.
Diffstat (limited to 'lv2/lv2plug.in/ns/lv2core')
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/AUTHORS | 13 | ||||
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/COPYING | 16 | ||||
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/INSTALL | 41 | ||||
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/README | 42 | ||||
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/lv2.h | 299 | ||||
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/lv2core.doap.ttl | 117 | ||||
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/lv2core.pc.in | 10 | ||||
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/lv2core.ttl | 883 | ||||
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/manifest.ttl | 10 | ||||
-rwxr-xr-x | lv2/lv2plug.in/ns/lv2core/waf | bin | 0 -> 91475 bytes | |||
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/wscript | 141 |
11 files changed, 1572 insertions, 0 deletions
diff --git a/lv2/lv2plug.in/ns/lv2core/AUTHORS b/lv2/lv2plug.in/ns/lv2core/AUTHORS new file mode 100644 index 0000000..64febf8 --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/AUTHORS @@ -0,0 +1,13 @@ +LV2 is written and maintained by: + +David Robillard <d@drobilla.net> +Steve Harris <steve@plugin.org.uk> + +with the input and help of many others. + +LV2 is based on LADSPA, which was by: + Paul Barton-Davis + Richard W.E. Furse + Stefan Westerfeld + +Thanks to all members of the free software community who made LV2 possible. diff --git a/lv2/lv2plug.in/ns/lv2core/COPYING b/lv2/lv2plug.in/ns/lv2core/COPYING new file mode 100644 index 0000000..c46d5dd --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/COPYING @@ -0,0 +1,16 @@ +Copyright 2006-2011 Steve Harris, David Robillard. + +Based on LADSPA, Copyright 2000-2002 Richard W.E. Furse, +Paul Barton-Davis, Stefan Westerfeld. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
\ No newline at end of file diff --git a/lv2/lv2plug.in/ns/lv2core/INSTALL b/lv2/lv2plug.in/ns/lv2core/INSTALL new file mode 100644 index 0000000..16b1427 --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/INSTALL @@ -0,0 +1,41 @@ +This software requires only Python to build. The build system, based on waf, +is included in this source distribution. + + +LV2Core +======= + +This package contains everything necessary to compile against and/or use LV2 +plugins and extensions: a header file, pkg-config file, and LV2 bundle (with +Turtle files). + +The configure option --bundle-only can be used to install only the lv2core.lv2 +bundle. This is useful for installing the bundle to a project-specific or +user-specific location (e.g. ~/.lv2). + +See README for details on how to correctly package LV2, and how to depend on +LV2 in other projects. + + +Generic Waf Instructions +======================== + +As with most build systems, building and installing a project with waf is done +in three separate stages: + + 1. ./waf configure [OPTIONS] + 2. ./waf build + 3. ./waf install + +The default command is build. For example: + + ./waf configure --prefix=/some/where + ./waf -j2 + sudo ./waf install + +The environment variable DESTDIR can be used to add a prefix to all install +paths (useful for packaging), for example: + + DESTDIR=./lv2core.pkg ./waf install + +Run './waf --help' for detailed option information. diff --git a/lv2/lv2plug.in/ns/lv2core/README b/lv2/lv2plug.in/ns/lv2core/README new file mode 100644 index 0000000..f49513f --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/README @@ -0,0 +1,42 @@ +LV2 +=== + +LV2 gives programmers the ability to write audio processors (or "plugins") in +C/C++ which can be dynamically loaded into a range of applications (or +"hosts"). + +This core specification is deliberately as short and simple as possible, but is +designed so that extensions can be defined to add more advanced features. + +More information about LV2 can be found at <http://lv2plug.in>. + + +Using LV2 +--------- + +Applications that use LV2 plugins should depend on this package. It includes a +header, LV2 bundle, and a pkg-config file. To compile against LV2, build +scripts should check for the pkg-config package "lv2core", or simply check for +the header "lv2/lv2plug.in/ns/lv2core/lv2.h". + +The appropriate C include for LV2 specifications is based on their URI, e.g.: + + #include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +Is how code should include the header "lv2.h" in this bundle, which defines the +specification with URI "http://lv2plug.in/ns/lv2core". Other specifications +should follow this convention, e.g. the correct way to include the header +"foo.h" in the extension "http://example.org/foo" is: + + #include "lv2/example.org/foo/foo.h" + + +Packaging +--------- + +Please package these components in a single package (i.e. do not split the +headers, data, and program into separate packages). This package, in its +entirety, is a build and run time dependency of any code that uses LV2. +Distributions are encouraged to include it with package name "lv2core". + + -- David Robillard <d@drobilla.net> diff --git a/lv2/lv2plug.in/ns/lv2core/lv2.h b/lv2/lv2plug.in/ns/lv2core/lv2.h new file mode 100644 index 0000000..29adf7b --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/lv2.h @@ -0,0 +1,299 @@ +/* + LV2 - An audio plugin interface specification. + Copyright 2006-2012 Steve Harris, David Robillard. + + Based on LADSPA, Copyright 2000-2002 Richard W.E. Furse, + Paul Barton-Davis, Stefan Westerfeld. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file lv2.h + API for the LV2 specification <http://lv2plug.in/ns/lv2core>. + Revision: 6.1 +*/ + +#ifndef LV2_H_INCLUDED +#define LV2_H_INCLUDED + +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Plugin Instance Handle. + + This is a handle for one particular instance of a plugin. It is valid to + compare to NULL (or 0 for C++) but otherwise the host MUST NOT attempt to + interpret it. +*/ +typedef void * LV2_Handle; + +/** + Feature. + + Features allow hosts to make additional functionality available to plugins + without requiring modification to the LV2 API. Extensions may define new + features and specify the @ref URI and @ref data to be used if necessary. + Some features, such as lv2:isLive, do not require the host to pass data. +*/ +typedef struct _LV2_Feature { + /** + A globally unique, case-sensitive identifier (URI) for this feature. + + This MUST be a valid URI string as defined by RFC 3986. + */ + const char * URI; + + /** + Pointer to arbitrary data. + + The format of this data is defined by the extension which describes the + feature with the given @ref URI. + */ + void * data; +} LV2_Feature; + +/** + Plugin Descriptor. + + This structure provides the core functions necessary to instantiate and use + a plugin. +*/ +typedef struct _LV2_Descriptor { + /** + A globally unique, case-sensitive identifier for this plugin. + + This MUST be a valid URI string as defined by RFC 3986. All plugins with + the same URI MUST be compatible to some degree, see + http://lv2plug.in/ns/lv2core for details. + */ + const char * URI; + + /** + Instantiate the plugin. + + Note that instance initialisation should generally occur in activate() + rather than here. If a host calls instantiate(), it MUST call cleanup() + at some point in the future. + + @param descriptor Descriptor of the plugin to instantiate. + + @param sample_rate Sample rate, in Hz, for the new plugin instance. + + @param bundle_path Path to the LV2 bundle which contains this plugin + binary. It MUST include the trailing directory separator (e.g. '/') so + that simply appending a filename will yield the path to that file in the + bundle. + + @param features A NULL terminated array of LV2_Feature structs which + represent the features the host supports. Plugins may refuse to + instantiate if required features are not found here. However, hosts MUST + NOT use this as a discovery mechanism: instead, use the RDF data to + determine which features are required and do not attempt to instantiate + unsupported plugins at all. This parameter MUST NOT be NULL, i.e. a host + that supports no features MUST pass a single element array containing + NULL. + + @return A handle for the new plugin instance, or NULL if instantiation + has failed. + */ + LV2_Handle (*instantiate)(const struct _LV2_Descriptor * descriptor, + double sample_rate, + const char * bundle_path, + const LV2_Feature *const * features); + + /** + Connect a port on a plugin instance to a memory location. + + Plugin writers should be aware that the host may elect to use the same + buffer for more than one port and even use the same buffer for both + input and output (see lv2:inPlaceBroken in lv2.ttl). + + If the plugin has the feature lv2:hardRTCapable then there are various + things that the plugin MUST NOT do within the connect_port() function; + see lv2core.ttl for details. + + connect_port() MUST be called at least once for each port before run() + is called, unless that port is lv2:connectionOptional. The plugin must + pay careful attention to the block size passed to run() since the block + allocated may only just be large enough to contain the data, and is not + guaranteed to remain constant between run() calls. + + connect_port() may be called more than once for a plugin instance to + allow the host to change the buffers that the plugin is reading or + writing. These calls may be made before or after activate() or + deactivate() calls. + + @param instance Plugin instance containing the port. + + @param port Index of the port to connect. The host MUST NOT try to + connect a port index that is not defined in the plugin's RDF data. If + it does, the plugin's behaviour is undefined (a crash is likely). + + @param data_location Pointer to data of the type defined by the port + type in the plugin's RDF data (e.g. an array of float for an + lv2:AudioPort). This pointer must be stored by the plugin instance and + used to read/write data when run() is called. Data present at the time + of the connect_port() call MUST NOT be considered meaningful. + */ + void (*connect_port)(LV2_Handle instance, + uint32_t port, + void * data_location); + + /** + Initialise a plugin instance and activate it for use. + + This is separated from instantiate() to aid real-time support and so + that hosts can reinitialise a plugin instance by calling deactivate() + and then activate(). In this case the plugin instance MUST reset all + state information dependent on the history of the plugin instance except + for any data locations provided by connect_port(). If there is nothing + for activate() to do then this field may be NULL. + + When present, hosts MUST call this function once before run() is called + for the first time. This call SHOULD be made as close to the run() call + as possible and indicates to real-time plugins that they are now live, + however plugins MUST NOT rely on a prompt call to run() after + activate(). + + The host MUST NOT call activate() again until deactivate() has been + called first. If a host calls activate(), it MUST call deactivate() at + some point in the future. Note that connect_port() may be called before + or after activate(). + */ + void (*activate)(LV2_Handle instance); + + /** + Run a plugin instance for a block. + + Note that if an activate() function exists then it must be called before + run(). If deactivate() is called for a plugin instance then run() may + not be called until activate() has been called again. + + If the plugin has the feature lv2:hardRTCapable then there are various + things that the plugin MUST NOT do within the run() function (see + lv2core.ttl for details). + + As a special case, when @c sample_count == 0, the plugin should update + any output ports that represent a single instant in time (e.g. control + ports, but not audio ports). This is particularly useful for latent + plugins, which should update their latency output port so hosts can + pre-roll plugins to compute latency. Plugins MUST NOT crash when + @c sample_count == 0. + + @param instance Instance to be run. + + @param sample_count The block size (in samples) for which the plugin + instance must run. + */ + void (*run)(LV2_Handle instance, + uint32_t sample_count); + + /** + Deactivate a plugin instance (counterpart to activate()). + + Hosts MUST deactivate all activated instances after they have been run() + for the last time. This call SHOULD be made as close to the last run() + call as possible and indicates to real-time plugins that they are no + longer live, however plugins MUST NOT rely on prompt deactivation. If + there is nothing for deactivate() to do then this field may be NULL + + Deactivation is not similar to pausing since the plugin instance will be + reinitialised by activate(). However, deactivate() itself MUST NOT fully + reset plugin state. For example, the host may deactivate a plugin, then + store its state (using some extension to do so). + + Hosts MUST NOT call deactivate() unless activate() was previously + called. Note that connect_port() may be called before or after + deactivate(). + */ + void (*deactivate)(LV2_Handle instance); + + /** + Clean up a plugin instance (counterpart to instantiate()). + + Once an instance of a plugin has been finished with it must be deleted + using this function. The instance handle passed ceases to be valid after + this call. + + If activate() was called for a plugin instance then a corresponding call + to deactivate() MUST be made before cleanup() is called. Hosts MUST NOT + call cleanup() unless instantiate() was previously called. + */ + void (*cleanup)(LV2_Handle instance); + + /** + Return additional plugin data defined by some extenion. + + A typical use of this facility is to return a struct containing function + pointers to extend the LV2_Descriptor API. + + The actual type and meaning of the returned object MUST be specified + precisely by the extension. This function MUST return NULL for any + unsupported URI. If a plugin does not support any extension data, this + field may be NULL. + + The host is never responsible for freeing the returned value. + */ + const void * (*extension_data)(const char * uri); +} LV2_Descriptor; + +/** + Put this (LV2_SYMBOL_EXPORT) before any functions that are to be loaded + by the host as a symbol from the dynamic library. +*/ +#ifdef _WIN32 +# define LV2_SYMBOL_EXPORT __declspec(dllexport) +#else +# define LV2_SYMBOL_EXPORT +#endif + +/** + Prototype for plugin accessor function. + + Plugins are discovered by hosts using RDF data (not by loading libraries). + See http://lv2plug.in for details on the discovery process, though most + hosts should use an existing library to implement this functionality. + + A plugin library MUST include a function called "lv2_descriptor" with this + prototype. This function MUST have C-style linkage (if you are using C++ + this is taken care of by the 'extern "C"' clause at the top of this file). + + When it is time to load a plugin (designated by its URI), the host loads the + plugin's library, gets the lv2_descriptor() function from it, and uses this + function to find the LV2_Descriptor for the desired plugin. Plugins are + accessed by index using values from 0 upwards. This function MUST return + NULL for out of range indices, so the host can enumerate plugins by + increasing @c index until NULL is returned. + + Note that @c index has no meaning, hosts MUST NOT depend on it remaining + consistent between loads of the plugin library. +*/ +LV2_SYMBOL_EXPORT +const LV2_Descriptor * lv2_descriptor(uint32_t index); + +/** + Type of the lv2_descriptor() function in a plugin library. +*/ +typedef const LV2_Descriptor * +(*LV2_Descriptor_Function)(uint32_t index); + +#ifdef __cplusplus +} +#endif + +#endif /* LV2_H_INCLUDED */ diff --git a/lv2/lv2plug.in/ns/lv2core/lv2core.doap.ttl b/lv2/lv2plug.in/ns/lv2core/lv2core.doap.ttl new file mode 100644 index 0000000..33048a2 --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/lv2core.doap.ttl @@ -0,0 +1,117 @@ +@prefix dcs: <http://ontologi.es/doap-changeset#> . +@prefix doap: <http://usefulinc.com/ns/doap#> . +@prefix foaf: <http://xmlns.com/foaf/0.1/> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . + +<http://plugin.org.uk/swh.xrdf#me> + a foaf:Person ; + foaf:name "Steve Harris" ; + foaf:homepage <http://plugin.org.uk/> ; + rdfs:seeAlso <http://plugin.org.uk/swh.xrdf> . + +<http://drobilla.net/drobilla#me> + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:homepage <http://drobilla.net/> ; + foaf:mbox <mailto:d@drobilla.net> ; + rdfs:seeAlso <http://drobilla.net/drobilla> . + +<http://lv2plug.in/ns/lv2core> + a doap:Project ; + doap:license <http://opensource.org/licenses/isc> ; + doap:name "LV2" ; + doap:homepage <http://lv2plug.in> ; + doap:created "2004-04-21" ; + doap:shortdesc "An audio plugin interface specification." ; + doap:programming-language "C" ; + doap:release [ + doap:revision "6.1" ; + doap:created "2012-02-01" ; + dcs:blame <http://drobilla.net/drobilla#me> ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix LV2_SYMBOL_EXPORT and lv2_descriptor prototype for Windows." + ] + ] + ] , [ + doap:revision "6.0" ; + doap:created "2011-11-21" ; + doap:file-release <http://lv2plug.in/spec/lv2core-6.0.tar.bz2> ; + dcs:blame <http://drobilla.net/drobilla#me> ; + dcs:changeset [ + dcs:item [ + rdfs:label "Rename core.lv2 and lv2.ttl to lv2core.lv2 and lv2core.ttl to adhere to modern conventions." + ] , [ + rdfs:label "Add lv2:extensionData and lv2:ExtensionData for plugins to indicate that they support some URI for extension_data()." + ] , [ + rdfs:label "Remove lv2config in favour of the simple convention that specifications install headers to standard URI-based paths." + ] , [ + rdfs:label "Switch to the ISC license, a simple BSD-style license (with permission of all contributors to lv2.h and its ancestor, ladspa.h)." + ] , [ + rdfs:label "Make lv2core.ttl a valid OWL 2 DL ontology." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "4.0" ; + doap:created "2011-03-18" ; + doap:file-release <http://lv2plug.in/spec/lv2core-4.0.tar.bz2> ; + dcs:blame <http://drobilla.net/drobilla#me> ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make doap:license suggested, but not required (for wrappers)." + ] , [ + rdfs:label "Define lv2:binary (MUST be in manifest.ttl)." + ] , [ + rdfs:label "Define lv2:minorVersion and lv2:microVersion (MUST be in manifest.ttl)." + ] , [ + rdfs:label "Define lv2:documentation and use it to document lv2core." + ] , [ + rdfs:label "Add lv2:FunctionPlugin and lv2:ConstantPlugin classes." + ] , [ + rdfs:label "Move lv2:AmplifierPlugin under lv2:DynamicsPlugin." + ] , [ + rdfs:label "Loosen domain of lv2:optionalFeature and lv2:requiredFeature (to allow re-use in extensions)." + ] , [ + rdfs:label "Add generic lv2:Resource and lv2:PluginBase classes." + ] , [ + rdfs:label "Fix definition of lv2:minimum etc. (used for values, not scale points)." + ] , [ + rdfs:label "More precisely define properties with OWL." + ] , [ + rdfs:label "Move project metadata to manifest." + ] , [ + rdfs:label "Add lv2:enumeration port property." + ] , [ + rdfs:label "Define run() pre-roll special case (sample_count == 0)." + ] + ] + ] , [ + doap:revision "3.0" ; + doap:created "2008-11-08" ; + doap:file-release <http://lv2plug.in/spec/lv2core-3.0.tar.bz2> ; + dcs:blame <http://drobilla.net/drobilla#me> ; + dcs:changeset [ + dcs:item [ + rdfs:label "Require that serialisations refer to ports by symbol rather than index." + ] , [ + rdfs:label "Minor stylistic changes to lv2.ttl." + ] , [ + rdfs:label "No header changes." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2008-02-10" ; + doap:file-release <http://lv2plug.in/spec/lv2core-2.0.tar.gz> ; + dcs:blame <http://drobilla.net/drobilla#me> ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + doap:developer <http://plugin.org.uk/swh.xrdf#me> , + <http://drobilla.net/drobilla#me> ; + doap:maintainer <http://drobilla.net/drobilla#me> . diff --git a/lv2/lv2plug.in/ns/lv2core/lv2core.pc.in b/lv2/lv2plug.in/ns/lv2core/lv2core.pc.in new file mode 100644 index 0000000..96e5169 --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/lv2core.pc.in @@ -0,0 +1,10 @@ +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@ +libdir=@LIBDIR@ +includedir=@INCLUDEDIR@ + +Name: lv2core +Version: @LV2CORE_VERSION@ +Description: An audio plugin interface specification. +Libs: +Cflags: -I${includedir} diff --git a/lv2/lv2plug.in/ns/lv2core/lv2core.ttl b/lv2/lv2plug.in/ns/lv2core/lv2core.ttl new file mode 100644 index 0000000..0ab56c5 --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/lv2core.ttl @@ -0,0 +1,883 @@ +# This document describes LV2, a plugin interface. +# See <http://lv2plug.in> for more information. +# +# Copyright 2006-2011 Steve Harris, David Robillard +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +@prefix doap: <http://usefulinc.com/ns/doap#> . +@prefix lv2: <http://lv2plug.in/ns/lv2core#> . +@prefix owl: <http://www.w3.org/2002/07/owl#> . +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . + +########################### +## General LV2 Resources ## +########################### + +lv2:Resource a rdfs:Class , owl:Class ; + rdfs:comment """ +An LV2 Resource (e.g. plugin, specification, or any other LV2 related thing). +""" . + +lv2:Specification a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Resource ; + lv2:documentation """ +<p>An LV2 specification (i.e. this specification, or an LV2 extension).</p> + +<p>Specification data, like plugin data, is distributed in bundles +so hosts may discover <em>all</em> present LV2 data.</p> +""" . + +lv2:documentation a rdf:Property , owl:AnnotationProperty ; + rdfs:range rdfs:Literal ; + rdfs:label "documentation" ; + rdfs:seeAlso <http://www.w3.org/TR/xhtml-basic/> ; + lv2:documentation """ +<p>Relates a Resource to documentation markup. The value of this property +MUST be a string literal which is a valid XHTML Basic 1.1 fragment suitable +for use as the content of the <body> element. This can be used by +hosts to provide rich online documentation or by tools to generate external +documentation pages. The standard language tagging facility of RDF can be +used to provide multi-lingual documentation.</p> +<p>XHTML Basic is a W3C Recommendation which defines a basic subset of XHTML +intended to be reasonable to implement with limited resources (e.g. on embedded +devices). See <a href="http://www.w3.org/TR/xhtml-basic/#s_xhtmlmodules" +>XHTML Basic, Section 3</a> for a list of legal tags.</p> +""" . + +<http://lv2plug.in/ns/lv2core> + a owl:Ontology ; + owl:imports <http://lv2plug.in/ns/doap.owl> ; + lv2:documentation """ +<p>LV2 is an interface for writing audio processors, or <q>plugins</q>, in +C/C++ which can be dynamically loaded into many applications, or <q>hosts</q>. +This <q>core</q> specification is simple and minimal, but is designed so that +<q>extensions</q> can be defined to add more advanced features, making it +possibly to implement nearly any feature imaginable.</p> + +<p>LV2 maintains a strong distinction between <q>code</q> and <q>data</q>. +Plugin code is in a shared library, while data is in a companion data file +written in <a href="http://www.w3.org/TeamSubmission/turtle/">Turtle</a>. +Code, data, and any other resources (e.g. waveforms) are shipped together in a +<q>bundle</q> directory. The code contains only the executable portions of the +plugin which inherently <em>must</em> be written in code. All other data is +provided in the data file(s). This makes plugin data flexible and extensible, +and allows the host to do everything but run the plugin without loading or +executing any code. Among other advantages, this makes hosts more robust +(broken plugins can't crash a host during discovery) and allows generic tools +and non-C programs to work with LV2 data. LV2 itself and extensions are +distributed in a similar way.</p> + +<p>An LV2 plugin library is suitable for dynamic loading (e.g. via +<code>dlopen()</code>) and provides one or more plugin descriptors via the +<code>lv2_descriptor()</code> function. These can be instantiated to create +plugin <q>instances</q>, which can be run directly on data or connected +together to perform advanced signal processing tasks.</p> + +<p>Plugins communicate via <q>ports</q>, which can transmit any type of data. +Data is processed by first <q>connecting</q> each port to a buffer, then +repeatedly calling a plugin's <code>run()</code> method to process blocks of +data.</p> + +<p>This core specification defines two types of port, equivalent to those in <a +href="http://www.ladspa.org/">LADSPA</a>: lv2:ControlPort and lv2:AudioPort. +Audio ports contain arrays with one <code>float</code> element per sample, +allowing a block of audio to be processed in a single call to +<code>run()</code>. Control ports contain single <code>float</code> values, +which are fixed and valid for the duration of the call to <code>run()</code>. +Thus the <q>control rate</q> is determined by the block size, which is +controlled by the host (and not necessarily constant).</p> + +<h3>Threading Rules</h3> + +<p>To faciliate use in multi-threaded programs, LV2 functions are partitioned +into several threading classes:</p> + +<table> +<tr><th>Discovery Class</th> + <th>Instantiation Class</th> + <th>Audio Class</th></tr> +<tr><td>lv2_descriptor()</td> + <td>LV2_Descriptor::instantiate()</td> + <td>LV2_Descriptor::run()</td></tr> +<tr><td>LV2_Descriptor::extension_data()</td> + <td>LV2_Descriptor::cleanup()</td> + <td>LV2_Descriptor::connect_port()</td></tr> +<tr><td></td><td>LV2_Descriptor::activate()</td><td></td></tr> +<tr><td></td><td>LV2_Descriptor::deactivate()</td><td></td></tr> +</table> + +<p>The rules that hosts MUST follow are:</p> +<ul> +<li>When any function is running for a plugin instance, +no other function in the same class may run for that instance.</li> +<li>When a <em>Discovery</em> function is running, +no other functions in the same shared object file may run.</li> +<li>When an <em>Instantiation</em> function is running for a plugin instance, +no other functions for that instance may run.</li> +</ul> + +<p>Any simultaneous calls that are not explicitly forbidden by these rules are +allowed. For example, a host may call <code>run()</code> for two different +plugin instances simultaneously.</p> + +<p>Plugin functions in any class MUST NOT manipulate any state which might +affect other plugin or host code, e.g. by using non-reentrant global +functions.</p> + +<p>Extensions to this specification which add new functions MUST declare in +which of these classes the functions belong, define new classes for them, or +otherwise precisely describe their threading rules.</p> +""" . + +############ +## Plugin ## +############ + +lv2:PluginBase a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Resource ; + lv2:documentation """ +<p>An abstract plugin-like resource that MAY not actually be an LV2 plugin +(e.g. may not actually have a plugin binary).</p> + +<p>PluginBase SHOULD be used as a base type for any resource that may have +ports or otherwise mimic the structure of a Plugin (e.g. a preset), since +hosts and other tools already <q>understand</q> this structure.</p> +""" . + +lv2:Plugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:PluginBase ; + rdfs:label "Plugin" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty doap:name ; + owl:someValuesFrom xsd:string ; + rdfs:comment """ +A Plugin MUST have at least one doap:name that is a string +with no language tag. +""" ] ; + lv2:documentation """ +<p>The class which represents an LV2 plugin.</p> + +<p>To be discovered by hosts, plugins MUST explicitly have rdf:type lv2:Plugin +listed in their bundle's manifest, e.g.:</p> +<pre class="turtle-code"> +<http://example.org/my-plugin> a lv2:Plugin . +</pre> + +<p>Plugins SHOULD have a doap:license property whenever possible. The doap:name +property should be at most a few words in length using title capitalization, +e.g. <q>Tape Delay Unit</q>. Use doap:shortdesc or doap:description for more +detailed descriptions.</p> +""" . + +########## +## Port ## +########## + +lv2:Port a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Resource ; + rdfs:label "Port" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:index ; + owl:allValuesFrom xsd:nonNegativeInteger ; + owl:cardinality 1 ; + rdfs:comment """ +A port MUST have a single lv2:index which is of type xsd:nonNegativeInteger +(e.g. a non-negative integer literal in Turtle). The actual RDF datatype +of the index MAY be xsd:integer (which is what a generic Turtle parser +will do), but the value itself MUST be non-negative. +""" ] , [ + a owl:Restriction ; + owl:onProperty lv2:symbol ; + owl:someValuesFrom xsd:string ; + rdfs:comment """ +A port MUST have a single lv2:symbol which is of type xsd:string with no +language tag. +""" ] , [ + a owl:Restriction ; + owl:onProperty lv2:name ; + owl:someValuesFrom xsd:string ; + rdfs:comment """ +A port MUST have at least one lv2:name which is of type xsd:string. +""" ] ; + lv2:documentation """ +<p>The class which represents an LV2 port.</p> + +<p>All LV2 port descriptions MUST have a rdf:type that is one of lv2:Port +lv2:InputPort or lv2:OutputPort. Additionally there MUST be at least one other +rdf:type which more precisely describes type of the port +(e.g. lv2:AudioPort).</p> + +<p>Hosts that do not support a specific port class MUST NOT instantiate the +plugin, unless that port has the connectionOptional property set (in which case +the host can simply <q>connect</q> that port to NULL). If a host is interested +in plugins to insert in a certain signal path (e.g. stereo audio), it SHOULD +consider all the classes of a port to determine which ports are most suitable +for connection (e.g. by ignoring ports with additional classes the host does +not recognize).</p> + +<p>A port has two identifiers: a (numeric) index, and a (textual) symbol. +The index can be used as an identifier at run-time, but persistent references +to ports (e.g. in a saved preset) MUST use the symbol. A symbol is guaranteed +to refer to the same port on all plugins with a given URI. An index does NOT +necessarily refer to the same port on all plugins with a given URI (i.e. the +index for a port may differ between plugin binaries).</p> +""" . + +lv2:InputPort a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Input port" ; + rdfs:comment """ +Ports of this type will be connected to a pointer to some value, which will +be read by the plugin during their run method. +""" . + +lv2:OutputPort a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Output port" ; + rdfs:comment """ +Ports of this type will be connected to a pointer to some value, which will +be written to by the plugin during their run method. +""" . + +lv2:ControlPort a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Control port" ; + lv2:documentation """ +<p>Ports of this type will be connected to a pointer to a single value of C +type <code>float</code>.</p> + +""" . + +lv2:AudioPort a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Audio port" ; + lv2:documentation """ +<p>Ports of this type will be connected to an array of length sample_count +with elements of C type <code>float</code>.</p> +""" . + +####################### +## Plugin Properties ## +####################### + +lv2:port a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:PluginBase ; + rdfs:range lv2:Port ; + rdfs:label "port" ; + rdfs:comment "Relates a Plugin to the Ports it contains" . + +lv2:minorVersion a rdf:Property , owl:DatatypeProperty ; + rdfs:domain lv2:Resource ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "minor version" ; + lv2:documentation """ +<p>The minor version of an LV2 Resource. This property is used (along with +lv2:microVersion) by hosts to distinguish different versions of a compatible +resource, e.g. to load only the bundle with the most recent version.</p> + +<p>The version of an LV2 resource is composed of two fields: minor version, +and micro version. These have the usual semantics:</p> + +<ul> +<li>The minor version MUST be incremented when backwards (but not +forwards) compatible additions are made, e.g. the addition of a port to a +plugin.</li> + +<li>The micro version is incremented for changes which do not affect +compatibility at all, e.g. bug fixes or documentation updates.</li> +</ul> + +<p>Note there is deliberately no concept of a major version: all versions of an +LV2 resource with a given URI are by definition backwards compatible. More +precisely: replacing a resource with a newer version of that resource MUST NOT +break anything. If a change is made which breaks this rule, the URI +of the resource MUST be changed. In contexts where a full (e.g. <a +href="http://semver.org">SemVer</a> conformant) version number is required, the +major version of all released LV2 resources is 1.</p> + +<p>Plugins and extensions MUST adhere to the following rules:</p> +<ul> +<li>All versions of a plugin with a given URI MUST have the <q>same</q> set of +mandatory (i.e. not lv2:connectionOptional) ports with respect to lv2:symbol +and rdf:type. In other words, every port on a specific version of a plugin has +a lv2:symbol and a set of rdf:types; all future versions of that plugin are +guaranteed to have a port with the same lv2:symbol and at least those +rdf:types. New types may be added only if doing so does not break +compatibility, i.e. if old hosts will continue to work correctly with the new +plugin.</li> + +<li>New ports MAY be added without changing the plugin URI if and only if they +are lv2:connectionOptional and the minor version is incremented.</li> + +<li>The minor version MUST be incremented if the index of any port (identified +by its symbol) is changed.</li> + +<li>All versions of an extension MUST be compatible in the sense that an +implementation of the new version can interoperate with an implementation of +any previous version.</li> +</ul> + +<p>(Note these rules are not necessarily exhaustive)</p> + +<p>Anything that depends on a specific version of a plugin (e.g. a +serialisation that references ports by index) MUST refer to the plugin by both +URI and version. However, implementations should be tolerant and extensions +should be designed such that there is no need to do this (e.g. indices should +only be meaningful for a particular plugin <em>instance</em> at run-time).</p> + +<p>When hosts discover several installed versions of a resource, they SHOULD +warn the user and load only the most recent version.</p> + +<p>An odd minor <em>or</em> micro version indicates that the resource is a +possibly unstable development version. Hosts and tools SHOULD clearly indicate +this wherever appropriate. Several versions of a resource with an odd version +may exist; i.e. it is acceptable to work on a development version of a resource +(e.g. in source control) without worrying about version numbers as long as +either the minor or micro version is odd.</p> + +<p>This property describes half of a resource version. See also <a +href="http://lv2plug.in/ns/lv2core#minorVersion">lv2:minorVersion</a>, the +property which describes the other half.</p> +""" . + +lv2:microVersion a rdf:Property , owl:DatatypeProperty ; + rdfs:domain lv2:Resource ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "micro version" ; + lv2:documentation """ +<p>The micro component of a Resource's version.</p> + +<p>Releases of plugins and extensions MUST be explicitly versioned. Correct +version numbers MUST always be maintained for any versioned resource that is +published. For example, after a release, if a change is made in the development +version in source control, the micro version MUST be incremented (to an odd +number) to distinguish this modified version from the previous release.</p> + +<p>This property describes half of a resource version. For detailed +documentation on LV2 resource versioning, see <a +href="http://lv2plug.in/ns/lv2core#minorVersion">lv2:minorVersion</a>.</p> +""" . + +lv2:binary a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:Resource ; + rdfs:range owl:Thing ; + rdfs:label "binary" ; + lv2:documentation """ +<p>The binary of an LV2 resource. The value of this property must be a URI that +resolves to a shared library object (the actual type of this library is system +specific).</p> + +<p>This is a required property of a Plugin which MUST be included in the +bundle's manifest.ttl file. The lv2:binary of an lv2:Plugin is the +shared object containing the <code>lv2_descriptor()</code> function which can +be used to access the descriptor for that plugin. This property may be used +similarly by extensions to relate other resources to their implementations.</p> +""" . + +lv2:appliesTo a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:Resource ; + rdfs:range lv2:Plugin ; + rdfs:label "Applies to" ; + lv2:documentation """ +<p>Specifies that a resource is related to a plugin. This is primarily intended +for discovery purposes: bundles that describe resources that work with +particular plugins (e.g. presets or user interfaces) SHOULD use this predicate +in manifest.ttl to relate the resource to the applicable +plugin(s), e.g.:</p> +<pre class="turtle-code"> +<thing> + a ext:Thing ; + lv2:appliesTo <plugin> ; + rdfs:seeAlso <thing.ttl> . +</pre> + +<p>Particularly for large amounts of data, this is preferable to +extending the plugin description with rdfs:seeAlso since the host may choose +if/when to load the data, knowing that it describes an additional resource and +not the plugin itself.</p> +""" . + +##################### +## Port Properties ## +##################### + +lv2:index a rdf:Property , owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "index" ; + rdfs:comment """ +Specifies the index of the port, passed as an argument to the connect port +function. The index uniqely identifies the port on an instance of the plugin. +""" . + +lv2:symbol a rdf:Property , owl:DatatypeProperty ; + rdfs:label "symbol" ; + rdfs:comment """ +A short name used as a machine and human readable identifier. + +The first character must be one of _, a-z or A-Z and subsequenct characters can +be from _, a-z, A-Z and 0-9. + +A language tag MUST NOT be used on this property. The symbol uniquely +identifies the port on a plugin with a given URI (i.e. the plugin author MUST +change the plugin URI if a port symbol is changed or removed). +""" . + +lv2:name a rdf:Property , owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:label "name" ; + rdfs:comment """ +A display name for labeling the Port in a user interface. + +This property is required for Ports, but MUST NOT be used by the host for +port identification. The plugin author may change the values of this +property without changing the Plugin URI. +""" . + +########################### +## Port Range and Points ## +########################### + +lv2:Point a rdfs:Class , owl:Class ; + rdfs:label "Port value point" ; + # Unfortunately, it is illegal to specify restrictions on rdfs:label or + # rdf:value. If the migration can be handled gracefully, it would be + # good to switch to more appropriate predicates here for validators. + lv2:documentation """ +<p>A Point describes an interesting value in a Port's range (much like a labeled +<q>notch</q> on a physical knob).</p> +<ul> + <li>A Point MUST have at least one rdfs:label which is a string.</li> + <li>A Point MUST have exactly one rdf:value with a type that is compatible + with the type of the corresponding Port.</li> +</ul> +""" . + +lv2:ScalePoint a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Point ; + rdfs:comment "A single float Point (for control inputs)." . + +lv2:scalePoint a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:Port ; + rdfs:range lv2:ScalePoint ; + rdfs:label "Scale point" ; + rdfs:comment "Relates a Port to its ScalePoints." . + +lv2:default a rdf:Property , owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:label "Default value" ; + rdfs:comment """ +The default value that the host SHOULD set this port to when there is no +other information available. +""" . + +lv2:minimum a rdf:Property , owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:label "Minimum value" ; + lv2:documentation """ +<p>A hint to the host for the minimum useful value that the port will use. This +is a <q>soft</q> limit; the plugin is required to gracefully accept all values +in the range of a port's data type.</p> +""" . + +lv2:maximum a rdf:Property , owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:label "Maximum value" ; + lv2:documentation """ +<p>A hint to the host for the maximum useful value that the port will use. +This is a <q>soft</q> limit; the plugin is required to gracefully accept all +values in the range of a port's data type.</p> +""" . + +############# +## Feature ## +############# + +lv2:Feature a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Resource ; + rdfs:label "Feature" ; + rdfs:comment """ +An additional feature which a plugin or other resource may use or require. +""". + +lv2:optionalFeature a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:Resource ; + rdfs:range lv2:Feature ; + rdfs:label "Optional feature" ; + lv2:documentation """ +<p>Signifies that a plugin or other resource supports a certain feature. If +the host supports this feature, it MUST pass its URI and any additional data to +the plugin in LV2_Descriptor::instantiate(). The plugin MUST NOT fail to +instantiate if an optional feature is not supported by the host.</p> +""" . + +lv2:requiredFeature a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:Resource ; + rdfs:range lv2:Feature ; + rdfs:label "Required feature" ; + lv2:documentation """ +<p>Signifies that a plugin or other resource requires a certain feature. If +the host supports this feature, it MUST pass its URI and any additional data to +the plugin in LV2_Descriptor::instantiate(). The plugin MUST fail to +instantiate if a required feature is not present; hosts SHOULD always check +this before attempting to instantiate a plugin (i.e. discovery by attempting to +instantiate is strongly discouraged).</p> +""" . + +#################### +## Extension Data ## +#################### + +lv2:ExtensionData a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Resource ; + rdfs:label "Extension Data" ; + rdfs:comment """ +Additional data and/or functions a plugin may return from +LV2_Descriptor:extension_data() which can be used to add additional API beyond +that defined by LV2_Descriptor. +""". + +lv2:extensionData a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:Resource ; + rdfs:range lv2:ExtensionData ; + rdfs:label "Available extension data" ; + lv2:documentation """ +<p>Signifies that a plugin provides additional data or functions (as defined by +some extension) via LV2:Descriptor::instantiate().</p> +""" . + +####################### +## Standard Features ## +####################### + +lv2:isLive a lv2:Feature ; + rdfs:label "Has a live (realtime) dependency" ; + lv2:documentation """ +<p>Indicates that the plugin has a real-time dependency (e.g. queues data from +a socket) and so its output must not be cached or subject to significant +latency, and calls to the run method should be done in rapid succession. This +property is not related to <q>hard real-time</q> execution requirements (see +lv2:hardRTCapable).</p> +""" . + +lv2:inPlaceBroken a lv2:Feature ; + rdfs:label "In-place broken" ; + lv2:documentation """ +<p>Indicates that the plugin may cease to work correctly if the host elects to +use the same data location for both input and output. Plugins that will fail +to work correctly if ANY input port is connected to the same location as ANY +output port MUST require this Feature. Doing so should be avoided as it makes +it impossible for hosts to use the plugin to process data <q>in-place</q>.</p> +""" . + +lv2:hardRTCapable a lv2:Feature ; + rdfs:label "Hard realtime capable" ; + lv2:documentation """ +<p>Indicates that the plugin is capable of running not only in a conventional +host but also in a <q>hard real-time</q> environment. To qualify for this the +plugin MUST satisfy all of the following:</p> +<ol> +<li>The plugin MUST NOT use malloc(), free() or other heap memory management + functions within its Audio class functions.</li> + +<li>The plugin MUST NOT attempt to make use of any library functions in its + Audio class functions, unless those functions themselves adhere to these + rules (i.e. are hard realtime safe). The plugin MAY assume the standard C + and C math library functions are safe.</li> + +<li>The plugin will not access files, devices, pipes, sockets, IPC or any other + mechanism that might result in process or thread blocking within its Audio + class functions.</li> + +<li>The plugin will take an amount of time to execute a run() call + approximately of form <code>A + B * sample_count</code> where <code>A</code> + and <code>B</code> depend on the machine and host in use. This amount of + time MUST NOT depend on input signals or plugin state.</li> +</ol> +<p>Note these rules apply to the connect_port() function as well as run().</p> +""" . + +################## +## PortProperty ## +################## + +lv2:PortProperty a rdfs:Class , owl:Class ; + rdfs:label "Port property" ; + rdfs:comment """ +A port property - a useful piece of information that allows a host to make more +sensible decisions (e.g. to provide a better interface). +""" . + +lv2:portProperty a rdf:Property , owl:ObjectProperty ; + rdfs:domain lv2:Port ; + rdfs:range lv2:PortProperty ; + rdfs:label "Port property" ; + rdfs:comment """ +Relates Ports to PortProperties. The PortProperty may be ignored without +catastrophic effects, though it may be useful e.g. for providing a sensible +interface for the port. +""" . + +############################# +## Standard PortProperties ## +############################# + +lv2:connectionOptional a lv2:PortProperty ; + rdfs:label "Optionally connected port" ; + rdfs:comment """ +Indicates that this port does not have to be connected to valid data by the +host. If it is to be disconnected then the port MUST set to NULL with a call +to the connectPort method. +""" . + +lv2:reportsLatency a lv2:PortProperty ; + rdfs:label "Latency reporting port" ; + lv2:documentation """ +<p>Indicates that the port is used to express the processing latency incurred +by the plugin, expressed in samples. The latency may be affected by the current +sample rate, plugin settings, or other factors, and may be changed by the +plugin at any time. Where the latency is frequency dependent the plugin may +choose any appropriate value. If a plugin introduces latency it MUST provide +EXACTLY ONE port with this property set which informs the host of the +<q>correct</q> latency. In <q>fuzzy</q> cases the value output should be the +most reasonable based on user expectation of input/output alignment +(eg. musical delay/echo plugins should not report their delay as latency, as it +is an intentional effect).</p> +""" . + +lv2:toggled a lv2:PortProperty ; + rdfs:label "Toggled" ; + lv2:documentation """ +<p>Indicates that the data item should be considered a Boolean toggle. Data +less than or equal to zero should be considered <q>off</q> or <q>false</q>, and +data above zero should be considered <q>on</q> or <q>true</q>.</p> +""" . + +lv2:sampleRate a lv2:PortProperty ; + rdfs:label "Sample rate" ; + rdfs:comment """ +Indicates that any bounds specified should be interpreted as multiples of the +sample rate. For instance, a frequency range from 0Hz to the Nyquist frequency +(half the sample rate) could be requested by this property in conjunction with +lv2:minimum 0.0 and lv2:maximum 0.5. +Hosts that support bounds at all MUST support this property. +""" . + +lv2:integer a lv2:PortProperty ; + rdfs:label "Integer" ; + rdfs:comment """ +Indicates that a port's reasonable values are integers (eg. a user interface +would likely wish to provide a stepped control allowing only integer input). +A plugin MUST operate reasonably even if such a port has a non-integer input. +""" . + +lv2:enumeration a lv2:PortProperty ; + rdfs:label "Enumeration" ; + rdfs:comment """ +Indicates that a port's only reasonable values are the scale points defined for +that port. A host SHOULD NOT allow a user to set the value of such a port to +anything other than a scale point. However, a plugin MUST operate reasonably +even if such a port has an input that is not a scale point, preferably by +simply choosing the largest enumeration value less than or equal to the actual +input value (i.e. round the input value down). +""" . + +#################### +## Plugin Classes ## +#################### + +lv2:GeneratorPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Generator" ; + rdfs:comment """ +Any plugin that generates sound internally, rather than processing its input. +""" . + +lv2:InstrumentPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Instrument" ; + rdfs:comment """ +Any plugin that is intended to be played as a musical instrument. +""" . + +lv2:OscillatorPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Oscillator" . + +lv2:UtilityPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Utility" ; + rdfs:comment """ +Includes things like mathematical functions and non-musical delays. +""" . + +lv2:ConverterPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Converter" ; + rdfs:comment """ +Any plugin that converts some form of input into a different form of output. +""" . + +lv2:AnalyserPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Analyser" ; + rdfs:comment """ +Any plugin that analyses input to output some useful information. +""" . + +lv2:MixerPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Mixer" ; + rdfs:comment """ +A plugin which mixes some number of inputs into some number of outputs. +""" . + +lv2:SimulatorPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Simulator" ; + rdfs:comment """ +Plugins that aim to duplicate the effect of some environmental effect or +musical equipment. +""" . + +lv2:DelayPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Delay" ; + rdfs:comment """ +Plugins that intentionally delay their input signal as an effect. +""" . + +lv2:ModulatorPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Modulator" . + +lv2:ReverbPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:subClassOf lv2:SimulatorPlugin ; + rdfs:subClassOf lv2:DelayPlugin ; + rdfs:label "Reverb" . + +lv2:PhaserPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Phaser" . + +lv2:FlangerPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Flanger" . + +lv2:ChorusPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Chorus" . + +lv2:FilterPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Filter" . + +lv2:LowpassPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Lowpass" . + +lv2:BandpassPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Bandpass" . + +lv2:HighpassPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Highpass" . + +lv2:CombPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Comb" . + +lv2:AllpassPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Allpass" . + +lv2:EQPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Equaliser" . + +lv2:ParaEQPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:EQPlugin ; + rdfs:label "Parametric" . + +lv2:MultiEQPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:EQPlugin ; + rdfs:label "Multiband" . + +lv2:SpatialPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Spatial" ; + rdfs:comment """ +Plugins that manipulate the position of audio in space (e.g. panning, +stereo width, surround encoding, etc.). +""" . + +lv2:SpectralPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Spectral" ; + rdfs:comment """ +Plugins that alter the spectral properties (e.g. frequency) of audio. +""" . + +lv2:PitchPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:SpectralPlugin ; + rdfs:label "Pitch Shifter" . + +lv2:AmplifierPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Amplifier" . + +lv2:DistortionPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Distortion" . + +lv2:WaveshaperPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:DistortionPlugin ; + rdfs:label "Waveshaper" . + +lv2:DynamicsPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Dynamics" ; + rdfs:comment """ +Plugins that alter the envelope or dynamic range of audio. +""" . + +lv2:CompressorPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Compressor" . + +lv2:ExpanderPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Expander" . + +lv2:LimiterPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Limiter" . + +lv2:GatePlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Gate" . + +lv2:FunctionPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Function" . + +lv2:ConstantPlugin a rdfs:Class , owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Constant" . diff --git a/lv2/lv2plug.in/ns/lv2core/manifest.ttl b/lv2/lv2plug.in/ns/lv2core/manifest.ttl new file mode 100644 index 0000000..5733b55 --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/manifest.ttl @@ -0,0 +1,10 @@ +@prefix doap: <http://usefulinc.com/ns/doap#> . +@prefix lv2: <http://lv2plug.in/ns/lv2core#> . +@prefix owl: <http://www.w3.org/2002/07/owl#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . + +<http://lv2plug.in/ns/lv2core> + a doap:Project , lv2:Specification , owl:Ontology ; + lv2:minorVersion 6 ; + lv2:microVersion 1 ; + rdfs:seeAlso <lv2core.ttl> , <lv2core.doap.ttl> .
\ No newline at end of file diff --git a/lv2/lv2plug.in/ns/lv2core/waf b/lv2/lv2plug.in/ns/lv2core/waf Binary files differnew file mode 100755 index 0000000..907b984 --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/waf diff --git a/lv2/lv2plug.in/ns/lv2core/wscript b/lv2/lv2plug.in/ns/lv2core/wscript new file mode 100644 index 0000000..bb76b13 --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/wscript @@ -0,0 +1,141 @@ +#!/usr/bin/env python +import os + +from waflib.extras import autowaf as autowaf +import waflib.Options as Options +import waflib.Scripting as Scripting +import glob + +# Version of this package (even if built as a child) +LV2CORE_VERSION = '6.1' + +# Variables for 'waf dist' +APPNAME = 'lv2core' +VERSION = LV2CORE_VERSION + +# Mandatory variables +top = '.' +out = 'build' + +def options(opt): + opt.load('compiler_c') + autowaf.set_options(opt) + opt.add_option('--bundle-only', action='store_true', default=False, + dest='bundle_only', + help="Only install bundle (not header or pkg-config file)") + opt.add_option('--copy-headers', action='store_true', default=False, + dest='copy_headers', + help='Copy headers instead of linking to bundle') + +def configure(conf): + if not hasattr(os.path, 'relpath') and not Options.options.copy_headers: + conf.fatal( + 'os.path.relpath missing, get Python 2.6 or use --copy-headers') + + conf.load('compiler_c') + autowaf.configure(conf) + + autowaf.display_msg(conf, "LV2 bundle directory", conf.env['LV2DIR']) + print('') + +def write_news(doap_file): + import rdflib + import textwrap + from time import strftime, strptime + + doap = rdflib.Namespace('http://usefulinc.com/ns/doap#') + dcs = rdflib.Namespace('http://ontologi.es/doap-changeset#') + rdfs = rdflib.Namespace('http://www.w3.org/2000/01/rdf-schema#') + foaf = rdflib.Namespace('http://xmlns.com/foaf/0.1/') + rdf = rdflib.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#') + + m = rdflib.ConjunctiveGraph() + + try: + m.parse(doap_file, format='n3') + except: + print('warning: %s not found, unable to generate NEWS' % doap_file) + return + + spec = m.value(None, rdf.type, doap.Project) + + entries = {} + for r in m.triples([spec, doap.release, None]): + release = r[2] + revision = m.value(release, doap.revision, None) or '9999' + date = m.value(release, doap.created, None) or '9999-01-01' + blamee = m.value(release, dcs.blame, None) + changeset = m.value(release, dcs.changeset, None) + + entry = '%s (%s) stable;\n' % (APPNAME, revision) + + if changeset: + for i in m.triples([changeset, dcs.item, None]): + entry += '\n * ' + '\n '.join( + textwrap.wrap(m.value(i[2], rdfs.label, None), width=79)) + + entry += '\n\n -- %s <%s> %s\n\n' % ( + m.value(blamee, foaf.name, None), + m.value(blamee, foaf.mbox, None).replace('mailto:', ''), + strftime('%a, %d %b %Y %H:%M:%S +0000', strptime(date, '%Y-%m-%d'))) + + entries[revision] = entry + + news = open('NEWS', 'w') + for e in sorted(entries.keys(), reverse=True): + news.write(entries[e]) + news.close() + +def build(bld): + # Header "library" + obj = bld(export_includes = ['.'], + name = 'liblv2core', + target = 'lv2core') + + # Bundle (data) + bld.install_files('${LV2DIR}/lv2core.lv2', bld.path.ant_glob('*.ttl')) + + if not Options.options.bundle_only: + # Header + bld.install_files('${INCLUDEDIR}', 'lv2.h') + bld.install_files('${LV2DIR}/lv2core.lv2', 'lv2.h') + + # Pkgconfig file + autowaf.build_pc(bld, 'LV2CORE', LV2CORE_VERSION, '', []) + + # URI-like header include + include_dir = os.path.join(bld.env['INCLUDEDIR'], 'lv2/lv2plug.in/ns') + bundle_dir = os.path.join(bld.env['LV2DIR'], 'lv2core.lv2') + if bld.env['COPY_HEADERS']: + bld.install_files(os.path.join(include_dir, 'lv2core'), + bld.path.ant_glob('*.h')) + else: + bld.symlink_as(os.path.join(include_dir, 'lv2core'), + os.path.relpath(bundle_dir, include_dir)) + +import pprint +class Dist(Scripting.Dist): + fun = 'dist' + cmd = 'dist' + + def archive(self): + pprint.pprint(self.exec_dict['bld'].__dict__) + print os.path.abspath(top) + # Write NEWS file + write_news('lv2core.doap.ttl') + + # Build distribution + Scripting.Dist.archive(self) + + # Delete generated NEWS file + try: + os.remove('NEWS') + except: + pass + +class DistCheck(Dist, Scripting.DistCheck): + fun = 'distcheck' + cmd = 'distcheck' + + def archive(self): + Dist.archive(self) |