1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883
|
# This document describes LV2, a plugin interface.
# See <http://lv2plug.in> for more information.
#
# Copyright 2006-2011 Steve Harris, David Robillard
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
###########################
## General LV2 Resources ##
###########################
lv2:Resource a rdfs:Class , owl:Class ;
rdfs:comment """
An LV2 Resource (e.g. plugin, specification, or any other LV2 related thing).
""" .
lv2:Specification a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Resource ;
lv2:documentation """
<p>An LV2 specification (i.e. this specification, or an LV2 extension).</p>
<p>Specification data, like plugin data, is distributed in bundles
so hosts may discover <em>all</em> present LV2 data.</p>
""" .
lv2:documentation a rdf:Property , owl:AnnotationProperty ;
rdfs:range rdfs:Literal ;
rdfs:label "documentation" ;
rdfs:seeAlso <http://www.w3.org/TR/xhtml-basic/> ;
lv2:documentation """
<p>Relates a Resource to documentation markup. The value of this property
MUST be a string literal which is a valid XHTML Basic 1.1 fragment suitable
for use as the content of the <body> element. This can be used by
hosts to provide rich online documentation or by tools to generate external
documentation pages. The standard language tagging facility of RDF can be
used to provide multi-lingual documentation.</p>
<p>XHTML Basic is a W3C Recommendation which defines a basic subset of XHTML
intended to be reasonable to implement with limited resources (e.g. on embedded
devices). See <a href="http://www.w3.org/TR/xhtml-basic/#s_xhtmlmodules"
>XHTML Basic, Section 3</a> for a list of legal tags.</p>
""" .
<http://lv2plug.in/ns/lv2core>
a owl:Ontology ;
owl:imports <http://lv2plug.in/ns/doap.owl> ;
lv2:documentation """
<p>LV2 is an interface for writing audio processors, or <q>plugins</q>, in
C/C++ which can be dynamically loaded into many applications, or <q>hosts</q>.
This <q>core</q> specification is simple and minimal, but is designed so that
<q>extensions</q> can be defined to add more advanced features, making it
possibly to implement nearly any feature imaginable.</p>
<p>LV2 maintains a strong distinction between <q>code</q> and <q>data</q>.
Plugin code is in a shared library, while data is in a companion data file
written in <a href="http://www.w3.org/TeamSubmission/turtle/">Turtle</a>.
Code, data, and any other resources (e.g. waveforms) are shipped together in a
<q>bundle</q> directory. The code contains only the executable portions of the
plugin which inherently <em>must</em> be written in code. All other data is
provided in the data file(s). This makes plugin data flexible and extensible,
and allows the host to do everything but run the plugin without loading or
executing any code. Among other advantages, this makes hosts more robust
(broken plugins can't crash a host during discovery) and allows generic tools
and non-C programs to work with LV2 data. LV2 itself and extensions are
distributed in a similar way.</p>
<p>An LV2 plugin library is suitable for dynamic loading (e.g. via
<code>dlopen()</code>) and provides one or more plugin descriptors via the
<code>lv2_descriptor()</code> function. These can be instantiated to create
plugin <q>instances</q>, which can be run directly on data or connected
together to perform advanced signal processing tasks.</p>
<p>Plugins communicate via <q>ports</q>, which can transmit any type of data.
Data is processed by first <q>connecting</q> each port to a buffer, then
repeatedly calling a plugin's <code>run()</code> method to process blocks of
data.</p>
<p>This core specification defines two types of port, equivalent to those in <a
href="http://www.ladspa.org/">LADSPA</a>: lv2:ControlPort and lv2:AudioPort.
Audio ports contain arrays with one <code>float</code> element per sample,
allowing a block of audio to be processed in a single call to
<code>run()</code>. Control ports contain single <code>float</code> values,
which are fixed and valid for the duration of the call to <code>run()</code>.
Thus the <q>control rate</q> is determined by the block size, which is
controlled by the host (and not necessarily constant).</p>
<h3>Threading Rules</h3>
<p>To faciliate use in multi-threaded programs, LV2 functions are partitioned
into several threading classes:</p>
<table>
<tr><th>Discovery Class</th>
<th>Instantiation Class</th>
<th>Audio Class</th></tr>
<tr><td>lv2_descriptor()</td>
<td>LV2_Descriptor::instantiate()</td>
<td>LV2_Descriptor::run()</td></tr>
<tr><td>LV2_Descriptor::extension_data()</td>
<td>LV2_Descriptor::cleanup()</td>
<td>LV2_Descriptor::connect_port()</td></tr>
<tr><td></td><td>LV2_Descriptor::activate()</td><td></td></tr>
<tr><td></td><td>LV2_Descriptor::deactivate()</td><td></td></tr>
</table>
<p>The rules that hosts MUST follow are:</p>
<ul>
<li>When any function is running for a plugin instance,
no other function in the same class may run for that instance.</li>
<li>When a <em>Discovery</em> function is running,
no other functions in the same shared object file may run.</li>
<li>When an <em>Instantiation</em> function is running for a plugin instance,
no other functions for that instance may run.</li>
</ul>
<p>Any simultaneous calls that are not explicitly forbidden by these rules are
allowed. For example, a host may call <code>run()</code> for two different
plugin instances simultaneously.</p>
<p>Plugin functions in any class MUST NOT manipulate any state which might
affect other plugin or host code, e.g. by using non-reentrant global
functions.</p>
<p>Extensions to this specification which add new functions MUST declare in
which of these classes the functions belong, define new classes for them, or
otherwise precisely describe their threading rules.</p>
""" .
############
## Plugin ##
############
lv2:PluginBase a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Resource ;
lv2:documentation """
<p>An abstract plugin-like resource that MAY not actually be an LV2 plugin
(e.g. may not actually have a plugin binary).</p>
<p>PluginBase SHOULD be used as a base type for any resource that may have
ports or otherwise mimic the structure of a Plugin (e.g. a preset), since
hosts and other tools already <q>understand</q> this structure.</p>
""" .
lv2:Plugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:PluginBase ;
rdfs:label "Plugin" ;
rdfs:subClassOf [
a owl:Restriction ;
owl:onProperty doap:name ;
owl:someValuesFrom xsd:string ;
rdfs:comment """
A Plugin MUST have at least one doap:name that is a string
with no language tag.
""" ] ;
lv2:documentation """
<p>The class which represents an LV2 plugin.</p>
<p>To be discovered by hosts, plugins MUST explicitly have rdf:type lv2:Plugin
listed in their bundle's manifest, e.g.:</p>
<pre class="turtle-code">
<http://example.org/my-plugin> a lv2:Plugin .
</pre>
<p>Plugins SHOULD have a doap:license property whenever possible. The doap:name
property should be at most a few words in length using title capitalization,
e.g. <q>Tape Delay Unit</q>. Use doap:shortdesc or doap:description for more
detailed descriptions.</p>
""" .
##########
## Port ##
##########
lv2:Port a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Resource ;
rdfs:label "Port" ;
rdfs:subClassOf [
a owl:Restriction ;
owl:onProperty lv2:index ;
owl:allValuesFrom xsd:nonNegativeInteger ;
owl:cardinality 1 ;
rdfs:comment """
A port MUST have a single lv2:index which is of type xsd:nonNegativeInteger
(e.g. a non-negative integer literal in Turtle). The actual RDF datatype
of the index MAY be xsd:integer (which is what a generic Turtle parser
will do), but the value itself MUST be non-negative.
""" ] , [
a owl:Restriction ;
owl:onProperty lv2:symbol ;
owl:someValuesFrom xsd:string ;
rdfs:comment """
A port MUST have a single lv2:symbol which is of type xsd:string with no
language tag.
""" ] , [
a owl:Restriction ;
owl:onProperty lv2:name ;
owl:someValuesFrom xsd:string ;
rdfs:comment """
A port MUST have at least one lv2:name which is of type xsd:string.
""" ] ;
lv2:documentation """
<p>The class which represents an LV2 port.</p>
<p>All LV2 port descriptions MUST have a rdf:type that is one of lv2:Port
lv2:InputPort or lv2:OutputPort. Additionally there MUST be at least one other
rdf:type which more precisely describes type of the port
(e.g. lv2:AudioPort).</p>
<p>Hosts that do not support a specific port class MUST NOT instantiate the
plugin, unless that port has the connectionOptional property set (in which case
the host can simply <q>connect</q> that port to NULL). If a host is interested
in plugins to insert in a certain signal path (e.g. stereo audio), it SHOULD
consider all the classes of a port to determine which ports are most suitable
for connection (e.g. by ignoring ports with additional classes the host does
not recognize).</p>
<p>A port has two identifiers: a (numeric) index, and a (textual) symbol.
The index can be used as an identifier at run-time, but persistent references
to ports (e.g. in a saved preset) MUST use the symbol. A symbol is guaranteed
to refer to the same port on all plugins with a given URI. An index does NOT
necessarily refer to the same port on all plugins with a given URI (i.e. the
index for a port may differ between plugin binaries).</p>
""" .
lv2:InputPort a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Port ;
rdfs:label "Input port" ;
rdfs:comment """
Ports of this type will be connected to a pointer to some value, which will
be read by the plugin during their run method.
""" .
lv2:OutputPort a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Port ;
rdfs:label "Output port" ;
rdfs:comment """
Ports of this type will be connected to a pointer to some value, which will
be written to by the plugin during their run method.
""" .
lv2:ControlPort a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Port ;
rdfs:label "Control port" ;
lv2:documentation """
<p>Ports of this type will be connected to a pointer to a single value of C
type <code>float</code>.</p>
""" .
lv2:AudioPort a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Port ;
rdfs:label "Audio port" ;
lv2:documentation """
<p>Ports of this type will be connected to an array of length sample_count
with elements of C type <code>float</code>.</p>
""" .
#######################
## Plugin Properties ##
#######################
lv2:port a rdf:Property , owl:ObjectProperty ;
rdfs:domain lv2:PluginBase ;
rdfs:range lv2:Port ;
rdfs:label "port" ;
rdfs:comment "Relates a Plugin to the Ports it contains" .
lv2:minorVersion a rdf:Property , owl:DatatypeProperty ;
rdfs:domain lv2:Resource ;
rdfs:range xsd:nonNegativeInteger ;
rdfs:label "minor version" ;
lv2:documentation """
<p>The minor version of an LV2 Resource. This property is used (along with
lv2:microVersion) by hosts to distinguish different versions of a compatible
resource, e.g. to load only the bundle with the most recent version.</p>
<p>The version of an LV2 resource is composed of two fields: minor version,
and micro version. These have the usual semantics:</p>
<ul>
<li>The minor version MUST be incremented when backwards (but not
forwards) compatible additions are made, e.g. the addition of a port to a
plugin.</li>
<li>The micro version is incremented for changes which do not affect
compatibility at all, e.g. bug fixes or documentation updates.</li>
</ul>
<p>Note there is deliberately no concept of a major version: all versions of an
LV2 resource with a given URI are by definition backwards compatible. More
precisely: replacing a resource with a newer version of that resource MUST NOT
break anything. If a change is made which breaks this rule, the URI
of the resource MUST be changed. In contexts where a full (e.g. <a
href="http://semver.org">SemVer</a> conformant) version number is required, the
major version of all released LV2 resources is 1.</p>
<p>Plugins and extensions MUST adhere to the following rules:</p>
<ul>
<li>All versions of a plugin with a given URI MUST have the <q>same</q> set of
mandatory (i.e. not lv2:connectionOptional) ports with respect to lv2:symbol
and rdf:type. In other words, every port on a specific version of a plugin has
a lv2:symbol and a set of rdf:types; all future versions of that plugin are
guaranteed to have a port with the same lv2:symbol and at least those
rdf:types. New types may be added only if doing so does not break
compatibility, i.e. if old hosts will continue to work correctly with the new
plugin.</li>
<li>New ports MAY be added without changing the plugin URI if and only if they
are lv2:connectionOptional and the minor version is incremented.</li>
<li>The minor version MUST be incremented if the index of any port (identified
by its symbol) is changed.</li>
<li>All versions of an extension MUST be compatible in the sense that an
implementation of the new version can interoperate with an implementation of
any previous version.</li>
</ul>
<p>(Note these rules are not necessarily exhaustive)</p>
<p>Anything that depends on a specific version of a plugin (e.g. a
serialisation that references ports by index) MUST refer to the plugin by both
URI and version. However, implementations should be tolerant and extensions
should be designed such that there is no need to do this (e.g. indices should
only be meaningful for a particular plugin <em>instance</em> at run-time).</p>
<p>When hosts discover several installed versions of a resource, they SHOULD
warn the user and load only the most recent version.</p>
<p>An odd minor <em>or</em> micro version indicates that the resource is a
possibly unstable development version. Hosts and tools SHOULD clearly indicate
this wherever appropriate. Several versions of a resource with an odd version
may exist; i.e. it is acceptable to work on a development version of a resource
(e.g. in source control) without worrying about version numbers as long as
either the minor or micro version is odd.</p>
<p>This property describes half of a resource version. See also <a
href="http://lv2plug.in/ns/lv2core#minorVersion">lv2:minorVersion</a>, the
property which describes the other half.</p>
""" .
lv2:microVersion a rdf:Property , owl:DatatypeProperty ;
rdfs:domain lv2:Resource ;
rdfs:range xsd:nonNegativeInteger ;
rdfs:label "micro version" ;
lv2:documentation """
<p>The micro component of a Resource's version.</p>
<p>Releases of plugins and extensions MUST be explicitly versioned. Correct
version numbers MUST always be maintained for any versioned resource that is
published. For example, after a release, if a change is made in the development
version in source control, the micro version MUST be incremented (to an odd
number) to distinguish this modified version from the previous release.</p>
<p>This property describes half of a resource version. For detailed
documentation on LV2 resource versioning, see <a
href="http://lv2plug.in/ns/lv2core#minorVersion">lv2:minorVersion</a>.</p>
""" .
lv2:binary a rdf:Property , owl:ObjectProperty ;
rdfs:domain lv2:Resource ;
rdfs:range owl:Thing ;
rdfs:label "binary" ;
lv2:documentation """
<p>The binary of an LV2 resource. The value of this property must be a URI that
resolves to a shared library object (the actual type of this library is system
specific).</p>
<p>This is a required property of a Plugin which MUST be included in the
bundle's manifest.ttl file. The lv2:binary of an lv2:Plugin is the
shared object containing the <code>lv2_descriptor()</code> function which can
be used to access the descriptor for that plugin. This property may be used
similarly by extensions to relate other resources to their implementations.</p>
""" .
lv2:appliesTo a rdf:Property , owl:ObjectProperty ;
rdfs:domain lv2:Resource ;
rdfs:range lv2:Plugin ;
rdfs:label "Applies to" ;
lv2:documentation """
<p>Specifies that a resource is related to a plugin. This is primarily intended
for discovery purposes: bundles that describe resources that work with
particular plugins (e.g. presets or user interfaces) SHOULD use this predicate
in manifest.ttl to relate the resource to the applicable
plugin(s), e.g.:</p>
<pre class="turtle-code">
<thing>
a ext:Thing ;
lv2:appliesTo <plugin> ;
rdfs:seeAlso <thing.ttl> .
</pre>
<p>Particularly for large amounts of data, this is preferable to
extending the plugin description with rdfs:seeAlso since the host may choose
if/when to load the data, knowing that it describes an additional resource and
not the plugin itself.</p>
""" .
#####################
## Port Properties ##
#####################
lv2:index a rdf:Property , owl:DatatypeProperty ;
rdfs:domain lv2:Port ;
rdfs:range xsd:nonNegativeInteger ;
rdfs:label "index" ;
rdfs:comment """
Specifies the index of the port, passed as an argument to the connect port
function. The index uniqely identifies the port on an instance of the plugin.
""" .
lv2:symbol a rdf:Property , owl:DatatypeProperty ;
rdfs:label "symbol" ;
rdfs:comment """
A short name used as a machine and human readable identifier.
The first character must be one of _, a-z or A-Z and subsequenct characters can
be from _, a-z, A-Z and 0-9.
A language tag MUST NOT be used on this property. The symbol uniquely
identifies the port on a plugin with a given URI (i.e. the plugin author MUST
change the plugin URI if a port symbol is changed or removed).
""" .
lv2:name a rdf:Property , owl:DatatypeProperty ;
rdfs:domain lv2:Port ;
rdfs:label "name" ;
rdfs:comment """
A display name for labeling the Port in a user interface.
This property is required for Ports, but MUST NOT be used by the host for
port identification. The plugin author may change the values of this
property without changing the Plugin URI.
""" .
###########################
## Port Range and Points ##
###########################
lv2:Point a rdfs:Class , owl:Class ;
rdfs:label "Port value point" ;
# Unfortunately, it is illegal to specify restrictions on rdfs:label or
# rdf:value. If the migration can be handled gracefully, it would be
# good to switch to more appropriate predicates here for validators.
lv2:documentation """
<p>A Point describes an interesting value in a Port's range (much like a labeled
<q>notch</q> on a physical knob).</p>
<ul>
<li>A Point MUST have at least one rdfs:label which is a string.</li>
<li>A Point MUST have exactly one rdf:value with a type that is compatible
with the type of the corresponding Port.</li>
</ul>
""" .
lv2:ScalePoint a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Point ;
rdfs:comment "A single float Point (for control inputs)." .
lv2:scalePoint a rdf:Property , owl:ObjectProperty ;
rdfs:domain lv2:Port ;
rdfs:range lv2:ScalePoint ;
rdfs:label "Scale point" ;
rdfs:comment "Relates a Port to its ScalePoints." .
lv2:default a rdf:Property , owl:DatatypeProperty ;
rdfs:domain lv2:Port ;
rdfs:label "Default value" ;
rdfs:comment """
The default value that the host SHOULD set this port to when there is no
other information available.
""" .
lv2:minimum a rdf:Property , owl:DatatypeProperty ;
rdfs:domain lv2:Port ;
rdfs:label "Minimum value" ;
lv2:documentation """
<p>A hint to the host for the minimum useful value that the port will use. This
is a <q>soft</q> limit; the plugin is required to gracefully accept all values
in the range of a port's data type.</p>
""" .
lv2:maximum a rdf:Property , owl:DatatypeProperty ;
rdfs:domain lv2:Port ;
rdfs:label "Maximum value" ;
lv2:documentation """
<p>A hint to the host for the maximum useful value that the port will use.
This is a <q>soft</q> limit; the plugin is required to gracefully accept all
values in the range of a port's data type.</p>
""" .
#############
## Feature ##
#############
lv2:Feature a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Resource ;
rdfs:label "Feature" ;
rdfs:comment """
An additional feature which a plugin or other resource may use or require.
""".
lv2:optionalFeature a rdf:Property , owl:ObjectProperty ;
rdfs:domain lv2:Resource ;
rdfs:range lv2:Feature ;
rdfs:label "Optional feature" ;
lv2:documentation """
<p>Signifies that a plugin or other resource supports a certain feature. If
the host supports this feature, it MUST pass its URI and any additional data to
the plugin in LV2_Descriptor::instantiate(). The plugin MUST NOT fail to
instantiate if an optional feature is not supported by the host.</p>
""" .
lv2:requiredFeature a rdf:Property , owl:ObjectProperty ;
rdfs:domain lv2:Resource ;
rdfs:range lv2:Feature ;
rdfs:label "Required feature" ;
lv2:documentation """
<p>Signifies that a plugin or other resource requires a certain feature. If
the host supports this feature, it MUST pass its URI and any additional data to
the plugin in LV2_Descriptor::instantiate(). The plugin MUST fail to
instantiate if a required feature is not present; hosts SHOULD always check
this before attempting to instantiate a plugin (i.e. discovery by attempting to
instantiate is strongly discouraged).</p>
""" .
####################
## Extension Data ##
####################
lv2:ExtensionData a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Resource ;
rdfs:label "Extension Data" ;
rdfs:comment """
Additional data and/or functions a plugin may return from
LV2_Descriptor:extension_data() which can be used to add additional API beyond
that defined by LV2_Descriptor.
""".
lv2:extensionData a rdf:Property , owl:ObjectProperty ;
rdfs:domain lv2:Resource ;
rdfs:range lv2:ExtensionData ;
rdfs:label "Available extension data" ;
lv2:documentation """
<p>Signifies that a plugin provides additional data or functions (as defined by
some extension) via LV2:Descriptor::instantiate().</p>
""" .
#######################
## Standard Features ##
#######################
lv2:isLive a lv2:Feature ;
rdfs:label "Has a live (realtime) dependency" ;
lv2:documentation """
<p>Indicates that the plugin has a real-time dependency (e.g. queues data from
a socket) and so its output must not be cached or subject to significant
latency, and calls to the run method should be done in rapid succession. This
property is not related to <q>hard real-time</q> execution requirements (see
lv2:hardRTCapable).</p>
""" .
lv2:inPlaceBroken a lv2:Feature ;
rdfs:label "In-place broken" ;
lv2:documentation """
<p>Indicates that the plugin may cease to work correctly if the host elects to
use the same data location for both input and output. Plugins that will fail
to work correctly if ANY input port is connected to the same location as ANY
output port MUST require this Feature. Doing so should be avoided as it makes
it impossible for hosts to use the plugin to process data <q>in-place</q>.</p>
""" .
lv2:hardRTCapable a lv2:Feature ;
rdfs:label "Hard realtime capable" ;
lv2:documentation """
<p>Indicates that the plugin is capable of running not only in a conventional
host but also in a <q>hard real-time</q> environment. To qualify for this the
plugin MUST satisfy all of the following:</p>
<ol>
<li>The plugin MUST NOT use malloc(), free() or other heap memory management
functions within its Audio class functions.</li>
<li>The plugin MUST NOT attempt to make use of any library functions in its
Audio class functions, unless those functions themselves adhere to these
rules (i.e. are hard realtime safe). The plugin MAY assume the standard C
and C math library functions are safe.</li>
<li>The plugin will not access files, devices, pipes, sockets, IPC or any other
mechanism that might result in process or thread blocking within its Audio
class functions.</li>
<li>The plugin will take an amount of time to execute a run() call
approximately of form <code>A + B * sample_count</code> where <code>A</code>
and <code>B</code> depend on the machine and host in use. This amount of
time MUST NOT depend on input signals or plugin state.</li>
</ol>
<p>Note these rules apply to the connect_port() function as well as run().</p>
""" .
##################
## PortProperty ##
##################
lv2:PortProperty a rdfs:Class , owl:Class ;
rdfs:label "Port property" ;
rdfs:comment """
A port property - a useful piece of information that allows a host to make more
sensible decisions (e.g. to provide a better interface).
""" .
lv2:portProperty a rdf:Property , owl:ObjectProperty ;
rdfs:domain lv2:Port ;
rdfs:range lv2:PortProperty ;
rdfs:label "Port property" ;
rdfs:comment """
Relates Ports to PortProperties. The PortProperty may be ignored without
catastrophic effects, though it may be useful e.g. for providing a sensible
interface for the port.
""" .
#############################
## Standard PortProperties ##
#############################
lv2:connectionOptional a lv2:PortProperty ;
rdfs:label "Optionally connected port" ;
rdfs:comment """
Indicates that this port does not have to be connected to valid data by the
host. If it is to be disconnected then the port MUST set to NULL with a call
to the connectPort method.
""" .
lv2:reportsLatency a lv2:PortProperty ;
rdfs:label "Latency reporting port" ;
lv2:documentation """
<p>Indicates that the port is used to express the processing latency incurred
by the plugin, expressed in samples. The latency may be affected by the current
sample rate, plugin settings, or other factors, and may be changed by the
plugin at any time. Where the latency is frequency dependent the plugin may
choose any appropriate value. If a plugin introduces latency it MUST provide
EXACTLY ONE port with this property set which informs the host of the
<q>correct</q> latency. In <q>fuzzy</q> cases the value output should be the
most reasonable based on user expectation of input/output alignment
(eg. musical delay/echo plugins should not report their delay as latency, as it
is an intentional effect).</p>
""" .
lv2:toggled a lv2:PortProperty ;
rdfs:label "Toggled" ;
lv2:documentation """
<p>Indicates that the data item should be considered a Boolean toggle. Data
less than or equal to zero should be considered <q>off</q> or <q>false</q>, and
data above zero should be considered <q>on</q> or <q>true</q>.</p>
""" .
lv2:sampleRate a lv2:PortProperty ;
rdfs:label "Sample rate" ;
rdfs:comment """
Indicates that any bounds specified should be interpreted as multiples of the
sample rate. For instance, a frequency range from 0Hz to the Nyquist frequency
(half the sample rate) could be requested by this property in conjunction with
lv2:minimum 0.0 and lv2:maximum 0.5.
Hosts that support bounds at all MUST support this property.
""" .
lv2:integer a lv2:PortProperty ;
rdfs:label "Integer" ;
rdfs:comment """
Indicates that a port's reasonable values are integers (eg. a user interface
would likely wish to provide a stepped control allowing only integer input).
A plugin MUST operate reasonably even if such a port has a non-integer input.
""" .
lv2:enumeration a lv2:PortProperty ;
rdfs:label "Enumeration" ;
rdfs:comment """
Indicates that a port's only reasonable values are the scale points defined for
that port. A host SHOULD NOT allow a user to set the value of such a port to
anything other than a scale point. However, a plugin MUST operate reasonably
even if such a port has an input that is not a scale point, preferably by
simply choosing the largest enumeration value less than or equal to the actual
input value (i.e. round the input value down).
""" .
####################
## Plugin Classes ##
####################
lv2:GeneratorPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:label "Generator" ;
rdfs:comment """
Any plugin that generates sound internally, rather than processing its input.
""" .
lv2:InstrumentPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:GeneratorPlugin ;
rdfs:label "Instrument" ;
rdfs:comment """
Any plugin that is intended to be played as a musical instrument.
""" .
lv2:OscillatorPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:GeneratorPlugin ;
rdfs:label "Oscillator" .
lv2:UtilityPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:label "Utility" ;
rdfs:comment """
Includes things like mathematical functions and non-musical delays.
""" .
lv2:ConverterPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:UtilityPlugin ;
rdfs:label "Converter" ;
rdfs:comment """
Any plugin that converts some form of input into a different form of output.
""" .
lv2:AnalyserPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:UtilityPlugin ;
rdfs:label "Analyser" ;
rdfs:comment """
Any plugin that analyses input to output some useful information.
""" .
lv2:MixerPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:UtilityPlugin ;
rdfs:label "Mixer" ;
rdfs:comment """
A plugin which mixes some number of inputs into some number of outputs.
""" .
lv2:SimulatorPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:label "Simulator" ;
rdfs:comment """
Plugins that aim to duplicate the effect of some environmental effect or
musical equipment.
""" .
lv2:DelayPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:label "Delay" ;
rdfs:comment """
Plugins that intentionally delay their input signal as an effect.
""" .
lv2:ModulatorPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:label "Modulator" .
lv2:ReverbPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:subClassOf lv2:SimulatorPlugin ;
rdfs:subClassOf lv2:DelayPlugin ;
rdfs:label "Reverb" .
lv2:PhaserPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:ModulatorPlugin ;
rdfs:label "Phaser" .
lv2:FlangerPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:ModulatorPlugin ;
rdfs:label "Flanger" .
lv2:ChorusPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:ModulatorPlugin ;
rdfs:label "Chorus" .
lv2:FilterPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:label "Filter" .
lv2:LowpassPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
rdfs:label "Lowpass" .
lv2:BandpassPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
rdfs:label "Bandpass" .
lv2:HighpassPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
rdfs:label "Highpass" .
lv2:CombPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
rdfs:label "Comb" .
lv2:AllpassPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
rdfs:label "Allpass" .
lv2:EQPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:FilterPlugin ;
rdfs:label "Equaliser" .
lv2:ParaEQPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:EQPlugin ;
rdfs:label "Parametric" .
lv2:MultiEQPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:EQPlugin ;
rdfs:label "Multiband" .
lv2:SpatialPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:label "Spatial" ;
rdfs:comment """
Plugins that manipulate the position of audio in space (e.g. panning,
stereo width, surround encoding, etc.).
""" .
lv2:SpectralPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:label "Spectral" ;
rdfs:comment """
Plugins that alter the spectral properties (e.g. frequency) of audio.
""" .
lv2:PitchPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:SpectralPlugin ;
rdfs:label "Pitch Shifter" .
lv2:AmplifierPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
rdfs:label "Amplifier" .
lv2:DistortionPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:label "Distortion" .
lv2:WaveshaperPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:DistortionPlugin ;
rdfs:label "Waveshaper" .
lv2:DynamicsPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Plugin ;
rdfs:label "Dynamics" ;
rdfs:comment """
Plugins that alter the envelope or dynamic range of audio.
""" .
lv2:CompressorPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
rdfs:label "Compressor" .
lv2:ExpanderPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
rdfs:label "Expander" .
lv2:LimiterPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
rdfs:label "Limiter" .
lv2:GatePlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:DynamicsPlugin ;
rdfs:label "Gate" .
lv2:FunctionPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:UtilityPlugin ;
rdfs:label "Function" .
lv2:ConstantPlugin a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:GeneratorPlugin ;
rdfs:label "Constant" .
|