# This document describes LV2, a plugin interface. # See 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: . @prefix foaf: . @prefix lv2: . @prefix owl: . @prefix rdf: . @prefix rdfs: . @prefix xsd: . ########################### ## 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 """ An LV2 specification (i.e. this specification, or an LV2 extension). Specification data, like plugin data, is distributed in bundles so hosts may discover all present LV2 data. """ . lv2:documentation a rdf:Property , owl:AnnotationProperty ; rdfs:range rdfs:Literal ; rdfs:label "documentation" ; rdfs:seeAlso ; lv2:documentation """

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 a <div> 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.

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 XHTML Basic, Section 3 for a list of legal tags.

""" . a lv2:Specification , owl:Ontology , doap:Project ; owl:imports , ; doap:license ; doap:name "LV2" ; doap:homepage ; doap:created "2004-04-21" ; doap:shortdesc "An audio plugin interface specification" ; doap:programming-language "C" ; doap:release [ doap:revision "4.0" ; doap:created "2011-03-18" ] ; doap:maintainer [ a foaf:Person ; foaf:name "Steve Harris" ; foaf:homepage ; rdfs:seeAlso ] , [ a foaf:Person ; foaf:name "David Robillard" ; foaf:homepage ; rdfs:seeAlso ] ; lv2:documentation """

Overview

LV2 is an interface for writing audio processors, or plugins, in C/C++ which can be dynamically loaded into many applications, or hosts. This core specification is simple and minimal, but is designed so that extensions can be defined to add more advanced features, making it possibly to implement nearly any feature imaginable.

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. Code, data, and any other resources (e.g. waveforms) are shipped together in a bundle directory. The code contains only the executable portions of the plugin which inherently must 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.

An LV2 plugin library is suitable for dynamic loading (e.g. via dlopen()) and provides one or more plugin descriptors via the lv2_descriptor() function. 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 a plugin's run() method to process blocks of data.

This core specification defines two types of port, equivalent to those in LADSPA: lv2:ControlPort and lv2:AudioPort. 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_Descriptor::extension_data() LV2_Descriptor::cleanup() LV2_Descriptor::connect_port()
LV2_Descriptor::activate()
LV2_Descriptor::deactivate()

The rules that hosts MUST follow are:

  • When any function is running for a plugin instance, no other function in the same class may run for that instance.
  • When a Discovery function is running, no other functions in the same shared object file may run.
  • When an Instantiation function is running for a plugin instance, no other functions for that instance may run.

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 plugin or host code, e.g. 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.

""" . ############ ## Plugin ## ############ lv2:PluginBase a rdfs:Class , owl:Class ; rdfs:subClassOf lv2:Resource ; lv2:documentation """

An abstract plugin-like resource that MAY not actually be an LV2 plugin (e.g. may not actually have a plugin binary).

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 understand this structure.

""" . 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 """

The class which represents an LV2 plugin.

To be discovered by hosts, plugins MUST explicitly have rdf:type lv2:Plugin listed in their bundle's manifest, e.g.:

<http://example.org/my-plugin> a lv2:Plugin .

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. Tape Delay Unit. Use doap:shortdesc or doap:description for more detailed descriptions.

""" . ########## ## 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 """

The class which represents an LV2 port.

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).

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 connect 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).

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).

""" . 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 """

Ports of this type will be connected to a pointer to a single value of C type float.

""" . lv2:AudioPort a rdfs:Class , owl:Class ; rdfs:subClassOf lv2:Port ; rdfs:label "Audio port" ; lv2:documentation """

Ports of this type will be connected to an array of length sample_count with elements of C type float.

""" . ####################### ## 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 """

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.

The version of an LV2 resource is composed of two fields: minor version, and micro version. These have the usual semantics:

  • 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.
  • The micro version is incremented for changes which do not affect compatibility at all, e.g. bug fixes or documentation updates.

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. SemVer conformant) version number is required, the major version of all released LV2 resources is 1.

Plugins and extensions MUST adhere to the following rules:

  • All versions of a plugin with a given URI MUST have the same 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.
  • 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 an extension MUST be compatible in the sense that an implementation of the new version can interoperate with an implementation of any previous version.

(Note these rules are not necessarily exhaustive)

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 instance at run-time).

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 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.

This property describes half of a resource version. See also lv2:minorVersion, the property which describes the other half.

""" . lv2:microVersion a rdf:Property , owl:DatatypeProperty ; rdfs:domain lv2:Resource ; rdfs:range xsd:nonNegativeInteger ; rdfs:label "micro version" ; lv2:documentation """

The micro component of a Resource's version.

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:binary a rdf:Property , owl:ObjectProperty ; rdfs:domain lv2:Resource ; rdfs:range owl:Thing ; rdfs:label "binary" ; lv2:documentation """

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).

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 lv2_descriptor() 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.

""" . lv2:appliesTo a rdf:Property , owl:ObjectProperty ; rdfs:domain lv2:Resource ; rdfs:range lv2:Plugin ; rdfs:label "Applies to" ; lv2:documentation """

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.:

<thing>
    a             ext:Thing ;
    lv2:appliesTo <plugin> ;
    rdfs:seeAlso  <thing.ttl> .

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.

""" . ##################### ## 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 """

A Point describes an interesting value in a Port's range (much like a labeled notch on a physical knob).

  • 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: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 """ A hint to the host for the minimum useful value that the port will use. This is a soft limit; the plugin is required to gracefully accept all values in the range of a port's data type. """ . lv2:maximum a rdf:Property , owl:DatatypeProperty ; rdfs:domain lv2:Port ; rdfs:label "Maximum value" ; lv2:documentation """

A hint to the host for the maximum useful value that the port will use. This is a soft limit; the plugin is required to gracefully accept all values in the range of a port's data type.

""" . ############# ## 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 """

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.

""" . lv2:requiredFeature a rdf:Property , owl:ObjectProperty ; rdfs:domain lv2:Resource ; rdfs:range lv2:Feature ; rdfs:label "Required feature" ; lv2:documentation """

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).

""" . #################### ## 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 """

Signifies that a plugin provides additional data or functions (as defined by some extension) via LV2:Descriptor::instantiate().

""" . ####################### ## Standard Features ## ####################### lv2:isLive a lv2:Feature ; rdfs:label "Has a live (realtime) dependency" ; lv2:documentation """

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 hard real-time execution requirements (see lv2:hardRTCapable).

""" . lv2:inPlaceBroken a lv2:Feature ; rdfs:label "In-place broken" ; lv2:documentation """

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 in-place.

""" . lv2:hardRTCapable a lv2:Feature ; rdfs:label "Hard realtime capable" ; lv2:documentation """

Indicates that the plugin is capable of running not only in a conventional host but also in a hard real-time environment. To qualify for this the plugin MUST satisfy all of the following:

  1. The plugin MUST NOT use malloc(), free() or other heap memory management functions within its Audio class functions.
  2. 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.
  3. 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.
  4. The plugin will take an amount of time to execute a run() call approximately of form A + B * sample_count where A and B depend on the machine and host in use. This amount of time MUST NOT depend on input signals or plugin state.

Note these rules apply to the connect_port() function as well as run().

""" . ################## ## 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 """

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 correct latency. In fuzzy 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).

""" . lv2:toggled a lv2:PortProperty ; rdfs:label "Toggled" ; lv2:documentation """

Indicates that the data item should be considered a Boolean toggle. Data less than or equal to zero should be considered off or false, and data above zero should be considered on or true.

""" . 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" .