# RDF Schema for LV2 plugins # *** PROVISIONAL Revision 1.0beta7 (2007-11-14) *** # # This document describes the classes and properties that are defined by the # core LV2 specification. See for more information. # # Copyright (C) 2006-2007 Steve Harris, Dave Robillard # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. @prefix : . @prefix rdf: . @prefix rdfs: . @prefix xsd: . @prefix doap: . @prefix foaf: . :Specification a rdfs:Class ; rdfs:comment """ An LV2 specification (ie this specification, or an LV2 extension). Specification data, like plugins, is distributed in standardized bundles so hosts may discover all present LV2 data. See http://lv2plug.in/docs for more details. """ . <> a doap:Project ; a :Specification ; doap:license ; doap:name "LV2" ; doap:homepage ; doap:created "2004-04-21" ; doap:shortdesc "An audio processing plugin specification" ; doap:programming-language "C" ; doap:release [ doap:revision "1.0beta7" ; doap:created "2007-11-14" ] ; doap:maintainer [ a foaf:Person ; foaf:name "Steve Harris" ; foaf:homepage ; rdfs:seeAlso ] , [ a foaf:Person ; foaf:name "Dave Robillard" ; foaf:homepage ; rdfs:seeAlso ]. ################## ## Plugin Class ## ################## :Plugin a rdfs:Class ; rdfs:label "Plugin" ; rdfs:comment """ The class which represents an LV2 plugin. To be used by a host a Plugin must have at least the following properties: rdf:type (with object :Plugin) doap:name (one without language tag) doap:license :port 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 Classes ## ################## :Port a rdfs:Class ; rdfs:label "Port" ; rdfs:comment """ The class which represents an LV2 port. In order for it to be used by a host it must have at least the following properties: rdf:type (with object one of :Port, :InputPort, :OutputPort) rdf:type (more specific port class, see below) :index :symbol :name All LV2 port descriptions MUST have a property rdf:type where the object is one of :Port :InputPort or :OutputPort. Additionally there MUST be at least one other rdf:type property which more specifically describes type of the port (e.g. :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). """ . :InputPort a rdfs:Class ; rdfs:label "Input port" ; rdfs:subClassOf :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. """ . :OutputPort a rdfs:Class ; rdfs:label "Output port" ; rdfs:subClassOf :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. """ . :ControlPort a rdfs:Class ; rdfs:label "Control port" ; rdfs:subClassOf :Port ; rdfs:comment """ Ports of this type will be connected to a pointer to a single value conforming to the 32bit IEEE-754 floating point specification. """ . :AudioPort a rdfs:Class ; rdfs:label "Audio port" ; rdfs:subClassOf :Port ; rdfs:comment """ Ports of this type will be connected to an array of length SampleCount conforming to the 32bit IEEE-754 floating point specification. """ . ##################################### ## Mandatory Plugin RDF Properties ## ##################################### :port a rdf:Property ; rdfs:domain :Plugin ; rdfs:range :Port ; rdfs:label "port" ; rdfs:comment "Relates a Plugin to the Ports it contains" . #################################### ## Optional Plugin RDF Properties ## #################################### :documentation a rdf:Property ; rdfs:domain :Plugin ; rdfs:label "documentation" ; rdfs:comment "Relates a Plugin to some text/audio/video documentation either online or included with the plugin package" . ################################### ## Mandatory Port RDF Properties ## ################################### :index a rdf:Property ; rdfs:domain :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. This number uniqely identifies the port within the plugin. The plugin author MUST change the plugin URI if a port index is changed. """ . :symbol a rdf:Property ; 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 plugin author MUST change the plugin URI if a port symbol is changed. """ . :name a rdf:Property ; rdfs:domain :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. """ . ################################## ## Optional Port RDF Properties ## ################################## :Point a rdfs:Class ; rdfs:label "Port value point" ; rdfs:comment """ Used to describe interesting values in a Port's range. To be valid it requires two rdf:properties, rdfs:label and rdf:value. There are 3 specially defined Points in the LV2 specification (default, minimum, and maximum), though future extensions may define more. """ . :ScalePoint a rdfs:Class ; rdfs:subClassOf :Point ; rdfs:comment "A single :float Point (for control inputs)" . :scalePoint a rdf:Property ; rdfs:domain :Port ; rdfs:range :ScalePoint ; rdfs:label "Scale point" ; rdfs:comment "Relates a Port to its ScalePoints." . :default a rdf:Property ; rdfs:subPropertyOf :scalePoint ; rdfs:label "Default value" ; rdfs:comment """ The default value that the host SHOULD set this port to when there is no other information available. """ . :minimum a rdf:Property ; rdfs:subPropertyOf :scalePoint ; rdfs:label "Minimum value" ; rdfs:comment """ 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 :float. """ . :maximum a rdf:Property ; rdfs:subPropertyOf :scalePoint ; rdfs:label "Maximum value" ; rdfs:comment """ 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 :float. """ . ############## ## Features ## ############## :Feature a rdfs:Class ; rdfs:label "Feature" ; rdfs:comment "An additional feature which a plugin may use (possibly require).". :optionalFeature a rdf:Property ; rdfs:domain :Plugin ; rdfs:range :Feature ; rdfs:label "Optional feature" ; rdfs:comment """ Signifies that a plugin is able to make use of or provide a certain feature. If the host supports this feature, it MUST pass its URI and any additional data to the plugin in the instantiate() function. The plugin MUST NOT fail to instantiate if an optional feature is not supported by the host.""" . :requiredFeature a rdf:Property ; rdfs:domain :Plugin ; rdfs:range :Feature ; rdfs:label "Required feature" ; rdfs:comment """ Signifies that a plugin requires a certain feature in order to function. If the host supports this feature, it MUST pass its URI and any additional data to the plugin in the instantiate() function. 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). """ . #################### ## PortProperties ## #################### :PortProperty a rdfs:Class ; rdfs:label "Port property" ; rdfs:comment """ A port propety - a useful piece of information that allows a host to make more sensible decisions (e.g. to provide a better interface). """ . :portProperty a rdf:Property ; rdfs:domain :Port ; rdfs:range :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 Features ## ####################### :isLive a :Feature ; rdfs:label "Has a live (realtime) dependency" ; rdfs:comment """ 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. """ . :inPlaceBroken a :Feature ; rdfs:label "in-place broken" ; rdfs:comment """ 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 buffer is set to the same location as ANY output buffer (with connect_port()) MUST require this Feature. Doing so should be avoided as it makes it impossible for hosts to use the plugin to process audio "in-place". """ . :hardRTCapable a :Feature ; rdfs:label "Hard realtime capable" ; rdfs:comment """ 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 within its Audio class functions. All new memory used in Audio class functions must be managed via the stack. These restrictions only apply to the Audio class functions. (2) The plugin will not attempt to make use of any library functions in its Audio class functions, with the exceptions of functions in the ANSI standard C and C maths libraries, which the host is expected to provide. (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*SampleCount) where A and B depend on the machine and host in use. This amount of time may not depend on input signals or plugin state. The host is left the responsibility to perform timings to estimate upper bounds for A and B. The plugin will also take an approximately constant amount of time to execute a connect_port() call. """ . ############################# ## Standard PortProperties ## ############################# :connectionOptional a :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. """ . :reportsLatency a :PortProperty ; rdfs:label "Latency reporting port" ; rdfs:comment """ 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). """. :toggled a :PortProperty ; rdfs:label "Toggled" ; rdfs:comment """ 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". """ . :sampleRate a :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 :minimum 0.0 and :maximum 0.5. Hosts that support bounds at all must support this property to retain meaning. """ . :integer a :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. """ . #################### ## Plugin Classes ## #################### :GeneratorPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:label "Generator" ; rdfs:comment """ Any plugin that generates sound internally, rather than processing its input. """ . :InstrumentPlugin a rdfs:Class ; rdfs:subClassOf :GeneratorPlugin ; rdfs:label "Instrument" ; rdfs:comment """ Any plugin that is intended to be played as a musical instrument. """ . :OscillatorPlugin a rdfs:Class ; rdfs:subClassOf :GeneratorPlugin ; rdfs:label "Oscillator" . :UtilityPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:label "Utility" ; rdfs:comment """ Includes things like mathematical functions and non-musical delays. """ . :ConverterPlugin a rdfs:Class ; rdfs:subClassOf :UtilityPlugin ; rdfs:label "Converter" ; rdfs:comment """ Any plugin that converts some form of input into a different form of output. """ . :AnalyserPlugin a rdfs:Class ; rdfs:subClassOf :UtilityPlugin ; rdfs:label "Analyser" ; rdfs:comment """ Any plugin that analyses input to output some useful information. """ . :MixerPlugin a rdfs:Class ; rdfs:subClassOf :UtilityPlugin ; rdfs:label "Mixer" ; rdfs:comment """ A plugin which mixes some number of inputs into some number of outputs. """ . :SimulatorPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:label "Simulator" ; rdfs:comment """ Plugins that aim to duplicate the effect of some environmental effect or musical equipment. """ . :DelayPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:label "Delay" ; rdfs:comment """ Plugins that intentionally delay their input signal as an effect. """ . :ModulatorPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:label "Modulator" . :ReverbPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:subClassOf :SimulatorPlugin ; rdfs:subClassOf :DelayPlugin ; rdfs:label "Reverb" . :PhaserPlugin a rdfs:Class ; rdfs:subClassOf :ModulatorPlugin ; rdfs:label "Phaser" . :FlangerPlugin a rdfs:Class ; rdfs:subClassOf :ModulatorPlugin ; rdfs:label "Flanger" . :ChorusPlugin a rdfs:Class ; rdfs:subClassOf :ModulatorPlugin ; rdfs:label "Chorus" . :FilterPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:label "Filter" . :LowpassPlugin a rdfs:Class ; rdfs:subClassOf :FilterPlugin ; rdfs:label "Lowpass" . :BandpassPlugin a rdfs:Class ; rdfs:subClassOf :FilterPlugin ; rdfs:label "Bandpass" . :HighpassPlugin a rdfs:Class ; rdfs:subClassOf :FilterPlugin ; rdfs:label "Highpass" . :CombPlugin a rdfs:Class ; rdfs:subClassOf :FilterPlugin ; rdfs:label "Comb" . :AllpassPlugin a rdfs:Class ; rdfs:subClassOf :FilterPlugin ; rdfs:label "Allpass" . :EQPlugin a rdfs:Class ; rdfs:subClassOf :FilterPlugin ; rdfs:label "Equaliser" . :ParaEQPlugin a rdfs:Class ; rdfs:subClassOf :EQPlugin ; rdfs:label "Parametric" . :MultiEQPlugin a rdfs:Class ; rdfs:subClassOf :EQPlugin ; rdfs:label "Multiband" . :SpectralPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:label "Spectral Processor" . :PitchPlugin a rdfs:Class ; rdfs:subClassOf :SpectralPlugin ; rdfs:label "Pitch Shifter" . :AmplifierPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:label "Amplifier" . :DistortionPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:label "Distortion" . :WaveshaperPlugin a rdfs:Class ; rdfs:subClassOf :DistortionPlugin ; rdfs:label "Waveshaper" . :DynamicsPlugin a rdfs:Class ; rdfs:subClassOf :Plugin ; rdfs:label "Dynamics Processor" ; rdfs:comment """ Plugins that alter the envelope or dynamic range of the processed audio. """ . :CompressorPlugin a rdfs:Class ; rdfs:subClassOf :DynamicsPlugin ; rdfs:label "Compressor" . :ExpanderPlugin a rdfs:Class ; rdfs:subClassOf :DynamicsPlugin ; rdfs:label "Expander" . :LimiterPlugin a rdfs:Class ; rdfs:subClassOf :DynamicsPlugin ; rdfs:label "Limiter" . :GatePlugin a rdfs:Class ; rdfs:subClassOf :DynamicsPlugin ; rdfs:label "Gate" .