@prefix pprops: <http://lv2plug.in/ns/ext/port-props#> .
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@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#> .

<http://lv2plug.in/ns/ext/port-props>
	a lv2:Specification ;
	doap:name "LV2 Port Properties" ;
	doap:release [
		doap:revision "0.1" ;
		doap:created "2011-11-01"
	] ;
	doap:created "2009-01-01" ;
	doap:shortdesc "Additional properties for LV2 plugin ports." ;
	doap:maintainer [
		a foaf:Person ;
		foaf:name "Krzysztof Foltman"
	] , [
		a foaf:Person ;
		foaf:name "David Robillard" ;
		rdfs:seeAlso <http://drobilla.net/drobilla.rdf>
	] ;
	lv2:documentation """
<p>This extension defines several useful properties for LV2 plugin ports, which
can be used in plugin descriptions to better describe ports.  Using this
metadata, hosts can build better UIs for plugins, and provide more advanced
automatic functionality.</p>
""" .

pprops:trigger
	a lv2:PortProperty ;
	rdfs:label "Trigger" ;
	rdfs:comment """
Indicates that the data item corresponds to a momentary event that has been
detected (control output ports) or is to be triggered (control input ports).
For input ports, the port needs to be reset to lv2:default value after run()
function of the plugin has returned. If the control port is assigned a GUI
widget by the host, the widget should be of auto-off (momentary, one-shot) type
- for example, a push button if the port is also declared as lv2:toggled, or a
series of push button or auto-clear input box with a "Send" button if the port
is also lv2:integer.
""" .

pprops:supportsStrictBounds
	a lv2:Feature ;
	rdfs:label "Supports strict bounds" ;
	rdfs:comment """
Indicates use of host support for pprops:hasStrictBounds port property.  A
plugin that specifies it as optional feature can omit value clamping for
hasStrictBounds ports, if the feature is supported by the host.  When specified
as required feature, it indicates that the plugin does not do any clamping for
input ports that have a pprops:hasStrictBounds property.
""" .

pprops:hasStrictBounds
	a lv2:PortProperty ;
	rdfs:label "Has strict bounds" ;
	rdfs:comment """
For hosts that support pprops:supportsStrictBounds, this indicates that the
value of the port should never exceed the port's minimum and maximum control
points.  For input ports, it moves the responsibility for limiting the range of
values to host, if it supports pprops:supportsStrictBounds.  For output ports,
it indicates that values within specified range are to be expected, and
breaking that should be considered by the host as error in plugin
implementation.
""" .

pprops:expensive
	a lv2:PortProperty ;
	rdfs:label "Changes trigger expensive calculation" ;
	rdfs:comment """
Input ports only.  Indicates that any changes to the port value may trigger
expensive background calculation (e.g. regenerate some lookup tables in a
background thread).  Any value changes may have not have immediate effect, or
may cause silence or diminished-quality version of the output until background
processing is finished.  Ports having this property are typically not well
suited for connection to outputs of other plugins, and should not be offered as
connection targets or for automation by default.
""" .

pprops:causesArtifacts
	a lv2:PortProperty ;
	rdfs:label "May cause audio artifacts when changed" ;
	rdfs:comment """
Input ports only.  Indicates that any changes to the port value may produce
slight artifacts to produced audio signals (zipper noise and other results of
signal discontinuities).  Connecting ports of this type to continuous signals
is not recommended, and when presenting a list of automation targets, those
ports may be marked as artifact-producing.
""" .

pprops:continuousCV
	a lv2:PortProperty ;
	rdfs:label "Carries a smooth modulation signal" ;
	rdfs:comment """
Indicates that the port carries a "smooth" modulation signal.  Control input
ports of this type are well-suited for being connected to sources of smooth
signals (knobs with smoothing, modulation rate oscillators, output ports with
continuousCV type, etc.).  Typically, the plugin with ports which have this
property will implement appropriate smoothing to avoid audio artifacts.  For
output ports, this property suggests the value of the port is likely to change
frequently, and describes a smooth signal (e.g. successive values may be
considered points along a curve).
""" .

pprops:discreteCV
	a lv2:PortProperty ;
	rdfs:label "Carries a discrete modulation signal" ;
	rdfs:comment """
Indicates that the port carries a "discrete" modulation signal.  Input ports of
this type are well-suited for being connected to sources of discrete signals
(switches, buttons, classifiers, event detectors, etc.).  May be combined with
pprops:trigger property.  For output ports, this property suggests the value of
the port describe discrete values that should be interpreted as steps (and not
points along a curve).
""" .

pprops:reportsBpm
	a lv2:PortProperty ;
	rdfs:label "Carries the current tempo expressed in BPM" ;
	rdfs:comment """
Indicates that the port is used to pass the current tempo in context of the
plugin (which may be current song tempo, or tempo of a particular subset of the
song, or the subgraph the plugin resides in).  For input ports, the host may
automatically feed the port with current tempo and hide the port from the user,
unless the user or other factors encourage different behaviour.
""" .

pprops:reportsBeatsPerBar
	a lv2:PortProperty ;
	rdfs:label "Carries the current number of beats in a bar" ;
	rdfs:comment """
Indicates that the port may be used to pass the current number of beats in a
bar.  """ .

pprops:reportsBeatUnit
	a lv2:PortProperty ;
	rdfs:label "Carries the current beat size" ;
	rdfs:comment """
Indicates that the port may be used to pass the current size of a beat (4 for a
crochet/quarter note, 8 for a quaver/eighth note, etc.).
""" .

pprops:logarithmic
	a lv2:PortProperty ;
	rdfs:label "Port value uses a logarithmic scale" ;
	rdfs:comment """
Indicates that port value behaviour within specified range (bounds) is a value
using logarithmic scale.  The lower and upper bounds must be specified, and
must be of the same sign.
""" .

pprops:notAutomatic
	a lv2:PortProperty ;
	rdfs:label "Port is not intended as a CV input" ;
	rdfs:comment """
Indicates that the port is not primarily intended to be fed with modulation
signals from external sources (other plugins, etc.).  It is merely a UI hint
and hosts may allow the user to override it.
""" .

pprops:notOnGUI
	a lv2:PortProperty ;
	rdfs:label "Port is not to be displayed on a GUI or equivalent" ;
	rdfs:comment """
Indicates that the port is not primarily intended to be represented by a
separate control in the user interface window (or any similar mechanism used
for direct, immediate control of control ports).  It is merely a UI hint and
hosts may allow the user to override it.
""" .

pprops:priority
	a rdf:Property ;
	rdfs:domain lv2:Port ;
	rdfs:range xsd:float ;
	rdfs:label "Relative usefulness of a port" ;
	rdfs:comment """
Indicates how (typically) useful is the port comparing to other ports with that
property (higher value = more important).  The values do not need to be unique,
and ports can be grouped based on their priorities.
""" .

pprops:rangeSteps
	a rdf:Property ;
	rdfs:domain lv2:Port ;
	rdfs:range xsd:nonNegativeInteger ;
	rdfs:label "Number of value quantization steps" ;
	lv2:documentation """
<p>This value indicates into how many evenly-divided points the (control) port
range shoujld be divided for step-wise control. This may be used for changing
the value with step-based controllers like arrow keys, mouse wheel, rotary
encoders, etc.</p>

<p>Note that when used with a pprops:logarithmic port, the steps are
logarithmic too, and port value can be calculated as:</p>

<pre class="c-code">
value = lower * pow(upper / lower, step / (steps - 1))
</pre>

<p>and the step from value is:</p>

<pre class="c-code">
step = (steps - 1) * log(value / lower) / log(upper / lower)
</pre>

<p>where:</p>
<ul>
<li><code>value</code> is the port value</li>
<li><code>step</code> is the step number (0..steps)</li>
<li><code>steps</code> is the number of steps (= value of :rangeSteps property)</li>
<li><code>lower</code> and <code>upper</code> are the bounds</li>
</ul>
""" .