@prefix trn:  <http://purl.org/stuff/transmissions/> .
@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#> .

## ── Classes ──────────────────────────────────────────────────────────────────

trn:PluginProfile    a owl:Class ; rdfs:label "Plugin Profile" ;
    rdfs:comment "Curated behavioural knowledge about a VST3 plugin." .

trn:DiscoveredPlugin a owl:Class ; rdfs:label "Discovered Plugin" ;
    rdfs:comment "Technical metadata extracted by the isolated VST3 inspector." .

## Role taxonomy
trn:PluginRole            a owl:Class ; rdfs:label "Plugin Role" .
trn:AudioEffect           a owl:Class ; rdfs:subClassOf trn:PluginRole ; rdfs:label "Audio Effect" .
trn:AudioMixer            a owl:Class ; rdfs:subClassOf trn:PluginRole ; rdfs:label "Audio Mixer" .
trn:AudioInstrument       a owl:Class ; rdfs:subClassOf trn:PluginRole ; rdfs:label "Audio Instrument" .
trn:AudioSource           a owl:Class ; rdfs:subClassOf trn:PluginRole ; rdfs:label "Audio Source" .
trn:AudioSink             a owl:Class ; rdfs:subClassOf trn:PluginRole ; rdfs:label "Audio Sink" .
trn:MidiGenerator         a owl:Class ; rdfs:subClassOf trn:PluginRole ; rdfs:label "MIDI Generator" .
trn:MidiProcessor         a owl:Class ; rdfs:subClassOf trn:PluginRole ; rdfs:label "MIDI Processor" .
trn:Instrument            a owl:Class ; rdfs:subClassOf trn:PluginRole ; rdfs:label "Instrument" .
trn:DrumInstrument        a owl:Class ; rdfs:subClassOf trn:Instrument  ; rdfs:label "Drum Instrument" .
trn:BassInstrument        a owl:Class ; rdfs:subClassOf trn:Instrument  ; rdfs:label "Bass Instrument" .
trn:Controller            a owl:Class ; rdfs:subClassOf trn:PluginRole  ; rdfs:label "Controller" ;
    rdfs:comment "Emits control signals (CC, scene notes) that reshape other plugins rather than producing musical audio or notes." .
trn:PerformanceInstrument a owl:Class ; rdfs:subClassOf trn:PluginRole  ; rdfs:label "Performance Instrument" .
trn:Utility               a owl:Class ; rdfs:subClassOf trn:PluginRole  ; rdfs:label "Utility" .

## Signal type instances
trn:Audio         a owl:NamedIndividual ; rdfs:label "Audio" .
trn:Midi          a owl:NamedIndividual ; rdfs:label "MIDI" .
trn:BassMidi      a owl:NamedIndividual ; rdfs:label "Bass MIDI" .
trn:DrumMidi      a owl:NamedIndividual ; rdfs:label "Drum MIDI" .
trn:MelodyMidi    a owl:NamedIndividual ; rdfs:label "Melody MIDI" .
trn:HarmonyMidi   a owl:NamedIndividual ; rdfs:label "Harmony MIDI" .
trn:MultiPartMidi a owl:NamedIndividual ; rdfs:label "Multi-part MIDI" .
trn:ControlMidi   a owl:NamedIndividual ; rdfs:label "Control MIDI" ;
    rdfs:comment "MIDI CCs and scene notes used to reshape other generators rather than to produce musical content directly." .
## These two were in the catalogue before they were in this file: hand-written
## downspout profiles used them, the shapes admit any trn: IRI so ingest kept
## them, and nothing compared the two. The consequence was invisible until the
## signal types reached a page — a plugin could declare a sidechain input that
## no submission form could offer and no label could name.
## tests/store/profile-vocabulary.test.js now binds the file to the data.
trn:AudioSidechain a owl:NamedIndividual ; rdfs:label "Audio Sidechain" ;
    rdfs:comment "A second audio input used to control processing of the first — the key input of a compressor or gate — rather than to be heard." .
trn:MidiCC        a owl:NamedIndividual ; rdfs:label "MIDI CC" ;
    rdfs:comment "MIDI continuous controller messages alone, without note data. Narrower than Control MIDI, which also covers scene notes." .

## Host requirement instances
trn:HostTransport a owl:NamedIndividual ; rdfs:label "Host Transport" ;
    rdfs:comment "Plugin requires the host to provide tempo/beat position." .
trn:Launchpad     a owl:NamedIndividual ; rdfs:label "Launchpad" ;
    rdfs:comment "Plugin expects a Novation Launchpad MIDI controller for full functionality." .

## ── Profile properties ───────────────────────────────────────────────────────

trn:role              a owl:ObjectProperty ; rdfs:domain trn:PluginProfile ; rdfs:range trn:PluginRole .
trn:produces          a owl:ObjectProperty ; rdfs:domain trn:PluginProfile .
trn:accepts           a owl:ObjectProperty ; rdfs:domain trn:PluginProfile .
trn:requires          a owl:ObjectProperty ; rdfs:domain trn:PluginProfile .
trn:recommendedBefore a owl:ObjectProperty ; rdfs:domain trn:PluginProfile .
trn:recommendedAfter  a owl:ObjectProperty ; rdfs:domain trn:PluginProfile .
trn:companion         a owl:ObjectProperty ; rdfs:domain trn:PluginProfile .
trn:genre             a owl:DatatypeProperty ; rdfs:domain trn:PluginProfile ; rdfs:range xsd:string .
trn:caution           a owl:DatatypeProperty ; rdfs:domain trn:PluginProfile ; rdfs:range xsd:string .
trn:homepage          a owl:DatatypeProperty ; rdfs:domain trn:PluginProfile ; rdfs:range xsd:anyURI .

## ── Conductor / CC-control routing ──────────────────────────────────────────
##
## These properties let agents understand which plugins feed CC control signals
## into which receivers and what parameter to set to enable the link.

trn:feedsControls a owl:ObjectProperty ; rdfs:domain trn:PluginProfile ;
    rdfs:label "feeds controls" ;
    rdfs:comment "This plugin emits MIDI CC or scene control signals that can reshape live parameters on the target plugin. Route its MIDI output to the target's MIDI input and set the target's conductor channel parameter to match." .

trn:conductorChannelParam a owl:DatatypeProperty ; rdfs:domain trn:PluginProfile ; rdfs:range xsd:string ;
    rdfs:label "conductor channel parameter" ;
    rdfs:comment "Name of the parameter on this (receiver) plugin that selects which MIDI channel to listen on for Conductor CCs. Set to 0 to disable." .

## ── CC mapping vocabulary ────────────────────────────────────────────────────
##
## Use trn:ccMapping to attach one or more mapping blank nodes to a profile.
## Each blank node carries trn:ccNumber, trn:ccRole, and trn:targetParameter.

trn:ccMapping      a owl:ObjectProperty ; rdfs:domain trn:PluginProfile ;
    rdfs:label "CC mapping" ;
    rdfs:comment "Links a plugin profile to a blank node describing one CC→parameter binding." .

trn:ccNumber       a owl:DatatypeProperty ; rdfs:range xsd:integer ;
    rdfs:label "CC number" ;
    rdfs:comment "MIDI continuous controller number (0–127)." .

trn:ccRole         a owl:DatatypeProperty ; rdfs:range xsd:string ;
    rdfs:label "CC role" ;
    rdfs:comment "Semantic name for this CC as emitted by the controller (e.g. Density, Energy, Scene, Reset)." .

trn:targetParameter a owl:DatatypeProperty ; rdfs:range xsd:string ;
    rdfs:label "target parameter" ;
    rdfs:comment "Symbol or display name of the plugin parameter driven by this CC." .

trn:ccTriggerValue a owl:DatatypeProperty ; rdfs:range xsd:integer ;
    rdfs:label "CC trigger value" ;
    rdfs:comment "When set, the mapping fires only when the CC value equals this integer (e.g. 127 for Reset triggers)." .

## ── Discovery properties ─────────────────────────────────────────────────────

trn:bundleName      a owl:DatatypeProperty ; rdfs:range xsd:string .
trn:vstClassId      a owl:DatatypeProperty ; rdfs:range xsd:string .
trn:vendor          a owl:DatatypeProperty ; rdfs:range xsd:string .
trn:category        a owl:DatatypeProperty ; rdfs:range xsd:string .
trn:modulePath      a owl:DatatypeProperty ; rdfs:range xsd:string .
trn:discoverySource a owl:DatatypeProperty ; rdfs:range xsd:string .

trn:parameter         a owl:ObjectProperty .
trn:parameterTitle    a owl:DatatypeProperty ; rdfs:range xsd:string .
trn:shortTitle        a owl:DatatypeProperty ; rdfs:range xsd:string .
trn:units             a owl:DatatypeProperty ; rdfs:range xsd:string .
trn:defaultNormalized a owl:DatatypeProperty ; rdfs:range xsd:decimal .
trn:stepCount         a owl:DatatypeProperty ; rdfs:range xsd:integer .
trn:parameterFlags    a owl:DatatypeProperty ; rdfs:range xsd:integer .
