@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#>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix vs: <http://www.w3.org/2003/06/sw-vocab-status/ns#>.
@prefix dc: <http://purl.org/dc/elements/1.1/>.
@prefix event: <http://purl.org/NET/c4dm/event.owl#>.
@prefix af: <http://purl.org/ontology/af/>.
@prefix vamp: <http://purl.org/ontology/vamp/>.
@prefix :         <> .

<> 
	a owl:Ontology;
	dc:title "Vamp Plugins Ontology";
	rdfs:label "Vamp Plugins Ontology";
	rdfs:comment """
			Vamp Ontology. This ontology includes the following descriptions:
			
				- OWL description of the Vamp API
				- OWL description of the Transform environment necessary to set up the execution of any plugin 
			
			This Ontology provides semantics to describe and control Vamp plugins in RDF. Any "RDF-speaker" host is therefore able to 
			use this ontology to read, set up and execute plugins.
			The extracted features are expressed in terms of the Audio Features Ontology: http://purl.org/ontology/af/.
			For more information, please visit the Vamp Plugins website: http://www.vamp-plugins.org/
	""";
	foaf:maker "Chris Cannam";
	foaf:maker "Chris Sutton";
	foaf:maker "Yves Raimond";
	foaf:maker "David Pastor Escuredo";
        dc:date "$Date: 2008/05/21 17:05:11 $";
	.

vs:term_status a owl:AnnotationProperty.

#Authors foaf

#############################################
# Part 1: Describing a Vamp plugin
#############################################

#########################################
# CLASSES
#########################################

# Note: we don't include a Feature concept because we rely on the Audio Feature ontology
# Note: we additionally define a Transform concept to link the running context

vamp:Plugin
	a owl:Class;
	rdfs:label "Vamp Plugin";
	rdfs:comment """
		A Vamp plugin is an implementation of an audio feature extraction algorithm using the Vamp API.
	""";
	vs:term_status "stable";
	.

vamp:PluginLibrary
	a owl:Class;
	rdfs:label "Vamp Plugin Library";
	rdfs:comment """
		Library of Vamp Plugins. This may need to include rights.
	""";
	vs:term_status "stable";
	.

vamp:Parameter
	a owl:Class;
	rdfs:label "Vamp Plugin Parameter";
	rdfs:comment """
		Descriptor for a plugin parameter. Hosts need to know about the specific type and form of the parameters of a particular plugin for a correct transform setup.
	""";
	vs:term_status "stable";
	.

vamp:QuantizedParameter
	a owl:Class;
	rdfs:label "Quantized Parameter";
	rdfs:subClassOf	vamp:Parameter;
	rdfs:comment """
			Descriptor of a parameter that does have quantized values. The property quantize_step is just defined for this subclass and not for the general Parameter.
	""";
	vs:term_status "stable";
	.

vamp:PluginOutput
	a owl:Class;
	rdfs:label "Vamp Plugin output descriptor";
	rdfs:comment """
		Descriptor for an output of a plugin. This descriptor provides information that is necessary to correctly interpret the output features. The output type will determine how to read the temporal information of the extracted features and how to manage the burden of ouput data.
	""";
	vs:term_status "unstable";
	.

#3 classifications of outputs: 
#-density of data
#-quantised
#-known extents

#there is not classification for fix_bin_count

vamp:QuantizedOutput
	a owl:Class;
	rdfs:label "Quantized Output";
	rdfs:subClassOf	vamp:PluginOutput;
	rdfs:comment """
			Descriptor of an output that does have quantized values.
	""";
	vs:term_status "stable";
	.

vamp:KnownExtentsOutput
	a owl:Class;
	rdfs:label "Known Extents Output";
	rdfs:subClassOf	vamp:PluginOutput;
	rdfs:comment """
			Descriptor of an output that does have known extents.
	""";
	vs:term_status "stable";
	.

vamp:DenseOutput
	a owl:Class;
	rdfs:subClassOf vamp:PluginOutput;
	rdfs:label "Dense output";
	rdfs:comment """
		Specific output type for data evenly spaced in time, which may be of high volume and which it is usually desirable to represent in a compact form.
	""";
	vs:term_status "unstable";
	.

vamp:SparseOutput 
	a owl:Class;
	rdfs:label "Sparse output";
	rdfs:subClassOf vamp:PluginOutput;
	rdfs:comment """
		Specific output type for data that consist of features that require their own individual temporal information.
	""";
	vs:term_status "unstable";
	.

vamp:TrackLevelOutput
	a owl:Class;
	rdfs:label "track level output";
	rdfs:subClassOf vamp:PluginOutput;
	rdfs:comment """
		Specific output type for track level information.  The Vamp API does not provide for this sort of output directly, so this will require a "hacky" interpretation of the feature timestamp to establish that it reflects track metadata instead of temporal data.
	""";
	vs:term_status "unstable";
	.

vamp:PluginProgram
	a owl:Class;
	rdfs:label "Plugin program";
	rdfs:comment """
		The program is a predefined context of parameters. We may not need a concept for this and just a property linking a string representing the program name.
	""";
	vs:term_status "unstable";
	.

vamp:Feature
	a owl:Class;
	rdfs:label "Vamp Feature";
	rdfs:comment "This may be removed mighty soon as we rely on the Audio Features Ontology for this";
	vs:term_status "deprecated";
	.

# Classes for enumerations in the Vamp API

vamp:InputDomain
	a owl:Class;
	rdfs:label "Plugin input domain";
	rdfs:comment """
		Plugins declare the input domain they require, so the host can convert the input data properly. Hosts using the Vamp SDK PluginAdapter to wrap plugins should see this work done for them automatically - see the Vamp documentation.
	""";
	vs:term_status "stable";
	.

vamp:SampleType
	a owl:Class;
	rdfs:label "sample type";
	rdfs:comment """
		The sample type specifies the temporal information of the plugin output. This information should be combined with the output type for a correct interpretation.
	""";
	vs:term_status "stable";
	.

##################################################################
# PROPERTIES. 
##################################################################

##### Plugin properties



##!!! lacking plugin version?

vamp:parameter
	a rdf:Property;
	a owl:ObjectProperty;
	rdfs:label "parameter descriptor";
	rdfs:comment """
		Links each parameter descriptor to the plugin.
	""";
	rdfs:range vamp:Parameter;
	rdfs:domain vamp:ParameterBinding;
	rdfs:domain vamp:Plugin;
	vs:term_status "stable";
	.

vamp:output
	a rdf:Property;
	a owl:ObjectProperty;
	rdfs:label "output";
	rdfs:comment """
		Links each output type to the plugin.
	""";
	rdfs:range vamp:PluginOutput;
	rdfs:domain vamp:Plugin;
	rdfs:domain vamp:Transform;
	vs:term_status "stable";
	.

##### Plugin Library properties (could include affiliation, rights...)

vamp:available_plugin 
	a rdf:Property;
	a owl:ObjectProperty;
	rdfs:label "available plugin";
	rdfs:comment """
		Available plugins in the library
	""";
	rdfs:range vamp:Plugin;
	rdfs:domain vamp:PluginLibrary;
	vs:term_status "stable";
	.

#### Plugin Descriptor properties

vamp:identifier
	a rdf:Property;
	a owl:DatatypeProperty;
	rdfs:label "plugin identifier";
	rdfs:comment """
		Machine-readable identifier for a Vamp plugin within the scope of its library, or for a plugin descriptor within the scope of the plugin.
	""";
	rdfs:domain vamp:Plugin;
	rdfs:domain vamp:PluginLibrary;
	rdfs:domain vamp:PluginProgram;
	rdfs:domain vamp:PluginOutput;
	rdfs:domain vamp:Parameter;
	rdfs:domain vamp:Transform;
	vs:term_status "stable";
	.

vamp:name
	a rdf:Property;
	a owl:DatatypeProperty;
	rdfs:label "plugin name";
	rdfs:comment """
		Human-readable identifier for the plugin.
	""";
	rdfs:domain vamp:Plugin;
	vs:term_status "stable";
	.

vamp:vamp_API_version
	a rdf:Property;
	a owl:DatatypeProperty;
	rdfs:label "Vamp API version";
	rdfs:comment """
		Version of the Vamp API used to implement this plugin.
	""";
	rdfs:domain vamp:Plugin;
	vs:term_status "stable";
	.

vamp:input_domain
	a rdf:Property;
	a owl:DatatypeProperty;
	rdfs:label "input domain";
	rdfs:comment """
		Input domain required by the plugin (time or frequency).
	""";
	rdfs:domain vamp:Plugin;
	rdfs:range vamp:InputDomain;
	vs:term_status "stable";
	.

# Note that other properties like maker can be linked to the plugin descriptor using other namespaces

##### Parameter Descriptor properties (and some common with PluginOutput)

# Note: Identifier has been already defined

vamp:max_value
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "max value";
	rdfs:comment """
		Maximum value of the parameter range
	""";
	rdfs:range vamp:Parameter;
	rdfs:range vamp:KnownExtentsOutput;
	vs:term_status "unstable";
	.

vamp:min_value
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "min value";
	rdfs:comment """
		Minimum value of the parameter range
	""";
	rdfs:range vamp:Parameter;
	rdfs:range vamp:KnownExtentsOutput;
	vs:term_status "unstable";
	.

vamp:default_value
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "default value";
	rdfs:comment """
		Default value of the parameter
	""";
	rdfs:range vamp:Parameter;
	vs:term_status "unstable";
	.

vamp:quantize_step
	a rdf:Property;
	a owl:FunctionalProperty;
	a owl:DatatypeProperty;
	rdfs:label "quantized step";
	rdfs:comment """
		Quantize step. Only defined for quantized outputs
	""";
	rdfs:domain vamp:QuantizedOutput;
	rdfs:domain vamp:QuantizedParameter;
	vs:term_status "unstable";
	.

vamp:has_duration
	a rdf:Property;
	a owl:FunctionalProperty;
	a owl:DatatypeProperty;
	rdfs:label "has duration";
	rdfs:comment """
		True if features on this output are known to have durations
	""";
	rdfs:domain vamp:PluginOutput;
	vs:term_status "unstable";
	.

vamp:unit 
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "unit";
	rdfs:comment """
		Unit of the output/parameter. A string type
	""";
	rdfs:domain vamp:PluginOutput;
	rdfs:domain vamp:Parameter;
	vs:term_status "unstable";
	.

vamp:value_names  
	a rdf:Property;
	a owl:DatatypeProperty;
	rdfs:label "value names";
	rdfs:comment """
		List of value names if available
	""";
	rdfs:domain vamp:Parameter;
	vs:term_status "unstable";
	.

########Output Descriptor properties

vamp:fixed_bin_count 
	a rdf:Property;
	a owl:DatatypeProperty;
	rdfs:label "fixed bin count";
	rdfs:comment """
		Fixed bin count. A boolean type.
	""";
	rdfs:domain vamp:PluginOutput;
	vs:term_status "unstable";
	.

vamp:sample_rate
	a rdf:Property;
	a owl:DatatypeProperty;
	rdfs:label "sample rate";
	rdfs:comment """
		Sample rate of the output if any. Should be read depending on SampleType and Output classes.
	""";
	rdfs:domain vamp:PluginOutput;
	vs:term_status "unstable";
	.
	
vamp:bin_count      
	a rdf:Property;
	a owl:DatatypeProperty;
	rdfs:label "bin count";
	rdfs:comment """
		Number of elements of the bin output. This information is necessary to define the output as belonging to a specific subclass of Plugin Output.
	""";
	rdfs:domain vamp:PluginOutput;
	vs:term_status "unstable";
	.

vamp:bin_names  
	a rdf:Property;
	a owl:DatatypeProperty;
	rdfs:label "bin names";
	rdfs:comment """
		List of bin names if available.
	""";
	rdfs:domain vamp:PluginOutput;
	vs:term_status "unstable";
	.

vamp:sample_type  
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "sample type";
	rdfs:comment """
		The sample type specifies the temporal information of the output.
	""";
	rdfs:domain vamp:PluginOutput;
	rdfs:range vamp:SampleType;
	vs:term_status "unstable";
	.

# The next 3 properties are included to link in the Audio Features Ontology (not strictly from the Vamp API).

vamp:computes_event_type
	a rdf:Property;
	a owl:ObjectProperty;
	rdfs:label "event type";
	rdfs:comment """
			Associates a plugin output with its corresponding event type (for example, in the Audio Features ontology).
	""";
	rdfs:domain vamp:PluginOutput;
	rdfs:range event:Event;
	vs:term_status "unstable";
	.

vamp:computes_feature
	a rdf:Property;
	a owl:ObjectProperty;
	rdfs:label "feature type";
	rdfs:comment """
			Associates a plugin output with the attribute connecting the event to its value data.
	""";
	rdfs:domain vamp:PluginOutput;
	rdfs:range event:factor;
	vs:term_status "unstable";
	.

vamp:computes_signal_type
	a rdf:Property;
	a owl:ObjectProperty;
	rdfs:label "signal type";
	rdfs:comment """
			Associates a dense plugin output with its corresponding signal type (for example, in the Audio Features ontology).
	""";
	rdfs:domain vamp:PluginOutput;
	rdfs:range af:Signal;
	vs:term_status "unstable";
	.
	
########################
# INDIVIDUALS
########################

vamp:TimeDomain 
	a vamp:InputDomain;
	.

vamp:FrequencyDomain
	a vamp:InputDomain;
	.

vamp:OneSamplePerStep
	a vamp:SampleType;
	.

vamp:FixedSampleRate
	a vamp:SampleType;
	.

vamp:VariableSampleRate
	a vamp:SampleType; 
	.

################################################### END OF THE VAMP API DESCRIPTION ############################################################


#############################################
# Part 2: Classes to describe plugin execution. TRANSFORM
#############################################

# Note: we need to define this part of the ontology to give a minimun common standard for hosts.
# Note: this may split up in some other ontology or become part of the DSP namespace

vamp:Transform
	a owl:Class;
	rdfs:label "Transform";
	vs:term_status "stable";
	rdfs:comment """
		The Transform defines the environment of any audio processing computation. 
	""";
	.

vamp:ParameterBinding
	a owl:Class;
	rdfs:label "Parameter binding";
	vs:term_status "unstable";
	rdfs:comment """
		Parameter setting used by the plugin transform to set up the plugin.
	""";
	.

vamp:Configuration
	a owl:Class;
	rdfs:label "Configuration";
	vs:term_status "unstable";
	rdfs:comment """
		For extension (key/value data provided to DSSI plugins, not relevant to Vamp)
	""";
	.

vamp:TransformType
	a owl:Class;
	rdfs:label "Transform Type";
	vs:term_status "unstable";
	rdfs:comment """
		Specifies the type of transform. May be feature extraction, effect...
	""";
	.

##individuals of transformtype
vamp:FeatureExtraction
	a vamp:TransformType;
	rdfs:label "Feature Extraction";
	vs:term_status "unstable";
	rdfs:comment """
		Feature extraction transform. This may be just a subclass of Transform...
	""";
	.

vamp:Effect
	a vamp:TransformType;
	rdfs:label "Effect";
	vs:term_status "unstable";
	rdfs:comment """
		Effect transform. This may be just a subclass of Transform...
	""";
	.

################
# Properties
################

##### Plugin Transform properties

#identifier and output are declared above

vamp:engine
	a rdf:Property;
	a owl:ObjectProperty;
	rdfs:label "plugin";
	vs:term_status "stable";
	rdfs:comment """
		Specifies the sort of plugin in execution. This is an extension to use Transform with other plugin libraries
	""";
	rdfs:domain vamp:Transform;
	rdfs:range vamp:Plugin;
	.

vamp:program
	a rdf:Property;
	a owl:ObjectProperty;
	a owl:FunctionalProperty;
	rdfs:label "program";
	vs:term_status "stable";
	rdfs:comment """
		Specifies the program to set the plugin in execution.  Here the plugin program matches with the one in the plugin descriptor. There is not descriptor required for the program (just a string), is it?
	""";
	rdfs:domain vamp:Transform;
	rdfs:range vamp:PluginProgram;
	.

vamp:configuration
	a rdf:Property;
	a owl:ObjectProperty;
	a owl:FunctionalProperty;
	rdfs:label "program";
	vs:term_status "stable";
	rdfs:comment """
		Extension for configuration. 
	""";
	rdfs:domain vamp:Transform;
	rdfs:range vamp:Configuration;
	.

vamp:parameter_binding
	a rdf:Property;
	a owl:ObjectProperty;
	rdfs:label "parameter";
	vs:term_status "stable";
	rdfs:comment """
			Specifies the parameter to set the plugin in execution. 
	""";
	rdfs:domain vamp:Transform;
	rdfs:range vamp:ParameterBinding;
	.

vamp:step_size
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "step size";
	vs:term_status "stable";
	rdfs:comment """
			Specifies the step size for the framing. 
	""";
	rdfs:domain vamp:Transform;
	.

vamp:block_size
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "block size";
	vs:term_status "stable";
	rdfs:comment """
			Specifies the block size for the framing. 
	""";
	rdfs:domain vamp:Transform;
	.

vamp:sample_rate
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "sample rate";
	vs:term_status "stable";
	rdfs:comment """
			Specifies the sample rate if it is not constant.
	""";
	rdfs:domain vamp:Transform;
	.

vamp:transform_type
	a rdf:Property;
	a owl:ObjectProperty;
	a owl:FunctionalProperty;
	rdfs:label "transform type";
	vs:term_status "unstable";
	rdfs:comment """
			Specifies the transform type (we could do this by subclassin transform instead of using a property). 
	""";
	rdfs:domain vamp:Transform;
	.

vamp:window_type
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "window type";
	vs:term_status "unstable";
	rdfs:comment """
			Specifies the window type (they should be individuals and clearly not here). 
	""";
	rdfs:domain vamp:Transform;
	.

vamp:start
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "start";
	vs:term_status "unstable";
	rdfs:comment """
			Specifies temporal information when processing a data stream. 
	""";
	rdfs:domain vamp:Transform;
	.

vamp:duration
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "start";
	vs:term_status "unstable";
	rdfs:comment """
			Specifies temporal information when processing a data stream. 
	""";
	rdfs:domain vamp:Transform;
	.

vamp:summary_type
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "summary type";
	vs:term_status "unstable";
	rdfs:comment """
		     Specifies a summary type to be used (for averaging etc) on transform results.
        """;
	rdfs:domain vamp:Transform;
	.
	
##### Parameter properties

vamp:value
	a rdf:Property;
	a owl:DatatypeProperty;
	a owl:FunctionalProperty;
	rdfs:label "value";
	vs:term_status "stable";
	rdfs:comment """
			Specifies the current value of the parameter. 
	""";
	rdfs:domain vamp:ParameterBinding;
	.

#parameter declared above


# The next property is here to link the Audio Features ontology to the
# Transform ontology terms -- an audio feature may use this to
# indicate which transform produced it

vamp:computed_by
	a rdf:Property;
	a owl:ObjectProperty;
	rdfs:label "computed by";
	rdfs:comment """
			Associates an audio feature with the transform that was used to compute it.
	""";
	rdfs:domain event:Event;
	rdfs:domain af:Signal;
	rdfs:range vamp:Transform;
	vs:term_status "unstable";
	.


