1@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
2@prefix dcs: <http://ontologi.es/doap-changeset#> .
3@prefix doap: <http://usefulinc.com/ns/doap#> .
4@prefix foaf: <http://xmlns.com/foaf/0.1/> .
5@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
6
7<http://lv2plug.in/ns/lv2core>
8	a doap:Project ;
9	doap:license <http://opensource.org/licenses/isc> ;
10	doap:name "LV2" ;
11	doap:homepage <http://lv2plug.in> ;
12	doap:created "2004-04-21" ;
13	doap:shortdesc "An extensible open standard for audio plugins" ;
14	doap:programming-language "C" ;
15	doap:developer <http://plugin.org.uk/swh.xrdf#me> ,
16		<http://drobilla.net/drobilla#me> ;
17	doap:maintainer <http://drobilla.net/drobilla#me> ;
18	doap:release [
19		doap:revision "18.0" ;
20		doap:created "2020-04-26" ;
21		doap:file-release <http://lv2plug.in/spec/lv2-1.18.0.tar.bz2> ;
22		dcs:blame <http://drobilla.net/drobilla#me> ;
23		dcs:changeset [
24			dcs:item [
25				rdfs:label "Add lv2:Markdown datatype."
26			] , [
27				rdfs:label "Deprecate lv2:reportsLatency."
28			]
29		]
30	] , [
31		doap:revision "16.0" ;
32		doap:created "2019-02-03" ;
33		doap:file-release <http://lv2plug.in/spec/lv2-1.16.0.tar.bz2> ;
34		dcs:blame <http://drobilla.net/drobilla#me> ;
35		dcs:changeset [
36			dcs:item [
37				rdfs:label "Add lv2:MIDIPlugin class."
38			] , [
39				rdfs:label "Rework port restrictions so that presets can be validated."
40			]
41		]
42	] , [
43		doap:revision "14.0" ;
44		doap:created "2016-09-18" ;
45		doap:file-release <http://lv2plug.in/spec/lv2-1.14.0.tar.bz2> ;
46		dcs:blame <http://drobilla.net/drobilla#me> ;
47		dcs:changeset [
48			dcs:item [
49				rdfs:label "Add lv2_util.h with lv2_features_data() and lv2_features_query()."
50			] , [
51				rdfs:label "Add lv2:enabled designation."
52			]
53		]
54	] , [
55		doap:revision "12.4" ;
56		doap:created "2015-04-07" ;
57		doap:file-release <http://lv2plug.in/spec/lv2-1.12.0.tar.bz2> ;
58		dcs:blame <http://drobilla.net/drobilla#me> ;
59		dcs:changeset [
60			dcs:item [
61				rdfs:label "Relax domain of lv2:minimum lv2:maximum and lv2:default so they can be used to describe properties/parameters as well."
62			] , [
63				rdfs:label "Add extern C and visibility attribute to LV2_SYMBOL_EXPORT."
64			] , [
65				rdfs:label "Add lv2:isSideChain port property."
66			]
67		]
68	] , [
69		doap:revision "12.2" ;
70		doap:created "2014-08-08" ;
71		doap:file-release <http://lv2plug.in/spec/lv2-1.10.0.tar.bz2> ;
72		dcs:blame <http://drobilla.net/drobilla#me> ;
73		dcs:changeset [
74			dcs:item [
75				rdfs:label "Clarify lv2_descriptor() and lv2_lib_descriptor() documentation."
76			]
77		]
78	] , [
79		doap:revision "12.0" ;
80		doap:created "2014-01-04" ;
81		doap:file-release <http://lv2plug.in/spec/lv2-1.8.0.tar.bz2> ;
82		dcs:blame <http://drobilla.net/drobilla#me> ;
83		dcs:changeset [
84			dcs:item [
85				rdfs:label "Add lv2:prototype for property inheritance."
86			]
87		]
88	] , [
89		doap:revision "10.0" ;
90		doap:created "2013-02-17" ;
91		doap:file-release <http://lv2plug.in/spec/lv2-1.4.0.tar.bz2> ;
92		dcs:blame <http://drobilla.net/drobilla#me> ;
93		dcs:changeset [
94			dcs:item [
95				rdfs:label "Add lv2:EnvelopePlugin class."
96			] , [
97				rdfs:label "Add lv2:control for designating primary event-based control ports."
98			] , [
99				rdfs:label "Set range of lv2:designation to lv2:Designation."
100			] , [
101				rdfs:label "Make lv2:Parameter rdfs:subClassOf rdf:Property."
102			] , [
103				rdfs:label "Reserve minor version 0 for unstable development plugins."
104			]
105		]
106	] , [
107		doap:revision "8.2" ;
108		doap:created "2012-10-14" ;
109		doap:file-release <http://lv2plug.in/spec/lv2-1.2.0.tar.bz2> ;
110		dcs:blame <http://drobilla.net/drobilla#me> ;
111		dcs:changeset [
112			dcs:item [
113				rdfs:label "Use consistent label style."
114			]
115		]
116	] , [
117		doap:revision "8.0" ;
118		doap:created "2012-04-17" ;
119		doap:file-release <http://lv2plug.in/spec/lv2-1.0.0.tar.bz2> ;
120		dcs:blame <http://drobilla.net/drobilla#me> ;
121		dcs:changeset [
122			dcs:item [
123				rdfs:label "Fix LV2_SYMBOL_EXPORT and lv2_descriptor prototype for Windows."
124			] , [
125				rdfs:label "Add metadata concept of a designation, a channel or parameter description which can be assigned to ports for more intelligent use by hosts."
126			] , [
127				rdfs:label "Add new discovery API which allows libraries to read bundle files during discovery, makes library construction/destruction explicit, and adds extensibility to prevent future breakage."
128			] , [
129				rdfs:label "Relax the range of lv2:index so it can be used for things other than ports."
130			] , [
131				rdfs:label "Remove lv2:Resource, which turned out to be meaningless."
132			] , [
133				rdfs:label "Add lv2:CVPort."
134			] , [
135				rdfs:label "Merge with unified LV2 package."
136			]
137		]
138	] , [
139		doap:revision "6.0" ;
140		doap:created "2011-11-21" ;
141		doap:file-release <http://lv2plug.in/spec/lv2core-6.0.tar.bz2> ;
142		dcs:blame <http://drobilla.net/drobilla#me> ;
143		dcs:changeset [
144			dcs:item [
145				rdfs:label "Rename core.lv2 and lv2.ttl to lv2core.lv2 and lv2core.ttl to adhere to modern conventions."
146			] , [
147				rdfs:label "Add lv2:extensionData and lv2:ExtensionData for plugins to indicate that they support some URI for extension_data()."
148			] , [
149				rdfs:label "Remove lv2config in favour of the simple convention that specifications install headers to standard URI-based paths."
150			] , [
151				rdfs:label "Switch to the ISC license, a simple BSD-style license (with permission of all contributors to lv2.h and its ancestor, ladspa.h)."
152			] , [
153				rdfs:label "Make lv2core.ttl a valid OWL 2 DL ontology."
154			] , [
155				rdfs:label "Improve documentation."
156			]
157		]
158	] , [
159		doap:revision "4.0" ;
160		doap:created "2011-03-18" ;
161		doap:file-release <http://lv2plug.in/spec/lv2core-4.0.tar.bz2> ;
162		dcs:blame <http://drobilla.net/drobilla#me> ;
163		dcs:changeset [
164			dcs:item [
165				rdfs:label "Make doap:license suggested, but not required (for wrappers)."
166			] , [
167				rdfs:label "Define lv2:binary (MUST be in manifest.ttl)."
168			] , [
169				rdfs:label "Define lv2:minorVersion and lv2:microVersion (MUST be in manifest.ttl)."
170			] , [
171				rdfs:label "Define lv2:documentation and use it to document lv2core."
172			] , [
173				rdfs:label "Add lv2:FunctionPlugin and lv2:ConstantPlugin classes."
174			] , [
175				rdfs:label "Move lv2:AmplifierPlugin under lv2:DynamicsPlugin."
176			] , [
177				rdfs:label "Loosen domain of lv2:optionalFeature and lv2:requiredFeature (to allow re-use in extensions)."
178			] , [
179				rdfs:label "Add generic lv2:Resource and lv2:PluginBase classes."
180			] , [
181				rdfs:label "Fix definition of lv2:minimum etc. (used for values, not scale points)."
182			] , [
183				rdfs:label "More precisely define properties with OWL."
184			] , [
185				rdfs:label "Move project metadata to manifest."
186			] , [
187				rdfs:label "Add lv2:enumeration port property."
188			] , [
189				rdfs:label "Define run() pre-roll special case (sample_count == 0)."
190			]
191		]
192	] , [
193		doap:revision "3.0" ;
194		doap:created "2008-11-08" ;
195		doap:file-release <http://lv2plug.in/spec/lv2core-3.0.tar.bz2> ;
196		dcs:blame <http://drobilla.net/drobilla#me> ;
197		dcs:changeset [
198			dcs:item [
199				rdfs:label "Require that serialisations refer to ports by symbol rather than index."
200			] , [
201				rdfs:label "Minor stylistic changes to lv2.ttl."
202			] , [
203				rdfs:label "No header changes."
204			]
205		]
206	] , [
207		doap:revision "2.0" ;
208		doap:created "2008-02-10" ;
209		doap:file-release <http://lv2plug.in/spec/lv2core-2.0.tar.gz> ;
210		dcs:blame <http://drobilla.net/drobilla#me> ;
211		dcs:changeset [
212			dcs:item [
213				rdfs:label "Initial release."
214			]
215		]
216	] ;
217	lv2:documentation """
218
219LV2 is an interface for writing audio plugins in C or compatible languages,
220which can be dynamically loaded into many _host_ applications.  This core
221specification is simple and minimal, but is designed so that _extensions_ can
222be defined to add more advanced features, making it possible to implement
223nearly any feature.
224
225LV2 maintains a strong distinction between code and data.  Plugin code is in a
226shared library, while data is in a companion data file written in
227[Turtle](https://www.w3.org/TR/turtle/).  Code, data, and any other resources
228(such as waveforms) are shipped together in a bundle directory.  The code
229contains only the executable portions of the plugin.  All other data is
230provided in the data file(s).  This makes plugin data flexible and extensible,
231and allows the host to do everything but run the plugin without loading or
232executing any code.  Among other advantages, this makes hosts more robust
233(broken plugins can't crash a host during discovery) and allows generic tools
234written in any language to work with LV2 data.  The LV2 specification itself is
235distributed in a similar way.
236
237An LV2 plugin library is suitable for dynamic loading (for example with
238`dlopen()`) and provides one or more plugin descriptors via `lv2_descriptor()`
239or `lv2_lib_descriptor()`.  These can be instantiated to create plugin
240instances, which can be run directly on data or connected together to perform
241advanced signal processing tasks.
242
243Plugins communicate via _ports_, which can transmit any type of data.  Data is
244processed by first connecting each port to a buffer, then repeatedly calling
245the `run()` method to process blocks of data.
246
247This core specification defines two types of port, equivalent to those in
248[LADSPA](http://www.ladspa.org/), lv2:ControlPort and lv2:AudioPort, as well as
249lv2:CVPort which has the same format as an audio port but is interpreted as
250non-audible control data.  Audio ports contain arrays with one `float` element
251per sample, allowing a block of audio to be processed in a single call to
252`run()`.  Control ports contain single `float` values, which are fixed and
253valid for the duration of the call to `run()`.  Thus the _control rate_ is
254determined by the block size, which is controlled by the host (and not
255necessarily constant).
256
257### Threading Rules
258
259To faciliate use in multi-threaded programs, LV2 functions are partitioned into
260several threading classes:
261
262| Discovery Class                  | Instantiation Class           | Audio Class                    |
263|----------------------------------|-------------------------------|------------------------------- |
264| lv2_descriptor()                 | LV2_Descriptor::instantiate() | LV2_Descriptor::run()          |
265| lv2_lib_descriptor()             | LV2_Descriptor::cleanup()     | LV2_Descriptor::connect_port() |
266| LV2_Descriptor::extension_data() | LV2_Descriptor::activate()    |                                |
267|                                  | LV2_Descriptor::deactivate()  |                                |
268
269Hosts MUST guarantee that:
270
271 * A function in any class is never called concurrently with another function
272   in that class.
273
274 * A _Discovery_ function is never called concurrently with any other fuction
275   in the same shared object file.
276
277 * An _Instantiation_ function for an instance is never called concurrently
278   with any other function for that instance.
279
280Any simultaneous calls that are not explicitly forbidden by these rules are
281allowed. For example, a host may call `run()` for two different plugin
282instances simultaneously.
283
284Plugin functions in any class MUST NOT manipulate any state which might affect
285other plugins or the host (beyond the contract of that function), for example
286by using non-reentrant global functions.
287
288Extensions to this specification which add new functions MUST declare in which
289of these classes the functions belong, define new classes for them, or
290otherwise precisely describe their threading rules.
291
292"""^^lv2:Markdown .
293
294lv2:Specification
295	lv2:documentation """
296
297An LV2 specification typically contains a vocabulary description, C headers to
298define an API, and any other resources that may be useful.  Specifications,
299like plugins, are distributed and installed as bundles so that hosts may
300discover them.
301
302"""^^lv2:Markdown .
303
304lv2:Markdown
305	lv2:documentation """
306
307This datatype is typically used for documentation in
308[Markdown](https://daringfireball.net/projects/markdown/syntax) syntax.
309
310Generally, documentation with this datatype should stay as close to readable
311plain text as possible, but may use core Markdown syntax for nicer
312presentation.  Documentation can assume that basic extensions like codehilite
313and tables are available.
314
315"""^^lv2:Markdown .
316
317lv2:documentation
318	lv2:documentation """
319
320Relates a Resource to extended documentation.
321
322LV2 specifications are documented using this property with an lv2:Markdown
323datatype.
324
325If the value has no explicit datatype, it is assumed to be a valid XHTML Basic
3261.1 fragment suitable for use as the content of the `body` element of a page.
327
328XHTML Basic is a W3C Recommendation which defines a simplified subset of XHTML
329intended to be reasonable to implement with limited resources, for exampe on
330embedded devices. See [XHTML Basic, Section
3313](http://www.w3.org/TR/xhtml-basic/#s_xhtmlmodules) for a list of valid tags.
332
333"""^^lv2:Markdown .
334
335lv2:PluginBase
336	lv2:documentation """
337
338An abstract plugin-like resource that may not actually be an LV2 plugin, for
339example that may not have a lv2:binary.  This is useful for describing things
340that share common structure with a plugin, but are not themselves an actul
341plugin, such as presets.
342
343"""^^lv2:Markdown .
344
345lv2:Plugin
346	lv2:documentation """
347
348To be discovered by hosts, plugins MUST explicitly have an rdf:type of lv2:Plugin
349in their bundle's manifest, for example:
350
351    :::turtle
352    <http://example.org/my-plugin> a lv2:Plugin .
353
354Plugins should have a doap:name property that is at most a few words in length
355using title capitalization, for example <q>Tape Delay Unit</q>.
356
357"""^^lv2:Markdown .
358
359lv2:PortBase
360	lv2:documentation """
361
362Similar to lv2:PluginBase, this is an abstract port-like resource that may not
363be a fully specified LV2 port.  For example, this is used for preset "ports"
364which do not specify an index.
365
366"""^^lv2:Markdown .
367
368lv2:Port
369	lv2:documentation """
370
371All LV2 port descriptions MUST have a rdf:type that is one of lv2:Port,
372lv2:InputPort or lv2:OutputPort.  Additionally, there MUST be at least one
373other rdf:type which more precisely describes type of the port, for example
374lv2:AudioPort.
375
376Hosts that do not support a specific port class MUST NOT instantiate the
377plugin, unless that port has the lv2:connectionOptional property set.
378
379A port has two identifiers: a (numeric) index, and a (textual) symbol.  The
380index can be used as an identifier at run-time, but persistent references to
381ports (for example in presets or save files) MUST use the symbol.  Only the
382symbol is guaranteed to refer to the same port on all plugins with a given URI,
383that is the index for a port may differ between plugin binaries.
384
385"""^^lv2:Markdown .
386
387lv2:AudioPort
388	lv2:documentation """
389
390Ports of this type are connected to a buffer of `float` audio samples, which
391the host guarantees have `sample_count` elements in any call to
392LV2_Descriptor::run().
393
394Audio samples are normalized between -1.0 and 1.0, though there is no
395requirement for samples to be strictly within this range.
396
397"""^^lv2:Markdown .
398
399lv2:CVPort
400	lv2:documentation """
401
402Ports of this type have the same buffer format as an lv2:AudioPort, except the
403buffer represents audio-rate control data rather than audio.  Like a
404lv2:ControlPort, a CV port SHOULD have properties describing its value, in
405particular lv2:minimum, lv2:maximum, and lv2:default.
406
407Hosts may present CV ports to users as controls in the same way as control
408ports.  Conceptually, aside from the buffer format, a CV port is the same as a
409control port, so hosts can use all the same properties and expectations.
410
411In particular, this port type does not imply any range, unit, or meaning for
412its values.  However, if there is no inherent unit to the values, for example
413if the port is used to modulate some other value, then plugins SHOULD use a
414normalized range, either from -1.0 to 1.0, or from 0.0 to 1.0.
415
416It is generally safe to connect an audio output to a CV input, but not
417vice-versa.  Hosts must take care to prevent data from a CVPort port from being
418used as audio.
419
420"""^^lv2:Markdown .
421
422lv2:project
423	lv2:documentation """
424
425This property provides a way to group plugins and/or related resources.  A
426project may have useful metadata common to all plugins (such as homepage,
427author, version history) which would be wasteful to list separately for each
428plugin.
429
430Grouping via projects also allows users to find plugins in hosts by project,
431which is often how they are remembered.  For this reason, a project that
432contains plugins SHOULD always have a doap:name.  It is also a good idea for
433each plugin and the project itself to have an lv2:symbol property, which allows
434nice quasi-global identifiers for plugins, for example `myproj.superamp` which
435can be useful for display or fast user entry.
436
437"""^^lv2:Markdown .
438
439lv2:prototype
440	lv2:documentation """
441
442This property can be used to <q>include</q> common properties in several
443descriptions, serving as a sort of template mechanism.  If a plugin has a
444prototype, then the host must load all the properties for the prototype as if
445they were properties of the plugin.  That is, if `:plug lv2:prototype :prot`,
446then for each triple `:prot p o`, the triple `:plug p o` should be loaded.
447
448This facility is useful for distributing data-only plugins that rely on a
449common binary, for example those where the internal state is loaded from some
450other file.  Such plugins can refer to a prototype in a template LV2 bundle
451which is installed by the corresponding software.
452
453"""^^lv2:Markdown .
454
455lv2:minorVersion
456	lv2:documentation """
457
458This, along with lv2:microVersion, is used to distinguish between different
459versions of the <q>same</q> resource, for example to load only the bundle with
460the most recent version of a plugin.  An LV2 version has a minor and micro
461number with the usual semantics:
462
463  * The minor version MUST be incremented when backwards (but not forwards)
464    compatible additions are made, for example the addition of a port to a
465    plugin.
466
467  * The micro version is incremented for changes which do not affect
468    compatibility at all, for example bug fixes or documentation updates.
469
470Note that there is deliberately no major version: all versions with the same
471URI are compatible by definition.  Replacing a resource with a newer version of
472that resource MUST NOT break anything.  If a change violates this rule, then
473the URI of the resource (which serves as the major version) MUST be changed.
474
475Plugins and extensions MUST adhere to at least the following rules:
476
477  * All versions of a plugin with a given URI MUST have the <q>same</q> set of
478    mandatory (not lv2:connectionOptional) ports with respect to lv2:symbol and
479    rdf:type.  In other words, every port on a particular version is guaranteed
480    to exist on a future version with same lv2:symbol and at least those
481    rdf:types.
482
483  * New ports MAY be added without changing the plugin URI if and only if they
484    are lv2:connectionOptional and the minor version is incremented.
485
486  * The minor version MUST be incremented if the index of any port (identified
487    by its symbol) is changed.
488
489  * All versions of a specification MUST be compatible in the sense that an
490    implementation of the new version can interoperate with an implementation
491    of any previous version.
492
493Anything that depends on a specific version of a plugin (including referencing
494ports by index) MUST refer to the plugin by both URI and version.  However,
495implementations should be tolerant where possible.
496
497When hosts discover several installed versions of a resource, they SHOULD warn
498the user and load only the most recent version.
499
500An odd minor _or_ micro version, or minor version zero, indicates that the
501resource is a development version.  Hosts and tools SHOULD clearly indicate
502this wherever appropriate.  Minor version zero is a special case for
503pre-release development of plugins, or experimental plugins that are not
504intended for stable use at all.  Hosts SHOULD NOT expect such a plugin to
505remain compatible with any future version.  Where feasible, hosts SHOULD NOT
506expose such plugins to users by default, but may provide an option to display
507them.
508
509"""^^lv2:Markdown .
510
511lv2:microVersion
512	lv2:documentation """
513
514Releases of plugins and extensions MUST be explicitly versioned.  Correct
515version numbers MUST always be maintained for any versioned resource that is
516published. For example, after a release, if a change is made in the development
517version in source control, the micro version MUST be incremented (to an odd
518number) to distinguish this modified version from the previous release.
519
520This property describes half of a resource version. For detailed documentation
521on LV2 resource versioning, see lv2:minorVersion.
522
523"""^^lv2:Markdown .
524
525lv2:binary
526	lv2:documentation """
527
528The value of this property must be the URI of a shared library object,
529typically in the same bundle as the data file which contains this property.
530The actual type of the library is platform specific.
531
532This is a required property of a lv2:Plugin which MUST be included in the
533bundle's `manifest.ttl` file.  The lv2:binary of a lv2:Plugin is the shared
534object containing the lv2_descriptor() or lv2_lib_descriptor() function.  This
535probably may also be used similarly by extensions to relate other resources to
536their implementations (it is not implied that a lv2:binary on an arbitrary
537resource is an LV2 plugin library).
538
539"""^^lv2:Markdown .
540
541lv2:appliesTo
542	lv2:documentation """
543
544This is primarily intended for discovery purposes: bundles that describe
545resources that work with particular plugins (like presets or user interfaces)
546SHOULD specify this in their `manifest.ttl` so the host can associate them with
547the correct plugin.  For example:
548
549    :::turtle
550    <thing>
551        a             ext:Thing ;
552        lv2:appliesTo <plugin> ;
553        rdfs:seeAlso  <thing.ttl> .
554
555Using this pattern is preferable for large amounts of data, since the host may
556choose whether/when to load the data.
557
558"""^^lv2:Markdown .
559
560lv2:Symbol
561	lv2:documentation """
562
563The first character of a symbol must be one of `_`, `a-z` or `A-Z`, and
564subsequent characters may additionally be `0-9`.  This is, among other things,
565a valid C identifier, and generally compatible in most contexts which have
566restrictions on string identifiers, such as file paths.
567
568"""^^lv2:Markdown .
569
570lv2:symbol
571	lv2:documentation """
572
573The value of this property MUST be a valid lv2:Symbol, and MUST NOT have a
574language tag.
575
576A symbol is a unique identifier with respect to the parent, for example a
577port's symbol is a unique identifiers with respect to its plugin.  The plugin
578author MUST change the plugin URI if any port symbol is changed or removed.
579
580"""^^lv2:Markdown .
581
582lv2:name
583	lv2:documentation """
584
585Unlike lv2:symbol, this is unrestricted, may be translated, and is not relevant
586for compatibility.  The name is not necessarily unique and MUST NOT be used as
587an identifier.
588
589"""^^lv2:Markdown .
590
591lv2:shortName
592	lv2:documentation """
593
594This is the same as lv2:name, with the additional requirement that the value is
595shorter than 16 characters.
596
597"""^^lv2:Markdown .
598
599lv2:Designation
600	lv2:documentation """
601
602A designation is metadata that describes the meaning or role of something.  By
603assigning a designation to a port using lv2:designation, the port's content
604becomes meaningful and can be used more intelligently by the host.
605
606"""^^lv2:Markdown .
607
608lv2:Channel
609	lv2:documentation """
610
611A specific channel, for example the <q>left</q> channel of a stereo stream.  A
612channel may be audio, or another type such as a MIDI control stream.
613
614"""^^lv2:Markdown .
615
616lv2:Parameter
617	lv2:documentation """
618
619A parameter is a designation for a control.
620
621A parameter defines the meaning of a control, not the method of conveying its
622value.  For example, a parameter could be controlled via a lv2:ControlPort,
623messages, or both.
624
625A lv2:ControlPort can be associated with a parameter using lv2:designation.
626
627"""^^lv2:Markdown .
628
629lv2:designation
630	lv2:documentation """
631
632This property is used to give a port's contents a well-defined meaning.  For
633example, if a port has the designation `eg:gain`, then the value of that port
634represents the `eg:gain` of the plugin instance.
635
636Ports should be given designations whenever possible, particularly if a
637suitable designation is already defined.  This allows the host to act more
638intelligently and provide a more effective user interface.  For example, if the
639plugin has a BPM parameter, the host may automatically set that parameter to
640the current tempo.
641
642"""^^lv2:Markdown .
643
644lv2:freeWheeling
645	lv2:documentation """
646
647If true, this means that all processing is happening as quickly as possible,
648not in real-time.  When free-wheeling there is no relationship between the
649passage of real wall-clock time and the passage of time in the data being
650processed.
651
652"""^^lv2:Markdown .
653
654lv2:enabled
655	lv2:documentation """
656
657If this value is greater than zero, the plugin processes normally.  If this
658value is zero, the plugin is expected to bypass all signals unmodified.  The
659plugin must provide a click-free transition between the enabled and disabled
660(bypassed) states.
661
662Values less than zero are reserved for future use (such as click-free
663insertion/removal of latent plugins), and should be treated like zero
664(bypassed) by current implementations.
665
666"""^^lv2:Markdown .
667
668lv2:control
669	lv2:documentation """
670
671This should be used as the lv2:designation of ports that are used to send
672commands and receive responses.  Typically this will be an event port that
673supports some protocol, for example MIDI or LV2 Atoms.
674
675"""^^lv2:Markdown .
676
677lv2:Point
678	lv2:documentation """
679
680  * A Point MUST have at least one rdfs:label which is a string.
681
682  * A Point MUST have exactly one rdf:value with a type that is compatible with
683    the type of the corresponding Port.
684
685"""^^lv2:Markdown .
686
687lv2:default
688	lv2:documentation """
689
690The host SHOULD set the port to this value initially, and in any situation
691where the port value should be cleared or reset.
692
693"""^^lv2:Markdown .
694
695lv2:minimum
696	lv2:documentation """
697
698This is a soft limit: the plugin is required to gracefully accept all values in
699the range of a port's data type.
700
701"""^^lv2:Markdown .
702
703lv2:maximum
704	lv2:documentation """
705
706This is a soft limit: the plugin is required to gracefully accept all values in
707the range of a port's data type.
708
709"""^^lv2:Markdown .
710
711lv2:optionalFeature
712	lv2:documentation """
713
714To support this feature, the host MUST pass its URI and any additional data to
715the plugin in LV2_Descriptor::instantiate().
716
717The plugin MUST NOT fail to instantiate if an optional feature is not supported
718by the host.
719
720"""^^lv2:Markdown .
721
722lv2:requiredFeature
723	lv2:documentation """
724
725To support this feature, the host MUST pass its URI and any additional data to
726the plugin in LV2_Descriptor::instantiate().
727
728The host MUST check this property before attempting to instantiate a plugin,
729and not attempt to instantiate plugins which require features it does not
730support.  The plugin MUST fail to instantiate if a required feature is not
731supported by the host.  Note that these rules are intentionally redundant for
732resilience: neither host nor plugin should assume that the other does not
733violate them.
734
735"""^^lv2:Markdown .
736
737lv2:ExtensionData
738	lv2:documentation """
739
740This is additional data that a plugin may return from
741LV2_Descriptor::extension_data().  This is generally used to add APIs to extend
742that defined by LV2_Descriptor.
743
744"""^^lv2:Markdown .
745
746lv2:extensionData
747	lv2:documentation """
748
749If a plugin has a value for this property, it must be a URI that defines the
750extension data.  The plugin should return the appropriate data when
751LV2_Descriptor::extension_data() is called with that URI as a parameter.
752
753"""^^lv2:Markdown .
754
755lv2:isLive
756	lv2:documentation """
757
758This feature is for plugins that have time-sensitive internals, for example
759communicating in real time over a socket.  It indicates to the host that its
760input and output must not be cached or subject to significant latency, and that
761calls to LV2_Descriptor::run() should be made at a rate that roughly
762corresponds to wall clock time (according to the `sample_count` parameter).
763
764Note that this feature is not related to <q>hard real-time</q> execution
765requirements (see lv2:hardRTCapable).
766
767"""^^lv2:Markdown .
768
769lv2:inPlaceBroken
770	lv2:documentation """
771
772This feature indicates that the plugin may not work correctly if the host
773elects to use the same data location for both input and output.  Plugins that
774will fail to work correctly if ANY input port is connected to the same location
775as ANY output port MUST require this feature.  Doing so should be avoided
776whenever possible since it prevents hosts from running the plugin on data
777<q>in-place</q>.
778
779"""^^lv2:Markdown .
780
781lv2:hardRTCapable
782	lv2:documentation """
783
784This feature indicates that the plugin is capable of running in a <q>hard
785real-time</q> environment.  This should be the case for most audio processors,
786so most plugins are expected to have this feature.
787
788To support this feature, plugins MUST adhere to the following in all of their
789audio class functions (LV2_Descriptor::run() and
790LV2_Descriptor::connect_port()):
791
792  * There is no use of `malloc()`, `free()` or any other heap memory management
793    functions.
794
795  * There is no use of any library functions which do not adhere to these
796    rules.  The plugin may assume that the standard C math library functions
797    are safe.
798
799  * There is no access to files, devices, pipes, sockets, system calls, or any
800    other mechanism that might result in the process or thread blocking.
801
802  * The maximum amount of time for a `run()` call is bounded by some expression
803    of the form `A + B * sample_count`, where `A` and `B` are platform specific
804    constants.  Note that this bound does not depend on input signals or plugin
805    state.
806
807"""^^lv2:Markdown .
808
809lv2:portProperty
810	lv2:documentation """
811
812States that a port has a particular lv2:PortProperty.  This may be ignored
813without catastrophic effects, though it may be useful, for example to provide a
814sensible user interface for the port.
815
816"""^^lv2:Markdown .
817
818lv2:connectionOptional
819	lv2:documentation """
820
821This property means that the port does not have to be connected to valid data
822by the host.  To leave a port <q>unconnected</q>, the host MUST explicitly
823connect the port to `NULL`.
824
825"""^^lv2:Markdown .
826
827lv2:reportsLatency
828	lv2:documentation """
829
830This property indicates that the port is used to express the processing latency
831incurred by the plugin, expressed in samples.  The latency may be affected by
832the current sample rate, plugin settings, or other factors, and may be changed
833by the plugin at any time.  Where the latency is frequency dependent the plugin
834may choose any appropriate value.  If a plugin introduces latency it MUST
835provide EXACTLY ONE port with this property set.  In <q>fuzzy</q> cases the
836value should be the most reasonable one based on user expectation of
837input/output alignment.  For example, musical delay plugins should not report
838their delay as latency, since it is an intentional effect that the host should
839not compensate for.
840
841This property is deprecated, use a lv2:designation of lv2:latency instead,
842following the same rules as above:
843
844    :::turtle
845	<http://example.org/plugin>
846		lv2:port [
847			a lv2:OutputPort , lv2:ControlPort ;
848			lv2:designation lv2:latency ;
849			lv2:symbol "latency" ;
850        ]
851
852"""^^lv2:Markdown .
853
854lv2:toggled
855	lv2:documentation """
856
857Indicates that the data item should be considered a boolean toggle.  Data less
858than or equal to zero should be considered <q>off</q> or <q>false</q>, and data
859above zero should be considered <q>on</q> or <q>true</q>.
860
861"""^^lv2:Markdown .
862
863lv2:sampleRate
864	lv2:documentation """
865
866Indicates that any specified bounds should be interpreted as multiples of the
867sample rate.  For example, a frequency range from 0 Hz to the Nyquist frequency
868(half the sample rate) can be specified by using this property with lv2:minimum
8690.0 and lv2:maximum 0.5.  Hosts that support bounds at all MUST support this
870property.
871
872"""^^lv2:Markdown .
873
874lv2:integer
875	lv2:documentation """
876
877Indicates that all the reasonable values for a port are integers.  For such
878ports, a user interface should provide a stepped control that only allows
879choosing integer values.
880
881Note that this is only a hint, and that the plugin MUST operate reasonably even
882if such a port has a non-integer value.
883
884"""^^lv2:Markdown .
885
886lv2:enumeration
887	lv2:documentation """
888
889Indicates that all the rasonable values for a port are defined by
890lv2: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.
891
892Note that this is only a hint, and that the plugin MUST operate reasonably even
893if such a port has a value that does not correspond to a scale point.
894
895"""^^lv2:Markdown .
896
897lv2:isSideChain
898	lv2:documentation """
899
900Indicates that a port is a <q>sidechain</q>, which affects the output somehow
901but should not be considered a part of the main signal chain.  Sidechain ports
902SHOULD be lv2:connectionOptional, and may be ignored by hosts.
903
904"""^^lv2:Markdown .
905
906