@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@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 tl: <http://purl.org/NET/c4dm/timeline.owl#> .
@prefix event: <http://purl.org/NET/c4dm/event.owl#> .
@prefix mo: <http://purl.org/ontology/mo/> .
@prefix co: <http://purl.org/ontology/chord/> .
@prefix : <http://purl.org/ontology/symbolic-music/> .

<file:///usr/local/archivo-data/purl.org/ontology--symbolic-music/2025.03.14-124433/ontology--symbolic-music_type=orig.ttl>
    a owl:Ontology ;
    rdfs:comment """
		Symbolic notation ontology
		TODO:
			* Time signature;
			* Key signature?
			* Repetitions
	"""@en ;
    foaf:maker <http://moustaki.org/foaf.rdf#moustaki> .

:Accidental
    a owl:Class ;
    rdfs:comment """
		An accidental - eg. flat, sharp, natural
	""" ;
    rdfs:label "accidental"@en .

:Bar
    a owl:Class ;
    rdfs:comment """
		A bar is an event, grouping a bunch of sub_event - eg. note events.
		Relationships such as Allen's meets hold for two consecutive bars.
	"""@en ;
    rdfs:label "bar"@en ;
    rdfs:subClassOf event:Event .

:DottedDoubleWholeNote
    a owl:Class ;
    rdfs:label "dotted double whole note"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :DottedDoubleWhole ;
        owl:onProperty event:time
    ] .

:DottedEighthNote
    a owl:Class ;
    rdfs:label "dotted eighth note"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :DottedEighth ;
        owl:onProperty event:time
    ] .

:DottedHalfNote
    a owl:Class ;
    rdfs:label "dotted half note"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :DottedHalf ;
        owl:onProperty event:time
    ] .

:DottedQuarterNote
    a owl:Class ;
    rdfs:label "dotted quarter note"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :DottedQuarter ;
        owl:onProperty event:time
    ] .

:DottedSixteenthNote
    a owl:Class ;
    rdfs:label "dotted sixteenth note"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentlass [
        a owl:Restriction ;
        owl:allValuesFrom :DottedSixteenth ;
        owl:onProperty event:time
    ] .

:DottedThirtySecondNote
    a owl:Class ;
    rdfs:label "dotted thirty second note"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :DottedThirtysecond ;
        owl:onProperty event:time
    ] .

:DottedWholeNote
    a owl:Class ;
    rdfs:label "dotted whole note"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :DottedWhole ;
        owl:onProperty event:time
    ] .

:DoubleWhole
    a owl:Class ;
    rdfs:label "double whole"@en ;
    rdfs:subClassOf :ScoreInterval ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:hasValue "2"^^xsd:float ;
        owl:onProperty tl:duration
    ] .

:DoubleWholeNote
    a owl:Class ;
    rdfs:label "breve"@en-UK, "double ronde"@fr, "double whole"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :DoubleWhole ;
        owl:onProperty event:time
    ] .

:DoubleWholeRest
    a owl:Class ;
    rdfs:label "breve rest"@en-UK, "double whole rest"@en-US ;
    rdfs:subClassOf :RestEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :DoubleWhole ;
        owl:onProperty event:time
    ] .

:Eighth
    a owl:Class ;
    rdfs:label "eighth"@en ;
    rdfs:subClassOf :ScoreInterval ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:hasValue "0.125"^^xsd:float ;
        owl:onProperty tl:duration
    ] .

:EighthNote
    a owl:Class ;
    rdfs:label "croche"@fr, "eighth note"@en-US, "quaver"@en-UK ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Eighth ;
        owl:onProperty event:time
    ] .

:EighthRest
    a owl:Class ;
    rdfs:label "eighth rest"@en-US, "quaver rest"@en-UK ;
    rdfs:subClassOf :RestEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Eighth ;
        owl:onProperty event:time
    ] .

:Half
    a owl:Class ;
    rdfs:label "half"@en ;
    rdfs:subClassOf :ScoreInterval ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:hasValue "0.5"^^xsd:float ;
        owl:onProperty tl:duration
    ] .

:HalfNote
    a owl:Class ;
    rdfs:label "blanche"@fr, "half note"@en-US, "minim"@en-UK ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Half ;
        owl:onProperty event:time
    ] .

:HalfRest
    a owl:Class ;
    rdfs:label "half rest"@en-US, "minim rest"@en-UK ;
    rdfs:subClassOf :RestEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Half ;
        owl:onProperty event:time
    ] .

:Longa
    a owl:Class ;
    rdfs:label "longa"@en ;
    rdfs:subClassOf :ScoreInterval ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:hasValue "4"^^xsd:float ;
        owl:onProperty tl:duration
    ] .

:LongaRest
    a owl:Class ;
    rdfs:label "longa"@en ;
    rdfs:subClassOf :RestEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Longa ;
        owl:onProperty event:time
    ] .

:Motif
    a owl:Class ;
    rdfs:comment """
		A classification of a set of events forming a motif.
		It can either be several note events, a set of bars, etc.
	""" ;
    rdfs:label "motif"@en ;
    rdfs:subClassOf event:Event .

:Note
    a owl:Class ;
    rdfs:comment """
		A note. Either A, B, C, D, E, F or G.
	"""@en ;
    rdfs:label "note"@en .

:NoteEvent
    a owl:Class ;
    rdfs:comment """
		Classifying a particular region of a score' timeline (or another concept,
		depending on the context), as holding a note. Several subclasses are defined,
		implicitly specifying (through a DL restriction) the duration of the event.
	"""@en ;
    rdfs:label "note event"@en ;
    rdfs:subClassOf event:Event ;
    owl:disjointWith :RestEvent .

:Octave
    a owl:Class .

:Pitch
    a owl:Class ;
    rdfs:comment """
		The pitch of a note. A pitch holds information about the modifiers (sharp, flat, natural), the note, and the octave.
	"""@en ;
    rdfs:label "pitch"@en .

:Quarter
    a owl:Class ;
    rdfs:label "quarter"@en ;
    rdfs:subClassOf :ScoreInterval ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:hasValue "0.25"^^xsd:float ;
        owl:onProperty tl:duration
    ] .

:QuarterNote
    a owl:Class ;
    rdfs:label "crotchet"@en-UK, "noire"@fr, "quarter note"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Quarter ;
        owl:onProperty event:time
    ] .

:QuarterRest
    a owl:Class ;
    rdfs:label "crotchet rest"@en-UK, "quarter rest"@en-US ;
    rdfs:subClassOf :RestEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Quarter ;
        owl:onProperty event:time
    ] .

:RestEvent
    a owl:Class ;
    rdfs:comment """
		Classifying a particular region as holding a rest (an interval of silence).
		Subclasses of this event are restriced to a particular length, as note events.
	"""@en ;
    rdfs:label "rest event"@en ;
    rdfs:subClassOf event:Event ;
    owl:disjointWith :NoteEvent .

:ScoreInterval
    a owl:Class ;
    rdfs:comment """
		An interval defined on a score time line (defined 
		canonically in number of beats).
	"""@en ;
    rdfs:label "score interval"@en ;
    rdfs:subClassOf tl:AbstractInterval .

:ScoreTimeLine
    a owl:Class ;
    rdfs:comment """
		A class of timelines backing scores, or other symbolic
		representations. 
	"""@en ;
    rdfs:label "score timeline"@en ;
    rdfs:subClassOf tl:AbstractTimeLine .

:Sixteenth
    a owl:Class ;
    rdfs:label "sixteenth"@en ;
    rdfs:subClassOf :ScoreInterval ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:hasValue "0.0625"^^xsd:float ;
        owl:onProperty tl:duration
    ] .

:SixteenthNote
    a owl:Class ;
    rdfs:label "double croche"@fr, "semiquaver"@en-UK, "sixteenth note"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Sixteenth ;
        owl:onProperty event:time
    ] .

:SixteenthRest
    a owl:Class ;
    rdfs:label "semiquaver rest"@en-UK, "sixteenth rest"@en-US ;
    rdfs:subClassOf :RestEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Sixteenth ;
        owl:onProperty event:time
    ] .

:Slur
    a owl:Class ;
    rdfs:label "slur"@en-UK ;
    rdfs:subClassOf event:Event .

:ThirtySecondNote
    a owl:Class ;
    rdfs:label "demisemiquaver"@en-UK, "thirtysecond note"@en-US, "triple croche"@fr ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Thirtysecond ;
        owl:onProperty event:time
    ] .

:ThirtySecondRest
    a owl:Class ;
    rdfs:label "demisemiquaver rest"@en-UK, "thirtysecond rest"@en-US ;
    rdfs:subClassOf :RestEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Thirtysecond ;
        owl:onProperty event:time
    ] .

:Thirtysecond
    a owl:Class ;
    rdfs:label "thirtysecond"@en ;
    rdfs:subClassOf :ScoreInterval ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:hasValue "0.03125"^^xsd:float ;
        owl:onProperty tl:duration
    ] .

:Tie
    a owl:Class ;
    rdfs:label "tie"@en-UK ;
    rdfs:subClassOf event:Event .

:Timbre
    a owl:Class .

:Voice
    a owl:Class ;
    rdfs:comment """
		This is stolen from Christophe Rhodes' GSharp.
		A grouping of events forming a `voice'.
	""" ;
    rdfs:label "voice"@en ;
    rdfs:subClassOf event:Event .

:Whole
    a owl:Class ;
    rdfs:label "whole"@en ;
    rdfs:subClassOf :ScoreInterval ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:hasValue "1"^^xsd:float ;
        owl:onProperty tl:duration
    ] .

:WholeNote
    a owl:Class ;
    rdfs:label "ronde"@fr, "semibreve"@en-UK, "whole note"@en-US ;
    rdfs:subClassOf :NoteEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Whole ;
        owl:onProperty event:time
    ] .

:WholeRest
    a owl:Class ;
    rdfs:label "semibreve rest"@en-UK, "whole rest"@en-US ;
    rdfs:subClassOf :RestEvent ;
    owl:equivalentClass [
        a owl:Restriction ;
        owl:allValuesFrom :Whole ;
        owl:onProperty event:time
    ] .

:a
    a :Note .

:accidental
    a owl:FunctionalProperty, owl:ObjectProperty ;
    rdfs:domain :Note ;
    rdfs:label "accidental"@en ;
    rdfs:range :Accidental .

:b
    a :Note .

:c
    a :Note .

:d
    a :Note .

:double_flat
    a :Accidental .

:double_natural
    a :Accidental .

:double_sharp
    a :Accidental .

:e
    a :Note .

:f
    a :Note .

:flat
    a :Accidental .

:g
    a :Note .

:natural
    a :Accidental .

:note
    a owl:FunctionalProperty, owl:ObjectProperty ;
    rdfs:domain :Pitch ;
    rdfs:label "note"@en ;
    rdfs:range :Note .

:octave
    a owl:DatatypeProperty ;
    rdfs:domain :Note ;
    rdfs:label "octave"@en ;
    rdfs:range xsd:int .

:pitch
    a owl:FunctionalProperty, owl:ObjectProperty ;
    rdfs:domain :NoteEvent ;
    rdfs:label "pitch"@en ;
    rdfs:range :Pitch ;
    rdfs:subPropertyOf event:factor .

:sharp
    a :Accidental .

:timbre
    a owl:ObjectProperty ;
    rdfs:domain :NoteEvent ;
    rdfs:label "timbre"@en ;
    rdfs:range :Timbre ;
    rdfs:subPropertyOf event:factor .

