aboutsummaryrefslogtreecommitdiffstats
path: root/lv2/core
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-03-22 16:36:44 +0100
committerDavid Robillard <d@drobilla.net>2020-04-10 19:46:04 +0200
commit430284545345539c9ffb31df889debac1d3888b5 (patch)
treedc9bb1f32f0d6fe34a7339221389048e199f14a5 /lv2/core
parentc4514483da1ab4f49148f9c4fe4ff5b559323217 (diff)
downloadlv2-430284545345539c9ffb31df889debac1d3888b5.tar.xz
Move documentation to metadata files and convert it to Markdown
Diffstat (limited to 'lv2/core')
-rw-r--r--lv2/core/lv2core.meta.ttl696
-rw-r--r--lv2/core/lv2core.ttl691
-rw-r--r--lv2/core/meta.ttl4
3 files changed, 840 insertions, 551 deletions
diff --git a/lv2/core/lv2core.meta.ttl b/lv2/core/lv2core.meta.ttl
index 5c3e29c..45e1a5a 100644
--- a/lv2/core/lv2core.meta.ttl
+++ b/lv2/core/lv2core.meta.ttl
@@ -1,3 +1,4 @@
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix dcs: <http://ontologi.es/doap-changeset#> .
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@@ -9,7 +10,7 @@
doap:name "LV2" ;
doap:homepage <http://lv2plug.in> ;
doap:created "2004-04-21" ;
- doap:shortdesc "An open and extensible audio plugin standard" ;
+ doap:shortdesc "An extensible open standard for audio plugins" ;
doap:programming-language "C" ;
doap:developer <http://plugin.org.uk/swh.xrdf#me> ,
<http://drobilla.net/drobilla#me> ;
@@ -21,6 +22,8 @@
dcs:changeset [
dcs:item [
rdfs:label "Add lv2:Markdown datatype."
+ ] , [
+ rdfs:label "Deprecate lv2:reportsLatency."
]
]
] , [
@@ -209,5 +212,694 @@
rdfs:label "Initial release."
]
]
- ] .
+ ] ;
+ lv2:documentation """
+
+LV2 is an interface for writing audio plugins in C or compatible languages,
+which can be dynamically loaded into many _host_ applications. This core
+specification is simple and minimal, but is designed so that _extensions_ can
+be defined to add more advanced features, making it possible to implement
+nearly any feature.
+
+LV2 maintains a strong distinction between code and data. Plugin code is in a
+shared library, while data is in a companion data file written in
+[Turtle](https://www.w3.org/TR/turtle/). Code, data, and any other resources
+(such as waveforms) are shipped together in a bundle directory. The code
+contains only the executable portions of the plugin. 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
+written in any language to work with LV2 data. The LV2 specification itself is
+distributed in a similar way.
+
+An LV2 plugin library is suitable for dynamic loading (for example with
+`dlopen()`) and provides one or more plugin descriptors via `lv2_descriptor()`
+or `lv2_lib_descriptor()`. These can be instantiated to create plugin
+instances, which can be run directly on data or connected together to perform
+advanced signal processing tasks.
+
+Plugins communicate via _ports_, which can transmit any type of data. Data is
+processed by first connecting each port to a buffer, then repeatedly calling
+the `run()` method to process blocks of data.
+
+This core specification defines two types of port, equivalent to those in
+[LADSPA](http://www.ladspa.org/), lv2:ControlPort and lv2:AudioPort, as well as
+lv2:CVPort which has the same format as an audio port but is interpreted as
+non-audible control data. Audio ports contain arrays with one `float` element
+per sample, allowing a block of audio to be processed in a single call to
+`run()`. Control ports contain single `float` values, which are fixed and
+valid for the duration of the call to `run()`. Thus the _control rate_ is
+determined by the block size, which is controlled by the host (and not
+necessarily constant).
+
+### Threading Rules
+
+To faciliate use in multi-threaded programs, LV2 functions are partitioned into
+several threading classes:
+
+| Discovery Class | Instantiation Class | Audio Class |
+|----------------------------------|-------------------------------|------------------------------- |
+| lv2_descriptor() | LV2_Descriptor::instantiate() | LV2_Descriptor::run() |
+| lv2_lib_descriptor() | LV2_Descriptor::cleanup() | LV2_Descriptor::connect_port() |
+| LV2_Descriptor::extension_data() | LV2_Descriptor::activate() | |
+| | LV2_Descriptor::deactivate() | |
+
+Hosts MUST guarantee that:
+
+ * A function in any class is never called concurrently with another function
+ in that class.
+
+ * A _Discovery_ function is never called concurrently with any other fuction
+ in the same shared object file.
+
+ * An _Instantiation_ function for an instance is never called concurrently
+ with any other function for that instance.
+
+Any simultaneous calls that are not explicitly forbidden by these rules are
+allowed. For example, a host may call `run()` for two different plugin
+instances simultaneously.
+
+Plugin functions in any class MUST NOT manipulate any state which might affect
+other plugins or the host (beyond the contract of that function), for example
+by using non-reentrant global functions.
+
+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.
+
+"""^^lv2:Markdown .
+
+lv2:Specification
+ lv2:documentation """
+
+An LV2 specification typically contains a vocabulary description, C headers to
+define an API, and any other resources that may be useful. Specifications,
+like plugins, are distributed and installed as bundles so that hosts may
+discover them.
+
+"""^^lv2:Markdown .
+
+lv2:Markdown
+ lv2:documentation """
+
+This datatype is typically used for documentation in
+[Markdown](https://daringfireball.net/projects/markdown/syntax) syntax.
+
+Generally, documentation with this datatype should stay as close to readable
+plain text as possible, but may use core Markdown syntax for nicer
+presentation. Documentation can assume that basic extensions like codehilite
+and tables are available.
+
+"""^^lv2:Markdown .
+
+lv2:documentation
+ lv2:documentation """
+
+Relates a Resource to extended documentation.
+
+LV2 specifications are documented using this property with an lv2:Markdown
+datatype.
+
+If the value has no explicit datatype, it is assumed to be a valid XHTML Basic
+1.1 fragment suitable for use as the content of the <code>&lt;body&gt;</code>
+element of a page.
+
+XHTML Basic is a W3C Recommendation which defines a simplified subset of XHTML
+intended to be reasonable to implement with limited resources, for exampe on
+embedded devices. See [XHTML Basic, Section
+3](http://www.w3.org/TR/xhtml-basic/#s_xhtmlmodules) for a list of valid tags.
+
+"""^^lv2:Markdown .
+
+lv2:PluginBase
+ lv2:documentation """
+
+An abstract plugin-like resource that may not actually be an LV2 plugin, for
+example that may not have a lv2:binary. This is useful for describing things
+that share common structure with a plugin, but are not themselves an actul
+plugin, such as presets.
+
+"""^^lv2:Markdown .
+
+lv2:Plugin
+ lv2:documentation """
+
+To be discovered by hosts, plugins MUST explicitly have an rdf:type of lv2:Plugin
+in their bundle's manifest, for example:
+
+ :::turtle
+ &lt;http://example.org/my-plugin&gt; a lv2:Plugin .
+
+Plugins should have a doap:name property that is at most a few words in length
+using title capitalization, for example <q>Tape Delay Unit</q>.
+
+"""^^lv2:Markdown .
+
+lv2:PortBase
+ lv2:documentation """
+
+Similar to lv2:PluginBase, this is an abstract port-like resource that may not
+be a fully specified LV2 port. For example, this is used for preset "ports"
+which do not specify an index.
+
+"""^^lv2:Markdown .
+
+lv2:Port
+ lv2:documentation """
+
+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, for example
+lv2:AudioPort.
+
+Hosts that do not support a specific port class MUST NOT instantiate the
+plugin, unless that port has the lv2:connectionOptional property set.
+
+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 (for example in presets or save files) MUST use the symbol. Only the
+symbol is guaranteed to refer to the same port on all plugins with a given URI,
+that is the index for a port may differ between plugin binaries.
+
+"""^^lv2:Markdown .
+
+lv2:AudioPort
+ lv2:documentation """
+
+Ports of this type are connected to a buffer of `float` audio samples, which
+the host guarantees have `sample_count` elements in any call to
+LV2_Descriptor::run().
+
+Audio samples are normalized between -1.0 and 1.0, though there is no
+requirement for samples to be strictly within this range.
+
+"""^^lv2:Markdown .
+
+lv2:CVPort
+ lv2:documentation """
+
+Ports of this type have the same buffer format as an lv2:AudioPort, except the
+buffer represents audio-rate control data rather than audio. Like a
+lv2:ControlPort, a CV port SHOULD have properties describing its value, in
+particular lv2:minimum, lv2:maximum, and lv2:default.
+
+Hosts may present CV ports to users as controls in the same way as control
+ports. Conceptually, aside from the buffer format, a CV port is the same as a
+control port, so hosts can use all the same properties and expectations.
+
+In particular, this port type does not imply any range, unit, or meaning for
+its values. However, if there is no inherent unit to the values, for example
+if the port is used to modulate some other value, then plugins SHOULD use a
+normalized range, either from -1.0 to 1.0, or from 0.0 to 1.0.
+
+It is generally safe to connect an audio output to a CV input, but not
+vice-versa. Hosts must take care to prevent data from a CVPort port from being
+used as audio.
+
+"""^^lv2:Markdown .
+
+lv2:project
+ lv2:documentation """
+
+This property provides a way to group plugins and/or related resources. A
+project may have useful metadata common to all plugins (such as homepage,
+author, version history) which would be wasteful to list separately for each
+plugin.
+
+Grouping via projects also allows users to find plugins in hosts by project,
+which is often how they are remembered. For this reason, a project that
+contains plugins SHOULD always have a doap:name. It is also a good idea for
+each plugin and the project itself to have an lv2:symbol property, which allows
+nice quasi-global identifiers for plugins, for example `myproj.superamp` which
+can be useful for display or fast user entry.
+
+"""^^lv2:Markdown .
+
+lv2:prototype
+ lv2:documentation """
+
+This property can be used to <q>include</q> common properties in several
+descriptions, serving as a sort of template mechanism. If a plugin has a
+prototype, then the host must load all the properties for the prototype as if
+they were properties of the plugin. That is, if `:plug lv2:prototype :prot`,
+then for each triple `:prot p o`, the triple `:plug p o` should be loaded.
+
+This facility is useful for distributing data-only plugins that rely on a
+common binary, for example those where the internal state is loaded from some
+other file. Such plugins can refer to a prototype in a template LV2 bundle
+which is installed by the corresponding software.
+
+"""^^lv2:Markdown .
+
+lv2:minorVersion
+ lv2:documentation """
+
+This, along with lv2:microVersion, is used to distinguish between different
+versions of the <q>same</q> resource, for example to load only the bundle with
+the most recent version of a plugin. An LV2 version has a minor and micro
+number with the usual semantics:
+
+ * The minor version MUST be incremented when backwards (but not forwards)
+ compatible additions are made, for example the addition of a port to a
+ plugin.
+
+ * The micro version is incremented for changes which do not affect
+ compatibility at all, e.g. bug fixes or documentation updates.
+
+Note that there is deliberately no major version: all versions with the same
+URI are compatible by definition. Replacing a resource with a newer version of
+that resource MUST NOT break anything. If a change violates this rule, then
+the URI of the resource (which serves as the major version) MUST be changed.
+
+Plugins and extensions MUST adhere to at least the following rules:
+
+ * All versions of a plugin with a given URI MUST have the <q>same</q> set of
+ mandatory (not lv2:connectionOptional) ports with respect to lv2:symbol and
+ rdf:type. In other words, every port on a particular version is guaranteed
+ to exist on a future version with same lv2:symbol and at least those
+ rdf:types.
+
+ * New ports MAY be added without changing the plugin URI if and only if they
+ are lv2:connectionOptional and the minor version is incremented.
+
+ * The minor version MUST be incremented if the index of any port (identified
+ by its symbol) is changed.
+
+ * All versions of a specification MUST be compatible in the sense that an
+ implementation of the new version can interoperate with an implementation
+ of any previous version.
+
+Anything that depends on a specific version of a plugin (including referencing
+ports by index) MUST refer to the plugin by both URI and version. However,
+implementations should be tolerant where possible.
+
+When hosts discover several installed versions of a resource, they SHOULD warn
+the user and load only the most recent version.
+
+An odd minor _or_ micro version, or minor version zero, indicates that the
+resource is a development version. Hosts and tools SHOULD clearly indicate
+this wherever appropriate. Minor version zero is a special case for
+pre-release development of plugins, or experimental plugins that are not
+intended for stable use at all. Hosts SHOULD NOT expect such a plugin to
+remain compatible with any future version. Where feasible, hosts SHOULD NOT
+expose such plugins to users by default, but may provide an option to display
+them.
+
+"""^^lv2:Markdown .
+
+lv2:microVersion
+ lv2:documentation """
+
+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.
+
+This property describes half of a resource version. For detailed documentation
+on LV2 resource versioning, see lv2:minorVersion.
+
+"""^^lv2:Markdown .
+
+lv2:binary
+ lv2:documentation """
+
+The value of this property must be the URI of a shared library object,
+typically in the same bundle as the data file which contains this property.
+The actual type of the library is platform specific.
+
+This is a required property of a lv2:Plugin which MUST be included in the
+bundle's `manifest.ttl` file. The lv2:binary of a lv2:Plugin is the shared
+object containing the lv2_descriptor() or lv2_lib_descriptor() function. This
+probably may also be used similarly by extensions to relate other resources to
+their implementations (it is not implied that a lv2:binary on an arbitrary
+resource is an LV2 plugin library).
+
+"""^^lv2:Markdown .
+
+lv2:appliesTo
+ lv2:documentation """
+
+This is primarily intended for discovery purposes: bundles that describe
+resources that work with particular plugins (like presets or user interfaces)
+SHOULD specify this in their `manifest.ttl` so the host can associate them with
+the correct plugin. For example:
+
+ :::turtle
+ &lt;thing&gt;
+ a ext:Thing ;
+ lv2:appliesTo &lt;plugin&gt; ;
+ rdfs:seeAlso &lt;thing.ttl&gt; .
+
+Using this pattern is preferable for large amounts of data, since the host may
+choose whether/when to load the data.
+
+"""^^lv2:Markdown .
+
+lv2:Symbol
+ lv2:documentation """
+
+The first character of a symbol must be one of `_`, `a-z` or `A-Z`, and
+subsequent characters may additionally be `0-9`. This is, among other things,
+a valid C identifier, and generally compatible in most contexts which have
+restrictions on string identifiers, such as file paths.
+
+"""^^lv2:Markdown .
+
+lv2:symbol
+ lv2:documentation """
+
+The value of this property MUST be a valid lv2:Symbol, and MUST NOT have a
+language tag.
+
+A symbol is a unique identifier with respect to the parent, for example a
+port's symbol is a unique identifiers with respect to its plugin. The plugin
+author MUST change the plugin URI if any port symbol is changed or removed.
+
+"""^^lv2:Markdown .
+
+lv2:name
+ lv2:documentation """
+
+Unlike lv2:symbol, this is unrestricted, may be translated, and is not relevant
+for compatibility. The name is not necessarily unique and MUST NOT be used as
+an identifier.
+
+"""^^lv2:Markdown .
+
+lv2:shortName
+ lv2:documentation """
+
+This is the same as lv2:name, with the additional requirement that the value is
+shorter than 16 characters.
+
+"""^^lv2:Markdown .
+
+lv2:Designation
+ lv2:documentation """
+
+A designation is metadata that describes the meaning or role of something. By
+assigning a designation to a port using lv2:designation, the port's content
+becomes meaningful and can be used more intelligently by the host.
+
+"""^^lv2:Markdown .
+
+lv2:Channel
+ lv2:documentation """
+
+A specific channel, for example the <q>left</q> channel of a stereo stream. A
+channel may be audio, or another type such as a MIDI control stream.
+
+"""^^lv2:Markdown .
+
+lv2:Parameter
+ lv2:documentation """
+
+A parameter is a designation for a control.
+
+A parameter defines the meaning of a control, not the method of conveying its
+value. For example, a parameter could be controlled via a lv2:ControlPort,
+messages, or both.
+
+A lv2:ControlPort can be associated with a parameter using lv2:designation.
+
+"""^^lv2:Markdown .
+
+lv2:designation
+ lv2:documentation """
+
+This property is used to give a port's contents a well-defined meaning. For
+example, if a port has the designation `eg:gain`, then the value of that port
+represents the `eg:gain` of the plugin instance.
+
+Ports should be given designations whenever possible, particularly if a
+suitable designation is already defined. This allows the host to act more
+intelligently and provide a more effective user interface. For example, if the
+plugin has a BPM parameter, the host may automatically set that parameter to
+the current tempo.
+
+"""^^lv2:Markdown .
+
+lv2:freeWheeling
+ lv2:documentation """
+
+If true, this means that all processing is happening as quickly as possible,
+not in real-time. When free-wheeling there is no relationship between the
+passage of real wall-clock time and the passage of time in the data being
+processed.
+
+"""^^lv2:Markdown .
+
+lv2:enabled
+ lv2:documentation """
+
+If this value is greater than zero, the plugin processes normally. If this
+value is zero, the plugin is expected to bypass all signals unmodified. The
+plugin must provide a click-free transition between the enabled and disabled
+(bypassed) states.
+
+Values less than zero are reserved for future use (such as click-free
+insertion/removal of latent plugins), and should be treated like zero
+(bypassed) by current implementations.
+
+"""^^lv2:Markdown .
+
+lv2:control
+ lv2:documentation """
+
+This should be used as the lv2:designation of ports that are used to send
+commands and receive responses. Typically this will be an event port that
+supports some protocol, e.g. MIDI or LV2 Atoms.
+
+"""^^lv2:Markdown .
+
+lv2:Point
+ lv2:documentation """
+
+ * A Point MUST have at least one rdfs:label which is a string.
+
+ * A Point MUST have exactly one rdf:value with a type that is compatible with
+ the type of the corresponding Port.
+
+"""^^lv2:Markdown .
+
+lv2:default
+ lv2:documentation """
+
+The host SHOULD set the port to this value initially, and in any situation
+where the port value should be cleared or reset.
+
+"""^^lv2:Markdown .
+
+lv2:minimum
+ lv2:documentation """
+
+This is a soft limit: the plugin is required to gracefully accept all values in
+the range of a port's data type.
+
+"""^^lv2:Markdown .
+
+lv2:maximum
+ lv2:documentation """
+
+This is a soft limit: the plugin is required to gracefully accept all values in
+the range of a port's data type.
+
+"""^^lv2:Markdown .
+
+lv2:optionalFeature
+ lv2:documentation """
+
+To support this feature, the host 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.
+
+"""^^lv2:Markdown .
+
+lv2:requiredFeature
+ lv2:documentation """
+
+To support this feature, the host MUST pass its URI and any additional data to
+the plugin in LV2_Descriptor::instantiate().
+
+The host MUST check this property before attempting to instantiate a plugin,
+and not attempt to instantiate plugins which require features it does not
+support. The plugin MUST fail to instantiate if a required feature is not
+supported by the host. Note that these rules are intentionally redundant for
+resilience: neither host nor plugin should assume that the other does not
+violate them.
+
+"""^^lv2:Markdown .
+
+lv2:ExtensionData
+ lv2:documentation """
+
+This is additional data that a plugin may return from
+LV2_Descriptor::extension_data(). This is generally used to add APIs to extend
+that defined by LV2_Descriptor.
+
+"""^^lv2:Markdown .
+
+lv2:extensionData
+ lv2:documentation """
+
+If a plugin has a value for this property, it must be a URI that defines the
+extension data. The plugin should return the appropriate data when
+LV2_Descriptor::extension_data() is called with that URI as a parameter.
+
+"""^^lv2:Markdown .
+
+lv2:isLive
+ lv2:documentation """
+
+This feature is for plugins that have time-sensitive internals, for example
+communicating in real time over a socket. It indicates to the host that its
+input and output must not be cached or subject to significant latency, and that
+calls to LV2_Descriptor::run() should be made at a rate that roughly
+corresponds to wall clock time (according to the `sample_count` parameter).
+
+Note that this feature is not related to <q>hard real-time</q> execution
+requirements (see lv2:hardRTCapable).
+
+"""^^lv2:Markdown .
+
+lv2:inPlaceBroken
+ lv2:documentation """
+
+This feature indicates that the plugin may not 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
+whenever possible since it prevents hosts from running the plugin on data
+<q>in-place</q>.
+
+"""^^lv2:Markdown .
+
+lv2:hardRTCapable
+ lv2:documentation """
+
+This feature indicates that the plugin is capable of running in a <q>hard
+real-time</q> environment. This should be the case for most audio processors,
+so most plugins are expected to have this feature.
+
+To support this feature, plugins MUST adhere to the following in all of their
+audio class functions (LV2_Descriptor::run() and
+LV2_Descriptor::connect_port()):
+
+ * There is no use of `malloc()`, `free()` or any other heap memory management
+ functions.
+
+ * There is no use of any library functions which do not adhere to these
+ rules. The plugin may assume that the standard C math library functions
+ are safe.
+
+ * There is no access to files, devices, pipes, sockets, system calls, or any
+ other mechanism that might result in the process or thread blocking.
+
+ * The maximum amount of time for a `run()` call is bounded by some expression
+ of the form `A + B * sample_count`, where `A` and `B` are platform specific
+ constants. Note that this bound does not depend on input signals or plugin
+ state.
+
+"""^^lv2:Markdown .
+
+lv2:portProperty
+ lv2:documentation """
+
+States that a port has a particular lv2:PortProperty. This may be ignored
+without catastrophic effects, though it may be useful, for example to provide a
+sensible user interface for the port.
+
+"""^^lv2:Markdown .
+
+lv2:connectionOptional
+ lv2:documentation """
+
+This property means that the port does not have to be connected to valid data
+by the host. To leave a port <q>unconnected</q>, the host MUST explicitly
+connect the port to `NULL`.
+
+"""^^lv2:Markdown .
+
+lv2:reportsLatency
+ lv2:documentation """
+
+This property 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. In <q>fuzzy</q> cases the
+value should be the most reasonable one based on user expectation of
+input/output alignment. For example, musical delay plugins should not report
+their delay as latency, since it is an intentional effect that the host should
+not compensate for.
+
+This property is deprecated, use a lv2:designation of lv2:latency instead,
+following the same rules as above:
+
+ :::turtle
+ <http://example.org/plugin>
+ lv2:port [
+ a lv2:OutputPort , lv2:ControlPort ;
+ lv2:designation lv2:latency ;
+ lv2:symbol "latency" ;
+ ]
+
+"""^^lv2:Markdown .
+
+lv2:toggled
+ lv2:documentation """
+
+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>.
+
+"""^^lv2:Markdown .
+
+lv2:sampleRate
+ lv2:documentation """
+
+Indicates that any specified bounds should be interpreted as multiples of the
+sample rate. For example, a frequency range from 0 Hz to the Nyquist frequency
+(half the sample rate) can be specified by using this property with lv2:minimum
+0.0 and lv2:maximum 0.5. Hosts that support bounds at all MUST support this
+property.
+
+"""^^lv2:Markdown .
+
+lv2:integer
+ lv2:documentation """
+
+Indicates that all the reasonable values for a port are integers. For such
+ports, a user interface should provide a stepped control that only allows
+choosing integer values.
+
+Note that this is only a hint, and that the plugin MUST operate reasonably even
+if such a port has a non-integer value.
+
+"""^^lv2:Markdown .
+
+lv2:enumeration
+ lv2:documentation """
+
+Indicates that all the rasonable values for a port are defined by
+lv2:scalePoint properties. For such ports, a user interface should provide a selector that allows the user to choose any of the scale point values by name. It is recommended to show the value as well if possible.
+
+Note that this is only a hint, and that the plugin MUST operate reasonably even
+if such a port has a value that does not correspond to a scale point.
+
+"""^^lv2:Markdown .
+
+lv2:isSideChain
+ lv2:documentation """
+
+Indicates that a port is a <q>sidechain</q>, which affects the output somehow
+but should not be considered a part of the main signal chain. Sidechain ports
+SHOULD be lv2:connectionOptional, and may be ignored by hosts.
+
+"""^^lv2:Markdown .
diff --git a/lv2/core/lv2core.ttl b/lv2/core/lv2core.ttl
index aa8a192..85ccf1e 100644
--- a/lv2/core/lv2core.ttl
+++ b/lv2/core/lv2core.ttl
@@ -5,156 +5,48 @@
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+<http://lv2plug.in/ns/lv2core>
+ a owl:Ontology ,
+ lv2:Specification ;
+ rdfs:label "LV2" ;
+ rdfs:comment "An extensible open standard for audio plugins." ;
+ rdfs:seeAlso <lv2.h> ,
+ <lv2_util.h> ,
+ <lv2core.meta.ttl> .
+
lv2:Specification
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf doap:Project ;
rdfs:label "Specification" ;
- 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>
-""" .
+ rdfs:comment "An LV2 specifiation." .
lv2:Markdown
a rdfs:Datatype ;
owl:onDatatype xsd:string ;
- lv2:documentation """
-<p>A string in <a href="https://daringfireball.net/projects/markdown/syntax">Markdown</a> syntax.</p>
-
-<p>Generally, documentation with this datatype should stay as close to readable
-plain text as possible, but may use core Markdown syntax for nicer
-presentation. Documentation can assume that basic extensions like codehilite
-and tables are available.</p>
-""" .
+ rdfs:label "Markdown" ;
+ rdfs:comment "A string in Markdown syntax." .
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 &lt;body&gt; 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 ,
- lv2:Specification ;
- rdfs:seeAlso <lv2.h> ,
- <lv2_util.h> ,
- <lv2core.meta.ttl> ;
- 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
-possible 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
-<code>lv2_descriptor()</code> or <code>lv2_lib_descriptor()</code>. 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_lib_descriptor()</td>
- <td>LV2_Descriptor::cleanup()</td>
- <td>LV2_Descriptor::connect_port()</td></tr>
-<tr><td>LV2_Descriptor::extension_data()</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>
-""" .
+ rdfs:comment "Extended documentation." ;
+ rdfs:seeAlso <http://www.w3.org/TR/xhtml-basic/> .
lv2:PluginBase
a rdfs:Class ,
owl:Class ;
rdfs:label "Plugin Base" ;
- 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>
-""" .
+ rdfs:comment "Base class for a plugin-like resource." .
lv2:Plugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:PluginBase ;
rdfs:label "Plugin" ;
+ rdfs:comment "An LV2 plugin." ;
rdfs:subClassOf [
a owl:Restriction ;
owl:onProperty doap:name ;
@@ -165,124 +57,67 @@ lv2:Plugin
owl:onProperty lv2:port ;
owl:allValuesFrom lv2:Port ;
rdfs:comment "All ports on a plugin MUST be fully specified lv2:Port instances."
- ] ;
- 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">
-&lt;http://example.org/my-plugin&gt; 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>
-""" .
+ ] .
lv2:PortBase
a rdfs:Class ,
owl:Class ;
rdfs:label "Port Base" ;
+ rdfs:comment "Base class for a port-like resource." ;
rdfs:subClassOf [
a owl:Restriction ;
owl:onProperty lv2:symbol ;
owl:cardinality 1 ;
rdfs:comment "A port MUST have exactly one lv2:symbol."
- ] ;
- lv2:documentation """
-<p>Similar to lv2:PluginBase, an abstract port-like resource that MAY not
-actually be a fully specified LV2 port. For example, this is used for preset
-"ports" which do not specify an index.</p>
-""" .
+ ] .
lv2:Port
a rdfs:Class ,
owl:Class ;
rdfs:label "Port" ;
+ rdfs:comment "An LV2 plugin port." ;
rdfs:subClassOf lv2:PortBase ,
[
a owl:Restriction ;
owl:onProperty lv2:name ;
owl:minCardinality 1 ;
rdfs:comment "A port MUST have at least one lv2:name."
- ] ;
- 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." .
+ rdfs:comment "A port connected to constant data which is read during `run()`." .
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." .
+ rdfs:comment "A port connected to data which is written during `run()`." .
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>
-
-""" .
+ rdfs:comment "A port connected to a single `float`." .
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>
-""" .
+ rdfs:comment "A port connected to an array of float audio samples." .
lv2:CVPort
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:Port ;
rdfs:label "CV Port" ;
- lv2:documentation """
-<p>Ports of this type have the same buffer format as an lv2:AudioPort, except
-the buffer represents audio-rate control data rather than audio. Like an
-lv2:ControlPort, a CVPort SHOULD have properties describing its value
-(e.g. lv2:minimum, lv2:maximum, and lv2:default), and may be presented to the
-user as a control.</p>
-
-<p>It is generally safe to connect an audio output to a CV input, but not vice
-versa. Hosts SHOULD take care to prevent data from a CVPort port from being
-used as audio.</p>
-""" .
+ rdfs:comment "A port connected to an array of float control values." .
lv2:port
a rdf:Property ,
@@ -297,162 +132,41 @@ lv2:project
owl:ObjectProperty ;
rdfs:range doap:Project ;
rdfs:label "project" ;
- lv2:documentation """
-<p>The project this is a component of.</p>
-
-<p>This property provides a way to group plugins and/or related resources. A
-project may have useful metadata common to all plugins (such as homepage,
-author, version history) which would be wasteful to list separately for each
-plugin.</p>
-
-<p>Grouping via projects also allows users to find plugins in hosts by project,
-which is often how they are remembered. For this reason, a project that
-contains plugins SHOULD always have a doap:name. It is also a good idea for
-each plugin and the project itself to have an lv2:symbol property, which allows
-nice quasi-global identifiers for plugins, e.g. <q>myproj.superamp</q> which
-can be useful for display or fast user entry.</p>
-""" .
+ rdfs:comment "The project this is a part of." .
lv2:prototype
a rdf:Property ,
owl:ObjectProperty ;
rdfs:label "prototype" ;
- lv2:documentation """
-<p>The prototype to inherit properties from.</p>
-
-<p>This property can be used to <q>include</q> common properties in several
-descriptions. If a plugin has a prototype, then the host must load all the
-properties for the prototype as if they were properties of the plugin. That
-is, if <code>:plug lv2:prototype :prot</code>, then for each triple <code>:prot
-p o</code>, the triple <code>:plug p o</code> should be loaded.</p>
-
-<p>This facility is useful for distributing text-only plugins that rely on a
-common binary, by referring to a prototype which is installed by the
-corresponding software, along with the plugin binary.</p>
-""" .
+ rdfs:comment "The prototype to inherit properties from." .
lv2:minorVersion
a rdf:Property ,
owl:DatatypeProperty ;
rdfs:range xsd:nonNegativeInteger ;
rdfs:label "minor version" ;
- lv2:documentation """
-<p>The minor version of an LV2 Resource. This, along with lv2:microVersion, is
-used to distinguish between different versions of the <q>same</q> resource,
-e.g. to load only the bundle with the most recent version of a plugin. An LV2
-version has a minor and micro number with 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 major version; all versions with the same URI
-are compatible by definition. Replacing a resource with a newer version of
-that resource MUST NOT break anything. If a change violates this rule, then
-the URI of the resource (which serves as the major version) MUST be
-changed.</p>
-
-<p>Plugins and extensions MUST adhere to at least 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 particular version is guaranteed
-to exist on a future version with same lv2:symbol and at least those
-rdf:types.</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 a specification 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>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, or minor version zero, indicates
-that the resource is a development version. Hosts and tools SHOULD clearly
-indicate this wherever appropriate. Minor version zero is a special case for
-pre-release development of plugins, or experimental plugins that are not
-intended for stable use at all. Hosts SHOULD NOT expect such a plugin to
-remain compatible with any future version. If possible, hosts SHOULD hide such
-plugins from users unless an <q>experimental</q> option is enabled.</p>
-""" .
+ rdfs:comment "The minor version of this resource." .
lv2:microVersion
a rdf:Property ,
owl:DatatypeProperty ;
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 lv2:minorVersion.</p>
-""" .
+ rdfs:comment "The micro version of this resource." .
lv2:binary
a rdf:Property ,
owl:ObjectProperty ;
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> or
-<code>lv2_lib_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>
-""" .
+ rdfs:comment "The binary of this resource." .
lv2:appliesTo
a rdf:Property ,
owl:ObjectProperty ;
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">
-&lt;thing&gt;
- a ext:Thing ;
- lv2:appliesTo &lt;plugin&gt; ;
- rdfs:seeAlso &lt;thing.ttl&gt; .
-</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>
-""" .
+ rdfs:comment "The plugin this resource is related to." .
lv2:index
a rdf:Property ,
@@ -470,9 +184,8 @@ lv2:Symbol
xsd:pattern "[_a-zA-Z][_a-zA-Z0-9]*"
]
) ;
- rdfs:comment """A short restricted name used as a machine and human readable identifier.
-
-The first character must be one of _, a-z or A-Z and subsequent characters can be from _, a-z, A-Z and 0-9. This is a valid C identifier, and compatible in most other contexts with restricted string identifiers (e.g. file paths).""" .
+ rdfs:label "Symbol" ;
+ rdfs:comment "A short restricted name used as a strong identifier." .
lv2:symbol
a rdf:Property ,
@@ -481,54 +194,35 @@ lv2:symbol
rdfs:label "symbol" ;
rdfs:range lv2:Symbol ,
rdf:PlainLiteral ;
- lv2:documentation """
-<p>The value of this property MUST conform to the rules for lv2:Symbol, and
-MUST NOT have a language tag.</p>
-
-<p>A symbol is a unique identifier with respect to the parent (e.g. a port's
-symbol is a unique identifier with respect to its plugin). The plugin author
-MUST change the plugin URI if a port symbol is changed or removed.</p>
-""" .
+ rdfs:comment "The symbol that identifies this resource in the context of its parent." .
lv2:name
a rdf:Property ,
owl:DatatypeProperty ;
rdfs:label "name" ;
rdfs:range xsd:string ;
- rdfs:comment """A display name for labeling in a user interface. Unlike lv2:symbol this is unrestricted and may be translated. The lv2:name MUST NOT be used as an identifier.
-
-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.""" .
+ rdfs:comment "A display name for labeling in a user interface." .
lv2:shortName
a rdf:Property ,
owl:DatatypeProperty ;
rdfs:label "short name" ;
rdfs:range xsd:string ;
- rdfs:comment """A short display name for labeling in a user interface.
-
-The same rules for port names apply here, with the exception that short names should not be longer than 16 characters.""" .
+ rdfs:comment "A short display name for labeling in a user interface." .
lv2:Designation
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf rdf:Property ;
rdfs:label "Designation" ;
- lv2:documentation """
-<p>The designation (or <q>assignment</q>) of an input or output. A designation
-is metadata that describes the meaning or role of data. By assigning a
-designation to a port using lv2:designation, the port's content becomes
-meaningful and can be used more intelligently by the host.</p>
-""" .
+ rdfs:comment "A designation which defines the meaning of some data." .
lv2:Channel
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:Designation ;
rdfs:label "Channel" ;
- lv2:documentation """
-<p>A specific channel, e.g. <q>left</q> or <q>right</q>. A channel may be
-audio, or another type such as a MIDI control stream.</p>
-""" .
+ rdfs:comment "An individual channel, such as left or right." .
lv2:Parameter
a rdfs:Class ,
@@ -536,16 +230,7 @@ lv2:Parameter
rdfs:subClassOf lv2:Designation ,
rdf:Property ;
rdfs:label "Parameter" ;
- lv2:documentation """
-<p>A parameter, i.e. a recognized property. A parameter is a designation for a
-control.</p>
-
-<p>A parameter defines the <em>meaning</em> of a control (not the
-<em>method</em> of conveying its value). The standard way of exposing a plugin
-parameter is via an lv2:ControlPort, which can be given a parameter designation
-with lv2:designation. Other methods, such as setting dynamic parameters via
-messages, are possible but not defined here.</p>
-""" .
+ rdfs:comment "A property that is a plugin parameter." .
lv2:designation
a rdf:Property ,
@@ -553,18 +238,7 @@ lv2:designation
owl:FunctionalProperty ;
rdfs:range rdf:Property ;
rdfs:label "designation" ;
- lv2:documentation """
-<p>Indicates a channel or parameter designation.</p>
-
-<p>This property is used to give the port's contents a well-defined meaning.
-For example, if a port has lv2:designation eg:gain, then the value of that port
-represents the eg:gain of the plugin instance.</p>
-
-<p>Ports should be given designations whenever a well-defined designation
-exists. This allows the host to act more intelligently and/or provide a more
-effective user interface. For example, if the plugin has a BPM parameter, the
-host may automatically set that parameter to the current tempo.</p>
-""" .
+ rdfs:comment "The designation that defines the meaning of this input or output." .
lv2:latency
a rdf:Property ,
@@ -578,61 +252,32 @@ lv2:freeWheeling
owl:DatatypeProperty ;
rdfs:label "free-wheeling" ;
rdfs:range xsd:boolean ;
- lv2:documentation """
-<p>Whether or not processing is currently free-wheeling. If true, this means
-that all processing is happening as quickly as possible, not in real-time.
-When free-wheeling there is no relationship between the passage of real
-wall-clock time and the passage of time in the data being processed (e.g. audio
-frames).</p>
-""" .
+ rdfs:comment "Whether processing is currently free-wheeling." .
lv2:enabled
a rdf:Property ,
owl:DatatypeProperty ;
rdfs:label "enabled" ;
rdfs:range xsd:int ;
- lv2:documentation """
-<p>Whether or not processing is currently enabled, that is, not bypassed.</p>
-
-<p>If this value is greater than zero, the plugin processes normally. If this
-value is zero, the plugin is expected to bypass all signals unmodified. The
-plugin must provide a click-free transition between the enabled and disabled
-(bypassed) states.</p>
-
-<p>Values less than zero are reserved for future use (such as click-free
-insertion/removal of latent plugins), and should be treated like zero
-(bypassed) by current implementations.</p>
-""" .
+ rdfs:comment "Whether processing is currently enabled (not bypassed)." .
lv2:control
a lv2:Channel ;
rdfs:label "control" ;
- lv2:documentation """
-<p>The primary control channel. This should be used as the lv2:designation of
-ports that are used to send commands and receive responses. Typically this
-will be an event port that supports some protocol, e.g. MIDI or LV2 Atoms.</p>
-""" .
+ rdfs:comment "The primary control channel." .
lv2:Point
a rdfs:Class ,
owl:Class ;
rdfs:label "Point" ;
- 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>
-""" .
+ rdfs:comment "An interesting point in a value range." .
lv2:ScalePoint
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:Point ;
rdfs:label "Scale Point" ;
- rdfs:comment "A single float Point (for control inputs)." .
+ rdfs:comment "A single `float` Point for control inputs." .
lv2:scalePoint
a rdf:Property ,
@@ -646,137 +291,75 @@ lv2:default
owl:DatatypeProperty ,
owl:FunctionalProperty ;
rdfs:label "default" ;
- rdfs:comment "The default value that the host SHOULD set this port to when there is no other information available." .
+ rdfs:comment "The default value for this control." .
lv2:minimum
a rdf:Property ,
owl:DatatypeProperty ,
owl:FunctionalProperty ;
rdfs:label "minimum" ;
- 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>
-""" .
+ rdfs:comment "The minimum value for this control." .
lv2:maximum
a rdf:Property ,
owl:DatatypeProperty ,
owl:FunctionalProperty ;
rdfs:label "maximum" ;
- 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>
-""" .
+ rdfs:comment "The maximum value for this control." .
lv2:Feature
a rdfs:Class ,
owl:Class ;
rdfs:label "Feature" ;
- rdfs:comment "An additional feature which a plugin or other resource may use or require." .
+ rdfs:comment "An additional feature which may be used or required." .
lv2:optionalFeature
a rdf:Property ,
owl:ObjectProperty ;
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>
-""" .
+ rdfs:comment "An optional feature that is supported if available." .
lv2:requiredFeature
a rdf:Property ,
owl:ObjectProperty ;
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>
-""" .
+ rdfs:comment "A required feature that must be available to run." .
lv2:ExtensionData
a rdfs:Class ,
owl:Class ;
rdfs:label "Extension Data" ;
- lv2:documentation """
-<p>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.</p>
-""" .
+ rdfs:comment "Additional data defined by an extension." .
lv2:extensionData
a rdf:Property ,
owl:ObjectProperty ;
rdfs:range lv2:ExtensionData ;
rdfs:label "extension data" ;
- lv2:documentation """
-<p>Signifies that a plugin provides additional data or functions (as defined by
-some extension) via LV2_Descriptor::instantiate().</p>
-""" .
+ rdfs:comment "Extension data provided by a plugin or other binary." .
lv2:isLive
a lv2:Feature ;
rdfs:label "is live" ;
- 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>
-""" .
+ rdfs:comment "Plugin has a real-time dependency." .
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>
-""" .
+ rdfs:comment "Plugin requires separate locations for input and output." .
lv2:hardRTCapable
a lv2:Feature ;
rdfs:label "hard real-time 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>
-""" .
+ rdfs:comment "Plugin is capable of running in a hard real-time environment." .
lv2:PortProperty
a rdfs:Class ,
owl:Class ;
rdfs:label "Port Property" ;
- rdfs:comment "A property of this port that allows a host to make more sensible decisions (e.g. to provide a better interface)." .
+ rdfs:comment "A particular property that a port has." .
lv2:portProperty
a rdf:Property ,
@@ -784,125 +367,113 @@ lv2:portProperty
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." .
+ rdfs:comment "A property of this port hosts may find useful." .
lv2:connectionOptional
a lv2:PortProperty ;
rdfs:label "connection optional" ;
- 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." .
+ rdfs:comment "The property that this port may be connected to NULL." .
lv2:reportsLatency
a lv2:PortProperty ;
+ owl:deprecated "true"^^xsd:boolean ;
rdfs:label "reports latency" ;
- 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>
-""" .
+ rdfs:comment "Control port value is the plugin latency in frames." .
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>
-""" .
+ rdfs:comment "Control port value is considered a boolean toggle." .
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." .
+ rdfs:comment "Control port bounds are interpreted as multiples of the sample rate." .
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.""" .
+ rdfs:comment "Control port values are treated as integers." .
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).""" .
+ rdfs:comment "Control port scale points represent all useful values." .
lv2:isSideChain
a lv2:PortProperty ;
rdfs:label "is side-chain" ;
- rdfs:comment """Indicates that a port is a "sidechain", which affects the output somehow but should not be considered a main input. Sidechain ports should be connectionOptional, and may be ignored by hosts.""" .
+ rdfs:comment "Signal for port should not be considered a main input or output." .
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." .
+ rdfs:label "Generator Plugin" ;
+ rdfs:comment "A plugin that generates new sound internally." .
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." .
+ rdfs:label "Instrument Plugin" ;
+ rdfs:comment "A plugin intended to be played as a musical instrument." .
lv2:OscillatorPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:GeneratorPlugin ;
- rdfs:label "Oscillator" .
+ rdfs:label "Oscillator Plugin" ;
+ rdfs:comment "A plugin that generates output with an 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." .
+ rdfs:label "Utility Plugin" ;
+ rdfs:comment "A utility plugin that is not a typical audio effect or generator." .
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." .
+ rdfs:label "Converter Plugin" ;
+ rdfs:comment "A plugin that converts its input into a different form." .
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." .
+ rdfs:label "Analyser Plugin" ;
+ rdfs:comment "A plugin that analyses its input and emits 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." .
+ rdfs:label "Mixer Plugin" ;
+ rdfs:comment "A plugin that 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." .
+ rdfs:label "Simulator Plugin" ;
+ rdfs:comment "A plugin that aims to emulate 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." .
+ rdfs:label "Delay Plugin" ;
+ rdfs:comment "An effect that intentionally delays its input as an effect." .
lv2:ModulatorPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:Plugin ;
- rdfs:label "Modulator" .
+ rdfs:label "Modulator Plugin" ;
+ rdfs:comment "An effect that modulats its input as an effect." .
lv2:ReverbPlugin
a rdfs:Class ,
@@ -910,171 +481,195 @@ lv2:ReverbPlugin
rdfs:subClassOf lv2:Plugin ,
lv2:SimulatorPlugin ,
lv2:DelayPlugin ;
- rdfs:label "Reverb" .
+ rdfs:label "Reverb Plugin" ;
+ rdfs:comment "An effect that adds reverberation to its input." .
lv2:PhaserPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:ModulatorPlugin ;
- rdfs:label "Phaser" .
+ rdfs:label "Phaser Plugin" ;
+ rdfs:comment "An effect that periodically sweeps a filter over its input." .
lv2:FlangerPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:ModulatorPlugin ;
- rdfs:label "Flanger" .
+ rdfs:label "Flanger Plugin" ;
+ rdfs:comment "An effect that mixes slightly delayed copies of its input." .
lv2:ChorusPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:ModulatorPlugin ;
- rdfs:label "Chorus" .
+ rdfs:label "Chorus Plugin" ;
+ rdfs:comment "An effect that mixes significantly delayed copies of its input." .
lv2:FilterPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:Plugin ;
- rdfs:label "Filter" .
+ rdfs:label "Filter Plugin" ;
+ rdfs:comment "An effect that manipulates the frequency spectrum of its input." .
lv2:LowpassPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
- rdfs:label "Lowpass" .
+ rdfs:label "Lowpass Filter Plugin" ;
+ rdfs:comment "A filter that attenuates frequencies above some cutoff." .
lv2:BandpassPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
- rdfs:label "Bandpass" .
+ rdfs:label "Bandpass Filter Plugin" ;
+ rdfs:comment "A filter that attenuates frequencies outside of some band." .
lv2:HighpassPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
- rdfs:label "Highpass" .
+ rdfs:label "Highpass Filter Plugin" ;
+ rdfs:comment "A filter that attenuates frequencies below some cutoff." .
lv2:CombPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
- rdfs:label "Comb" .
+ rdfs:label "Comb FilterPlugin" ;
+ rdfs:comment "A filter that adds a delayed version of its input to itself." .
lv2:AllpassPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
- rdfs:label "Allpass" .
+ rdfs:label "Allpass Plugin" ;
+ rdfs:comment "A filter that changes the phase relationship between frequency components." .
lv2:EQPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
- rdfs:label "Equaliser" .
+ rdfs:label "Equaliser Plugin" ;
+ rdfs:comment "A plugin that adjusts the balance between frequency components." .
lv2:ParaEQPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:EQPlugin ;
- rdfs:label "Parametric" .
+ rdfs:label "Parametric EQ Plugin" ;
+ rdfs:comment "A plugin that adjusts the balance between configurable frequency components." .
lv2:MultiEQPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:EQPlugin ;
- rdfs:label "Multiband" .
+ rdfs:label "Multiband EQ Plugin" ;
+ rdfs:comment "A plugin that adjusts the balance between a fixed set of frequency components." .
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.).""" .
+ rdfs:label "Spatial Plugin" ;
+ rdfs:comment "A plugin that manipulates the position of audio in space." .
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." .
+ rdfs:label "Spectral Plugin" ;
+ rdfs:comment "A plugin that alters the spectral properties of audio." .
lv2:PitchPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:SpectralPlugin ;
- rdfs:label "Pitch Shifter" .
+ rdfs:label "Pitch Shifter Plugin" ;
+ rdfs:comment "A plugin that shifts the pitch of its input." .
lv2:AmplifierPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
- rdfs:label "Amplifier" .
+ rdfs:label "Amplifier Plugin" ;
+ rdfs:comment "A plugin that primarily changes the volume of its input." .
lv2:EnvelopePlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
- rdfs:label "Envelope" .
+ rdfs:label "Envelope Plugin" ;
+ rdfs:comment "A plugin that applies an envelope to its input." .
lv2:DistortionPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:Plugin ;
- rdfs:label "Distortion" .
+ rdfs:label "Distortion Plugin" ;
+ rdfs:comment "A plugin that adds distortion to its input." .
lv2:WaveshaperPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:DistortionPlugin ;
- rdfs:label "Waveshaper" .
+ rdfs:label "Waveshaper Plugin" ;
+ rdfs:comment "An effect that alters the shape of input waveforms." .
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." .
+ rdfs:label "Dynamics Plugin" ;
+ rdfs:comment "A plugin that alters the envelope or dynamic range of its input." .
lv2:CompressorPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
- rdfs:label "Compressor" .
+ rdfs:label "Compressor Plugin" ;
+ rdfs:comment "A plugin that reduces the dynamic range of its input." .
lv2:ExpanderPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
- rdfs:label "Expander" .
+ rdfs:label "Expander Plugin" ;
+ rdfs:comment "A plugin that expands the dynamic range of its input." .
lv2:LimiterPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
- rdfs:label "Limiter" .
+ rdfs:label "Limiter Plugin" ;
+ rdfs:comment "A plugin that limits its input to some maximum level." .
lv2:GatePlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
- rdfs:label "Gate" .
+ rdfs:label "Gate Plugin" ;
+ rdfs:comment "A plugin that attenuates signals below some threshold." .
lv2:FunctionPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:UtilityPlugin ;
- rdfs:label "Function" .
+ rdfs:label "Function Plugin" ;
+ rdfs:comment "A plugin whose output is a mathmatical function of its input." .
lv2:ConstantPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:GeneratorPlugin ;
- rdfs:label "Constant" .
+ rdfs:label "Constant Plugin" ;
+ rdfs:comment "A plugin that emits constant values." .
lv2:MIDIPlugin
a rdfs:Class ,
owl:Class ;
rdfs:subClassOf lv2:Plugin ;
- rdfs:label "MIDI" .
+ rdfs:label "MIDI Plugin" ;
+ rdfs:comment "A plugin that primarily processes MIDI messages." .
diff --git a/lv2/core/meta.ttl b/lv2/core/meta.ttl
index 836e7db..930e404 100644
--- a/lv2/core/meta.ttl
+++ b/lv2/core/meta.ttl
@@ -15,9 +15,11 @@ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH R
<http://lv2plug.in/ns/lv2>
a doap:Project ;
lv2:symbol "lv2" ;
+ rdfs:label "LV2" ;
+ rdfs:comment "The LV2 Plugin Interface Project." ;
doap:name "LV2" ;
doap:license <http://opensource.org/licenses/isc> ;
- doap:shortdesc "The LV2 Plugin Interface Project" ;
+ doap:shortdesc "The LV2 Plugin Interface Project." ;
doap:description "LV2 is a plugin standard for audio systems. It defines a minimal yet extensible C API for plugin code and a format for plugin bundles" ;
doap:created "2006-05-10" ;
doap:homepage <http://lv2plug.in/> ;