diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 209fd93..d022579 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,6 +21,7 @@ jobs: - uses: distrho/dpf-makefile-action@v1 with: target: ${{ matrix.target }} + hvcc: true macos: strategy: @@ -34,6 +35,7 @@ jobs: - uses: distrho/dpf-makefile-action@v1 with: target: ${{ matrix.target }} + hvcc: true windows: strategy: @@ -47,6 +49,7 @@ jobs: - uses: distrho/dpf-makefile-action@v1 with: target: ${{ matrix.target }} + hvcc: true pluginval: runs-on: ubuntu-22.04 @@ -57,3 +60,4 @@ jobs: - uses: distrho/dpf-makefile-action@v1 with: target: pluginval + hvcc: true diff --git a/.gitignore b/.gitignore index 4a95481..1b4ecf7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ /bin/ /build/ +*.dll +*.dylib +*.so diff --git a/Makefile b/Makefile index 93d15d4..c0e4c99 100644 --- a/Makefile +++ b/Makefile @@ -11,15 +11,15 @@ include dpf/Makefile.base.mk PLUGINS = $(subst plugins/,,$(wildcard plugins/*)) -# CUSTOM_TTL = $(subst custom-ttl/,,$(wildcard custom-ttl/*)) -# MODGUIS = $(subst custom-ttl/,,$(subst /modgui,,$(wildcard custom-ttl/*/modgui))) +CUSTOM_TTL = $(subst custom-ttl/,,$(wildcard custom-ttl/*)) +MODGUIS = $(subst custom-ttl/,,$(subst /modgui,,$(wildcard custom-ttl/*/modgui))) # --------------------------------------------------------------------------------------------------------------------- # build rules all: pregen -# $(foreach p,$(CUSTOM_TTL),cp custom-ttl/${p}/*.ttl bin/${p}.lv2/;) -# $(foreach p,$(MODGUIS),cp -r custom-ttl/${p}/modgui bin/${p}.lv2/;) + $(foreach p,$(CUSTOM_TTL),cp custom-ttl/${p}/*.ttl bin/$(lastword $(subst -, ,${p})).lv2/;) + $(foreach p,$(MODGUIS),cp -r custom-ttl/${p}/modgui bin/$(lastword $(subst -, ,${p})).lv2/;) pregen: plugins dpf/utils/lv2_ttl_generator$(APP_EXT) @$(CURDIR)/dpf/utils/generate-ttl.sh @@ -35,9 +35,8 @@ build/%/dpf-widgets: dpf-widgets -@mkdir -p build/$* ln -s $(abspath $<) $@ -build/%/Makefile: hvcc/build/lib/hvcc/__init__.py plugins/%/plugin.json plugins/%/plugin.pd - env PYTHONPATH=$(CURDIR)/hvcc/build/lib \ - python3 ./hvcc/build/lib/hvcc/__init__.py \ +build/%/Makefile: plugins/%/plugin.json plugins/%/plugin.pd + hvcc \ plugins/$*/plugin.pd \ -m plugins/$*/plugin.json \ -n "$(lastword $(subst -, ,$*))" \ @@ -47,11 +46,6 @@ build/%/Makefile: hvcc/build/lib/hvcc/__init__.py plugins/%/plugin.json plugins/ dpf/utils/lv2_ttl_generator$(APP_EXT): $(MAKE) -C dpf/utils/lv2-ttl-generator -hvcc/build/lib/hvcc/__init__.py: - cd hvcc && \ - python3 -m pip install --isolated --no-cache-dir --no-input -q -r requirements.txt && \ - [ -e build ] || python3 setup.py build - # --------------------------------------------------------------------------------------------------------------------- # cleanup diff --git a/README.md b/README.md index 225f6c6..aa11677 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ make moddwarf Change `moddwarf` to `modduo` or `modduox` if applicable. -After building, you can directly push the bundle into a MOD unit over USB by running: +After building, you can directly push the plugin bundles into a MOD unit over USB by running: ```sh make modpush diff --git a/custom-ttl/BatteryNotIncluded-Freezer/Freezer_dsp.ttl b/custom-ttl/BatteryNotIncluded-Freezer/Freezer_dsp.ttl new file mode 100644 index 0000000..0b41faa --- /dev/null +++ b/custom-ttl/BatteryNotIncluded-Freezer/Freezer_dsp.ttl @@ -0,0 +1,188 @@ +@prefix atom: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix midi: . +@prefix mod: . +@prefix opts: . +@prefix pg: . +@prefix patch: . +@prefix rdf: . +@prefix rdfs: . +@prefix rsz: . +@prefix spdx: . +@prefix unit: . + + + a lv2:UtilityPlugin, lv2:Plugin, doap:Project ; + + lv2:extensionData opts:interface ; + + lv2:optionalFeature , + ; + + lv2:requiredFeature opts:options , + ; + + opts:supportedOption , + , + ; + + lv2:port [ + a lv2:InputPort, lv2:AudioPort ; + lv2:index 0 ; + lv2:symbol "lv2_audio_in_1" ; + lv2:name "Audio Input 1" ; + ] ; + + lv2:port [ + a lv2:OutputPort, lv2:AudioPort ; + lv2:index 1 ; + lv2:symbol "lv2_audio_out_1" ; + lv2:name "Audio Output 1" ; + ] ; + + lv2:port [ + a lv2:InputPort, atom:AtomPort ; + lv2:index 2 ; + lv2:name "Events Input" ; + lv2:symbol "lv2_events_in" ; + rsz:minimumSize 2048 ; + atom:bufferType atom:Sequence ; + atom:supports ; + ] ; + + lv2:port [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 3 ; + lv2:name "attack" ; + lv2:symbol "attack" ; + lv2:default 100 ; + lv2:minimum 0 ; + lv2:maximum 2000 ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 4 ; + lv2:name "current step" ; + lv2:symbol "current_step" ; + lv2:default 1 ; + lv2:minimum 1 ; + lv2:maximum 6 ; + lv2:portProperty lv2:integer ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 5 ; + lv2:name "decay" ; + lv2:symbol "decay" ; + lv2:default 100 ; + lv2:minimum 0 ; + lv2:maximum 2000 ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 6 ; + lv2:name "decay x10" ; + lv2:symbol "decay_x10" ; + lv2:default 1 ; + lv2:minimum 1 ; + lv2:maximum 10 ; + lv2:portProperty lv2:toggled ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 7 ; + lv2:name "dry" ; + lv2:symbol "dry" ; + lv2:default 1 ; + lv2:minimum 0 ; + lv2:maximum 1 ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 8 ; + lv2:name "freeze" ; + lv2:symbol "freeze" ; + lv2:default 0 ; + lv2:minimum 0 ; + lv2:maximum 1 ; + lv2:portProperty lv2:toggled , mod:preferMomentaryOnByDefault ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 9 ; + lv2:name "layers number" ; + lv2:symbol "layers_number" ; + lv2:default 1 ; + lv2:minimum 1 ; + lv2:maximum 6 ; + lv2:portProperty lv2:integer ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 10 ; + lv2:name "layers volume" ; + lv2:symbol "layers_volume" ; + lv2:default 0.8 ; + lv2:minimum 0 ; + lv2:maximum 1 ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 11 ; + lv2:name "mode" ; + lv2:symbol "mode" ; + lv2:default 0 ; + lv2:minimum 0 ; + lv2:maximum 1 ; + lv2:portProperty lv2:enumeration , lv2:integer ; + lv2:scalePoint + [ + rdfs:label "MOMENT" ; + rdf:value 1 + ] , [ + rdfs:label "LATCH" ; + rdf:value 0 + ] + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 12 ; + lv2:name "sample length" ; + lv2:symbol "sample_length" ; + lv2:default 1 ; + lv2:minimum 0.2 ; + lv2:maximum 1 ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 13 ; + lv2:name "speed" ; + lv2:symbol "speed" ; + lv2:default 1 ; + lv2:minimum 0 ; + lv2:maximum 2 ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 14 ; + lv2:name "wet" ; + lv2:symbol "wet" ; + lv2:default 1 ; + lv2:minimum 0 ; + lv2:maximum 1 ; + ] ; + + rdfs:comment "Freezer sample and hold notes or chords with infinite sustain" ; + + doap:name "Freezer" ; + mod:brand "BattNotIncluded" ; + mod:label "Freezer" ; + + doap:maintainer [ + foaf:name "J.Velcl@seznam.cz" ; + ] ; + + lv2:microVersion 0 ; + lv2:minorVersion 0 . diff --git a/custom-ttl/BatteryNotIncluded-Freezer/modgui.ttl b/custom-ttl/BatteryNotIncluded-Freezer/modgui.ttl new file mode 100644 index 0000000..81f01ca --- /dev/null +++ b/custom-ttl/BatteryNotIncluded-Freezer/modgui.ttl @@ -0,0 +1,15 @@ +@prefix modgui: . +@prefix lv2: . + + + modgui:gui [ + modgui:resourcesDirectory ; + modgui:iconTemplate ; + modgui:stylesheet ; + modgui:screenshot ; + modgui:thumbnail ; + + + + + ] . \ No newline at end of file diff --git a/custom-ttl/BatteryNotIncluded-Freezer/modgui/bg.png b/custom-ttl/BatteryNotIncluded-Freezer/modgui/bg.png new file mode 100644 index 0000000..0525f1a Binary files /dev/null and b/custom-ttl/BatteryNotIncluded-Freezer/modgui/bg.png differ diff --git a/custom-ttl/BatteryNotIncluded-Freezer/modgui/icon.html b/custom-ttl/BatteryNotIncluded-Freezer/modgui/icon.html new file mode 100644 index 0000000..c74c5d2 --- /dev/null +++ b/custom-ttl/BatteryNotIncluded-Freezer/modgui/icon.html @@ -0,0 +1,24 @@ +
+ +
+ +
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
\ No newline at end of file diff --git a/custom-ttl/BatteryNotIncluded-Freezer/modgui/knob.png b/custom-ttl/BatteryNotIncluded-Freezer/modgui/knob.png new file mode 100644 index 0000000..b2e15e2 Binary files /dev/null and b/custom-ttl/BatteryNotIncluded-Freezer/modgui/knob.png differ diff --git a/custom-ttl/BatteryNotIncluded-Freezer/modgui/knob_small.png b/custom-ttl/BatteryNotIncluded-Freezer/modgui/knob_small.png new file mode 100644 index 0000000..d201545 Binary files /dev/null and b/custom-ttl/BatteryNotIncluded-Freezer/modgui/knob_small.png differ diff --git a/custom-ttl/BatteryNotIncluded-Freezer/modgui/screen.png b/custom-ttl/BatteryNotIncluded-Freezer/modgui/screen.png new file mode 100644 index 0000000..5d69085 Binary files /dev/null and b/custom-ttl/BatteryNotIncluded-Freezer/modgui/screen.png differ diff --git a/custom-ttl/BatteryNotIncluded-Freezer/modgui/stylesheet.css b/custom-ttl/BatteryNotIncluded-Freezer/modgui/stylesheet.css new file mode 100644 index 0000000..d62eb96 --- /dev/null +++ b/custom-ttl/BatteryNotIncluded-Freezer/modgui/stylesheet.css @@ -0,0 +1,93 @@ +.mod-pedal-freezer { + background-image: url(/resources/bg.png{{{ns}}}); + width: 258px; + height: 482px; +} +.mod-pedal-freezer .mod-pedal-input{ +left: -65px; +} +.mod-pedal-freezer .mod-pedal-output{ +left: 235px; +} +.mod-pedal-freezer .mod-toggle{ + background-image: url(/resources/tap.png{{{ns}}}); + cursor: pointer; + background-repeat: no-repeat; + background-size: auto 43px; + width: 45px; + height: 43px; + position: absolute; + z-index: 50; + left: 110px; + top: 374px; +} + +.mod-pedal-freezer .mod-pedal-knob{ + background-image: url(/resources/knob.png{{{ns}}}); + cursor: pointer; + background-repeat: no-repeat; + background-size: auto 59px; + height: 59px; + width: 60px; + margin: 0 auto; + position: absolute; + z-index: 40; +} +.mod-pedal-freezer .mod-pedal-knob.attack_knob{ + left: 36px; + top: 35px; +} +.mod-pedal-freezer .mod-pedal-knob.decay_knob{ + left: 153px; + top: 35px; +} + +.mod-pedal-freezer .mod-pedal-knob.dry_knob{ + left: 36px; + top: 127px; +} +.mod-pedal-freezer .mod-pedal-knob.wet_knob{ + left: 153px; + top: 127px; +} + +.mod-pedal-freezer .mod-pedal-knob_small{ + background-image: url(/resources/knob_small.png{{{ns}}}); + cursor: pointer; + background-repeat: no-repeat; + background-size: auto 42px; + height: 42px; + width: 43px; + margin: 0 auto; + position: absolute; + z-index: 40; +} +.mod-pedal-freezer .mod-pedal-knob_small.layer_knob{ + left: 105px; + top: 185px; +} +.mod-pedal-freezer .mod-pedal-knob_small.vol_knob{ + left: 104px; + top: 87px; +} + + +.mod-pedal-freezer .mod-switch { + background-image: url(/resources/switch.png{{{ns}}}); + position: absolute; + background-position: top center; + background-repeat: no-repeat; + background-size: 106 35px; + cursor: pointer; + height: 35px; + width: 53px; + left: 44px; + top: 225px; + z-index: 40; +} +.mod-pedal-freezer .mod-switch.on { + background-position:center left; +} +.mod-pedal-freezer .mod-switch.off { + background-position:center right; +} diff --git a/custom-ttl/BatteryNotIncluded-Freezer/modgui/switch.png b/custom-ttl/BatteryNotIncluded-Freezer/modgui/switch.png new file mode 100644 index 0000000..09e2b03 Binary files /dev/null and b/custom-ttl/BatteryNotIncluded-Freezer/modgui/switch.png differ diff --git a/custom-ttl/BatteryNotIncluded-Freezer/modgui/tap.png b/custom-ttl/BatteryNotIncluded-Freezer/modgui/tap.png new file mode 100644 index 0000000..6837eff Binary files /dev/null and b/custom-ttl/BatteryNotIncluded-Freezer/modgui/tap.png differ diff --git a/custom-ttl/BatteryNotIncluded-Freezer/modgui/thumbnail.png b/custom-ttl/BatteryNotIncluded-Freezer/modgui/thumbnail.png new file mode 100644 index 0000000..4ca4427 Binary files /dev/null and b/custom-ttl/BatteryNotIncluded-Freezer/modgui/thumbnail.png differ diff --git a/plugins/BatteryNotIncluded-Freezer/plugin.json b/plugins/BatteryNotIncluded-Freezer/plugin.json index 7a1ee0a..b15fc40 100644 --- a/plugins/BatteryNotIncluded-Freezer/plugin.json +++ b/plugins/BatteryNotIncluded-Freezer/plugin.json @@ -14,6 +14,7 @@ "vst2", "vst3" ], - "lv2_info": "lv2:UtilityPlugin" + "lv2_info": "lv2:UtilityPlugin", + "enable_modgui": true } }