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
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
|
# This document describes LV2, a plugin interface.
# See <http://lv2plug.in> for more information.
#
# Copyright 2006-2012 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#> .
lv2:Specification a rdfs:Class , owl:Class ;
rdfs:subClassOf doap:Project ;
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 ;
rdfs:seeAlso <lv2.h> , <lv2core.doap.ttl> , <../people/people.ttl> ;
lv2:documentation """
<p>LV2 is an interface for writing audio processors, or <q>plugins</q>, in
C/C++ which can be dynamically loaded into many applications, or <q>hosts</q>.
This <q>core</q> specification is simple and minimal, but is designed so that
<q>extensions</q> can be defined to add more advanced features, making it
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>
""" .
lv2:PluginBase a rdfs:Class , owl:Class ;
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>
""" .
doap:name a owl:DatatypeProperty .
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>
""" .
lv2:Port a rdfs:Class , owl:Class ;
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:allValuesFrom xsd:string ;
owl:cardinality 1 ;
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>
""" .
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: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: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: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: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>
""" .
lv2:index a rdf:Property , owl:DatatypeProperty , owl:FunctionalProperty ;
rdfs:range xsd:nonNegativeInteger ;
rdfs:label "index" ;
rdfs:comment "A non-negative zero-based index." .
lv2:Symbol a rdfs:Datatype ;
rdfs:subClassOf xsd:string ;
xsd:pattern "[_a-zA-Z][_a-zA-Z0-9]*$" ;
rdfs:comment """
A short restricted name used as a machine and human readable identifier.
The first character must be one of _, a-z or A-Z and subsequent characters can
be from _, a-z, A-Z and 0-9. This is a valid C identifier, and compatible in
most other contexts with restricted string identifiers (e.g. file paths).
""" .
lv2:symbol a rdf:Property , owl:DatatypeProperty , owl:FunctionalProperty ;
rdfs:label "symbol" ;
rdfs:range lv2:Symbol ;
lv2:documentation """
<p>The value of this property MUST conform to the rules for lv2:Symbol, and
MUST NOT have a language tag.</p>
<p>A symbol is a unique identifier with respect to the parent (e.g. a port's
symbol is a unique identifier with respect to its plugin). The plugin author
MUST change the plugin URI if a port symbol is changed or removed.</p>
""" .
lv2:name a rdf:Property , owl:DatatypeProperty ;
rdfs:label "name" ;
rdfs:comment """
A display name for labeling in a user interface. Unlike lv2:symbol this is
unrestricted and may be translated. The lv2:name MUST NOT be used as an
identifier.
This property is required for Ports, but MUST NOT be used by the host for
port identification. The plugin author may change the values of this
property without changing the Plugin URI.
""" .
lv2:Designation a rdfs:Class , owl:Class ;
rdfs:label "Designation" ;
lv2:documentation """
<p>The designation (or <q>assignment</q>) of an input or output. A designation
is metadata that describes the meaning or role of data. By assigning a
designation to a port using lv2:designation, the port's content becomes
meaningful and can be used more intelligently by the host.</p>
""" .
lv2:Channel a rdfs:Class , owl:Class ;
rdfs:label "Channel" ;
rdfs:subClassOf lv2:Designation ;
lv2:documentation """
<p>A specific channel of audio, e.g. <q>left</q> or <q>right</q>.</p>
""" .
lv2:Parameter a rdfs:Class , owl:Class ;
rdfs:subClassOf lv2:Designation ;
#owl:equivalentClass rdf:Property ;
lv2:documentation """
<p>A parameter, i.e. a recognized property. A parameter is a designation for a
control.</p>
<p>A parameter defines the <em>meaning</em> of a control (not the
<em>method</em> of conveying its value). The standard way of exposing a plugin
parameter is via an lv2:ControlPort, which can be given a parameter designation
with lv2:designation. Other methods, such as setting dynamic parameters via
messages, are possible but not defined here.</p>
""" .
lv2:hasParameter a rdf:Property , owl:ObjectProperty ;
#rdfs:range lv2:Parameter ;
rdfs:label "has parameter" ;
lv2:documentation """
<p>Indicates that a specific parameter is supported. This predicate is to
advertise that a plugin supports a parameter in some way other than a port
value, such as a message interface. It is not necessary use for control port
parameters, simply use lv2:designation on the port for that.</p>
<p>This property may be used to indicate any resource has a parameter, it is
not restricted to plugins.</p>
""" .
lv2:designation a rdf:Property , owl:ObjectProperty , owl:FunctionalProperty ;
#rdfs:range lv2:Designation ;
rdfs:label "assignment" ;
lv2:documentation """
<p>Indicates a channel or parameter designation.</p>
<p>This property is used to give the port's contents a well-defined meaning.
For example, if a port has lv2:designation eg:gain, then the value of that port
represents the eg:gain of the plugin instance.</p>
<p>Ports should be given designations whenever a well-defined designation
exists. This allows the host to act more intelligently and/or provide a more
effective user interface. For example, if the plugin has a BPM parameter, the
host may automatically set that parameter to the current tempo.</p>
""" .
lv2:latency a rdf:Property , owl:DatatypeProperty ;
rdfs:label "latency" ;
lv2:documentation """
<p>The latency introduced by the plugin (or similar), in frames.</p>
""" .
lv2:freeWheeling a rdf:Property , owl:DatatypeProperty ;
rdfs:label "free-wheeling" ;
rdfs:range xsd:boolean ;
lv2:documentation """
<p>Whether or not processing is currently free-wheeling. If true, this means
that all processing is happening as quickly as possible, not in real-time.
When free-wheeling there is no relationship between the passage of real
wall-clock time and the passage of time in the data being processed (e.g. audio
frames).</p>
""" .
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 , owl:FunctionalProperty ;
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 , owl:FunctionalProperty ;
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 , owl:FunctionalProperty ;
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>
""" .
lv2:Feature a rdfs:Class , owl:Class ;
rdfs:label "Feature" ;
rdfs:comment """
An additional feature which a plugin or other resource may use or require.
""".
lv2:optionalFeature a rdf:Property , owl:ObjectProperty ;
rdfs:range lv2:Feature ;
rdfs:label "Optional feature" ;
lv2:documentation """
<p>Signifies that a plugin or other resource supports a certain feature. If
the host supports this feature, it MUST pass its URI and any additional data to
the plugin in LV2_Descriptor::instantiate(). The plugin MUST NOT fail to
instantiate if an optional feature is not supported by the host.</p>
""" .
lv2:requiredFeature a rdf:Property , owl:ObjectProperty ;
rdfs:range lv2:Feature ;
rdfs:label "Required feature" ;
lv2:documentation """
<p>Signifies that a plugin or other resource requires a certain feature. If
the host supports this feature, it MUST pass its URI and any additional data to
the plugin in LV2_Descriptor::instantiate(). The plugin MUST fail to
instantiate if a required feature is not present; hosts SHOULD always check
this before attempting to instantiate a plugin (i.e. discovery by attempting to
instantiate is strongly discouraged).</p>
""" .
lv2:ExtensionData a rdfs:Class , owl:Class ;
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: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>
""" .
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>
""" .
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.
""" .
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).
""" .
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" .
|