@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 units: <http://lv2plug.in/ns/extensions/units#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .

<http://lv2plug.in/ns/extensions/units>
	a owl:Ontology ;
	owl:imports <http://lv2plug.in/ns/lv2core> ;
	rdfs:seeAlso <units.h> ,
		<lv2-units.doap.ttl> ;
	lv2:documentation """
<p>This vocabulary defines a number of units for use in audio processing.</p>

<p>For example, to say that a gain port's value is in decibels (units:db)</p>
<pre class="turtle-code">
@prefix units: &lt;http://lv2plug.in/ns/extensions/units#&gt; .
@prefix eg:    &lt;http://example.org/&gt; .

eg:plugin lv2:port [
    a            lv2:ControlPort , lv2:InputPort ;
    lv2:datatype lv2:Float ;
    lv2:index    0 ;
    lv2:symbol   "gain" ;
    lv2:name     "gain" ;
    units:unit   units:db
] .
</pre>

<p>Using the same form, plugins may also specify one-off units inline, to give
better display hints to hosts:</p>
<pre class="turtle-code">
eg:plugin lv2:port [
    a            lv2:ControlPort , lv2:InputPort ;
    lv2:datatype lv2:Float ;
    lv2:index    0 ;
    lv2:symbol   "frob" ;
    lv2:name     "frob level" ;
    units:unit [
        a            units:Unit ;
        rdfs:label   "frobnication" ;
        units:symbol "fr" ;
        units:render "%f f"
    ]
] .
</pre>

<p>It is also possible to define conversions between various units, which makes
it possible for hosts to automatically and generically convert from a given
unit to a desired unit.  The units defined in this extension include conversion
definitions where it makes sense to do so.</p>
""" .

units:Unit
	a rdfs:Class ,
		owl:Class ;
	rdfs:label "Unit" ;
	rdfs:comment "A unit for LV2 port data" .

units:unit
	a rdf:Property ,
		owl:ObjectProperty ;
	rdfs:domain lv2:Port ,
		lv2:Parameter ;
	rdfs:range units:Unit ;
	rdfs:label "unit" ;
	rdfs:comment "The unit used by the value of a port or parameter." .

units:render
	a rdf:Property ,
		owl:DatatypeProperty ;
	rdfs:label "unit format string" ;
	rdfs:domain units:Unit ;
	rdfs:range xsd:string ;
	rdfs:comment """A printf format string for rendering a value (eg. "%f dB").""" .

units:symbol
	a rdf:Property ,
		owl:DatatypeProperty ;
	rdfs:label "unit symbol" ;
	rdfs:domain units:Unit ;
	rdfs:range xsd:string ;
	rdfs:comment "The abbreviated symbol for the unit (e.g. dB)." .

units:Conversion
	a rdfs:Class ,
		owl:Class ;
	rdfs:subClassOf [
		a owl:Restriction ;
		owl:onProperty units:to ;
		owl:cardinality 1 ;
		rdfs:comment "A conversion MUST have exactly 1 units:to property."
	] ;
	rdfs:label "Conversion" ;
	rdfs:comment "A conversion from one unit to another." .

units:conversion
	a rdf:Property ,
		owl:ObjectProperty ;
	rdfs:domain units:Unit ;
	rdfs:range units:Conversion ;
	rdfs:label "conversion" ;
	rdfs:comment "A conversion from this unit to another." .

units:prefixConversion
	a rdf:Property ,
		owl:ObjectProperty ;
	rdfs:subPropertyOf units:conversion ;
	rdfs:domain units:Unit ;
	rdfs:range units:Conversion ;
	rdfs:label "prefix conversion" ;
	rdfs:comment """A conversion from this unit to the same unit but with a different SI prefix (e.g. Hz to kHz).""" .

units:to
	a rdf:Property ,
		owl:ObjectProperty ;
	rdfs:domain units:Conversion ;
	rdfs:range units:Unit ;
	rdfs:label "conversion target" ;
	rdfs:comment "The target unit this conversion converts to." .

units:factor
	a rdf:Property ,
		owl:DatatypeProperty ;
	rdfs:domain units:Conversion ;
	rdfs:label "conversion factor" ;
	rdfs:comment """The factor to multiply the source value by in order to convert to the target unit.""" .

units:s
	a units:Unit ;
	units:conversion [
		units:factor 0.0166666666 ;
		units:to units:min
	] ;
	rdfs:label "seconds" ;
	units:prefixConversion [
		units:factor 1000 ;
		units:to units:ms
	] ;
	units:render "%f s" ;
	units:symbol "s" .

units:ms
	a units:Unit ;
	rdfs:label "milliseconds" ;
	units:prefixConversion [
		units:factor 0.001 ;
		units:to units:s
	] ;
	units:render "%f ms" ;
	units:symbol "ms" .

units:min
	a units:Unit ;
	units:conversion [
		units:factor 60.0 ;
		units:to units:s
	] ;
	rdfs:label "minutes" ;
	units:render "%f mins" ;
	units:symbol "min" .

units:bar
	a units:Unit ;
	rdfs:label "bars" ;
	units:render "%f bars" ;
	units:symbol "bars" .

units:beat
	a units:Unit ;
	rdfs:label "beats" ;
	units:render "%f beats" ;
	units:symbol "beats" .

units:frame
	a units:Unit ;
	rdfs:label "audio frames" ;
	units:render "%f frames" ;
	units:symbol "frames" .

units:m
	a units:Unit ;
	units:conversion [
		units:factor 39.37 ;
		units:to units:inch
	] ;
	rdfs:label "metres" ;
	units:prefixConversion [
		units:factor 100 ;
		units:to units:cm
	] , [
		units:factor 1000 ;
		units:to units:mm
	] , [
		units:factor 0.001 ;
		units:to units:km
	] ;
	units:render "%f m" ;
	units:symbol "m" .

units:cm
	a units:Unit ;
	units:conversion [
		units:factor 0.3937 ;
		units:to units:inch
	] ;
	rdfs:label "centimetres" ;
	units:prefixConversion [
		units:factor 0.01 ;
		units:to units:m
	] , [
		units:factor 10 ;
		units:to units:mm
	] , [
		units:factor 0.00001 ;
		units:to units:km
	] ;
	units:render "%f cm" ;
	units:symbol "cm" .

units:mm
	a units:Unit ;
	units:conversion [
		units:factor 0.03937 ;
		units:to units:inch
	] ;
	rdfs:label "millimetres" ;
	units:prefixConversion [
		units:factor 0.001 ;
		units:to units:m
	] , [
		units:factor 0.1 ;
		units:to units:cm
	] , [
		units:factor 0.000001 ;
		units:to units:km
	] ;
	units:render "%f mm" ;
	units:symbol "mm" .

units:km
	a units:Unit ;
	units:conversion [
		units:factor 0.62138818 ;
		units:to units:mile
	] ;
	rdfs:label "kilometres" ;
	units:prefixConversion [
		units:factor 1000 ;
		units:to units:m
	] , [
		units:factor 100000 ;
		units:to units:cm
	] , [
		units:factor 1000000 ;
		units:to units:mm
	] ;
	units:render "%f km" ;
	units:symbol "km" .

units:inch
	a units:Unit ;
	units:conversion [
		units:factor 2.54 ;
		units:to units:cm
	] ;
	rdfs:label "inches" ;
	units:render """%f\"""" ;
	units:symbol "in" .

units:mile
	a units:Unit ;
	units:conversion [
		units:factor 1.6093 ;
		units:to units:km
	] ;
	rdfs:label "miles" ;
	units:render "%f mi" ;
	units:symbol "mi" .

units:db
	a units:Unit ;
	rdfs:label "decibels" ;
	units:render "%f dB" ;
	units:symbol "dB" .

units:pc
	a units:Unit ;
	units:conversion [
		units:factor 0.01 ;
		units:to units:coef
	] ;
	rdfs:label "percent" ;
	units:render "%f%%" ;
	units:symbol "%" .

units:coef
	a units:Unit ;
	units:conversion [
		units:factor 100 ;
		units:to units:pc
	] ;
	rdfs:label "coefficient" ;
	units:render "* %f" ;
	units:symbol "" .

units:hz
	a units:Unit ;
	rdfs:label "hertz" ;
	units:prefixConversion [
		units:factor 0.001 ;
		units:to units:khz
	] , [
		units:factor 0.000001 ;
		units:to units:mhz
	] ;
	units:render "%f Hz" ;
	units:symbol "Hz" .

units:khz
	a units:Unit ;
	rdfs:label "kilohertz" ;
	units:prefixConversion [
		units:factor 1000 ;
		units:to units:hz
	] , [
		units:factor 0.001 ;
		units:to units:mhz
	] ;
	units:render "%f kHz" ;
	units:symbol "kHz" .

units:mhz
	a units:Unit ;
	rdfs:label "megahertz" ;
	units:prefixConversion [
		units:factor 1000000 ;
		units:to units:hz
	] , [
		units:factor 0.001 ;
		units:to units:khz
	] ;
	units:render "%f MHz" ;
	units:symbol "MHz" .

units:bpm
	a units:Unit ;
	rdfs:label "beats per minute" ;
	units:prefixConversion [
		units:factor 0.0166666666 ;
		units:to units:hz
	] ;
	units:render "%f BPM" ;
	units:symbol "BPM" .

units:oct
	a units:Unit ;
	units:conversion [
		units:factor 12.0 ;
		units:to units:semitone12TET
	] ;
	rdfs:label "octaves" ;
	units:render "%f octaves" ;
	units:symbol "oct" .

units:cent
	a units:Unit ;
	units:conversion [
		units:factor 0.01 ;
		units:to units:semitone12TET
	] ;
	rdfs:label "cents" ;
	units:render "%f ct" ;
	units:symbol "ct" .

units:semitone12TET
	a units:Unit ;
	units:conversion [
		units:factor 0.083333333 ;
		units:to units:oct
	] ;
	rdfs:label "semitones" ;
	units:render "%f semi" ;
	units:symbol "semi" .

units:degree
	a units:Unit ;
	rdfs:label "degrees" ;
	units:render "%f deg" ;
	units:symbol "deg" .

units:midiNote
	a units:Unit ;
	rdfs:label "MIDI note" ;
	units:render "MIDI note %d" ;
	units:symbol "note" .
