@prefix doap: . @prefix lv2: . @prefix rdfs: . @prefix rdf: . @prefix units: . @prefix urid: . @prefix atom: . @prefix midi: . @prefix epp: . @prefix uiext: . @prefix idpy: . @prefix foaf: . @prefix mod: . @prefix param: . @prefix work: . @prefix pg: . @prefix atom: . @prefix patch: . @prefix state: . @prefix urid: . @prefix xsd: . @prefix ui: . @prefix pprop: . @prefix pipedal_ui: . @prefix looperPrefix: . @prefix myprefix: . myprefix:stereoInGroup a pg:StereoGroup, pg:InputGroup ; rdfs:label "Stereo Input" ; lv2:symbol "in_g" . myprefix:steroOutGroup a pg:Group ; a pg:StereoGroup, pg:OuputGroup ; rdfs:label "Stereo Output" ; lv2:symbol "out_g" . myprefix:syncGroup a pg:ControlGroup ; lv2:name "Clock" ; lv2:symbol "sync_g" . myprefix:loop_main_group a pg:ControlGroup ; lv2:name "Main Loop" ; lv2:symbol "loop_main_group" . myprefix:loop2_group a pg:ControlGroup ; lv2:name "Loop 2" ; lv2:symbol "loop2_group" . myprefix:loop3_group a pg:ControlGroup ; lv2:name "Loop 3" ; lv2:symbol "loop3_group" . myprefix:loop4_group a pg:ControlGroup ; lv2:name "Loop 4" ; lv2:symbol "loop4_group" . myprefix:options_group a pg:ControlGroup ; lv2:name "Options" ; lv2:symbol "options_group" . myprefix:output_group a pg:ControlGroup ; lv2:name "Output" ; lv2:symbol "output_group" . a foaf:Person ; foaf:name "Robin Davies" ; foaf:mbox ; foaf:homepage . a lv2:Plugin , lv2:UtilityPlugin ; doap:name "TooB 4Looper (stereo)" ; doap:license ; doap:maintainer ; lv2:minorVersion 1 ; lv2:microVersion 57 ; ui:ui ; patch:readable looperPrefix:audioFile; patch:writable looperPrefix:audioFile; lv2:extensionData state:interface ; rdfs:comment """ A Stereo Looper. - A single tap on the bound midi controller will start recording. - A second tap with mark the end of the loop, and start playback. - Subsequent taps will toggle overdub mode. When overdubbing, new audio input will be blended with the existing loop. - A touble tap will stop playback. - To erase an overdub, long press the MIDI controller. The loop will return to the state that it was in before the overdub was made. """ ; mod:brand "TooB"; mod:label "4Looper"; lv2:optionalFeature lv2:hardRTCapable; lv2:port ################# MAIN Loop [ a lv2:InputPort , lv2:ControlPort ; lv2:index 0; lv2:symbol "stop1" ; lv2:name "⏹"; rdfs:comment "Reset loop 1."; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop_main_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 1; lv2:symbol "record1" ; lv2:name "⏺"; rdfs:comment "Record/Overdub loop 1"; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop_main_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 2; lv2:symbol "record_led1" ; lv2:name ""; lv2:portProperty lv2:toggled ; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; pipedal_ui:ledColor "red"; pg:group myprefix:loop_main_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 3; lv2:symbol "play1" ; lv2:name "⏵"; rdfs:comment "Play Loop 1. Click again to stop."; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop_main_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 4; lv2:symbol "play_led1" ; lv2:name ""; lv2:portProperty lv2:toggled ; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; pipedal_ui:ledColor "green"; pg:group myprefix:loop_main_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 5; lv2:symbol "position1" ; rdfs:comment "Time"; lv2:name "\u00A0\u00A0\u00A0\u00A0"; units:unit units:pc ; lv2:default 0.0 ; lv2:minimum 0.0 ; lv2:maximum 100.0 ; pg:group myprefix:loop_main_group ; ], ################# Loop2 [ a lv2:InputPort , lv2:ControlPort ; lv2:index 6; lv2:symbol "stop2" ; lv2:name "⏹"; rdfs:comment "Reset loop 2."; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop2_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 7; lv2:symbol "record2" ; lv2:name "⏺"; rdfs:comment "Record/Overdub loop 2"; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop2_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 8; lv2:symbol "record_led2" ; lv2:name ""; lv2:portProperty lv2:toggled ; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; pipedal_ui:ledColor "red"; pg:group myprefix:loop2_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 9; lv2:symbol "play2" ; lv2:name "⏵"; rdfs:comment "Play Loop 2. Click again to stop."; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop2_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 10; lv2:symbol "play_led2" ; lv2:name ""; lv2:portProperty lv2:toggled ; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; pipedal_ui:ledColor "green"; pg:group myprefix:loop2_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 11; lv2:symbol "position2" ; rdfs:comment "Time"; lv2:name "\u00A0\u00A0\u00A0\u00A0"; units:unit units:pc ; lv2:default 0.0 ; lv2:minimum 0.0 ; lv2:maximum 100.0 ; pg:group myprefix:loop2_group ; ], ################# Loop3 [ a lv2:InputPort , lv2:ControlPort ; lv2:index 12; lv2:symbol "stop3" ; lv2:name "⏹"; rdfs:comment "Reset loop 3."; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop3_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 13; lv2:symbol "record3" ; lv2:name "⏺"; rdfs:comment "Record/Overdub loop 3"; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop3_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 14; lv2:symbol "record_led3" ; lv2:name ""; lv2:portProperty lv2:toggled ; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; pipedal_ui:ledColor "red"; pg:group myprefix:loop3_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 15; lv2:symbol "play3" ; lv2:name "⏵"; rdfs:comment "Play Loop 3. Click again to stop."; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop3_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 16; lv2:symbol "play_led3" ; lv2:name ""; lv2:portProperty lv2:toggled ; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; pipedal_ui:ledColor "green"; pg:group myprefix:loop3_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 17; lv2:symbol "position3" ; rdfs:comment "Time"; lv2:name "\u00A0\u00A0\u00A0\u00A0"; units:unit units:pc ; lv2:default 0.0 ; lv2:minimum 0.0 ; lv2:maximum 100.0 ; pg:group myprefix:loop3_group ; ], ################# Loop4 [ a lv2:InputPort , lv2:ControlPort ; lv2:index 18; lv2:symbol "stop4" ; lv2:name "⏹"; rdfs:comment "Reset loop 4."; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop4_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 19; lv2:symbol "record4" ; lv2:name "⏺"; rdfs:comment "Record/Overdub loop 4"; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop4_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 20; lv2:symbol "record_led4" ; lv2:name ""; lv2:portProperty lv2:toggled ; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; pipedal_ui:ledColor "red"; pg:group myprefix:loop4_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 21; lv2:symbol "play4" ; lv2:name "⏵"; rdfs:comment "Play Loop 4. Click again to stop."; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled,pprop:trigger; pg:group myprefix:loop4_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 22; lv2:symbol "play_led4" ; lv2:name ""; lv2:portProperty lv2:toggled ; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; pipedal_ui:ledColor "green"; pg:group myprefix:loop4_group ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 23; lv2:symbol "position4" ; rdfs:comment "Time"; lv2:name "\u00A0\u00A0\u00A0\u00A0"; units:unit units:pc ; lv2:default 0.0 ; lv2:minimum 0.0 ; lv2:maximum 100.0 ; pg:group myprefix:loop4_group ; ], ###### Sync [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 24; lv2:symbol "bar_led" ; lv2:name "\u00A0\u00A0Bar\u00A0\u00A0"; lv2:portProperty lv2:toggled ; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; pipedal_ui:ledColor "red"; pg:group myprefix:syncGroup ; ], [ a lv2:OutputPort , lv2:ControlPort ; lv2:index 25; lv2:symbol "beat_led" ; lv2:name "\u00A0Beat\u00A0"; lv2:portProperty lv2:toggled ; lv2:default 0 ; lv2:minimum 0.0; lv2:maximum 1.0; pipedal_ui:ledColor "red"; pg:group myprefix:syncGroup ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 26; lv2:symbol "tempo" ; lv2:name "Tempo"; lv2:default 120.0 ; lv2:minimum 40.0; lv2:maximum 240.0; units:unit units:bpm; rdfs:comment "Tempo in quarter-notes per minute" ; pg:group myprefix:syncGroup ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 27; lv2:symbol "timesig" ; rdfs:comment "Time Signature"; lv2:name "TimeSig"; lv2:default 2 ; lv2:minimum 0; lv2:maximum 5; lv2:portProperty lv2:enumeration ; lv2:scalePoint [ rdfs:label "2/2" ; rdf:value 0 ] , [ rdfs:label "3/4" ; rdf:value 1 ] , [ rdfs:label "4/4" ; rdf:value 2 ] , [ rdfs:label "5/4" ; rdf:value 3 ] , [ rdfs:label "6/8" ; rdf:value 4 ] , [ rdfs:label "7/4" ; rdf:value 5 ]; pg:group myprefix:syncGroup ], ########## Options [ lv2:name "Count In" ; a lv2:InputPort , lv2:ControlPort ; lv2:index 28; lv2:symbol "rec_count_in" ; lv2:default 1.0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled; rdfs:comment "Whether to count in when starting the main loop."; pg:group myprefix:options_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 29; lv2:symbol "bars" ; lv2:name "Bars"; lv2:default 0 ; lv2:minimum 0; lv2:maximum 32; units:unit units:bar ; lv2:portProperty lv2:integer; rdfs:comment "Loop length in bars. Set to minimum for arbitrary length loops."; pg:group myprefix:options_group ; lv2:scalePoint [ rdfs:label "Free" ; rdf:value 0.0 ] ], [ lv2:name "Rec Sync" ; a lv2:InputPort , lv2:ControlPort ; lv2:index 30; lv2:symbol "rec_sync_option" ; lv2:default 1.0 ; lv2:minimum 0.0; lv2:maximum 1.0; lv2:portProperty lv2:toggled; rdfs:comment "Whether to sync the start of the loop with the main loop when recording secondary loops."; pg:group myprefix:options_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 31; lv2:symbol "loop_end_option" ; lv2:name "On Rec End"; lv2:default 1.0 ; lv2:minimum 1.0; lv2:maximum 2.0; lv2:portProperty lv2:enumeration; rdfs:comment "(One-control MIDI operation only) Whether to go to OVERDUB or PLAY state when recording of the main loop ends."; lv2:scalePoint [ rdfs:label "REC->PLAY" ; rdf:value 1.0 ] , [ rdfs:label "REC->DUB" ; rdf:value 2.0 ] ; pg:group myprefix:options_group ; ], [ a lv2:InputPort , lv2:ControlPort ; lv2:index 32; lv2:symbol "level" ; lv2:name "Level"; lv2:name "Level"; pg:group myprefix:output_group ; lv2:default 0 ; lv2:minimum -60.0; lv2:maximum 30.0; lv2:scalePoint [ rdfs:label "-INF" ; rdf:value -60.0 ]; units:unit units:db ], ################# Audio/Control Busses [ a lv2:AudioPort , lv2:InputPort ; lv2:index 33 ; lv2:symbol "in" ; lv2:name "In"; pg:group myprefix:stereoInGroup ; lv2:designation pg:left ], [ a lv2:AudioPort , lv2:OutputPort ; lv2:index 34 ; lv2:symbol "out" ; lv2:name "Out" ; pg:group myprefix:stereoOutGroup ; lv2:designation pg:left ], [ a atom:AtomPort , lv2:InputPort ; lv2:index 35 ; lv2:symbol "controlIn" ; lv2:name "ControlIn" ], [ a atom:AtomPort , lv2:OutputPort ; lv2:index 36 ; lv2:symbol "controlOut" ; lv2:name "ControlOut" ], [ a lv2:AudioPort , lv2:InputPort ; lv2:index 37; lv2:symbol "inR" ; lv2:name "InR" ; pg:group myprefix:stereoInGroup ; lv2:designation pg:right ], [ a lv2:AudioPort , lv2:OutputPort ; lv2:index 38 ; lv2:symbol "outR" ; lv2:name "OutR" ; pg:group myprefix:stereoOutGroup ; lv2:designation pg:right ] ; . a ui:X11UI ; lv2:binary <.so>; lv2:extensionData ui:resize ; lv2:extensionData ui:idleInterface ; lv2:requiredFeature ui:idleInterface ; .