# melgen/profile.ttl
#
# GENERATED by bin/write-profile.js. Do not edit: the digests are of the
# files on disk, and editing them by hand is how a profile comes to describe
# artefacts that no longer exist. Edit profile.json and run ./build.sh.

@base <https://strandz.it/jigdaw/plugins/melgen/> .

@prefix jig:   <http://purl.org/stuff/jigdaw/> .
@prefix trn:   <http://purl.org/stuff/transmissions/> .
@prefix pu:    <http://purl.org/stuff/plugin-universe/> .
@prefix lv2:   <http://lv2plug.in/ns/lv2core#> .
@prefix midi:  <http://lv2plug.in/ns/ext/midi#> .
@prefix units: <http://lv2plug.in/ns/extensions/units#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix doap:  <http://usefulinc.com/ns/doap#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix foaf:  <http://xmlns.com/foaf/0.1/> .

<>
    a jig:WebPlugin , trn:PluginProfile ;
    rdfs:label "MelGen" ;
    rdfs:comment "Transport synced phrase-aware melody generator. Period, contour and answer shape a seeded line that plays in time with the session, follows an incoming line when asked, and answers Conductor CCs." ;
    trn:vendor "danja" ;
    doap:revision "1.0.0" ;
    doap:developer <http://danny.ayers.name> ;
    foaf:homepage <> ;
    trn:role trn:MidiGenerator ;
    trn:accepts trn:Midi , trn:ControlMidi ;
    trn:produces trn:Midi , trn:MelodyMidi ;
    trn:caution "Silent until the host transport is rolling and reports a tempo and a beat position. A generator with no idea what time it is would be guessing, and this one says so by producing nothing." ;
    trn:caution "Pure MIDI, no audio: route its MIDI output to an instrument. New, Notes and Rhythm are triggers that fire on the rising edge, so each press is one action." ;
    trn:caution "Monophonic by design. A new note ends the note before it rather than overlapping." ;
    trn:format trn:Jig , trn:WebAudio ;
    pu:licenceId "Apache-2.0" ;
    trn:requires jig:MidiEvents ;
    trn:requires jig:MidiOut ;
    trn:requires trn:HostTransport ;

    jig:stateless true ;
    jig:audioInputs 0 ;
    jig:audioOutputs 0 ;
    jig:renderQuantum 128 ;
    jig:latencyFrames 0 ;

    jig:module <#module> ;
    jig:processor <#processor> ;

    lv2:port <#root_note> , <#scale> , <#channel> , <#length_beats> , <#phrase_bars> , <#subdivision> , <#period> , <#contour> , <#answer> , <#density> , <#register> , <#hold> , <#accent> , <#structure> , <#range> , <#leap> , <#rest> , <#cadence> , <#seed> , <#vary> , <#new> , <#notes> , <#rhythm> , <#follow> , <#color> , <#conductor_ch> .

<#module>
    a jig:Module ;
    jig:location <melgen.wasm> ;
    jig:mediaType "application/wasm" ;
    jig:abi jig:Abi2 ;
    jig:integrity "sha384-pHlWAhyB90zxmrf8qS4iLtO3spP5ZDljlLSUxigyV035Z7N5DwbXWo5vdUYWv9Bu" .

<#processor>
    a jig:Processor ;
    jig:location <melgen-processor.js> ;
    jig:mediaType "text/javascript" ;
    jig:registeredName "melgen" ;
    jig:integrity "sha384-d06DP2EY4X4AlXGoatsO8HL3DdMpuo3eFRIz23lMmPgizWc1V864ZtqmTIvxA5Dd" .

<#root_note>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "root_note" ; lv2:name "Root Note" ;
    lv2:default 60 ; lv2:minimum 0 ; lv2:maximum 127 ;
    jig:paramIndex 0 .

<#scale>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "scale" ; lv2:name "Scale" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 22 ;
    jig:paramIndex 1 ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#scale-0> ,
        <#scale-1> ,
        <#scale-2> ,
        <#scale-3> ,
        <#scale-4> ,
        <#scale-5> ,
        <#scale-6> ,
        <#scale-7> ,
        <#scale-8> ,
        <#scale-9> ,
        <#scale-10> ,
        <#scale-11> ,
        <#scale-12> ,
        <#scale-13> ,
        <#scale-14> ,
        <#scale-15> ,
        <#scale-16> ,
        <#scale-17> ,
        <#scale-18> ,
        <#scale-19> ,
        <#scale-20> ,
        <#scale-21> ,
        <#scale-22> .

<#scale-0> rdfs:label "Major" ; rdf:value 0 .

<#scale-1> rdfs:label "Ionian" ; rdf:value 1 .

<#scale-2> rdfs:label "Minor" ; rdf:value 2 .

<#scale-3> rdfs:label "Harmonic Minor" ; rdf:value 3 .

<#scale-4> rdfs:label "Melodic Minor" ; rdf:value 4 .

<#scale-5> rdfs:label "Dorian" ; rdf:value 5 .

<#scale-6> rdfs:label "Phrygian" ; rdf:value 6 .

<#scale-7> rdfs:label "Lydian" ; rdf:value 7 .

<#scale-8> rdfs:label "Mixolydian" ; rdf:value 8 .

<#scale-9> rdfs:label "Locrian" ; rdf:value 9 .

<#scale-10> rdfs:label "Phrygian Dominant" ; rdf:value 10 .

<#scale-11> rdfs:label "Neapolitan Major" ; rdf:value 11 .

<#scale-12> rdfs:label "Neapolitan Minor" ; rdf:value 12 .

<#scale-13> rdfs:label "Pent Major" ; rdf:value 13 .

<#scale-14> rdfs:label "Pent Minor" ; rdf:value 14 .

<#scale-15> rdfs:label "Blues" ; rdf:value 15 .

<#scale-16> rdfs:label "Whole Tone" ; rdf:value 16 .

<#scale-17> rdfs:label "Altered" ; rdf:value 17 .

<#scale-18> rdfs:label "Half Whole Diminished" ; rdf:value 18 .

<#scale-19> rdfs:label "Whole Half Diminished" ; rdf:value 19 .

<#scale-20> rdfs:label "Bebop Dominant" ; rdf:value 20 .

<#scale-21> rdfs:label "Bebop Major" ; rdf:value 21 .

<#scale-22> rdfs:label "Bebop Minor" ; rdf:value 22 .

<#channel>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "channel" ; lv2:name "Channel" ;
    lv2:default 1 ; lv2:minimum 1 ; lv2:maximum 16 ;
    jig:paramIndex 2 .

<#length_beats>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "length_beats" ; lv2:name "Length Beats" ;
    lv2:default 16 ; lv2:minimum 4 ; lv2:maximum 64 ;
    jig:paramIndex 3 .

<#phrase_bars>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "phrase_bars" ; lv2:name "Phrase Bars" ;
    lv2:default 2 ; lv2:minimum 1 ; lv2:maximum 8 ;
    jig:paramIndex 4 .

<#subdivision>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "subdivision" ; lv2:name "Subdivision" ;
    lv2:default 1 ; lv2:minimum 0 ; lv2:maximum 3 ;
    jig:paramIndex 5 ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#subdivision-0> ,
        <#subdivision-1> ,
        <#subdivision-2> ,
        <#subdivision-3> .

<#subdivision-0> rdfs:label "Eighth" ; rdf:value 0 .

<#subdivision-1> rdfs:label "Sixteenth" ; rdf:value 1 .

<#subdivision-2> rdfs:label "Sixteenth Triplet" ; rdf:value 2 .

<#subdivision-3> rdfs:label "Quarter" ; rdf:value 3 .

<#period>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "period" ; lv2:name "Period" ;
    lv2:default 4 ; lv2:minimum 0 ; lv2:maximum 5 ;
    jig:paramIndex 6 ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#period-0> ,
        <#period-1> ,
        <#period-2> ,
        <#period-3> ,
        <#period-4> ,
        <#period-5> .

<#period-0> rdfs:label "Free" ; rdf:value 0 .

<#period-1> rdfs:label "A A" ; rdf:value 1 .

<#period-2> rdfs:label "A B" ; rdf:value 2 .

<#period-3> rdfs:label "A A'" ; rdf:value 3 .

<#period-4> rdfs:label "Call Answer" ; rdf:value 4 .

<#period-5> rdfs:label "A B A" ; rdf:value 5 .

<#contour>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "contour" ; lv2:name "Contour" ;
    lv2:default 4 ; lv2:minimum 0 ; lv2:maximum 5 ;
    jig:paramIndex 7 ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#contour-0> ,
        <#contour-1> ,
        <#contour-2> ,
        <#contour-3> ,
        <#contour-4> ,
        <#contour-5> .

<#contour-0> rdfs:label "Wandering" ; rdf:value 0 .

<#contour-1> rdfs:label "Flat" ; rdf:value 1 .

<#contour-2> rdfs:label "Rising" ; rdf:value 2 .

<#contour-3> rdfs:label "Falling" ; rdf:value 3 .

<#contour-4> rdfs:label "Arch" ; rdf:value 4 .

<#contour-5> rdfs:label "Inverted Arch" ; rdf:value 5 .

<#answer>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "answer" ; lv2:name "Answer" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 5 ;
    jig:paramIndex 8 ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#answer-0> ,
        <#answer-1> ,
        <#answer-2> ,
        <#answer-3> ,
        <#answer-4> ,
        <#answer-5> .

<#answer-0> rdfs:label "Related" ; rdf:value 0 .

<#answer-1> rdfs:label "Same" ; rdf:value 1 .

<#answer-2> rdfs:label "Transpose" ; rdf:value 2 .

<#answer-3> rdfs:label "Invert" ; rdf:value 3 .

<#answer-4> rdfs:label "Compress" ; rdf:value 4 .

<#answer-5> rdfs:label "Expand" ; rdf:value 5 .

<#density>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "density" ; lv2:name "Density" ;
    lv2:default 0.48 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 9 .

<#register>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "register" ; lv2:name "Register" ;
    lv2:default 1 ; lv2:minimum 0 ; lv2:maximum 4 ;
    jig:paramIndex 10 .

<#hold>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "hold" ; lv2:name "Hold" ;
    lv2:default 0.42 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 11 .

<#accent>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "accent" ; lv2:name "Accent" ;
    lv2:default 0.45 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 12 .

<#structure>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "structure" ; lv2:name "Structure" ;
    lv2:default 0.62 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 13 .

<#range>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "range" ; lv2:name "Range" ;
    lv2:default 0.45 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 14 .

<#leap>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "leap" ; lv2:name "Leap" ;
    lv2:default 0.28 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 15 .

<#rest>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "rest" ; lv2:name "Rest" ;
    lv2:default 0.24 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 16 .

<#cadence>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "cadence" ; lv2:name "Cadence" ;
    lv2:default 0.55 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 17 .

<#seed>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "seed" ; lv2:name "Seed" ;
    lv2:default 1 ; lv2:minimum 1 ; lv2:maximum 65535 ;
    jig:paramIndex 18 .

<#vary>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "vary" ; lv2:name "Vary" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 19 .

<#new>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "new" ; lv2:name "New" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 20 ;
    lv2:portProperty lv2:toggled .

<#notes>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "notes" ; lv2:name "Notes" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 21 ;
    lv2:portProperty lv2:toggled .

<#rhythm>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "rhythm" ; lv2:name "Rhythm" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 22 ;
    lv2:portProperty lv2:toggled .

<#follow>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "follow" ; lv2:name "Follow" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 23 .

<#color>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "color" ; lv2:name "Color" ;
    lv2:default 0.5 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 24 .

<#conductor_ch>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "conductor_ch" ; lv2:name "Conductor Ch" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 16 ;
    jig:paramIndex 25 .
