# quartet/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/quartet/> .

@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 pprops: <http://lv2plug.in/ns/ext/port-props#> .
@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 "Quartet" ;
    rdfs:comment "Eight-voice four-operator FM synthesiser with eleven algorithms, band-limited sine, saw and square operators, per-operator envelopes, feedback, optional 2x oversampling, a pitch envelope and a multimode filter. It opens as a mono bass." ;
    trn:vendor "danja" ;
    doap:revision "1.0.0" ;
    doap:developer <http://danny.ayers.name> ;
    foaf:homepage <> ;
    trn:role trn:Instrument , trn:AudioInstrument ;
    trn:accepts trn:Midi ;
    trn:produces trn:Audio ;
    trn:genre "FM synthesis" , "Bass" , "Synthesizer" ;
    trn:caution "It opens as a bass: algorithm 1, mono, a 24 dB low-pass at 2.4 kHz. Set Play Mode to Poly for chords." ;
    trn:caution "A ninth note steals the quietest voice rather than being refused." ;
    trn:caution "The panel does not draw the routing or the filter response the VST3 does; the algorithm is named in its choice list instead." ;
    trn:format trn:Jig ;
    pu:licenceId "MIT" ;
    trn:requires jig:MidiEvents ;

    jig:audioInputs 0 ;
    jig:audioOutputs 1 ;
    jig:outputChannels 2 ;
    jig:renderQuantum 128 ;
    jig:latencyFrames 0 ;
    jig:tailFrames 384000 ;

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

    lv2:port <#opa_wave> , <#opa_fixed> , <#opa_ratio> , <#opa_fine> , <#opa_fixed_hz> , <#opa_level> , <#opa_attack> , <#opa_decay> , <#opa_sustain> , <#opa_release> , <#opb_wave> , <#opb_fixed> , <#opb_ratio> , <#opb_fine> , <#opb_fixed_hz> , <#opb_level> , <#opb_attack> , <#opb_decay> , <#opb_sustain> , <#opb_release> , <#opc_wave> , <#opc_fixed> , <#opc_ratio> , <#opc_fine> , <#opc_fixed_hz> , <#opc_level> , <#opc_attack> , <#opc_decay> , <#opc_sustain> , <#opc_release> , <#opd_wave> , <#opd_fixed> , <#opd_ratio> , <#opd_fine> , <#opd_fixed_hz> , <#opd_level> , <#opd_attack> , <#opd_decay> , <#opd_sustain> , <#opd_release> , <#algorithm> , <#feedback> , <#depth> , <#pitch_env> , <#pitch_env_amount> , <#pitch_attack> , <#pitch_decay> , <#pitch_sustain> , <#pitch_release> , <#filter_type> , <#cutoff> , <#resonance> , <#key_track> , <#master> , <#velocity> , <#bend_range> , <#quality> , <#play_mode> , <#glide> .

<#module>
    a jig:Module ;
    jig:location <quartet.wasm> ;
    jig:mediaType "application/wasm" ;
    jig:abi jig:Abi2 ;
    jig:integrity "sha384-bgeyeYK+5A3IT5uUFfmGfGUjv0d03cMGc5RTqtf+1DsH1s/AnTkKrD2AKcBiZ6e5" .

<#processor>
    a jig:Processor ;
    jig:location <quartet-processor.js> ;
    jig:mediaType "text/javascript" ;
    jig:registeredName "quartet" ;
    jig:integrity "sha384-Ot6G+khz/VEbG+uGCEt7u4ScNRXqQ/j5pHobkxvGZMHCOrjPVBr4CVLNz2bKGCyV" .

<#skin>
    a jig:Skin ;
    jig:location <skin/skin.html> ;
    jig:mediaType "text/html" ;
    jig:integrity "sha384-p9WjIW8YUaqPCmr9lA1bOQMb+0Jl9kijPguDaaUt0xioAX16JcTDLniZHpvtVP1j" .

<#opa_wave>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opa_wave" ; lv2:name "Op A Waveform" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 2 ;
    jig:paramIndex 0 ;
    jig:controlGroup "Operator A" ;
    rdfs:comment "Operator A: sine, saw or square. Saw and square are band-limited." ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#opa_wave-0> ,
        <#opa_wave-1> ,
        <#opa_wave-2> .

<#opa_wave-0> rdfs:label "Sine" ; rdf:value 0 .

<#opa_wave-1> rdfs:label "Saw" ; rdf:value 1 .

<#opa_wave-2> rdfs:label "Square" ; rdf:value 2 .

<#opa_fixed>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opa_fixed" ; lv2:name "Op A Fixed Frequency" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 1 ;
    jig:controlGroup "Operator A" ;
    rdfs:comment "Operator A: off follows the note (ratio), on plays a fixed frequency." ;
    lv2:portProperty lv2:toggled .

<#opa_ratio>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opa_ratio" ; lv2:name "Op A Ratio" ;
    lv2:default 1 ; lv2:minimum 0.25 ; lv2:maximum 32 ;
    jig:paramIndex 2 ;
    jig:controlGroup "Operator A" ;
    rdfs:comment "Operator A: frequency as a multiple of the note." .

<#opa_fine>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opa_fine" ; lv2:name "Op A Fine" ;
    lv2:default 0 ; lv2:minimum -50 ; lv2:maximum 50 ;
    jig:paramIndex 3 ;
    jig:controlGroup "Operator A" ;
    rdfs:comment "Operator A: fine tuning in cents." ;
    units:unit units:cent .

<#opa_fixed_hz>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opa_fixed_hz" ; lv2:name "Op A Fixed Hz" ;
    lv2:default 440 ; lv2:minimum 10 ; lv2:maximum 20000 ;
    jig:paramIndex 4 ;
    jig:controlGroup "Operator A" ;
    rdfs:comment "Operator A: the frequency when Fixed Frequency is on." ;
    units:unit units:hz ;
    lv2:portProperty pprops:logarithmic .

<#opa_level>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opa_level" ; lv2:name "Op A Level" ;
    lv2:default 0.9 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 5 ;
    jig:controlGroup "Operator A" ;
    rdfs:comment "Operator A: the loudness of a carrier, or how hard a modulator pushes its target." ;
    pprops:displayPriority 60 .

<#opa_attack>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opa_attack" ; lv2:name "Op A Attack" ;
    lv2:default 2 ; lv2:minimum 0.5 ; lv2:maximum 5000 ;
    jig:paramIndex 6 ;
    jig:controlGroup "Operator A" ;
    rdfs:comment "Operator A envelope: time to rise to full." ;
    units:unit units:ms .

<#opa_decay>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opa_decay" ; lv2:name "Op A Decay" ;
    lv2:default 600 ; lv2:minimum 1 ; lv2:maximum 8000 ;
    jig:paramIndex 7 ;
    jig:controlGroup "Operator A" ;
    rdfs:comment "Operator A envelope: time to fall to Sustain." ;
    units:unit units:ms .

<#opa_sustain>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opa_sustain" ; lv2:name "Op A Sustain" ;
    lv2:default 0.8 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 8 ;
    jig:controlGroup "Operator A" ;
    rdfs:comment "Operator A envelope: the level held while the key is down." .

<#opa_release>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opa_release" ; lv2:name "Op A Release" ;
    lv2:default 140 ; lv2:minimum 1 ; lv2:maximum 8000 ;
    jig:paramIndex 9 ;
    jig:controlGroup "Operator A" ;
    rdfs:comment "Operator A envelope: time to fade after the key is let go." ;
    units:unit units:ms .

<#opb_wave>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opb_wave" ; lv2:name "Op B Waveform" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 2 ;
    jig:paramIndex 10 ;
    jig:controlGroup "Operator B" ;
    rdfs:comment "Operator B: sine, saw or square. Saw and square are band-limited." ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#opb_wave-0> ,
        <#opb_wave-1> ,
        <#opb_wave-2> .

<#opb_wave-0> rdfs:label "Sine" ; rdf:value 0 .

<#opb_wave-1> rdfs:label "Saw" ; rdf:value 1 .

<#opb_wave-2> rdfs:label "Square" ; rdf:value 2 .

<#opb_fixed>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opb_fixed" ; lv2:name "Op B Fixed Frequency" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 11 ;
    jig:controlGroup "Operator B" ;
    rdfs:comment "Operator B: off follows the note (ratio), on plays a fixed frequency." ;
    lv2:portProperty lv2:toggled .

<#opb_ratio>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opb_ratio" ; lv2:name "Op B Ratio" ;
    lv2:default 1 ; lv2:minimum 0.25 ; lv2:maximum 32 ;
    jig:paramIndex 12 ;
    jig:controlGroup "Operator B" ;
    rdfs:comment "Operator B: frequency as a multiple of the note." .

<#opb_fine>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opb_fine" ; lv2:name "Op B Fine" ;
    lv2:default 0 ; lv2:minimum -50 ; lv2:maximum 50 ;
    jig:paramIndex 13 ;
    jig:controlGroup "Operator B" ;
    rdfs:comment "Operator B: fine tuning in cents." ;
    units:unit units:cent .

<#opb_fixed_hz>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opb_fixed_hz" ; lv2:name "Op B Fixed Hz" ;
    lv2:default 440 ; lv2:minimum 10 ; lv2:maximum 20000 ;
    jig:paramIndex 14 ;
    jig:controlGroup "Operator B" ;
    rdfs:comment "Operator B: the frequency when Fixed Frequency is on." ;
    units:unit units:hz ;
    lv2:portProperty pprops:logarithmic .

<#opb_level>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opb_level" ; lv2:name "Op B Level" ;
    lv2:default 0.42 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 15 ;
    jig:controlGroup "Operator B" ;
    rdfs:comment "Operator B: the loudness of a carrier, or how hard a modulator pushes its target." ;
    pprops:displayPriority 55 .

<#opb_attack>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opb_attack" ; lv2:name "Op B Attack" ;
    lv2:default 1 ; lv2:minimum 0.5 ; lv2:maximum 5000 ;
    jig:paramIndex 16 ;
    jig:controlGroup "Operator B" ;
    rdfs:comment "Operator B envelope: time to rise to full." ;
    units:unit units:ms .

<#opb_decay>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opb_decay" ; lv2:name "Op B Decay" ;
    lv2:default 220 ; lv2:minimum 1 ; lv2:maximum 8000 ;
    jig:paramIndex 17 ;
    jig:controlGroup "Operator B" ;
    rdfs:comment "Operator B envelope: time to fall to Sustain." ;
    units:unit units:ms .

<#opb_sustain>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opb_sustain" ; lv2:name "Op B Sustain" ;
    lv2:default 0.18 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 18 ;
    jig:controlGroup "Operator B" ;
    rdfs:comment "Operator B envelope: the level held while the key is down." .

<#opb_release>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opb_release" ; lv2:name "Op B Release" ;
    lv2:default 90 ; lv2:minimum 1 ; lv2:maximum 8000 ;
    jig:paramIndex 19 ;
    jig:controlGroup "Operator B" ;
    rdfs:comment "Operator B envelope: time to fade after the key is let go." ;
    units:unit units:ms .

<#opc_wave>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opc_wave" ; lv2:name "Op C Waveform" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 2 ;
    jig:paramIndex 20 ;
    jig:controlGroup "Operator C" ;
    rdfs:comment "Operator C: sine, saw or square. Saw and square are band-limited." ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#opc_wave-0> ,
        <#opc_wave-1> ,
        <#opc_wave-2> .

<#opc_wave-0> rdfs:label "Sine" ; rdf:value 0 .

<#opc_wave-1> rdfs:label "Saw" ; rdf:value 1 .

<#opc_wave-2> rdfs:label "Square" ; rdf:value 2 .

<#opc_fixed>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opc_fixed" ; lv2:name "Op C Fixed Frequency" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 21 ;
    jig:controlGroup "Operator C" ;
    rdfs:comment "Operator C: off follows the note (ratio), on plays a fixed frequency." ;
    lv2:portProperty lv2:toggled .

<#opc_ratio>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opc_ratio" ; lv2:name "Op C Ratio" ;
    lv2:default 2 ; lv2:minimum 0.25 ; lv2:maximum 32 ;
    jig:paramIndex 22 ;
    jig:controlGroup "Operator C" ;
    rdfs:comment "Operator C: frequency as a multiple of the note." .

<#opc_fine>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opc_fine" ; lv2:name "Op C Fine" ;
    lv2:default 0 ; lv2:minimum -50 ; lv2:maximum 50 ;
    jig:paramIndex 23 ;
    jig:controlGroup "Operator C" ;
    rdfs:comment "Operator C: fine tuning in cents." ;
    units:unit units:cent .

<#opc_fixed_hz>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opc_fixed_hz" ; lv2:name "Op C Fixed Hz" ;
    lv2:default 440 ; lv2:minimum 10 ; lv2:maximum 20000 ;
    jig:paramIndex 24 ;
    jig:controlGroup "Operator C" ;
    rdfs:comment "Operator C: the frequency when Fixed Frequency is on." ;
    units:unit units:hz ;
    lv2:portProperty pprops:logarithmic .

<#opc_level>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opc_level" ; lv2:name "Op C Level" ;
    lv2:default 0.14 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 25 ;
    jig:controlGroup "Operator C" ;
    rdfs:comment "Operator C: the loudness of a carrier, or how hard a modulator pushes its target." ;
    pprops:displayPriority 43 .

<#opc_attack>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opc_attack" ; lv2:name "Op C Attack" ;
    lv2:default 1 ; lv2:minimum 0.5 ; lv2:maximum 5000 ;
    jig:paramIndex 26 ;
    jig:controlGroup "Operator C" ;
    rdfs:comment "Operator C envelope: time to rise to full." ;
    units:unit units:ms .

<#opc_decay>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opc_decay" ; lv2:name "Op C Decay" ;
    lv2:default 120 ; lv2:minimum 1 ; lv2:maximum 8000 ;
    jig:paramIndex 27 ;
    jig:controlGroup "Operator C" ;
    rdfs:comment "Operator C envelope: time to fall to Sustain." ;
    units:unit units:ms .

<#opc_sustain>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opc_sustain" ; lv2:name "Op C Sustain" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 28 ;
    jig:controlGroup "Operator C" ;
    rdfs:comment "Operator C envelope: the level held while the key is down." .

<#opc_release>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opc_release" ; lv2:name "Op C Release" ;
    lv2:default 60 ; lv2:minimum 1 ; lv2:maximum 8000 ;
    jig:paramIndex 29 ;
    jig:controlGroup "Operator C" ;
    rdfs:comment "Operator C envelope: time to fade after the key is let go." ;
    units:unit units:ms .

<#opd_wave>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opd_wave" ; lv2:name "Op D Waveform" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 2 ;
    jig:paramIndex 30 ;
    jig:controlGroup "Operator D" ;
    rdfs:comment "Operator D: sine, saw or square. Saw and square are band-limited." ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#opd_wave-0> ,
        <#opd_wave-1> ,
        <#opd_wave-2> .

<#opd_wave-0> rdfs:label "Sine" ; rdf:value 0 .

<#opd_wave-1> rdfs:label "Saw" ; rdf:value 1 .

<#opd_wave-2> rdfs:label "Square" ; rdf:value 2 .

<#opd_fixed>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opd_fixed" ; lv2:name "Op D Fixed Frequency" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 31 ;
    jig:controlGroup "Operator D" ;
    rdfs:comment "Operator D: off follows the note (ratio), on plays a fixed frequency." ;
    lv2:portProperty lv2:toggled .

<#opd_ratio>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opd_ratio" ; lv2:name "Op D Ratio" ;
    lv2:default 1 ; lv2:minimum 0.25 ; lv2:maximum 32 ;
    jig:paramIndex 32 ;
    jig:controlGroup "Operator D" ;
    rdfs:comment "Operator D: frequency as a multiple of the note." .

<#opd_fine>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opd_fine" ; lv2:name "Op D Fine" ;
    lv2:default 0 ; lv2:minimum -50 ; lv2:maximum 50 ;
    jig:paramIndex 33 ;
    jig:controlGroup "Operator D" ;
    rdfs:comment "Operator D: fine tuning in cents." ;
    units:unit units:cent .

<#opd_fixed_hz>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opd_fixed_hz" ; lv2:name "Op D Fixed Hz" ;
    lv2:default 440 ; lv2:minimum 10 ; lv2:maximum 20000 ;
    jig:paramIndex 34 ;
    jig:controlGroup "Operator D" ;
    rdfs:comment "Operator D: the frequency when Fixed Frequency is on." ;
    units:unit units:hz ;
    lv2:portProperty pprops:logarithmic .

<#opd_level>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opd_level" ; lv2:name "Op D Level" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 35 ;
    jig:controlGroup "Operator D" ;
    rdfs:comment "Operator D: the loudness of a carrier, or how hard a modulator pushes its target." ;
    pprops:displayPriority 42 .

<#opd_attack>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opd_attack" ; lv2:name "Op D Attack" ;
    lv2:default 1 ; lv2:minimum 0.5 ; lv2:maximum 5000 ;
    jig:paramIndex 36 ;
    jig:controlGroup "Operator D" ;
    rdfs:comment "Operator D envelope: time to rise to full." ;
    units:unit units:ms .

<#opd_decay>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opd_decay" ; lv2:name "Op D Decay" ;
    lv2:default 100 ; lv2:minimum 1 ; lv2:maximum 8000 ;
    jig:paramIndex 37 ;
    jig:controlGroup "Operator D" ;
    rdfs:comment "Operator D envelope: time to fall to Sustain." ;
    units:unit units:ms .

<#opd_sustain>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opd_sustain" ; lv2:name "Op D Sustain" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 38 ;
    jig:controlGroup "Operator D" ;
    rdfs:comment "Operator D envelope: the level held while the key is down." .

<#opd_release>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "opd_release" ; lv2:name "Op D Release" ;
    lv2:default 60 ; lv2:minimum 1 ; lv2:maximum 8000 ;
    jig:paramIndex 39 ;
    jig:controlGroup "Operator D" ;
    rdfs:comment "Operator D envelope: time to fade after the key is let go." ;
    units:unit units:ms .

<#algorithm>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "algorithm" ; lv2:name "Algorithm" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 10 ;
    jig:paramIndex 40 ;
    jig:controlGroup "FM" ;
    rdfs:comment "Which operators modulate which, and which are heard. A letter is an operator and a greater-than sign means it modulates the next." ;
    pprops:displayPriority 100 ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#algorithm-0> ,
        <#algorithm-1> ,
        <#algorithm-2> ,
        <#algorithm-3> ,
        <#algorithm-4> ,
        <#algorithm-5> ,
        <#algorithm-6> ,
        <#algorithm-7> ,
        <#algorithm-8> ,
        <#algorithm-9> ,
        <#algorithm-10> .

<#algorithm-0> rdfs:label "1: D > C > B > A" ; rdf:value 0 .

<#algorithm-1> rdfs:label "2: (C + D) > B > A" ; rdf:value 1 .

<#algorithm-2> rdfs:label "3: (B + (D > C)) > A" ; rdf:value 2 .

<#algorithm-3> rdfs:label "4: D > (B + C) > A" ; rdf:value 3 .

<#algorithm-4> rdfs:label "5: (B > A) + (D > C)" ; rdf:value 4 .

<#algorithm-5> rdfs:label "6: (B + C + D) > A" ; rdf:value 5 .

<#algorithm-6> rdfs:label "7: A + B + (D > C)" ; rdf:value 6 .

<#algorithm-7> rdfs:label "8: A + (D > C > B)" ; rdf:value 7 .

<#algorithm-8> rdfs:label "9: A + ((C + D) > B)" ; rdf:value 8 .

<#algorithm-9> rdfs:label "10: D > (A + B + C)" ; rdf:value 9 .

<#algorithm-10> rdfs:label "11: A + B + C + D" ; rdf:value 10 .

<#feedback>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "feedback" ; lv2:name "Feedback" ;
    lv2:default 0.1 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 41 ;
    jig:controlGroup "FM" ;
    rdfs:comment "Operator D feeding back into itself, for a brighter, rougher tone." .

<#depth>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "depth" ; lv2:name "FM Depth" ;
    lv2:default 1 ; lv2:minimum 0 ; lv2:maximum 4 ;
    jig:paramIndex 42 ;
    jig:controlGroup "FM" ;
    rdfs:comment "How far a full-level modulator moves its target, in cycles. More is brighter." ;
    pprops:displayPriority 90 .

<#pitch_env>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "pitch_env" ; lv2:name "Pitch Envelope" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 43 ;
    jig:controlGroup "Pitch envelope" ;
    rdfs:comment "Sweeps the pitch of every operator with its own envelope." ;
    lv2:portProperty lv2:toggled .

<#pitch_env_amount>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "pitch_env_amount" ; lv2:name "Pitch Envelope Amount" ;
    lv2:default 12 ; lv2:minimum -48 ; lv2:maximum 48 ;
    jig:paramIndex 44 ;
    jig:controlGroup "Pitch envelope" ;
    rdfs:comment "How far the pitch envelope moves the pitch at full." ;
    units:unit units:semitone12TET .

<#pitch_attack>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "pitch_attack" ; lv2:name "Pitch Attack" ;
    lv2:default 1 ; lv2:minimum 0.5 ; lv2:maximum 5000 ;
    jig:paramIndex 45 ;
    jig:controlGroup "Pitch envelope" ;
    units:unit units:ms .

<#pitch_decay>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "pitch_decay" ; lv2:name "Pitch Decay" ;
    lv2:default 100 ; lv2:minimum 1 ; lv2:maximum 8000 ;
    jig:paramIndex 46 ;
    jig:controlGroup "Pitch envelope" ;
    units:unit units:ms .

<#pitch_sustain>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "pitch_sustain" ; lv2:name "Pitch Sustain" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 47 ;
    jig:controlGroup "Pitch envelope" .

<#pitch_release>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "pitch_release" ; lv2:name "Pitch Release" ;
    lv2:default 100 ; lv2:minimum 1 ; lv2:maximum 8000 ;
    jig:paramIndex 48 ;
    jig:controlGroup "Pitch envelope" ;
    units:unit units:ms .

<#filter_type>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "filter_type" ; lv2:name "Filter Type" ;
    lv2:default 1 ; lv2:minimum 0 ; lv2:maximum 4 ;
    jig:paramIndex 49 ;
    jig:controlGroup "Filter" ;
    rdfs:comment "The shape of the one filter every voice passes through." ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#filter_type-0> ,
        <#filter_type-1> ,
        <#filter_type-2> ,
        <#filter_type-3> ,
        <#filter_type-4> .

<#filter_type-0> rdfs:label "Low-pass 12" ; rdf:value 0 .

<#filter_type-1> rdfs:label "Low-pass 24" ; rdf:value 1 .

<#filter_type-2> rdfs:label "High-pass 12" ; rdf:value 2 .

<#filter_type-3> rdfs:label "Band-pass" ; rdf:value 3 .

<#filter_type-4> rdfs:label "Notch" ; rdf:value 4 .

<#cutoff>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "cutoff" ; lv2:name "Cutoff" ;
    lv2:default 2400 ; lv2:minimum 20 ; lv2:maximum 20000 ;
    jig:paramIndex 50 ;
    jig:controlGroup "Filter" ;
    rdfs:comment "Where the filter starts to cut. Lower is darker." ;
    pprops:displayPriority 80 ;
    units:unit units:hz ;
    lv2:portProperty pprops:logarithmic .

<#resonance>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "resonance" ; lv2:name "Resonance" ;
    lv2:default 0.2 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 51 ;
    jig:controlGroup "Filter" ;
    rdfs:comment "A peak at the cutoff." ;
    pprops:displayPriority 70 .

<#key_track>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "key_track" ; lv2:name "Key Track" ;
    lv2:default 0.3 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 52 ;
    jig:controlGroup "Filter" ;
    rdfs:comment "How much the cutoff follows the note, so high notes stay as bright as low ones." .

<#master>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "master" ; lv2:name "Master" ;
    lv2:default 0.6 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 53 ;
    jig:controlGroup "Output" ;
    rdfs:comment "The overall level of the instrument." ;
    pprops:displayPriority 95 .

<#velocity>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "velocity" ; lv2:name "Velocity" ;
    lv2:default 0.7 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 54 ;
    jig:controlGroup "Output" ;
    rdfs:comment "How much a harder key is louder. At 0 every note is at full level." .

<#bend_range>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "bend_range" ; lv2:name "Bend Range" ;
    lv2:default 2 ; lv2:minimum 0 ; lv2:maximum 24 ;
    jig:paramIndex 55 ;
    jig:controlGroup "Output" ;
    rdfs:comment "How far the pitch wheel bends the pitch." ;
    units:unit units:semitone12TET .

<#quality>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "quality" ; lv2:name "Quality" ;
    lv2:default 1 ; lv2:minimum 0 ; lv2:maximum 1 ;
    jig:paramIndex 56 ;
    jig:controlGroup "Output" ;
    rdfs:comment "2x oversamples the FM and filters it back down: cleaner at high depth, about twice the CPU." ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#quality-0> ,
        <#quality-1> .

<#quality-0> rdfs:label "1x" ; rdf:value 0 .

<#quality-1> rdfs:label "2x" ; rdf:value 1 .

<#play_mode>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "play_mode" ; lv2:name "Play Mode" ;
    lv2:default 1 ; lv2:minimum 0 ; lv2:maximum 2 ;
    jig:paramIndex 57 ;
    jig:controlGroup "Voicing" ;
    rdfs:comment "Poly plays every note on its own voice. Mono plays the last note. Legato does the same without restarting the envelopes." ;
    lv2:portProperty lv2:enumeration ;
    lv2:scalePoint
        <#play_mode-0> ,
        <#play_mode-1> ,
        <#play_mode-2> .

<#play_mode-0> rdfs:label "Poly" ; rdf:value 0 .

<#play_mode-1> rdfs:label "Mono" ; rdf:value 1 .

<#play_mode-2> rdfs:label "Legato" ; rdf:value 2 .

<#glide>
    a lv2:InputPort , lv2:ControlPort ;
    lv2:symbol "glide" ; lv2:name "Glide" ;
    lv2:default 0 ; lv2:minimum 0 ; lv2:maximum 2000 ;
    jig:paramIndex 58 ;
    jig:controlGroup "Voicing" ;
    rdfs:comment "Time to slide from the previous note. 0 is off." ;
    units:unit units:ms .
