diff --git a/.vscode/launch.json b/.vscode/launch.json index e719d51..5cf3812 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -72,7 +72,8 @@ "args": [ //"[Dev]" -- all dev-machine tests. - "[json_variants]" // subtest of your choice, or none to run all of the tests. + //"[json_variants]" // subtest of your choice, or none to run all of the tests. + "[inverting_mutex_test]" ], "stopAtEntry": false, diff --git a/CMakeLists.txt b/CMakeLists.txt index 6eab60c..a4b97ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,10 @@ cmake_minimum_required(VERSION 3.16.0) project(pipedal - VERSION 1.0.19 + VERSION 1.1.20 DESCRIPTION "PiPedal Guitar Effect Pedal For Raspberry Pi" HOMEPAGE_URL "https://rerdavies.github.io/pipedal" ) -set (DISPLAY_VERSION "v1.0.19") +set (DISPLAY_VERSION "v1.1.20") set (CMAKE_INSTALL_PREFIX "/usr/") diff --git a/README.md b/README.md index 16f3537..caee372 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,13 @@
-Download: v1.0.19 +Download: v1.1.20 Website: [https://rerdavies.github.io/pipedal](https://rerdavies.github.io/pipedal). + +NEW version 1.1 release. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details. + Use your Raspberry Pi as a guitar effects pedal. Configure and control PiPedal with your phone or tablet. PiPedal running on a Raspberry Pi 4 provides stable super-low-latency audio via external USB audio devices, or internal Raspberry Pi audio hats. diff --git a/capture_presets b/capture_presets new file mode 100755 index 0000000..2fb4663 --- /dev/null +++ b/capture_presets @@ -0,0 +1,8 @@ +#!/usr/bin/bash +# Copy current pipedal presets to provisioning directories. +rm -rf default_presets/plugin_presets +rm -rf default_presets/presets +mkdir default_presets/plugin_presets +mkdir default_presets/presets +cp -r /var/pipedal/plugin_presets default_presets/plugin_presets/ +cp -r /var/pipedal/presets default_presets/presets/ diff --git a/debian/control b/debian/control index a22a797..604fd2c 100644 --- a/debian/control +++ b/debian/control @@ -1,14 +1,14 @@ Architecture: arm64 -Depends: libstdc++6 (>= 9), libasound2 (>= 1.0.17), libc6 (>= 2.34), libgcc-s1 (>= 4.0), libjack-jackd2-0 (>= 1.9.10+20150825) | libjack-0.125, liblilv-0-0 (>= 0.22.0~dfsg0), libnl-3-200 (>= 3.2.7), libnl-genl-3-200 (>= 3.2.7), libstdc++6 (>= 11), libsystemd0 +Depends: libstdc++6 (>= 9), libasound2 (>= 1.0.17), libc6 (>= 2.34), libgcc-s1 (>= 4.0), libjack-jackd2-0 (>= 1.9.10+20150825) | libjack-0.125, liblilv-0-0 (>= 0.22.0~dfsg0), libnl-3-200 (>= 3.2.7), libnl-genl-3-200 (>= 3.2.7), libstdc++6 (>= 11), libsystemd0, dnsmasq(>= 2.85) Description: IoT guitar effect for Raspberry Pi IoT guitar effect pedal for Raspberry Pi, with phone-friendly web interface. Homepage: https://github.com/rerdavies/pipedal Maintainer: Robin E. R. Davies Source: pipedal Package: pipedal -Pre-Depends: hostapd;authbind +Pre-Depends: hostapd;authbind;dnsmasq Priority: optional Section: sound -Version: 1.0.19 +Version: 1.1.20 Installed-Size: 15147 diff --git a/default_presets.bak/plugin_presets/1.json b/default_presets.bak/plugin_presets/1.json new file mode 100644 index 0000000..475dd42 --- /dev/null +++ b/default_presets.bak/plugin_presets/1.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZaMaximX2","presets": [{"instanceId": 1,"label": "Zero","controlValues": {"ceil": 0,"rel": 25,"thresh": 0}}],"nextInstanceId": 2} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/10.json b/default_presets.bak/plugin_presets/10.json new file mode 100644 index 0000000..3e16c07 --- /dev/null +++ b/default_presets.bak/plugin_presets/10.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamGate","presets": [{"instanceId": 1,"label": "Default","controlValues": {"att": 50,"close": -50,"mak": 0,"mode": 0,"rel": 100,"sidechain": 0,"thr": -60}}],"nextInstanceId": 2} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/11.json b/default_presets.bak/plugin_presets/11.json new file mode 100644 index 0000000..2469e52 --- /dev/null +++ b/default_presets.bak/plugin_presets/11.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamGateX2","presets": [{"instanceId": 1,"label": "Default","controlValues": {"att": 50,"close": -50,"mak": 0,"mode": 0,"rel": 100,"sidechain": 0,"thr": -60}}],"nextInstanceId": 2} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/12.json b/default_presets.bak/plugin_presets/12.json new file mode 100644 index 0000000..a33212f --- /dev/null +++ b/default_presets.bak/plugin_presets/12.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamGrains","presets": [ ],"nextInstanceId": 1} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/13.json b/default_presets.bak/plugin_presets/13.json new file mode 100644 index 0000000..6db5588 --- /dev/null +++ b/default_presets.bak/plugin_presets/13.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamHeadX2","presets": [{"instanceId": 1,"label": "Zero","controlValues": {"az": 0,"elev": 0,"width": 1}}],"nextInstanceId": 2} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/14.json b/default_presets.bak/plugin_presets/14.json new file mode 100644 index 0000000..6bf0a82 --- /dev/null +++ b/default_presets.bak/plugin_presets/14.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamPhono","presets": [ ],"nextInstanceId": 1} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/15.json b/default_presets.bak/plugin_presets/15.json new file mode 100644 index 0000000..057c299 --- /dev/null +++ b/default_presets.bak/plugin_presets/15.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamTube","presets": [ ],"nextInstanceId": 1} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/16.json b/default_presets.bak/plugin_presets/16.json new file mode 100644 index 0000000..71771df --- /dev/null +++ b/default_presets.bak/plugin_presets/16.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamVerb","presets": [ ],"nextInstanceId": 1} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/17.json b/default_presets.bak/plugin_presets/17.json new file mode 100644 index 0000000..b55196b --- /dev/null +++ b/default_presets.bak/plugin_presets/17.json @@ -0,0 +1 @@ +{"pluginUri": "http://two-play.com/plugins/toob-delay","presets": [{"instanceId": 1,"label": "Classic","controlValues": {"delay": 340,"feedback": 39.1666679,"level": 27}},{"instanceId": 2,"label": "Slapback","controlValues": {"delay": 94.6446991,"feedback": 39.1666679,"level": 42}}],"nextInstanceId": 3} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/18.json b/default_presets.bak/plugin_presets/18.json new file mode 100644 index 0000000..bde3480 --- /dev/null +++ b/default_presets.bak/plugin_presets/18.json @@ -0,0 +1 @@ +{"pluginUri": "http://two-play.com/plugins/toob-ml","presets": [{"instanceId": 1,"label": "Fender Clean","controlValues": {"bass": 0.783333361,"gain": 0,"master": 1.5,"mid": 0.5,"model": 8,"treble": 0.550000012,"trim": -3}},{"instanceId": 2,"label": "Mesa Crunch","controlValues": {"bass": 0.650000036,"gain": 0,"master": 1.5,"mid": 0.5,"model": 17,"treble": 0.550000012,"trim": -3}},{"instanceId": 3,"label": "Sparkling Clean","controlValues": {"bass": 0.650000036,"gain": 0,"master": 1.5,"mid": 0.5,"model": 19,"treble": 0.550000012,"trim": -3}}],"nextInstanceId": 4} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/2.json b/default_presets.bak/plugin_presets/2.json new file mode 100644 index 0000000..cfc3227 --- /dev/null +++ b/default_presets.bak/plugin_presets/2.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZaMultiComp","presets": [{"instanceId": 1,"label": "Presence","controlValues": {"att1": 10,"att2": 10,"att3": 10,"globalgain": 0,"kn1": 3,"kn2": 3,"kn3": 3,"listen1": 0,"listen2": 0,"listen3": 0,"mak1": 9,"mak2": 6,"mak3": 6,"rat1": 5,"rat2": 5,"rat3": 5,"rel1": 200,"rel2": 200,"rel3": 200,"thr1": -20,"thr2": -18,"thr3": -16,"toggle1": 1,"toggle2": 1,"toggle3": 1,"xover1": 160,"xover2": 1400}},{"instanceId": 2,"label": "Zero","controlValues": {"att1": 10,"att2": 10,"att3": 10,"globalgain": 0,"kn1": 0,"kn2": 0,"kn3": 0,"listen1": 0,"listen2": 0,"listen3": 0,"mak1": 0,"mak2": 0,"mak3": 0,"rat1": 4,"rat2": 4,"rat3": 4,"rel1": 80,"rel2": 80,"rel3": 80,"thr1": -20,"thr2": -18,"thr3": -16,"toggle1": 0,"toggle2": 0,"toggle3": 0,"xover1": 160,"xover2": 1400}}],"nextInstanceId": 3} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/3.json b/default_presets.bak/plugin_presets/3.json new file mode 100644 index 0000000..58dd9ae --- /dev/null +++ b/default_presets.bak/plugin_presets/3.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZaMultiCompX2","presets": [{"instanceId": 1,"label": "Zero","controlValues": {"att1": 10,"att2": 10,"att3": 10,"globalgain": 0,"kn1": 0,"kn2": 0,"kn3": 0,"listen1": 0,"listen2": 0,"listen3": 0,"mak1": 0,"mak2": 0,"mak3": 0,"rat1": 4,"rat2": 4,"rat3": 4,"rel1": 80,"rel2": 80,"rel3": 80,"stereodet": 1,"thr1": -20,"thr2": -18,"thr3": -16,"toggle1": 0,"toggle2": 0,"toggle3": 0,"xover1": 160,"xover2": 1400}},{"instanceId": 2,"label": "Presence","controlValues": {"att1": 10,"att2": 10,"att3": 10,"globalgain": 0,"kn1": 3,"kn2": 3,"kn3": 3,"listen1": 0,"listen2": 0,"listen3": 0,"mak1": 9,"mak2": 6,"mak3": 6,"rat1": 5,"rat2": 5,"rat3": 5,"rel1": 200,"rel2": 200,"rel3": 200,"stereodet": 1,"thr1": -20,"thr2": -18,"thr3": -16,"toggle1": 1,"toggle2": 1,"toggle3": 1,"xover1": 160,"xover2": 1400}}],"nextInstanceId": 3} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/4.json b/default_presets.bak/plugin_presets/4.json new file mode 100644 index 0000000..8194191 --- /dev/null +++ b/default_presets.bak/plugin_presets/4.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamComp","presets": [{"instanceId": 1,"label": "Zero","controlValues": {"att": 10,"kn": 0,"mak": 0,"rat": 4,"rel": 80,"sidech": 0,"slew": 1,"thr": 0}},{"instanceId": 2,"label": "VocalLeveller","controlValues": {"att": 50,"kn": 8,"mak": 9,"rat": 5,"rel": 400,"sidech": 0,"slew": 1,"thr": -16}},{"instanceId": 3,"label": "PoppySnare","controlValues": {"att": 10,"kn": 1,"mak": 6,"rat": 5,"rel": 10,"sidech": 0,"slew": 20,"thr": -18}}],"nextInstanceId": 4} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/5.json b/default_presets.bak/plugin_presets/5.json new file mode 100644 index 0000000..d355ddf --- /dev/null +++ b/default_presets.bak/plugin_presets/5.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamCompX2","presets": [{"instanceId": 1,"label": "PoppySnare","controlValues": {"att": 10,"kn": 1,"mak": 6,"rat": 5,"rel": 10,"sidechain": 0,"slew": 20,"stereodet": 1,"thr": -18}},{"instanceId": 2,"label": "VocalLeveller","controlValues": {"att": 50,"kn": 8,"mak": 9,"rat": 5,"rel": 400,"sidechain": 0,"slew": 1,"stereodet": 1,"thr": -16}},{"instanceId": 3,"label": "Zero","controlValues": {"att": 10,"kn": 0,"mak": 0,"rat": 4,"rel": 80,"sidechain": 0,"slew": 1,"stereodet": 0,"thr": 0}}],"nextInstanceId": 4} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/6.json b/default_presets.bak/plugin_presets/6.json new file mode 100644 index 0000000..5986d9f --- /dev/null +++ b/default_presets.bak/plugin_presets/6.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamDelay","presets": [ ],"nextInstanceId": 1} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/7.json b/default_presets.bak/plugin_presets/7.json new file mode 100644 index 0000000..927ef51 --- /dev/null +++ b/default_presets.bak/plugin_presets/7.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamDynamicEQ","presets": [{"instanceId": 1,"label": "Zero","controlValues": {"att": 10,"boostcut": 0,"detectfreq": 1000,"kn": 0,"max": 10,"rat": 1.5,"rel": 80,"sidech": 0,"slew": 1,"targetfreq": 1000,"targetwidth": 1,"thr": 0,"togglehigh": 0,"togglelow": 0,"togglepeak": 1}},{"instanceId": 2,"label": "PoppySnare","controlValues": {"att": 10,"boostcut": 0,"detectfreq": 1000,"kn": 1,"max": 10,"rat": 1.5,"rel": 10,"sidech": 0,"slew": 20,"targetfreq": 1000,"targetwidth": 1,"thr": -18,"togglehigh": 0,"togglelow": 0,"togglepeak": 1}}],"nextInstanceId": 3} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/8.json b/default_presets.bak/plugin_presets/8.json new file mode 100644 index 0000000..6d81e80 --- /dev/null +++ b/default_presets.bak/plugin_presets/8.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamEQ2","presets": [{"instanceId": 1,"label": "Zero","controlValues": {"boost1": 0,"boost2": 0,"boosth": 0,"boostl": 0,"bw1": 1,"bw2": 1,"f1": 500,"f2": 3000,"fh": 8000,"fl": 250,"master": 0,"peaks": 0}},{"instanceId": 2,"label": "CarvedBass","controlValues": {"boost1": 0,"boost2": 0,"boosth": 0,"boostl": 6,"bw1": 1,"bw2": 1,"f1": 500,"f2": 3000,"fh": 8000,"fl": 60,"master": -6,"peaks": 0}},{"instanceId": 3,"label": "CarvedVox","controlValues": {"boost1": 0,"boost2": 0,"boosth": 6,"boostl": 6,"bw1": 1,"bw2": 1,"f1": 500,"f2": 3000,"fh": 330,"fl": 6600,"master": -12,"peaks": 0}},{"instanceId": 4,"label": "CarvedGuitar","controlValues": {"boost1": 5.5999999,"boost2": 0.699999988,"boosth": 0,"boostl": -1.04999995,"bw1": 1.46000004,"bw2": 1.33000004,"f1": 175,"f2": 500,"fh": 8000,"fl": 30,"master": -6,"peaks": 0}}],"nextInstanceId": 5} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/9.json b/default_presets.bak/plugin_presets/9.json new file mode 100644 index 0000000..b7c1c78 --- /dev/null +++ b/default_presets.bak/plugin_presets/9.json @@ -0,0 +1 @@ +{"pluginUri": "urn:zamaudio:ZamGEQ31","presets": [{"instanceId": 1,"label": "Default","controlValues": {"band1": 0,"band10": 0,"band11": 0,"band12": 0,"band13": 0,"band14": 0,"band15": 0,"band16": 0,"band17": 0,"band18": 0,"band19": 0,"band2": 0,"band20": 0,"band21": 0,"band22": 0,"band23": 0,"band24": 0,"band25": 0,"band26": 0,"band27": 0,"band28": 0,"band29": 0,"band3": 0,"band4": 0,"band5": 0,"band6": 0,"band7": 0,"band8": 0,"band9": 0,"master": 0}}],"nextInstanceId": 2} \ No newline at end of file diff --git a/default_presets.bak/plugin_presets/index.json b/default_presets.bak/plugin_presets/index.json new file mode 100644 index 0000000..f3fda51 --- /dev/null +++ b/default_presets.bak/plugin_presets/index.json @@ -0,0 +1 @@ +{"entries": [{"pluginUri": "urn:zamaudio:ZaMaximX2","fileName": "1.json"},{"pluginUri": "urn:zamaudio:ZaMultiComp","fileName": "2.json"},{"pluginUri": "urn:zamaudio:ZaMultiCompX2","fileName": "3.json"},{"pluginUri": "urn:zamaudio:ZamComp","fileName": "4.json"},{"pluginUri": "urn:zamaudio:ZamCompX2","fileName": "5.json"},{"pluginUri": "urn:zamaudio:ZamDelay","fileName": "6.json"},{"pluginUri": "urn:zamaudio:ZamDynamicEQ","fileName": "7.json"},{"pluginUri": "urn:zamaudio:ZamEQ2","fileName": "8.json"},{"pluginUri": "urn:zamaudio:ZamGEQ31","fileName": "9.json"},{"pluginUri": "urn:zamaudio:ZamGate","fileName": "10.json"},{"pluginUri": "urn:zamaudio:ZamGateX2","fileName": "11.json"},{"pluginUri": "urn:zamaudio:ZamGrains","fileName": "12.json"},{"pluginUri": "urn:zamaudio:ZamHeadX2","fileName": "13.json"},{"pluginUri": "urn:zamaudio:ZamPhono","fileName": "14.json"},{"pluginUri": "urn:zamaudio:ZamTube","fileName": "15.json"},{"pluginUri": "urn:zamaudio:ZamVerb","fileName": "16.json"},{"pluginUri": "http://two-play.com/plugins/toob-delay","fileName": "17.json"},{"pluginUri": "http://two-play.com/plugins/toob-ml","fileName": "18.json"}],"nextInstanceId": 19} \ No newline at end of file diff --git a/default_presets.bak/presets/Default+Bank.bank b/default_presets.bak/presets/Default+Bank.bank new file mode 100644 index 0000000..3f10372 --- /dev/null +++ b/default_presets.bak/presets/Default+Bank.bank @@ -0,0 +1 @@ +{"name": "","nextInstanceId": 20,"selectedPreset": 13,"presets": [{"instanceId": 13,"preset": {"name": "Jazz","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -49.1093903},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 18,"uri": "http://two-play.com/plugins/toob-tone-stack","isEnabled": true,"controlValues": [{"key": "bass","value": 0.11666666},{"key": "mid","value": 0.5},{"key": "treble","value": 0.283333331},{"key": "ampmodel","value": 1}],"pluginName": "TooB Tone Stack","midiBindings": [ ]},{"instanceId": 30,"uri": "http://two-play.com/plugins/toob-power-stage-2","isEnabled": true,"controlValues": [{"key": "trim1","value": 0},{"key": "locut1","value": 30},{"key": "hicut1","value": 19000},{"key": "shape1","value": 0},{"key": "gain1","value": 0.458333343},{"key": "bias1","value": 0},{"key": "trim2","value": 0},{"key": "locut2","value": 30},{"key": "hicut2","value": 19000},{"key": "shape2","value": 0},{"key": "gain2","value": 0.383333325},{"key": "bias2","value": 0},{"key": "gain2_enable","value": 1},{"key": "trim3","value": 0},{"key": "locut3","value": 30},{"key": "hicut3","value": 19000},{"key": "shape3","value": 0},{"key": "gain3","value": 0},{"key": "bias3","value": 0},{"key": "gain3_enable","value": 1},{"key": "sag","value": 0.316666663},{"key": "sagd","value": 0.325000018},{"key": "master","value": -12.75},{"key": "sagf","value": 13}],"pluginName": "TooB Power Stage","midiBindings": [ ]},{"instanceId": 20,"uri": "http://two-play.com/plugins/toob-cab-sim","isEnabled": true,"controlValues": [{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "comb","value": 0},{"key": "combf","value": 2000},{"key": "trim","value": 0}],"pluginName": "TooB Cab Simulator","midiBindings": [ ]},{"instanceId": 33,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 12},{"key": "feedback","value": 39}],"pluginName": "TooB Delay","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": false,"controlValues": [{"key": "dryWet","value": 0.300000012},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.491666675}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 33}},{"instanceId": 15,"preset": {"name": "Jazz ML","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 37,"uri": "uri://two-play/pipedal/pedalboard#Empty","isEnabled": true,"controlValues": [ ],"pluginName": "","midiBindings": [ ]},{"instanceId": 38,"uri": "uri://two-play/pipedal/pedalboard#Empty","isEnabled": true,"controlValues": [ ],"pluginName": "","midiBindings": [ ]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "bass","value": 0.5},{"key": "mid","value": 0.5},{"key": "treble","value": 0.5},{"key": "model","value": 0},{"key": "gain","value": 3},{"key": "master","value": 0}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 35,"uri": "uri://two-play/pipedal/pedalboard#Empty","isEnabled": true,"controlValues": [ ],"pluginName": "","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 39}},{"instanceId": 17,"preset": {"name": "Sparkling Clean","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 27},{"key": "feedback","value": 39}],"pluginName": "TooB Delay","midiBindings": [ ]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": -3},{"key": "bass","value": 0.650000036},{"key": "mid","value": 0.5},{"key": "treble","value": 0.550000012},{"key": "model","value": 19},{"key": "gain","value": 0},{"key": "master","value": 1.5}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 45}},{"instanceId": 18,"preset": {"name": "Light Crunch","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 27},{"key": "feedback","value": 39}],"pluginName": "TooB Delay","midiBindings": [ ]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 2.5},{"key": "bass","value": 0.650000036},{"key": "mid","value": 0.5},{"key": "treble","value": 0.266666681},{"key": "model","value": 17},{"key": "gain","value": 0},{"key": "master","value": 2}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 45}},{"instanceId": 19,"preset": {"name": "Heavy","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -65.5},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 27},{"key": "feedback","value": 39.1666679}],"pluginName": "TooB Delay","midiBindings": [ ]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 2.5},{"key": "bass","value": 0.650000036},{"key": "mid","value": 0.5},{"key": "treble","value": 0.266666681},{"key": "model","value": 18},{"key": "gain","value": 0},{"key": "master","value": -10}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 45}},{"instanceId": 20,"preset": {"name": "Scream","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -54},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": -15.75},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -64.5},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 47,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 12.5},{"key": "model","value": 29},{"key": "gain","value": 3},{"key": "master","value": 6.5},{"key": "bass","value": 0.5},{"key": "mid","value": 0.5},{"key": "treble","value": 0.5}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 10.333333},{"key": "feedback","value": 39.1666679}],"pluginName": "TooB Delay","midiBindings": [ ]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 2.5},{"key": "bass","value": 0.5},{"key": "mid","value": 0.5},{"key": "treble","value": 0.5},{"key": "model","value": 12},{"key": "gain","value": 10},{"key": "master","value": -10}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.0416666716},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 47}}]} \ No newline at end of file diff --git a/default_presets.bak/presets/index.banks b/default_presets.bak/presets/index.banks new file mode 100644 index 0000000..43e2843 --- /dev/null +++ b/default_presets.bak/presets/index.banks @@ -0,0 +1 @@ +{"selectedBank": 1,"nextInstanceId": 1,"entries": [{"instanceId": 1,"name": "Default Bank"}]} \ No newline at end of file diff --git a/default_presets/plugin_presets/19.json b/default_presets/plugin_presets/19.json new file mode 100644 index 0000000..f017130 --- /dev/null +++ b/default_presets/plugin_presets/19.json @@ -0,0 +1 @@ +{"pluginUri": "http://calf.sourceforge.net/plugins/Filter","presets": [{"instanceId": 1,"label": "Distant Headphones","controlValues": {"freq": 305.817993,"inertia": 74,"mode": 3,"res": 0.707000017},"state": [false,{}]},{"instanceId": 2,"label": "Totally muted","controlValues": {"freq": 10,"inertia": 20,"mode": 2,"res": 0.707000017},"state": [false,{}]},{"instanceId": 3,"label": "Disco","controlValues": {"freq": 193.820999,"inertia": 74,"mode": 0,"res": 1.37955999},"state": [false,{}]}],"nextInstanceId": 4} \ No newline at end of file diff --git a/default_presets/plugin_presets/20.json b/default_presets/plugin_presets/20.json new file mode 100644 index 0000000..12b61ef --- /dev/null +++ b/default_presets/plugin_presets/20.json @@ -0,0 +1 @@ +{"pluginUri": "http://calf.sourceforge.net/plugins/Flanger","presets": [{"instanceId": 1,"label": "Allpass filter","controlValues": {"amount": 1.85318005,"dry": 1,"feedback": -0.446399987,"min_delay": 2.63027,"mod_depth": 0.5,"mod_rate": 2.56892991,"reset": 0,"stereo": 0},"state": [false,{}]},{"instanceId": 2,"label": "Tooth Killer","controlValues": {"amount": 0.318639994,"feedback": 0.99000001,"min_delay": 0.363077998,"mod_depth": 0.181538999,"mod_rate": 0.100419},"state": [false,{}]},{"instanceId": 3,"label": "Waterlike","controlValues": {"amount": 0.926587999,"feedback": -0.169200003,"min_delay": 0.478630006,"mod_depth": 0.722720027,"mod_rate": 1.67184997},"state": [false,{}]},{"instanceId": 4,"label": "Chorus Lite","controlValues": {"amount": 0.632878006,"feedback": 0.0683998987,"min_delay": 10,"mod_depth": 2.08435011,"mod_rate": 0.910154998},"state": [false,{}]},{"instanceId": 5,"label": "Fast Sweep","controlValues": {"amount": 0.926587999,"feedback": 0.761399984,"min_delay": 0.100000001,"mod_depth": 4.35481977,"mod_rate": 5.22819996},"state": [false,{}]},{"instanceId": 6,"label": "Slow Resonant","controlValues": {"amount": 1,"feedback": -0.882000029,"min_delay": 0.125892997,"mod_depth": 0.362217993,"mod_rate": 0.146847993},"state": [false,{}]},{"instanceId": 7,"label": "Warble","controlValues": {"amount": 0.318639994,"feedback": -0.99000001,"min_delay": 0.218776003,"mod_depth": 0.181538999,"mod_rate": 20},"state": [false,{}]}],"nextInstanceId": 8} \ No newline at end of file diff --git a/default_presets/plugin_presets/21.json b/default_presets/plugin_presets/21.json new file mode 100644 index 0000000..f0b292d --- /dev/null +++ b/default_presets/plugin_presets/21.json @@ -0,0 +1 @@ +{"pluginUri": "http://calf.sourceforge.net/plugins/MonoCompressor","presets": [{"instanceId": 1,"label": "Vocal Leveller","controlValues": {"attack": 3.10086989,"bypass": 0,"clip_in": 0,"clip_out": 1,"compression": 0.176127002,"detection": 0,"knee": 8,"level_in": 1,"makeup": 4.85678005,"meter_in": 0.847831011,"meter_out": 0.908609986,"ratio": 4.25008011,"release": 25.0011997,"stereo_link": 0,"threshold": 0.0883883983},"state": [false,{}]},{"instanceId": 2,"label": "Vocal Leveller 2","controlValues": {"attack": 10.5095997,"bypass": 0,"clip_in": 0,"clip_out": 1,"compression": 0.247421995,"detection": 0,"knee": 8,"level_in": 1,"makeup": 4.85678005,"meter_in": 0.533456981,"meter_out": 0.740245998,"ratio": 4.25008011,"release": 106.851997,"stereo_link": 0,"threshold": 0.0883883983},"state": [false,{}]},{"instanceId": 3,"label": "Snare Mic","controlValues": {"attack": 3.5034399,"bypass": 0,"clip_in": 0,"clip_out": 0,"compression": 1,"detection": 0,"knee": 1,"level_in": 1.05701995,"makeup": 2.94853997,"meter_in": 0,"meter_out": 0,"ratio": 3.00696993,"release": 21.8598995,"stereo_link": 0,"threshold": 0.164939001},"state": [false,{}]},{"instanceId": 4,"label": "Snare Mic 2","controlValues": {"attack": 10.5095997,"bypass": 0,"clip_in": 0,"clip_out": 0,"compression": 1,"detection": 0,"knee": 1,"level_in": 1.05701995,"makeup": 2.94853997,"meter_in": 0,"meter_out": 0,"ratio": 3.00696993,"release": 80.6973038,"stereo_link": 0,"threshold": 0.164939001},"state": [false,{}]}],"nextInstanceId": 5} \ No newline at end of file diff --git a/default_presets/plugin_presets/22.json b/default_presets/plugin_presets/22.json new file mode 100644 index 0000000..106f161 --- /dev/null +++ b/default_presets/plugin_presets/22.json @@ -0,0 +1 @@ +{"pluginUri": "http://calf.sourceforge.net/plugins/Monosynth","presets": [{"instanceId": 1,"label": "Cut Through Bass","controlValues": {"adsr_a": 1,"adsr_d": 350,"adsr_r": 63.9728012,"adsr_s": 0.166666999,"cutoff": 88.9763031,"env2cutoff": 8000,"env2res": 1,"filter": 2,"filter_sep": 640.487,"key_follow": 1,"legato": 0,"o12_detune": 18.0792999,"o12_mix": 0.5,"o1_wave": 1,"o2_wave": 1,"o2_xpose": 0,"phase_mode": 1,"portamento": 1,"res": 2,"vel2amp": 1,"vel2filter": 1},"state": [false,{}]},{"instanceId": 2,"label": "Boom Bass","controlValues": {"adsr_a": 1,"adsr_d": 239.341003,"adsr_r": 134.309006,"adsr_s": 0.300000012,"cutoff": 132.264008,"env2amp": 1,"env2cutoff": 6912,"env2res": 1,"filter": 1,"filter_sep": -480,"key_follow": 0.5,"legato": 0,"o12_detune": 0,"o12_mix": 0.5,"o1_wave": 12,"o2_wave": 13,"o2_xpose": 12,"phase_mode": 0,"portamento": 1,"res": 1.72406995,"vel2amp": 0,"vel2filter": 0.5},"state": [false,{}]},{"instanceId": 3,"label": "Move it!","controlValues": {"Filter": 1,"adsr_a": 53.3753014,"adsr_d": 50.9017982,"adsr_r": 91.6362991,"adsr_s": 1,"cutoff": 90.3128967,"env2cutoff": 7551.8999,"env2res": 1,"filter_sep": 1272.27002,"key_follow": 1,"legato": 0,"o12_detune": 13.1620998,"o12_mix": 0.5,"o1_wave": 2,"o2_wave": 2,"o2_xpose": 0,"phase_mode": 1,"portamento": 1,"res": 3.07570004,"vel2amp": 1,"vel2filter": 1},"state": [false,{}]},{"instanceId": 4,"label": "Goa Bass","controlValues": {"adsr_a": 1,"adsr_d": 693.682007,"adsr_r": 156.360001,"adsr_s": 0.200000003,"cutoff": 38.2468987,"env2amp": 1,"env2cutoff": 10800,"env2res": 1,"filter": 1,"filter_sep": 1920,"key_follow": 1,"legato": 2,"master": 0.5,"o12_detune": 7,"o12_mix": 0.497000009,"o1_wave": 5,"o2_wave": 5,"o2_xpose": 0,"phase_mode": 5,"portamento": 12.2840004,"res": 3.41812992,"vel2amp": 0.469999999,"vel2filter": 0.5},"state": [false,{}]},{"instanceId": 5,"label": "Buzzy Bass","controlValues": {"adsr_a": 17.6725006,"adsr_d": 407.463013,"adsr_r": 50,"adsr_s": 0.0599999987,"cutoff": 91.4609985,"env2amp": 0.389999986,"env2cutoff": 10800,"env2res": 1,"filter": 0,"filter_sep": 0,"key_follow": 0.519999981,"legato": 2,"master": 0.5,"o12_detune": 6,"o12_mix": 0.524999976,"o1_wave": 14,"o2_wave": 14,"o2_xpose": 12,"phase_mode": 1,"portamento": 19.3820992,"res": 1.41877997,"vel2amp": 0.460000008,"vel2filter": 0.419999987},"state": [false,{}]},{"instanceId": 6,"label": "Claribone","controlValues": {"adsr_a": 93.4008026,"adsr_d": 46.3296013,"adsr_r": 50,"adsr_s": 0.749556005,"cutoff": 79.7022018,"env2amp": 1,"env2cutoff": 9620.50977,"env2res": 1,"filter": 1,"filter_sep": 0,"key_follow": 1,"legato": 2,"o12_detune": 0,"o12_mix": 0.5,"o1_wave": 1,"o2_wave": 2,"o2_xpose": 12,"phase_mode": 0,"portamento": 44.7214012,"res": 0.699999988,"vel2amp": 0,"vel2filter": 0.5},"state": [false,{}]},{"instanceId": 7,"label": "Synth Brass","controlValues": {"Filter": 2,"adsr_a": 84.5126038,"adsr_d": 350,"adsr_r": 59.6427994,"adsr_s": 0.682958007,"cutoff": 661.95697,"env2cutoff": 6443.00977,"env2res": 1,"filter_sep": 0,"key_follow": 1,"legato": 2,"o12_detune": 5.53014994,"o12_mix": 0.5,"o1_wave": 0,"o2_wave": 0,"o2_xpose": 0,"phase_mode": 5,"portamento": 64.4744034,"res": 0.699999988,"vel2amp": 0.530111015,"vel2filter": 0.225723997},"state": [false,{}]},{"instanceId": 8,"label": "Kill Dat Sub","controlValues": {"adsr_a": 1.34596002,"adsr_d": 26.4069004,"adsr_r": 50,"adsr_s": 0.219999999,"cutoff": 115.667999,"env2amp": 1,"env2cutoff": 656.000977,"env2res": 1,"filter": 0,"filter_sep": 0,"key_follow": 0,"legato": 0,"o12_detune": 0,"o12_mix": 1,"o1_wave": 3,"o2_wave": 9,"o2_xpose": 0,"phase_mode": 1,"portamento": 1,"res": 0.699999988,"vel2amp": 0,"vel2filter": 0},"state": [false,{}]},{"instanceId": 9,"label": "Barkline","controlValues": {"adsr_a": 47.5774994,"adsr_d": 350,"adsr_r": 12.7286997,"adsr_s": 0.5,"cutoff": 32.5581017,"env2amp": 1,"env2cutoff": 10800,"env2res": 1,"filter": 1,"filter_sep": -144,"key_follow": 1,"legato": 0,"o12_detune": 3,"o12_mix": 0.790000021,"o1_wave": 2,"o2_wave": 0,"o2_xpose": 0,"phase_mode": 4,"portamento": 1,"res": 1.99541998,"vel2amp": 0,"vel2filter": 0.75999999},"state": [false,{}]},{"instanceId": 10,"label": "Fat Cats","controlValues": {"adsr_a": 736.80603,"adsr_d": 10,"adsr_r": 162.197006,"adsr_s": 1,"cutoff": 159.315002,"env2amp": 1,"env2cutoff": 8000,"env2res": 1,"filter": 1,"filter_sep": 1212.42004,"key_follow": 1,"legato": 3,"o12_detune": 9.2655201,"o12_mix": 0.5,"o1_wave": 0,"o2_wave": 2,"o2_xpose": 0,"phase_mode": 5,"portamento": 167.214996,"res": 4.42802,"vel2amp": 0,"vel2filter": 1},"state": [false,{}]},{"instanceId": 11,"label": "OctaWorm","controlValues": {"adsr_a": 43.0914993,"adsr_d": 11.4447002,"adsr_r": 106.924004,"adsr_s": 1,"cutoff": 777.018005,"env2amp": 1,"env2cutoff": 5616,"env2res": 0,"filter": 1,"filter_sep": 0,"key_follow": 1,"legato": 1,"master": 0.5,"o12_detune": 0,"o12_mix": 0.497000009,"o1_wave": 3,"o2_wave": 3,"o2_xpose": 24,"phase_mode": 0,"portamento": 17.9634991,"res": 1.03366005,"vel2amp": 0.469999999,"vel2filter": 1},"state": [false,{}]},{"instanceId": 12,"label": "Twinkle","controlValues": {"adsr_a": 1,"adsr_d": 108.851997,"adsr_r": 91.6362991,"adsr_s": 0.0176430997,"cutoff": 1170.33997,"env2amp": 1,"env2cutoff": 3841.02002,"env2res": 1,"filter": 2,"filter_sep": -1202.13,"key_follow": 1,"legato": 2,"o12_detune": 0.606140018,"o12_mix": 0.5,"o1_wave": 4,"o2_wave": 3,"o2_xpose": 24,"phase_mode": 1,"portamento": 12.5992002,"res": 0.699999988,"vel2amp": 1,"vel2filter": 0},"state": [false,{}]},{"instanceId": 13,"label": "Munch Bass","controlValues": {"adsr_a": 1,"adsr_d": 147.529007,"adsr_r": 91.6362991,"adsr_s": 0,"cutoff": 65.8727036,"env2amp": 1,"env2cutoff": 9325.2002,"env2res": 1,"filter": 3,"filter_sep": -777.367981,"key_follow": 1,"legato": 0,"master": 0.5,"o12_detune": 5,"o12_mix": 0.5,"o1_wave": 5,"o2_wave": 2,"o2_xpose": 0,"phase_mode": 1,"portamento": 1,"res": 0.699999988,"vel2amp": 1,"vel2filter": 0.225723997},"state": [false,{}]},{"instanceId": 14,"label": "Square Worm","controlValues": {"adsr_a": 43.0914993,"adsr_d": 1094.52002,"adsr_r": 228.653,"adsr_s": 0.25999999,"cutoff": 10277.2002,"env2amp": 1,"env2cutoff": -4968,"env2res": 0.340000004,"filter": 1,"filter_sep": -240,"key_follow": 0,"legato": 1,"master": 0.5,"o12_detune": 0,"o12_mix": 0.497000009,"o1_wave": 1,"o2_wave": 1,"o2_xpose": 12,"phase_mode": 0,"portamento": 17.9634991,"res": 3.16995001,"vel2amp": 0.469999999,"vel2filter": 1},"state": [false,{}]},{"instanceId": 15,"label": "Octaved Square","controlValues": {"Filter": 4,"adsr_a": 1,"adsr_d": 108.851997,"adsr_r": 91.6362991,"adsr_s": 0.0176430997,"cutoff": 1170.33997,"env2cutoff": 9325.2002,"env2res": 1,"filter_sep": -777.367981,"key_follow": 1,"legato": 0,"o12_detune": 0.606140018,"o12_mix": 0.5,"o1_wave": 3,"o2_wave": 1,"o2_xpose": 24,"phase_mode": 1,"portamento": 1,"res": 0.699999988,"vel2amp": 1,"vel2filter": 0.225723997},"state": [false,{}]},{"instanceId": 16,"label": "Digi String","controlValues": {"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"cutoff": 320.579987,"env2amp": 1,"env2cutoff": 8000,"env2res": 1,"filter": 1,"filter_sep": -2400,"key_follow": 0,"legato": 0,"o12_detune": 4,"o12_mix": 0.469999999,"o1_wave": 10,"o2_wave": 1,"o2_xpose": 0,"phase_mode": 0,"portamento": 1,"res": 0.699999988,"vel2amp": 0,"vel2filter": 0.5},"state": [false,{}]},{"instanceId": 17,"label": "Pulsating Orange","controlValues": {"adsr_a": 1,"adsr_d": 232.776993,"adsr_r": 91.6362991,"adsr_s": 0.0176430997,"cutoff": 448.514008,"env2amp": 1,"env2cutoff": 5653.2002,"env2res": 1,"filter": 0,"filter_sep": -777.367981,"key_follow": 1,"legato": 0,"master": 0.5,"o12_detune": 2.6061399,"o12_mix": 0.5,"o1_wave": 1,"o2_wave": 0,"o2_xpose": 12,"phase_mode": 0,"portamento": 1,"res": 0.699999988,"vel2amp": 1,"vel2filter": 0.225723997},"state": [false,{}]},{"instanceId": 18,"label": "Crystal Harp","controlValues": {"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"cutoff": 224.690994,"env2amp": 1,"env2cutoff": 8000,"env2res": 1,"filter": 1,"filter_sep": 0,"key_follow": 0,"legato": 0,"o12_detune": 3,"o12_mix": 0.5,"o1_wave": 15,"o2_wave": 15,"o2_xpose": 0,"phase_mode": 5,"portamento": 1,"res": 0.699999988,"vel2amp": 0,"vel2filter": 0.5},"state": [false,{}]},{"instanceId": 19,"label": "Velo Bee","controlValues": {"adsr_a": 21.5436993,"adsr_d": 278.635986,"adsr_r": 73.1175003,"adsr_s": 0.5,"cutoff": 58.7473984,"env2amp": 1,"env2cutoff": 9512,"env2res": 1,"filter": 4,"filter_sep": 1392,"key_follow": 0.74000001,"legato": 2,"master": 0.5,"o12_detune": 0,"o12_mix": 0,"o1_wave": 1,"o2_wave": 0,"o2_xpose": 0,"phase_mode": 3,"portamento": 76.135498,"res": 8,"vel2amp": 0.600000024,"vel2filter": 0.5},"state": [false,{}]},{"instanceId": 20,"label": "Bubbles","controlValues": {"adsr_a": 47.5774002,"adsr_d": 190.539993,"adsr_r": 287.214996,"adsr_s": 0.449999988,"cutoff": 16000,"env2amp": 0.50999999,"env2cutoff": -3888,"env2res": 0,"filter": 5,"filter_sep": 2400,"key_follow": 0.980000019,"legato": 2,"master": 0.5,"o12_detune": 2,"o12_mix": 0.524999976,"o1_wave": 11,"o2_wave": 11,"o2_xpose": 0,"phase_mode": 1,"portamento": 19.3820992,"res": 8,"vel2amp": 0.460000008,"vel2filter": 0.419999987},"state": [false,{}]},{"instanceId": 21,"label": "Fat Bass","controlValues": {"Filter": 1,"adsr_a": 1,"adsr_d": 125.991997,"adsr_r": 50,"adsr_s": 0.530111015,"cutoff": 116.960999,"env2cutoff": 10800,"env2res": 1,"filter_sep": 0,"key_follow": 1,"legato": 0,"o12_detune": 7.49069023,"o12_mix": 0.5,"o1_wave": 0,"o2_wave": 0,"o2_xpose": 0,"phase_mode": 1,"portamento": 1,"res": 2,"vel2amp": 0,"vel2filter": 0.5},"state": [false,{}]}],"nextInstanceId": 22} \ No newline at end of file diff --git a/default_presets/plugin_presets/23.json b/default_presets/plugin_presets/23.json new file mode 100644 index 0000000..8d556c7 --- /dev/null +++ b/default_presets/plugin_presets/23.json @@ -0,0 +1 @@ +{"pluginUri": "http://calf.sourceforge.net/plugins/Organ","presets": [{"instanceId": 1,"label": "Edgy Bass","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 221.822998,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 0.370000005,"detune1": -6.5,"detune2": 3.5,"detune3": 3,"detune4": 6,"detune5": -5.5,"detune6": 7.5,"detune7": -9,"detune8": -6.5,"detune9": 9.5,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 44.7743988,"f1_env1": 10800,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 1.05999994,"f1_res": 1.11458004,"f2": 2,"f2_cutoff": 45.8174019,"f2_env1": 10800,"f2_env2": 0,"f2_env3": 0,"f2_keyf": 1.01999998,"f2_res": 1.25896001,"f3": 2,"f4": 2,"f5": 2,"f6": 2,"f7": 2,"f8": 2,"f9": 2,"filter_chain": 1,"foldnote": 96,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 8,"l6": 8,"l7": 8,"l8": 8,"l9": 8,"master": 0.100000001,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": -1,"pan6": 1,"pan7": -1,"pan8": 1,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_trigger": 0,"phase1": 64.8000031,"phase2": 86,"phase3": 183,"phase4": 293.600006,"phase5": 136.600006,"phase6": 55.2000008,"phase7": 241.199997,"phase8": 129,"phase9": 284.399994,"routing1": 1,"routing2": 1,"routing3": 1,"routing4": 1,"routing5": 1,"routing6": 1,"routing7": 1,"routing8": 1,"routing9": 1,"vib_amt": 0.5,"vib_mode": 0,"vib_phase": 180,"vib_rate": 0.570676982,"vib_wet": 0.5,"w1": 25,"w2": 25,"w3": 25,"w4": 25,"w5": 25,"w6": 25,"w7": 25,"w8": 25,"w9": 25},"state": [false,{}]},{"instanceId": 2,"label": "Melodica NOS","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 26.2626991,"adsr_d": 221.822998,"adsr_r": 58.2090988,"adsr_s": 0.819999993,"adsr_v": 0,"detune1": -4,"detune2": 3.5,"detune3": 8.5,"detune4": 6.5,"detune5": -5.5,"detune6": 7.5,"detune7": -10.5,"detune8": -6.5,"detune9": 9.5,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 219.296005,"f1_env1": 10800,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 1.05999994,"f1_res": 1.11458004,"f2": 2,"f2_cutoff": 45.8174019,"f2_env1": 10800,"f2_env2": 0,"f2_env3": 0,"f2_keyf": 1.01999998,"f2_res": 1.25896001,"f3": 4,"f4": 4,"f5": 2,"f6": 2,"f7": 4,"f8": 4,"f9": 6,"filter_chain": 0,"foldnote": 106,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 8,"l6": 8,"l7": 8,"l8": 8,"l9": 8,"master": 0.100000001,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": -1,"pan6": 1,"pan7": -0.680000007,"pan8": 0.620000005,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_trigger": 0,"phase1": 302.399994,"phase2": 150.800003,"phase3": 291,"phase4": 56,"phase5": 233.800003,"phase6": 145.199997,"phase7": 133.199997,"phase8": 172.199997,"phase9": 284.399994,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"vib_amt": 0.5,"vib_mode": 0,"vib_phase": 180,"vib_rate": 0.570676982,"vib_wet": 0.5,"w1": 10,"w2": 10,"w3": 10,"w4": 10,"w5": 10,"w6": 10,"w7": 10,"w8": 10,"w9": 13},"state": [false,{}]},{"instanceId": 3,"label": "Electropop","controlValues": {"adsr2_a": 1,"adsr2_d": 940.161987,"adsr2_r": 50,"adsr2_s": 0,"adsr2_v": 1,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 221.822998,"adsr_r": 329.970001,"adsr_s": 0.419999987,"adsr_v": 0.49000001,"detune1": -1,"detune2": 3,"detune3": -2,"detune4": 2.5,"detune5": 0.5,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 4,"eg2_amp_ctl": 3,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 135.216995,"f1_env1": 9944,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 1,"f1_res": 0.699999988,"f2": 2,"f2_cutoff": 20,"f2_env1": 0,"f2_env2": 10800,"f2_env3": 0,"f2_keyf": 1.20000005,"f2_res": 0.699999988,"f3": 8,"f4": 8,"f5": 2,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 96,"l1": 8,"l2": 8,"l3": 3.3563199,"l4": 3.49425006,"l5": 8,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 0.535887003,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_timbre": 2,"perc_trigger": 0,"phase1": 0,"phase2": 61.2000008,"phase3": 118.800003,"phase4": 21.6000004,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 1,"routing2": 1,"routing3": 0,"routing4": 0,"routing5": 2,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 0.115652002,"vib_wet": 0.5,"w1": 34,"w2": 34,"w3": 34,"w4": 34,"w5": 22,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 4,"label": "Subtle EP","controlValues": {"adsr2_a": 1,"adsr2_d": 482.531006,"adsr2_r": 50,"adsr2_s": 0,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 76.5353012,"adsr3_r": 50,"adsr3_s": 0,"adsr3_v": 0,"adsr_a": 35.3484993,"adsr_d": 3693.09009,"adsr_r": 50,"adsr_s": 0.00999999978,"adsr_v": 0,"detune1": -5.5,"detune2": -4,"detune3": -8,"detune4": 4,"detune5": 10.5,"detune6": -4.5,"detune7": -1.5,"detune8": 3,"detune9": -7.5,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 20,"f1_env1": 0,"f1_env2": 9504,"f1_env3": 2160,"f1_keyf": 1.08000004,"f1_res": 0.699999988,"f2": 2,"f2_cutoff": 141.095993,"f2_env1": 10800,"f2_env2": 0,"f2_env3": 1944,"f2_keyf": 0.980000019,"f2_res": 0.699999988,"f3": 2,"f4": 2,"f5": 2,"f6": 2,"f7": 2,"f8": 2,"f9": 2,"filter_chain": 0,"foldnote": 96,"l1": 5.22543001,"l2": 5.13294983,"l3": 4.76301003,"l4": 4.62427998,"l5": 4.76301003,"l6": 4.67051983,"l7": 3.09826994,"l8": 1.80347002,"l9": 1.29480004,"master": 0.25,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": -1,"pan6": 1,"pan7": 0.0399999991,"pan8": -0.0799999982,"pan9": 0.0199999996,"perc_decay": 32.2368011,"perc_level": 0,"perc_trigger": 0,"phase1": 90,"phase2": 193,"phase3": 302.399994,"phase4": 360,"phase5": 280.799988,"phase6": 133.199997,"phase7": 64.8000031,"phase8": 21.7999992,"phase9": 172.800003,"routing1": 2,"routing2": 2,"routing3": 2,"routing4": 2,"routing5": 2,"routing6": 2,"routing7": 1,"routing8": 1,"routing9": 1,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 1.17121994,"vib_wet": 0.5,"w1": 24,"w2": 24,"w3": 20,"w4": 20,"w5": 20,"w6": 20,"w7": 15,"w8": 15,"w9": 15},"state": [false,{}]},{"instanceId": 5,"label": "Mr Click","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 0,"detune": 0,"detune1": 0,"detune2": 0,"detune3": 0,"detune4": 0,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 1,"f1_cutoff": 2000,"f1_env1": 8000,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0,"f1_res": 2,"f2": 3,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 4,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 114,"l1": 0,"l2": 0,"l3": 8,"l4": 3.72413993,"l5": 0,"l6": 6.75861979,"l7": 0,"l8": 2.89654994,"l9": 6.20690012,"master": 0.100000001,"pan1": 0,"pan2": 0,"pan3": 0,"pan4": 0,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 178.438004,"perc_fm_decay": 200,"perc_fm_depth": 0,"perc_fm_harmonic": 6,"perc_fm_waveform": 0,"perc_harmonic": 6,"perc_level": 0.757857978,"perc_stereo": 0,"perc_trigger": 0,"perc_vel2amp": 0,"perc_vel2fm": 0,"perc_waveform": 0,"phase1": 0,"phase2": 0,"phase3": 21.6000004,"phase4": 0,"phase5": 0,"phase6": 3.5999999,"phase7": 0,"phase8": 0,"phase9": 0,"polyphony": 16,"quad_env": 1,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"transpose": -12,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 6.5999999,"vib_wet": 0.5,"w1": 0,"w2": 0,"w3": 30,"w4": 0,"w5": 0,"w6": 30,"w7": 0,"w8": 0,"w9": 30},"state": [false,{}]},{"instanceId": 6,"label": "Mystic Pizzicato","controlValues": {"adsr2_a": 1,"adsr2_d": 1600.56995,"adsr2_r": 50,"adsr2_s": 0,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 488.966003,"adsr_s": 0.419999987,"adsr_v": 0,"detune1": -12,"detune2": 14,"detune3": -8,"detune4": 8,"detune5": 0.5,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 4,"eg2_amp_ctl": 3,"eg3_amp_ctl": 0,"f1": 1,"f1_cutoff": 135.216995,"f1_env1": 9944,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 1,"f1_res": 0.699999988,"f2": 1,"f2_cutoff": 170.227997,"f2_env1": 0,"f2_env2": 10800,"f2_env3": 0,"f2_keyf": 1.20000005,"f2_res": 0.699999988,"f3": 2,"f4": 2,"f5": 8,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 96,"l1": 4.04597998,"l2": 4.04597998,"l3": 8,"l4": 8,"l5": 8,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 0.535887003,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_trigger": 0,"phase1": 0,"phase2": 61.2000008,"phase3": 118.800003,"phase4": 21.6000004,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 1,"routing2": 1,"routing3": 0,"routing4": 0,"routing5": 2,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"vib_amt": 0.5,"vib_mode": 4,"vib_phase": 180,"vib_rate": 0.999758005,"vib_wet": 0.5,"w1": 34,"w2": 34,"w3": 34,"w4": 34,"w5": 31,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 7,"label": "Pipe Dream","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 21.5436993,"adsr_d": 221.822998,"adsr_r": 50,"adsr_s": 0.610000014,"adsr_v": 0,"detune": 0,"detune1": -2,"detune2": 1.5,"detune3": 0.5,"detune4": 3.5,"detune5": -1.5,"detune6": -2.5,"detune7": -3.5,"detune8": -6.5,"detune9": 7.5,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 2000,"f1_env1": 8000,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0,"f1_res": 2,"f2": 8,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 16,"f4": 32,"f5": 2,"f6": 2,"f7": 2,"f8": 2,"f9": 2,"filter_chain": 0,"foldnote": 127,"l1": 8,"l2": 4.55172014,"l3": 2.75862002,"l4": 1.47125995,"l5": 0,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 0.100000001,"pan1": -0.170000002,"pan2": 0,"pan3": 0.180000007,"pan4": 0.0399999991,"pan5": -1,"pan6": 1,"pan7": -1,"pan8": 1,"pan9": 0,"perc_decay": 932.937988,"perc_fm_decay": 353.786987,"perc_fm_depth": 0.200000003,"perc_fm_harmonic": 10,"perc_fm_waveform": 3,"perc_harmonic": 2,"perc_level": 0,"perc_stereo": 90,"perc_trigger": 3,"perc_vel2amp": 0,"perc_vel2fm": 0,"perc_waveform": 0,"phase1": 0,"phase2": 183.199997,"phase3": 183,"phase4": 236,"phase5": 97,"phase6": 48,"phase7": 0,"phase8": 129,"phase9": 0,"polyphony": 4,"quad_env": 1,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"transpose": -12,"vib_amt": 0.100000001,"vib_mode": 5,"vib_phase": 180,"vib_rate": 5.9046402,"vib_wet": 0.5,"w1": 24,"w2": 22,"w3": 22,"w4": 22,"w5": 27,"w6": 27,"w7": 27,"w8": 27,"w9": 27},"state": [false,{}]},{"instanceId": 8,"label": "Transistor","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 0,"detune1": 4,"detune2": -3,"detune3": 2,"detune4": 0,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 2000,"f1_env1": 8000,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0,"f1_res": 2,"f2": 2,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 2,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 2,"filter_chain": 0,"foldnote": 96,"l1": 8,"l2": 8,"l3": 8,"l4": 0,"l5": 0,"l6": 0,"l7": 0,"l8": 0,"l9": 8,"master": 0.100000001,"pan1": -1,"pan2": 1,"pan3": 0,"pan4": 0,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 200,"perc_level": 0.25,"perc_trigger": 0,"phase1": 86,"phase2": 234,"phase3": 0,"phase4": 0,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 0.624339998,"vib_wet": 0.5,"w1": 27,"w2": 27,"w3": 27,"w4": 27,"w5": 27,"w6": 27,"w7": 27,"w8": 27,"w9": 27},"state": [false,{}]},{"instanceId": 9,"label": "Trollarity","controlValues": {"adsr2_a": 1,"adsr2_d": 1600.56995,"adsr2_r": 50,"adsr2_s": 0,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 488.966003,"adsr_s": 0.419999987,"adsr_v": 0,"detune1": -12,"detune2": 14,"detune3": -8,"detune4": 8,"detune5": 0.5,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 4,"eg2_amp_ctl": 3,"eg3_amp_ctl": 0,"f1": 1,"f1_cutoff": 135.216995,"f1_env1": 9944,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 1,"f1_res": 0.699999988,"f2": 1,"f2_cutoff": 170.227997,"f2_env1": 0,"f2_env2": 10800,"f2_env3": 0,"f2_keyf": 1.20000005,"f2_res": 0.699999988,"f3": 2,"f4": 2,"f5": 8,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 96,"l1": 4.04597998,"l2": 4.04597998,"l3": 8,"l4": 8,"l5": 8,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 0.535887003,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 498.161011,"perc_fm_decay": 407.501007,"perc_fm_depth": 0.879999995,"perc_fm_harmonic": 4,"perc_fm_waveform": 13,"perc_harmonic": 2,"perc_level": 0.329876989,"perc_trigger": 1,"perc_vel2amp": 1,"perc_waveform": 10,"phase1": 0,"phase2": 61.2000008,"phase3": 118.800003,"phase4": 21.6000004,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 1,"routing2": 1,"routing3": 0,"routing4": 0,"routing5": 2,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"vib_amt": 0.5,"vib_mode": 4,"vib_phase": 180,"vib_rate": 0.999758005,"vib_wet": 0.5,"w1": 29,"w2": 29,"w3": 34,"w4": 34,"w5": 28,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 10,"label": "Zyn Brass","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 23.7863998,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.50999999,"adsr_v": 0,"detune": 0,"detune1": -4,"detune2": 4,"detune3": 0,"detune4": 0,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 1,"f1_cutoff": 37.2416992,"f1_env1": 10800,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0.400000006,"f1_res": 0.699999988,"f2": 1,"f2_cutoff": 37.4762993,"f2_env1": 10800,"f2_env2": 0,"f2_env3": 0,"f2_keyf": 0.400000006,"f2_res": 0.699999988,"f3": 2,"f4": 4,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 1,"foldnote": 96,"l1": 8,"l2": 8,"l3": 0,"l4": 0,"l5": 0,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 1,"pan1": -1,"pan2": 1,"pan3": 0,"pan4": 0,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 200,"perc_fm_decay": 200,"perc_fm_depth": 0,"perc_fm_harmonic": 6,"perc_fm_waveform": 0,"perc_harmonic": 6,"perc_level": 0,"perc_stereo": 90,"perc_trigger": 0,"perc_vel2amp": 0,"perc_vel2fm": 0,"perc_waveform": 0,"phase1": 133.199997,"phase2": 327.600006,"phase3": 0,"phase4": 0,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 1,"routing2": 1,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"transpose": -12,"vib_amt": 0.5,"vib_mode": 0,"vib_phase": 180,"vib_rate": 6.5999999,"vib_wet": 0.5,"w1": 28,"w2": 28,"w3": 0,"w4": 0,"w5": 0,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 11,"label": "Clavesque","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 1,"detune1": -5,"detune2": 1.5,"detune3": 2.5,"detune4": 3.5,"detune5": -1.5,"detune6": -2.5,"detune7": -3.5,"detune8": -6.5,"detune9": 7.5,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 80.740303,"f1_env1": 10800,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0.899999976,"f1_res": 0.699999988,"f2": 2,"f2_cutoff": 80.740303,"f2_env1": 10800,"f2_env2": 0,"f2_env3": 0,"f2_keyf": 0.899999976,"f2_res": 0.699999988,"f3": 2,"f4": 2,"f5": 2,"f6": 2,"f7": 2,"f8": 2,"f9": 2,"filter_chain": 1,"foldnote": 96,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 8,"l6": 8,"l7": 8,"l8": 8,"l9": 8,"master": 0.100000001,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": -1,"pan6": 1,"pan7": -1,"pan8": 1,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_trigger": 2,"phase1": 0,"phase2": 86,"phase3": 183,"phase4": 236,"phase5": 97,"phase6": 48,"phase7": 233,"phase8": 129,"phase9": 82,"routing1": 1,"routing2": 1,"routing3": 1,"routing4": 1,"routing5": 1,"routing6": 1,"routing7": 1,"routing8": 1,"routing9": 1,"vib_amt": 0.5,"vib_mode": 4,"vib_phase": 180,"vib_rate": 0.570676982,"vib_wet": 0.5,"w1": 27,"w2": 27,"w3": 27,"w4": 27,"w5": 27,"w6": 27,"w7": 27,"w8": 27,"w9": 27},"state": [false,{}]},{"instanceId": 12,"label": "Monkstown","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 2263.62012,"adsr_d": 350,"adsr_r": 614.200012,"adsr_s": 0.959999979,"adsr_v": 0,"detune1": -12,"detune2": 14,"detune3": -8,"detune4": 8,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 4,"f1_cutoff": 514.078979,"f1_env1": 3032,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 1,"f1_res": 0.699999988,"f2": 4,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 2,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 114,"l1": 4.04597998,"l2": 4.04597998,"l3": 8,"l4": 8,"l5": 0,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 1,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_trigger": 0,"phase1": 79.1999969,"phase2": 61.2000008,"phase3": 270,"phase4": 147.600006,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 1,"routing2": 1,"routing3": 1,"routing4": 1,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"vib_amt": 0.5,"vib_mode": 0,"vib_phase": 180,"vib_rate": 6.5999999,"vib_wet": 0.5,"w1": 34,"w2": 34,"w3": 34,"w4": 34,"w5": 0,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 13,"label": "Transistor 2","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 0,"detune1": -5,"detune2": 1.5,"detune3": 2.5,"detune4": 3.5,"detune5": -1.5,"detune6": -2.5,"detune7": -3.5,"detune8": -6.5,"detune9": 7.5,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 2000,"f1_env1": 8000,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0,"f1_res": 2,"f2": 2,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 2,"f5": 2,"f6": 2,"f7": 2,"f8": 2,"f9": 2,"filter_chain": 0,"foldnote": 96,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 8,"l6": 8,"l7": 8,"l8": 8,"l9": 8,"master": 0.100000001,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": -1,"pan6": 1,"pan7": -1,"pan8": 1,"pan9": 0,"perc_decay": 200,"perc_level": 0.25,"perc_trigger": 0,"phase1": 0,"phase2": 86,"phase3": 183,"phase4": 236,"phase5": 97,"phase6": 48,"phase7": 0,"phase8": 129,"phase9": 0,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"vib_amt": 0.5,"vib_mode": 4,"vib_phase": 180,"vib_rate": 0.570676982,"vib_wet": 0.5,"w1": 24,"w2": 24,"w3": 23,"w4": 23,"w5": 27,"w6": 27,"w7": 27,"w8": 27,"w9": 27},"state": [false,{}]},{"instanceId": 14,"label": "Ethereal Clav","controlValues": {"adsr2_a": 1,"adsr2_d": 482.531006,"adsr2_r": 1313.44995,"adsr2_s": 0,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 76.5353012,"adsr3_r": 11904.5,"adsr3_s": 0,"adsr3_v": 0,"adsr_a": 35.3484993,"adsr_d": 3693.09009,"adsr_r": 179.634995,"adsr_s": 0,"adsr_v": 0,"detune": 0,"detune1": -5.5,"detune2": -4,"detune3": -8,"detune4": 4,"detune5": 10.5,"detune6": -4.5,"detune7": -1.5,"detune8": 3,"detune9": -7.5,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 20,"f1_env1": 0,"f1_env2": 9504,"f1_env3": 2160,"f1_keyf": 1.08000004,"f1_res": 0.699999988,"f2": 2,"f2_cutoff": 141.095993,"f2_env1": 10800,"f2_env2": 0,"f2_env3": 1944,"f2_keyf": 0.980000019,"f2_res": 0.699999988,"f3": 2,"f4": 2,"f5": 2,"f6": 2,"f7": 2,"f8": 2,"f9": 2,"filter_chain": 0,"foldnote": 96,"l1": 5.22543001,"l2": 5.13294983,"l3": 4.76301003,"l4": 4.62427998,"l5": 4.76301003,"l6": 4.67051983,"l7": 3.09826994,"l8": 1.80347002,"l9": 1.29480004,"master": 0.233257994,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": -1,"pan6": 1,"pan7": -1,"pan8": -0.0799999982,"pan9": 0.0199999996,"perc_decay": 3000,"perc_fm_decay": 1513.09998,"perc_fm_depth": 0.400000006,"perc_fm_harmonic": 6,"perc_fm_waveform": 1,"perc_harmonic": 4,"perc_level": 1,"perc_stereo": 144,"perc_trigger": 3,"perc_vel2amp": 1,"perc_vel2fm": 0.400000006,"perc_waveform": 1,"phase1": 90,"phase2": 193,"phase3": 302.399994,"phase4": 360,"phase5": 280.799988,"phase6": 133.199997,"phase7": 64.8000031,"phase8": 21.7999992,"phase9": 172.800003,"routing1": 2,"routing2": 2,"routing3": 2,"routing4": 2,"routing5": 2,"routing6": 2,"routing7": 2,"routing8": 1,"routing9": 1,"transpose": -12,"vib_amt": 1,"vib_mode": 4,"vib_phase": 180,"vib_rate": 0.0421206988,"vib_wet": 0.5,"w1": 28,"w2": 28,"w3": 28,"w4": 23,"w5": 23,"w6": 23,"w7": 23,"w8": 16,"w9": 16},"state": [false,{}]},{"instanceId": 15,"label": "Fat Belly","controlValues": {"adsr2_a": 1,"adsr2_d": 140.587006,"adsr2_r": 168.707993,"adsr2_s": 0.119999997,"adsr2_v": 0.439999998,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 1483.42004,"adsr_r": 334.369995,"adsr_s": 0.379999995,"adsr_v": 0.49000001,"detune1": -5,"detune2": 5,"detune3": 2.5,"detune4": 3.5,"detune5": -8,"detune6": 8,"detune7": -3.5,"detune8": -6.5,"detune9": 7.5,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 97.9555969,"f1_env1": 9072,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0.660000026,"f1_res": 0.699999988,"f2": 2,"f2_cutoff": 209.425995,"f2_env1": 0,"f2_env2": 6912,"f2_env3": 0,"f2_keyf": 0.540000021,"f2_res": 0.699999988,"f3": 7,"f4": 9,"f5": 14,"f6": 18,"f7": 23,"f8": 26,"f9": 32,"filter_chain": 0,"foldnote": 127,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 8,"l6": 8,"l7": 8,"l8": 8,"l9": 8,"master": 0.100000001,"pan1": -1,"pan2": 1,"pan3": -0.400000006,"pan4": 0.579999983,"pan5": -0.540000021,"pan6": 0.660000026,"pan7": -0.400000006,"pan8": 0.479999989,"pan9": 0,"perc_decay": 200,"perc_level": 0.164938003,"perc_trigger": 2,"phase1": 259.200012,"phase2": 86,"phase3": 183,"phase4": 236,"phase5": 97,"phase6": 246,"phase7": 0,"phase8": 128,"phase9": 270,"routing1": 0,"routing2": 0,"routing3": 1,"routing4": 1,"routing5": 1,"routing6": 1,"routing7": 2,"routing8": 2,"routing9": 2,"vib_amt": 1,"vib_mode": 4,"vib_phase": 180,"vib_rate": 0.278062999,"vib_wet": 0.409999996,"w1": 12,"w2": 12,"w3": 14,"w4": 14,"w5": 15,"w6": 15,"w7": 14,"w8": 15,"w9": 15},"state": [false,{}]},{"instanceId": 16,"label": "TekChoir+BellPerc","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 0,"detune": 0,"detune1": -5,"detune2": 6,"detune3": 0,"detune4": 0,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 8,"f1_cutoff": 2000,"f1_env1": 8000,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0,"f1_res": 2,"f2": 2,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 4,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 96,"l1": 8,"l2": 8,"l3": 0,"l4": 0,"l5": 0,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 1,"pan1": 0.0599999987,"pan2": -0.0199999996,"pan3": 0,"pan4": 0,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 353.786987,"perc_fm_decay": 113.061996,"perc_fm_depth": 0.159999996,"perc_fm_harmonic": 11,"perc_fm_waveform": 15,"perc_harmonic": 4,"perc_level": 0.307785988,"perc_stereo": 151.199997,"perc_trigger": 3,"perc_vel2amp": 0.529999971,"perc_vel2fm": 0.810000002,"perc_waveform": 14,"phase1": 0,"phase2": 147.600006,"phase3": 0,"phase4": 0,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"transpose": -12,"vib_amt": 0.5,"vib_mode": 0,"vib_phase": 180,"vib_rate": 6.5999999,"vib_wet": 0.5,"w1": 32,"w2": 34,"w3": 0,"w4": 0,"w5": 0,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 17,"label": "Critical Bass","controlValues": {"adsr2_a": 1,"adsr2_d": 65.7417984,"adsr2_r": 453.178009,"adsr2_s": 0.25999999,"adsr2_v": 0.540000021,"adsr3_a": 1,"adsr3_d": 13.3237,"adsr3_r": 39.8050995,"adsr3_s": 1,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 407.463989,"adsr_r": 211.917007,"adsr_s": 0.75999999,"adsr_v": 0,"detune": 0,"detune1": -4,"detune2": 3.5,"detune3": 8.5,"detune4": 6.5,"detune5": -5.5,"detune6": 7.5,"detune7": -10.5,"detune8": -6.5,"detune9": 9.5,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 4,"f1": 2,"f1_cutoff": 20,"f1_env1": 9288,"f1_env2": 1512,"f1_env3": 0,"f1_keyf": 0.340000004,"f1_res": 2.20469999,"f2": 2,"f2_cutoff": 20,"f2_env1": 9504,"f2_env2": 1728,"f2_env3": 0,"f2_keyf": 0.340000004,"f2_res": 2.81287003,"f3": 4,"f4": 4,"f5": 2,"f6": 2,"f7": 4,"f8": 4,"f9": 8,"filter_chain": 1,"foldnote": 106,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 8,"l6": 8,"l7": 8,"l8": 8,"l9": 8,"master": 0.100000001,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": -1,"pan6": 1,"pan7": -0.680000007,"pan8": 0.620000005,"pan9": 0,"perc_decay": 200,"perc_fm_decay": 200,"perc_fm_depth": 0,"perc_fm_harmonic": 6,"perc_fm_waveform": 0,"perc_harmonic": 6,"perc_level": 0,"perc_stereo": 90,"perc_trigger": 0,"perc_vel2amp": 0,"perc_vel2fm": 0,"perc_waveform": 0,"phase1": 302.399994,"phase2": 150.800003,"phase3": 291,"phase4": 56,"phase5": 233.800003,"phase6": 145.199997,"phase7": 133.199997,"phase8": 172.199997,"phase9": 284.399994,"polyphony": 16,"quad_env": 1,"routing1": 1,"routing2": 1,"routing3": 1,"routing4": 1,"routing5": 1,"routing6": 1,"routing7": 1,"routing8": 1,"routing9": 1,"transpose": -12,"vib_amt": 0.5,"vib_mode": 0,"vib_phase": 180,"vib_rate": 0.570676982,"vib_wet": 0.5,"w1": 11,"w2": 11,"w3": 11,"w4": 11,"w5": 11,"w6": 11,"w7": 11,"w8": 11,"w9": 11},"state": [false,{}]},{"instanceId": 18,"label": "Intertube","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 168.707993,"adsr_s": 0.649999976,"adsr_v": 0.620000005,"detune": 0,"detune1": 10,"detune2": -10,"detune3": 3,"detune4": -4,"detune5": 5,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 2000,"f1_env1": 8000,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0,"f1_res": 2,"f2": 2,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 4,"f5": 2,"f6": 8,"f7": 10,"f8": 12,"f9": 8,"filter_chain": 0,"foldnote": 96,"l1": 8,"l2": 8,"l3": 0,"l4": 0,"l5": 0,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 0.5,"pan1": -0.360000014,"pan2": 0.400000006,"pan3": 0.660000026,"pan4": 0.519999981,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 224.167007,"perc_fm_decay": 89.9980011,"perc_fm_depth": 0.680000007,"perc_fm_harmonic": 13,"perc_fm_waveform": 15,"perc_harmonic": 7,"perc_level": 0.233257994,"perc_stereo": 97.1999969,"perc_trigger": 3,"perc_vel2amp": 1,"perc_vel2fm": 1,"perc_waveform": 11,"phase1": 187.199997,"phase2": 331.200012,"phase3": 241.199997,"phase4": 104.400002,"phase5": 176.399994,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"transpose": -12,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 0.216955006,"vib_wet": 0.5,"w1": 13,"w2": 13,"w3": 2,"w4": 2,"w5": 2,"w6": 0,"w7": 0,"w8": 0,"w9": 2},"state": [false,{}]},{"instanceId": 19,"label": "Std Jimmy","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 0,"detune1": 0,"detune2": 0,"detune3": 0,"detune4": 0,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 1,"f1_cutoff": 2000,"f1_env1": 8000,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0,"f1_res": 2,"f2": 3,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 4,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 96,"l1": 8,"l2": 8,"l3": 8,"l4": 0,"l5": 0,"l6": 0,"l7": 0,"l8": 0,"l9": 8,"master": 0.100000001,"pan1": 0,"pan2": 0,"pan3": 0,"pan4": 0,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 200,"perc_level": 0.25,"perc_trigger": 0,"phase1": 0,"phase2": 0,"phase3": 0,"phase4": 0,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 6.5999999,"vib_wet": 0.5,"w1": 0,"w2": 0,"w3": 0,"w4": 0,"w5": 0,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 20,"label": "Space Bells","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 246.710007,"adsr_s": 0.5,"adsr_v": 0.479999989,"detune1": -4,"detune2": 4,"detune3": 0,"detune4": 4,"detune5": -2.5,"detune6": 2.5,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 4,"f1_cutoff": 126.191002,"f1_env1": 7568,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0.899999976,"f1_res": 1.35441005,"f2": 2,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 4,"f5": 2,"f6": 2,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 96,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 8,"l6": 8,"l7": 0,"l8": 0,"l9": 0,"master": 0.100000001,"pan1": -0.319999993,"pan2": -1,"pan3": 1,"pan4": 0.400000006,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_trigger": 0,"phase1": 0,"phase2": 0,"phase3": 148.600006,"phase4": 180,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 1,"routing6": 1,"routing7": 0,"routing8": 0,"routing9": 0,"vib_amt": 0.5,"vib_mode": 4,"vib_phase": 180,"vib_rate": 0.487132996,"vib_wet": 0.5,"w1": 31,"w2": 28,"w3": 28,"w4": 31,"w5": 8,"w6": 8,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 21,"label": "Gates of dawn","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 43.0914993,"adsr_d": 41.6657982,"adsr_r": 50,"adsr_s": 0.779999971,"adsr_v": 0.389999986,"detune1": -5,"detune2": 1.5,"detune3": 2.5,"detune4": 3.5,"detune5": -1.5,"detune6": -2.5,"detune7": -3.5,"detune8": -6.5,"detune9": 7.5,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 25.7649994,"f1_env1": 10800,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0.920000017,"f1_res": 0.699999988,"f2": 2,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 2,"f5": 2,"f6": 2,"f7": 2,"f8": 2,"f9": 2,"filter_chain": 0,"foldnote": 96,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 8,"l6": 8,"l7": 8,"l8": 8,"l9": 8,"master": 0.100000001,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": -1,"pan6": 1,"pan7": -1,"pan8": 1,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_trigger": 0,"phase1": 0,"phase2": 86,"phase3": 183,"phase4": 236,"phase5": 97,"phase6": 48,"phase7": 0,"phase8": 129,"phase9": 0,"routing1": 1,"routing2": 1,"routing3": 1,"routing4": 1,"routing5": 1,"routing6": 1,"routing7": 1,"routing8": 1,"routing9": 1,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 0.254162997,"vib_wet": 0.5,"w1": 19,"w2": 19,"w3": 18,"w4": 18,"w5": 20,"w6": 20,"w7": 20,"w8": 20,"w9": 20},"state": [false,{}]},{"instanceId": 22,"label": "Cursed Chalice","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 144.914993,"adsr_s": 0.5,"adsr_v": 1,"detune": 0,"detune1": -8,"detune2": 6,"detune3": 0,"detune4": 0,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 138.365997,"f1_env1": 10800,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 1.03999996,"f1_res": 1.49303997,"f2": 2,"f2_cutoff": 166.352997,"f2_env1": 10800,"f2_env2": 0,"f2_env3": 0,"f2_keyf": 1,"f2_res": 1.49303997,"f3": 2,"f4": 4,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 1,"foldnote": 96,"l1": 8,"l2": 8,"l3": 0,"l4": 0,"l5": 0,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 0.200000003,"pan1": -1,"pan2": 1,"pan3": 0,"pan4": 0,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 932.937988,"perc_fm_decay": 591.130005,"perc_fm_depth": 2,"perc_fm_harmonic": 4,"perc_fm_waveform": 13,"perc_harmonic": 2,"perc_level": 1,"perc_stereo": 111.599998,"perc_trigger": 3,"perc_vel2amp": 1,"perc_vel2fm": 1,"perc_waveform": 13,"phase1": 306,"phase2": 86.4000015,"phase3": 0,"phase4": 0,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 1,"routing2": 1,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"transpose": -12,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 1.43225002,"vib_wet": 0.5,"w1": 8,"w2": 8,"w3": 0,"w4": 0,"w5": 0,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 23,"label": "Tyrant Bass","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 106.922997,"adsr2_s": 0.389999986,"adsr2_v": 0.330000013,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 511.822998,"adsr_r": 488.966003,"adsr_s": 0.280000001,"adsr_v": 0.370000005,"detune": 0,"detune1": 2.5,"detune2": -2.5,"detune3": -5,"detune4": 5,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 3,"eg2_amp_ctl": 4,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 24.0452995,"f1_env1": 10800,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 1,"f1_res": 1.13944995,"f2": 2,"f2_cutoff": 20,"f2_env1": 0,"f2_env2": 7776,"f2_env3": 0,"f2_keyf": 1.01999998,"f2_res": 0.699999988,"f3": 2,"f4": 2,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 84,"l1": 8,"l2": 8,"l3": 4.4597702,"l4": 4.59770012,"l5": 0,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 1,"pan1": -1,"pan2": 1,"pan3": -0.340000004,"pan4": 0.340000004,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 251.255005,"perc_fm_decay": 591.130005,"perc_fm_depth": 0.439999998,"perc_fm_harmonic": 10,"perc_fm_waveform": 2,"perc_harmonic": 2,"perc_level": 0.615571976,"perc_stereo": 108,"perc_trigger": 3,"perc_vel2amp": 1,"perc_vel2fm": 1,"perc_waveform": 0,"phase1": 0,"phase2": 111.599998,"phase3": 291.600006,"phase4": 82.8000031,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 2,"routing2": 2,"routing3": 1,"routing4": 1,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"transpose": -12,"vib_amt": 0.239999995,"vib_mode": 0,"vib_phase": 180,"vib_rate": 0.476790994,"vib_wet": 0.349999994,"w1": 35,"w2": 35,"w3": 14,"w4": 15,"w5": 0,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 24,"label": "Shamrock","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 0,"detune1": 0,"detune2": -2.5,"detune3": 3,"detune4": -4,"detune5": 5,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 2000,"f1_env1": 8000,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0,"f1_res": 2,"f2": 6,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 4,"f5": 2,"f6": 8,"f7": 10,"f8": 12,"f9": 8,"filter_chain": 0,"foldnote": 96,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 8,"l6": 0,"l7": 0,"l8": 0,"l9": 8,"master": 0.100000001,"pan1": -0.639999986,"pan2": -0.620000005,"pan3": 0.660000026,"pan4": 0.519999981,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_trigger": 1,"phase1": 0,"phase2": 205.199997,"phase3": 241.199997,"phase4": 104.400002,"phase5": 176.399994,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 1.09377003,"vib_wet": 0.5,"w1": 3,"w2": 3,"w3": 2,"w4": 2,"w5": 2,"w6": 0,"w7": 0,"w8": 0,"w9": 2},"state": [false,{}]},{"instanceId": 25,"label": "Sitarean Pipes","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 21.5436993,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 0,"detune": 0,"detune1": 0,"detune2": 0,"detune3": -2,"detune4": 1,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 2,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 1,"f1_cutoff": 468.846008,"f1_env1": 6048,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0.939999998,"f1_res": 0.699999988,"f2": 1,"f2_cutoff": 408.347992,"f2_env1": 6048,"f2_env2": 0,"f2_env3": 0,"f2_keyf": 0.839999974,"f2_res": 0.699999988,"f3": 2,"f4": 4,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 1,"foldnote": 127,"l1": 2.85056996,"l2": 2.57470989,"l3": 8,"l4": 8,"l5": 8,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"map_curve": 0,"master": 0.348219991,"pan1": -1,"pan2": 1,"pan3": -0.360000014,"pan4": 0.340000004,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 625.827026,"perc_fm_decay": 200,"perc_fm_depth": 0.280000001,"perc_fm_harmonic": 2,"perc_fm_waveform": 1,"perc_harmonic": 2,"perc_level": 1,"perc_stereo": 90,"perc_trigger": 3,"perc_vel2amp": 0,"perc_vel2fm": 0,"perc_waveform": 1,"phase1": 320.399994,"phase2": 68.4000015,"phase3": 316.799988,"phase4": 39.5999985,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 0,"routing2": 0,"routing3": 1,"routing4": 1,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"transpose": 0,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 0.310808986,"vib_wet": 0.270000011,"w1": 0,"w2": 0,"w3": 14,"w4": 15,"w5": 10,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 26,"label": "Tty","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 0,"detune": 0,"detune1": 0,"detune2": 0,"detune3": 0,"detune4": 0,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 0,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 1,"f1_cutoff": 2000,"f1_env1": 8000,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0,"f1_res": 2,"f2": 3,"f2_cutoff": 2000,"f2_env1": 0,"f2_env2": 8000,"f2_env3": 0,"f2_keyf": 0,"f2_res": 2,"f3": 2,"f4": 4,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 127,"l1": 8,"l2": 0,"l3": 8,"l4": 8,"l5": 8,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 0.100000001,"pan1": 0,"pan2": 0,"pan3": 0,"pan4": 0,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 200,"perc_fm_decay": 200,"perc_fm_depth": 0,"perc_fm_harmonic": 6,"perc_fm_waveform": 0,"perc_harmonic": 6,"perc_level": 0.25,"perc_stereo": 90,"perc_trigger": 0,"perc_vel2amp": 0,"perc_vel2fm": 0,"perc_waveform": 0,"phase1": 0,"phase2": 0,"phase3": 0,"phase4": 0,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 0,"routing2": 0,"routing3": 0,"routing4": 0,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"transpose": 0,"vib_amt": 0.5,"vib_mode": 5,"vib_phase": 180,"vib_rate": 0.310808986,"vib_wet": 0.270000011,"w1": 2,"w2": 1,"w3": 1,"w4": 2,"w5": 10,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 27,"label": "Royale with Cheese","controlValues": {"adsr2_a": 1,"adsr2_d": 163.669006,"adsr2_r": 50,"adsr2_s": 0,"adsr2_v": 0.99000001,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 5827.04004,"adsr_r": 50,"adsr_s": 0.159999996,"adsr_v": 0.460000008,"detune": 0,"detune1": -2,"detune2": 2,"detune3": -7,"detune4": 7,"detune5": 0,"detune6": 0,"detune7": 0,"detune8": 0,"detune9": 0,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 95.7259979,"f1_env1": 10800,"f1_env2": 5616,"f1_env3": 0,"f1_keyf": 0.899999976,"f1_res": 0.699999988,"f2": 2,"f2_cutoff": 576.80603,"f2_env1": 3456,"f2_env2": 4760,"f2_env3": 0,"f2_keyf": 0.959999979,"f2_res": 0.699999988,"f3": 8,"f4": 8,"f5": 6,"f6": 8,"f7": 10,"f8": 12,"f9": 16,"filter_chain": 0,"foldnote": 96,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 0,"l6": 0,"l7": 0,"l8": 0,"l9": 0,"master": 0.229739994,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": 0,"pan6": 0,"pan7": 0,"pan8": 0,"pan9": 0,"perc_decay": 444.45401,"perc_fm_decay": 444.45401,"perc_fm_depth": 0.280000001,"perc_fm_harmonic": 2,"perc_fm_waveform": 14,"perc_harmonic": 2,"perc_level": 1,"perc_stereo": 0,"perc_trigger": 3,"perc_vel2amp": 1,"perc_vel2fm": 0.579999983,"perc_waveform": 14,"phase1": 237.600006,"phase2": 97.5999985,"phase3": 284.399994,"phase4": 90,"phase5": 0,"phase6": 0,"phase7": 0,"phase8": 0,"phase9": 0,"routing1": 1,"routing2": 1,"routing3": 2,"routing4": 2,"routing5": 0,"routing6": 0,"routing7": 0,"routing8": 0,"routing9": 0,"transpose": -12,"vib_amt": 1,"vib_mode": 4,"vib_phase": 180,"vib_rate": 0.913827002,"vib_wet": 0.400000006,"w1": 3,"w2": 3,"w3": 16,"w4": 24,"w5": 0,"w6": 0,"w7": 0,"w8": 0,"w9": 0},"state": [false,{}]},{"instanceId": 28,"label": "Rusty keys","controlValues": {"adsr2_a": 11.8921003,"adsr2_d": 140.587006,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 278.635986,"adsr_r": 50,"adsr_s": 0.200000003,"adsr_v": 0.389999986,"detune1": -5,"detune2": 5,"detune3": 2.5,"detune4": 3.5,"detune5": -8,"detune6": 8,"detune7": -3.5,"detune8": -6.5,"detune9": 7.5,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 20,"f1_env1": 3240,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0.920000017,"f1_res": 0.699999988,"f2": 2,"f2_cutoff": 20,"f2_env1": 0,"f2_env2": 3680,"f2_env3": 0,"f2_keyf": 1.01999998,"f2_res": 2.95331001,"f3": 4,"f4": 4,"f5": 4,"f6": 4,"f7": 2,"f8": 2,"f9": 8,"filter_chain": 0,"foldnote": 96,"l1": 4.40447998,"l2": 4.36781979,"l3": 8,"l4": 8,"l5": 8,"l6": 8,"l7": 8,"l8": 8,"l9": 8,"master": 0.100000001,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": -0.439999998,"pan6": 0.660000026,"pan7": -1,"pan8": 1,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_trigger": 0,"phase1": 104.400002,"phase2": 86,"phase3": 183,"phase4": 236,"phase5": 97,"phase6": 246,"phase7": 0,"phase8": 128,"phase9": 0,"routing1": 0,"routing2": 0,"routing3": 1,"routing4": 1,"routing5": 1,"routing6": 1,"routing7": 2,"routing8": 2,"routing9": 2,"vib_amt": 0.5,"vib_mode": 4,"vib_phase": 180,"vib_rate": 0.123841003,"vib_wet": 0.5,"w1": 15,"w2": 15,"w3": 22,"w4": 22,"w5": 22,"w6": 22,"w7": 18,"w8": 18,"w9": 14},"state": [false,{}]},{"instanceId": 29,"label": "12 Sqr","controlValues": {"adsr2_a": 1,"adsr2_d": 140.587006,"adsr2_r": 50,"adsr2_s": 0.119999997,"adsr2_v": 0.439999998,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 1483.42004,"adsr_r": 50,"adsr_s": 0.379999995,"adsr_v": 0.49000001,"detune1": -5,"detune2": 5,"detune3": 2.5,"detune4": 3.5,"detune5": -8,"detune6": 8,"detune7": -3.5,"detune8": -6.5,"detune9": 7.5,"eg1_amp_ctl": 4,"eg2_amp_ctl": 0,"eg3_amp_ctl": 0,"f1": 2,"f1_cutoff": 97.9555969,"f1_env1": 9072,"f1_env2": 0,"f1_env3": 0,"f1_keyf": 0.660000026,"f1_res": 0.699999988,"f2": 2,"f2_cutoff": 209.425995,"f2_env1": 0,"f2_env2": 6912,"f2_env3": 0,"f2_keyf": 0.540000021,"f2_res": 0.699999988,"f3": 2,"f4": 2,"f5": 2,"f6": 2,"f7": 2,"f8": 2,"f9": 2,"filter_chain": 0,"foldnote": 127,"l1": 8,"l2": 8,"l3": 8,"l4": 8,"l5": 8,"l6": 8,"l7": 8,"l8": 8,"l9": 8,"master": 0.100000001,"pan1": -1,"pan2": 1,"pan3": -1,"pan4": 1,"pan5": -0.439999998,"pan6": 0.660000026,"pan7": -1,"pan8": 1,"pan9": 0,"perc_decay": 200,"perc_level": 0,"perc_trigger": 0,"phase1": 259.200012,"phase2": 86,"phase3": 183,"phase4": 236,"phase5": 97,"phase6": 246,"phase7": 0,"phase8": 128,"phase9": 270,"routing1": 1,"routing2": 1,"routing3": 1,"routing4": 1,"routing5": 1,"routing6": 1,"routing7": 2,"routing8": 2,"routing9": 2,"vib_amt": 1,"vib_mode": 4,"vib_phase": 180,"vib_rate": 0.278062999,"vib_wet": 0.409999996,"w1": 11,"w2": 11,"w3": 12,"w4": 12,"w5": 12,"w6": 12,"w7": 11,"w8": 11,"w9": 24},"state": [false,{}]}],"nextInstanceId": 30} \ No newline at end of file diff --git a/default_presets/plugin_presets/24.json b/default_presets/plugin_presets/24.json new file mode 100644 index 0000000..dc33991 --- /dev/null +++ b/default_presets/plugin_presets/24.json @@ -0,0 +1 @@ +{"pluginUri": "http://calf.sourceforge.net/plugins/Reverb","presets": [{"instanceId": 1,"label": "Ambience","controlValues": {"amount": 0.291182995,"bass_cut": 514.078979,"decay_time": 1.10353994,"diffusion": 0.689999998,"dry": 1,"hf_damp": 2182.58008,"predelay": 6.5,"room_size": 4,"treble_cut": 4064.1499},"state": [false,{}]},{"instanceId": 2,"label": "Large Occupied Hall","controlValues": {"amount": 0.184284002,"decay_time": 1.45396996,"hf_damp": 9795.58008},"state": [false,{}]},{"instanceId": 3,"label": "Room","controlValues": {"amount": 0.469761014,"bass_cut": 257.649994,"decay_time": 0.445944995,"diffusion": 0.540000021,"dry": 1,"hf_damp": 5508.45996,"predelay": 25,"room_size": 4,"treble_cut": 20000},"state": [false,{}]},{"instanceId": 4,"label": "Large Empty Hall","controlValues": {"amount": 0.366021991,"decay_time": 2.00689006,"hf_damp": 20000},"state": [false,{}]},{"instanceId": 5,"label": "DiscoVerb","controlValues": {"amount": 0.269807011,"decay_time": 1,"hf_damp": 3396.48999},"state": [false,{}]},{"instanceId": 6,"label": "Empty walls","controlValues": {"amount": 0.198883995,"bass_cut": 240.453003,"decay_time": 0.505686998,"diffusion": 0.170000002,"dry": 1,"hf_damp": 3971.63989,"predelay": 13,"room_size": 4,"treble_cut": 3303.46997},"state": [false,{}]}],"nextInstanceId": 7} \ No newline at end of file diff --git a/default_presets/plugin_presets/25.json b/default_presets/plugin_presets/25.json new file mode 100644 index 0000000..2a81d26 --- /dev/null +++ b/default_presets/plugin_presets/25.json @@ -0,0 +1 @@ +{"pluginUri": "http://calf.sourceforge.net/plugins/Wavetable","presets": [{"instanceId": 1,"label": "Jazz Guitar","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 1,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 1863.34998,"adsr_r": 50,"adsr_s": 0.0299999993,"adsr_v": 0.5,"o1detune": 1,"o1level": 0.133972004,"o1offset": 0.0399999991,"o1trans": 0,"o1wave": 20,"o2detune": -1,"o2level": 0,"o2offset": 0.140000001,"o2trans": 0,"o2wave": 16},"state": [false,{}]},{"instanceId": 2,"label": "Reed","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 1,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 78.0643997,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 1,"o1detune": 6,"o1level": 0.100000001,"o1offset": -0.280000001,"o1trans": 0,"o1wave": 23,"o2detune": -6,"o2level": 0.0669858009,"o2offset": 0.400000006,"o2trans": 0,"o2wave": 24},"state": [false,{}]},{"instanceId": 3,"label": "AmbiDeXtrous","controlValues": {"adsr2_a": 1,"adsr2_d": 60.9300003,"adsr2_r": 50,"adsr2_s": 0,"adsr2_v": 1,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 1274.21997,"adsr_r": 50,"adsr_s": 0.389999986,"adsr_v": 1,"o1detune": 6,"o1level": 0.03125,"o1offset": -0.0199999996,"o1trans": 0,"o1wave": 13,"o2detune": -6,"o2level": 0.0412346013,"o2offset": 0.0199999996,"o2trans": 0,"o2wave": 15},"state": [false,{}]},{"instanceId": 4,"label": "Double Reed","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 1,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 78.0643997,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 1,"o1detune": 6,"o1level": 0.100000001,"o1offset": 0.0199999996,"o1trans": 0,"o1wave": 24,"o2detune": -6,"o2level": 0.0669858009,"o2offset": 0.239999995,"o2trans": -12,"o2wave": 23},"state": [false,{}]},{"instanceId": 5,"label": "Sharp Sync","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 0,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 1,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 0,"o1detune": 6,"o1level": 0.03125,"o1offset": -0.0599999987,"o1trans": 0,"o1wave": 0,"o2detune": -5,"o2level": 0.0441941991,"o2offset": -0.519999981,"o2trans": 0,"o2wave": 11},"state": [false,{}]},{"instanceId": 6,"label": "Swish","controlValues": {"adsr2_a": 1,"adsr2_d": 350,"adsr2_r": 50,"adsr2_s": 0.5,"adsr2_v": 1,"adsr3_a": 1,"adsr3_d": 350,"adsr3_r": 50,"adsr3_s": 0.5,"adsr3_v": 0,"adsr_a": 47.5774994,"adsr_d": 350,"adsr_r": 50,"adsr_s": 0.5,"adsr_v": 1,"o1detune": 6,"o1level": 0.100000001,"o1offset": -0.319999993,"o1trans": 0,"o1wave": 1,"o2detune": -6,"o2level": 0,"o2offset": 0.400000006,"o2trans": 0,"o2wave": 0},"state": [false,{}]}],"nextInstanceId": 7} \ No newline at end of file diff --git a/default_presets/plugin_presets/26.json b/default_presets/plugin_presets/26.json new file mode 100644 index 0000000..e14aa08 --- /dev/null +++ b/default_presets/plugin_presets/26.json @@ -0,0 +1 @@ +{"pluginUri": "http://drobilla.net/plugins/mda/DX10","presets": [{"instanceId": 1,"label": "Sine Bass","controlValues": {"attack": 0,"coarse": 0.170000002,"decay": 0.600000024,"fine": 0.150999993,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.400000006,"mod_init": 0.0989999995,"mod_rel": 0.899999976,"mod_sus": 0,"mod_thru": 0.0130000003,"mod_vel": 0.5,"octave": 0.400000006,"release": 0.49000001,"vibrato": 0,"waveform": 0.118000001},"state": [false,{}]},{"instanceId": 2,"label": "Reed 1","controlValues": {"attack": 0.219999999,"coarse": 0.170000002,"decay": 0.99000001,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.310000002,"mod_init": 0.239999995,"mod_rel": 0.899999976,"mod_sus": 0.256999999,"mod_thru": 0.802999973,"mod_vel": 0.757000029,"octave": 0.5,"release": 0.25,"vibrato": 0,"waveform": 0.697000027},"state": [false,{}]},{"instanceId": 3,"label": "Square Bass","controlValues": {"attack": 0,"coarse": 0.319999993,"decay": 0.600000024,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.670000017,"mod_init": 0.349999994,"mod_rel": 0.150000006,"mod_sus": 0.100000001,"mod_thru": 0.730000019,"mod_vel": 0.5,"octave": 0.200000003,"release": 0.100000001,"vibrato": 0,"waveform": 0.303000003},"state": [false,{}]},{"instanceId": 4,"label": "Scratch","controlValues": {"attack": 0,"coarse": 0,"decay": 0.5,"fine": 0.239999995,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.629999995,"mod_init": 0.579999983,"mod_rel": 0,"mod_sus": 0,"mod_thru": 0.243000001,"mod_vel": 0.5,"octave": 0.600000024,"release": 0,"vibrato": 0,"waveform": 0.815999985},"state": [false,{}]},{"instanceId": 5,"label": "Steel Drum","controlValues": {"attack": 0,"coarse": 0.479999989,"decay": 0.300000012,"fine": 0.730000019,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.100000001,"mod_init": 0,"mod_rel": 0.730000019,"mod_sus": 0.303000003,"mod_thru": 0,"mod_vel": 1,"octave": 0.600000024,"release": 0.507000029,"vibrato": 0,"waveform": 0.578999996},"state": [false,{}]},{"instanceId": 6,"label": "Funk Clav","controlValues": {"attack": 0,"coarse": 0.360000014,"decay": 0.400000006,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.159999996,"mod_init": 0.875,"mod_rel": 0.800000012,"mod_sus": 0.592000008,"mod_thru": 0.867999971,"mod_vel": 0.5,"octave": 0.5,"release": 0.100000001,"vibrato": 0,"waveform": 0.303000003},"state": [false,{}]},{"instanceId": 7,"label": "E.Piano Pad","controlValues": {"attack": 0,"coarse": 0.230000004,"decay": 0.699999988,"fine": 0.184,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.474000007,"mod_init": 0.270000011,"mod_rel": 0.800000012,"mod_sus": 0.224000007,"mod_thru": 0.836000025,"mod_vel": 0.973999977,"octave": 0.5,"release": 0.400000006,"vibrato": 0.25,"waveform": 0.428000003},"state": [false,{}]},{"instanceId": 8,"label": "Violin","controlValues": {"attack": 0.697000027,"coarse": 0.230000004,"decay": 0.99000001,"fine": 0.137999997,"finetune": 0.5,"lfo_rate": 0.486999989,"mod_dec": 0.389999986,"mod_init": 0.75,"mod_rel": 0.800000012,"mod_sus": 0.513000011,"mod_thru": 0.757000029,"mod_vel": 0.316000015,"octave": 0.677999973,"release": 0.421000004,"vibrato": 0.467000008,"waveform": 0.742999971},"state": [false,{}]},{"instanceId": 9,"label": "Harpsichord","controlValues": {"attack": 0,"coarse": 0.280000001,"decay": 0.342000008,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.100000001,"mod_init": 0.879999995,"mod_rel": 0.74000001,"mod_sus": 0.407999992,"mod_thru": 0.651000023,"mod_vel": 0,"octave": 0.600000024,"release": 0,"vibrato": 0,"waveform": 0.842000008},"state": [false,{}]},{"instanceId": 10,"label": "Koto","controlValues": {"attack": 0,"coarse": 0.389999986,"decay": 0.239999995,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.100000001,"mod_init": 0.879999995,"mod_rel": 0.74000001,"mod_sus": 0.600000024,"mod_thru": 0.479999989,"mod_vel": 0.5,"octave": 0.5,"release": 0,"vibrato": 0,"waveform": 0.526000023},"state": [false,{}]},{"instanceId": 11,"label": "Bright E.Piano","controlValues": {"attack": 0,"coarse": 0.842000008,"decay": 0.649999976,"fine": 0.328999996,"finetune": 0.5,"lfo_rate": 0.414000005,"mod_dec": 0.800000012,"mod_init": 0.230000004,"mod_rel": 0.800000012,"mod_sus": 0.0500000007,"mod_thru": 0,"mod_vel": 0.899999976,"octave": 0.5,"release": 0.441000015,"vibrato": 0,"waveform": 0.446999997},"state": [false,{}]},{"instanceId": 12,"label": "Chiff Organ","controlValues": {"attack": 0.600000024,"coarse": 0.319999993,"decay": 0.99000001,"fine": 0.282999992,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.300000012,"mod_init": 0.569999993,"mod_rel": 0.239999995,"mod_sus": 0.0500000007,"mod_thru": 0.822000027,"mod_vel": 0.5,"octave": 0.5,"release": 0.400000006,"vibrato": 0.137999997,"waveform": 0.282999992},"state": [false,{}]},{"instanceId": 13,"label": "Chunky Bass","controlValues": {"attack": 0,"coarse": 0.280000001,"decay": 0.400000006,"fine": 0.125,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.25,"mod_init": 0.474000007,"mod_rel": 0.5,"mod_sus": 0.100000001,"mod_thru": 0.592000008,"mod_vel": 0.5,"octave": 0.400000006,"release": 0,"vibrato": 0,"waveform": 0.578999996},"state": [false,{}]},{"instanceId": 14,"label": "E.Bass","controlValues": {"attack": 0.230000004,"coarse": 0.395000011,"decay": 0.5,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.0920000002,"mod_init": 0.388000011,"mod_rel": 0.150000006,"mod_sus": 0.25,"mod_thru": 0.822000027,"mod_vel": 0.5,"octave": 0.200000003,"release": 0.100000001,"vibrato": 0.200000003,"waveform": 0.178000003},"state": [false,{}]},{"instanceId": 15,"label": "Upright Bass 2","controlValues": {"attack": 0.300000012,"coarse": 0.360000014,"decay": 0.5,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.0700000003,"mod_init": 0.460999995,"mod_rel": 0.699999988,"mod_sus": 0.0700000003,"mod_thru": 0.467000008,"mod_vel": 0.5,"octave": 0.400000006,"release": 0.400000006,"vibrato": 0,"waveform": 0.546000004},"state": [false,{}]},{"instanceId": 16,"label": "Jazz E.Piano","controlValues": {"attack": 0,"coarse": 0.671000004,"decay": 0.5,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.335999995,"mod_init": 0.441000015,"mod_rel": 0.800000012,"mod_sus": 0.243000001,"mod_thru": 0,"mod_vel": 0.5,"octave": 0.5,"release": 0.100000001,"vibrato": 0,"waveform": 0.178000003},"state": [false,{}]},{"instanceId": 17,"label": "Syn Tom","controlValues": {"attack": 0,"coarse": 0,"decay": 0.354999989,"fine": 0.104999997,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0,"mod_init": 0,"mod_rel": 0.5,"mod_sus": 0.200000003,"mod_thru": 0.296000004,"mod_vel": 0.5,"octave": 0.644999981,"release": 0.349999994,"vibrato": 0,"waveform": 1},"state": [false,{}]},{"instanceId": 18,"label": "Sitar","controlValues": {"attack": 0,"coarse": 0.230000004,"decay": 0.5,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.75,"mod_init": 0.150999993,"mod_rel": 0.769999981,"mod_sus": 0.493000001,"mod_thru": 0.632000029,"mod_vel": 0.5,"octave": 0.400000006,"release": 0.703999996,"vibrato": 0,"waveform": 0.421000004},"state": [false,{}]},{"instanceId": 19,"label": "Soft Chimes","controlValues": {"attack": 0.400000006,"coarse": 0.75999999,"decay": 0.600000024,"fine": 0,"finetune": 0.5,"lfo_rate": 0.493000001,"mod_dec": 0.25,"mod_init": 0.389999986,"mod_rel": 0.899999976,"mod_sus": 0.159999996,"mod_thru": 0.296000004,"mod_vel": 0.5,"octave": 0.5,"release": 0.649999976,"vibrato": 0.361999989,"waveform": 0.400999993},"state": [false,{}]},{"instanceId": 20,"label": "Log Drum","controlValues": {"attack": 0,"coarse": 0.319999993,"decay": 0.300000012,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.0790000036,"mod_init": 0.467000008,"mod_rel": 0.5,"mod_sus": 0.158000007,"mod_thru": 0.0199999996,"mod_vel": 0.5,"octave": 0.400000006,"release": 0.5,"vibrato": 0,"waveform": 0.150999993},"state": [false,{}]},{"instanceId": 21,"label": "Clunk Bass","controlValues": {"attack": 0,"coarse": 0.230000004,"decay": 0.600000024,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.319999993,"mod_init": 0.449999988,"mod_rel": 0.899999976,"mod_sus": 0.0500000007,"mod_thru": 0.104999997,"mod_vel": 0.5,"octave": 0.200000003,"release": 0.400000006,"vibrato": 0,"waveform": 0.519999981},"state": [false,{}]},{"instanceId": 22,"label": "Jazz Guitar","controlValues": {"attack": 0,"coarse": 0.389999986,"decay": 0.5,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.25,"mod_init": 0.49000001,"mod_rel": 0.800000012,"mod_sus": 0.25,"mod_thru": 0.144999996,"mod_vel": 0.5,"octave": 0.5,"release": 0.100000001,"vibrato": 0,"waveform": 0.263000011},"state": [false,{}]},{"instanceId": 23,"label": "Trumpet","controlValues": {"attack": 0,"coarse": 0.230000004,"decay": 0.99000001,"fine": 0,"finetune": 0.5,"lfo_rate": 0.400999993,"mod_dec": 0.200000003,"mod_init": 0,"mod_rel": 0.800000012,"mod_sus": 0.449999988,"mod_thru": 0,"mod_vel": 0,"octave": 0.600000024,"release": 0.100000001,"vibrato": 0.112000003,"waveform": 0.711000025},"state": [false,{}]},{"instanceId": 24,"label": "Upright Bass 1","controlValues": {"attack": 0.300000012,"coarse": 0.280000001,"decay": 0.5,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.540000021,"mod_init": 0.180000007,"mod_rel": 0.699999988,"mod_sus": 0,"mod_thru": 0.0329999998,"mod_vel": 0.5,"octave": 0.400000006,"release": 0.400000006,"vibrato": 0,"waveform": 0.296000004},"state": [false,{}]},{"instanceId": 25,"label": "Fuzzy E.Piano","controlValues": {"attack": 0,"coarse": 0.319999993,"decay": 0.699999988,"fine": 0.216999993,"finetune": 0.5,"lfo_rate": 0.526000023,"mod_dec": 0.670000017,"mod_init": 0.598999977,"mod_rel": 0.800000012,"mod_sus": 0.308999985,"mod_thru": 0.638000011,"mod_vel": 0.5,"octave": 0.507000029,"release": 0.400000006,"vibrato": 0.263000011,"waveform": 0.275999993},"state": [false,{}]},{"instanceId": 26,"label": "Harmonics","controlValues": {"attack": 0,"coarse": 0.280000001,"decay": 0.5,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.200000003,"mod_init": 0.330000013,"mod_rel": 0.699999988,"mod_sus": 0,"mod_thru": 0.0790000036,"mod_vel": 0.5,"octave": 0.5,"release": 0.5,"vibrato": 0,"waveform": 0.150999993},"state": [false,{}]},{"instanceId": 27,"label": "Tinkle","controlValues": {"attack": 0,"coarse": 0.368000001,"decay": 0.5,"fine": 0.651000023,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.550000012,"mod_init": 0.395000011,"mod_rel": 0.899999976,"mod_sus": 0.256999999,"mod_thru": 0.414000005,"mod_vel": 0.5,"octave": 0.800000012,"release": 0.649999976,"vibrato": 0.300000012,"waveform": 0},"state": [false,{}]},{"instanceId": 28,"label": "Space Pad","controlValues": {"attack": 0,"coarse": 0.230000004,"decay": 0.699999988,"fine": 0.196999997,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.720000029,"mod_init": 0.519999981,"mod_rel": 0.730000019,"mod_sus": 0.280000001,"mod_thru": 0.428000003,"mod_vel": 0.5,"octave": 0.5,"release": 0.519999981,"vibrato": 0.25,"waveform": 0.335999995},"state": [false,{}]},{"instanceId": 29,"label": "Harp","controlValues": {"attack": 0,"coarse": 0.159999996,"decay": 0.5,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.349000007,"mod_init": 0.158000007,"mod_rel": 0.280000001,"mod_sus": 0,"mod_thru": 0,"mod_vel": 0.899999976,"octave": 0.617999971,"release": 0.699999988,"vibrato": 0,"waveform": 0.400999993},"state": [false,{}]},{"instanceId": 30,"label": "Thick Bass","controlValues": {"attack": 0,"coarse": 0.170000002,"decay": 0.600000024,"fine": 0.144999996,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.349999994,"mod_init": 0.289999992,"mod_rel": 0.899999976,"mod_sus": 0.100000001,"mod_thru": 0.308999985,"mod_vel": 0.5,"octave": 0.400000006,"release": 0.400000006,"vibrato": 0,"waveform": 0.441000015},"state": [false,{}]},{"instanceId": 31,"label": "Horn","controlValues": {"attack": 0.280000001,"coarse": 0.230000004,"decay": 0.99000001,"fine": 0,"finetune": 0.5,"lfo_rate": 0.5,"mod_dec": 0.400000006,"mod_init": 0.180000007,"mod_rel": 0.800000012,"mod_sus": 0.300000012,"mod_thru": 0.479999989,"mod_vel": 0.5,"octave": 0.400000006,"release": 0.280000001,"vibrato": 0,"waveform": 0.216999993},"state": [false,{}]},{"instanceId": 32,"label": "Reed 2","controlValues": {"attack": 0.219999999,"coarse": 0.449999988,"decay": 0.99000001,"fine": 0.0700000003,"finetune": 0.5,"lfo_rate": 0.414000005,"mod_dec": 0.310000002,"mod_init": 0.239999995,"mod_rel": 0.899999976,"mod_sus": 0.360000014,"mod_thru": 0,"mod_vel": 0.5,"octave": 0.5,"release": 0.25,"vibrato": 0.210999995,"waveform": 0.184},"state": [false,{}]}],"nextInstanceId": 33} \ No newline at end of file diff --git a/default_presets/plugin_presets/27.json b/default_presets/plugin_presets/27.json new file mode 100644 index 0000000..752ed9c --- /dev/null +++ b/default_presets/plugin_presets/27.json @@ -0,0 +1 @@ +{"pluginUri": "http://drobilla.net/plugins/mda/Detune","presets": [{"instanceId": 1,"label": "Stereo Detune","controlValues": {"detune": 0.200000003,"latency": 0.5,"mix": 0.899999976,"output": 0.5},"state": [false,{}]},{"instanceId": 2,"label": "Symphonic","controlValues": {"detune": 0.200000003,"latency": 0.5,"mix": 0.899999976,"output": 0.5},"state": [false,{}]},{"instanceId": 3,"label": "Out Of Tune","controlValues": {"detune": 0.800000012,"latency": 0.5,"mix": 0.699999988,"output": 0.5},"state": [false,{}]}],"nextInstanceId": 4} \ No newline at end of file diff --git a/default_presets/plugin_presets/28.json b/default_presets/plugin_presets/28.json new file mode 100644 index 0000000..3ae43bd --- /dev/null +++ b/default_presets/plugin_presets/28.json @@ -0,0 +1 @@ +{"pluginUri": "http://drobilla.net/plugins/mda/JX10","presets": [{"instanceId": 1,"label": "Car Horn","controlValues": {"env_att": 0.300000012,"env_dec": 0.5,"env_rel": 0.310000002,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 1,"noise": 0,"octave": 0.5,"osc_fine": 0.310000002,"osc_mix": 0.569999993,"osc_tune": 0.49000001,"tuning": 0.5,"vcf_att": 0.460000008,"vcf_dec": 0.300000012,"vcf_env": 0.680000007,"vcf_freq": 0.460000008,"vcf_lfo": 0,"vcf_rel": 0.230000004,"vcf_reso": 0,"vcf_sus": 1,"vcf_vel": 0.5,"vibrato": 0.379999995},"state": [false,{}]},{"instanceId": 2,"label": "303 Saw Bass","controlValues": {"env_att": 0,"env_dec": 0.800000012,"env_rel": 0.239999995,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.49000001,"glide": 0.829999983,"lfo_rate": 0.25999999,"noise": 0,"octave": 0.0700000003,"osc_fine": 0.5,"osc_mix": 0,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.560000002,"vcf_env": 0.689999998,"vcf_freq": 0.550000012,"vcf_lfo": 0.349999994,"vcf_rel": 0.560000002,"vcf_reso": 0.75,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.49000001},"state": [false,{}]},{"instanceId": 3,"label": "Echo Pad [SA]","controlValues": {"env_att": 0.300000012,"env_dec": 0.800000012,"env_rel": 0.660000026,"env_sus": 0.680000007,"gld_bend": 0.5,"gld_rate": 0.49000001,"glide": 0,"lfo_rate": 0.790000021,"noise": 0.25,"octave": 0.449999988,"osc_fine": 0.5,"osc_mix": 0.879999995,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 1,"vcf_dec": 0.860000014,"vcf_env": 0.689999998,"vcf_freq": 0.460000008,"vcf_lfo": 0.100000001,"vcf_rel": 0.569999993,"vcf_reso": 0.75999999,"vcf_sus": 0.75999999,"vcf_vel": 0.689999998,"vibrato": 0.129999995},"state": [false,{}]},{"instanceId": 4,"label": "Analog Bass","controlValues": {"env_att": 0,"env_dec": 0.5,"env_rel": 0.460000008,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.189999998,"glide": 0.810000002,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.270000011,"osc_fine": 0.200000003,"osc_mix": 1,"osc_tune": 0.25,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.879999995,"vcf_env": 0.850000024,"vcf_freq": 0.300000012,"vcf_lfo": 0.0900000036,"vcf_rel": 0.209999993,"vcf_reso": 0.50999999,"vcf_sus": 0,"vcf_vel": 0,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 5,"label": "Bubble","controlValues": {"env_att": 0,"env_dec": 0.379999995,"env_rel": 0.159999996,"env_sus": 0.649999976,"gld_bend": 0.479999989,"gld_rate": 0.709999979,"glide": 0,"lfo_rate": 0.479999989,"noise": 0,"octave": 0.670000017,"osc_fine": 0.430000007,"osc_mix": 0,"osc_tune": 0.25,"tuning": 0.5,"vcf_att": 0.400000006,"vcf_dec": 0.180000007,"vcf_env": 0.800000012,"vcf_freq": 0.230000004,"vcf_lfo": 0.319999993,"vcf_rel": 0.140000001,"vcf_reso": 0.769999981,"vcf_sus": 0.660000026,"vcf_vel": 0.629999995,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 6,"label": "Arctic Wind","controlValues": {"env_att": 0.889999986,"env_dec": 0.5,"env_rel": 0.889999986,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.239999995,"noise": 1,"octave": 1,"osc_fine": 0.5,"osc_mix": 0,"osc_tune": 0.25,"tuning": 0.5,"vcf_att": 0.370000005,"vcf_dec": 0.300000012,"vcf_env": 0.5,"vcf_freq": 0.159999996,"vcf_lfo": 0.280000001,"vcf_rel": 0.25,"vcf_reso": 0.850000024,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 7,"label": "Fretless Bass","controlValues": {"env_att": 0.200000003,"env_dec": 0.850000024,"env_rel": 0.300000012,"env_sus": 0,"gld_bend": 0.5,"gld_rate": 0.340000004,"glide": 0.800000012,"lfo_rate": 0.810000002,"noise": 0,"octave": 0,"osc_fine": 0.170000002,"osc_mix": 0.5,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.0900000036,"vcf_env": 0.579999983,"vcf_freq": 0.50999999,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 0,"vcf_sus": 0,"vcf_vel": 0.670000017,"vibrato": 0.699999988},"state": [false,{}]},{"instanceId": 8,"label": "5th Sweep Pad","controlValues": {"env_att": 0,"env_dec": 0.5,"env_rel": 0.709999979,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.319999993,"glide": 0.300000012,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.5,"osc_fine": 0.25,"osc_mix": 1,"osc_tune": 0.370000005,"tuning": 0.5,"vcf_att": 0.899999976,"vcf_dec": 0.889999986,"vcf_env": 0.119999997,"vcf_freq": 0.899999976,"vcf_lfo": 0,"vcf_rel": 0.730000019,"vcf_reso": 0.600000024,"vcf_sus": 0.899999976,"vcf_vel": 0.5,"vibrato": 0.649999976},"state": [false,{}]},{"instanceId": 9,"label": "808 State Lead","controlValues": {"env_att": 0.170000002,"env_dec": 0.5,"env_rel": 0.0299999993,"env_sus": 1,"gld_bend": 0.850000024,"gld_rate": 0.340000004,"glide": 0.400000006,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.680000007,"osc_fine": 0.239999995,"osc_mix": 1,"osc_tune": 0.649999976,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.300000012,"vcf_env": 0.75,"vcf_freq": 0.649999976,"vcf_lfo": 0.159999996,"vcf_rel": 0.25,"vcf_reso": 0.629999995,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 10,"label": "Detuned Syn Brass [ZF]","controlValues": {"env_att": 0,"env_dec": 0.75,"env_rel": 0.319999993,"env_sus": 0.540000021,"gld_bend": 0.620000005,"gld_rate": 0.310000002,"glide": 0,"lfo_rate": 0.75999999,"noise": 0.289999992,"octave": 0.560000002,"osc_fine": 0.930000007,"osc_mix": 0.680000007,"osc_tune": 0.5,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.829999983,"vcf_env": 0.850000024,"vcf_freq": 0.25999999,"vcf_lfo": 0,"vcf_rel": 0.0500000007,"vcf_reso": 0.0700000003,"vcf_sus": 0,"vcf_vel": 0.660000026,"vibrato": 0.370000005},"state": [false,{}]},{"instanceId": 11,"label": "Detuned Techno Lead","controlValues": {"env_att": 0.200000003,"env_dec": 0.850000024,"env_rel": 0.300000012,"env_sus": 1,"gld_bend": 0.419999987,"gld_rate": 0.409999996,"glide": 0.449999988,"lfo_rate": 0.829999983,"noise": 0.400000006,"octave": 0.49000001,"osc_fine": 0.150000006,"osc_mix": 0.839999974,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.0900000036,"vcf_env": 0.579999983,"vcf_freq": 0.540000021,"vcf_lfo": 0.209999993,"vcf_rel": 0.25,"vcf_reso": 0.00999999978,"vcf_sus": 1,"vcf_vel": 0.670000017,"vibrato": 0.0900000036},"state": [false,{}]},{"instanceId": 12,"label": "Click Organ","controlValues": {"env_att": 0,"env_dec": 0.75,"env_rel": 0,"env_sus": 0.800000012,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.439999998,"osc_fine": 0.519999981,"osc_mix": 0.5,"osc_tune": 0.769999981,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0,"vcf_env": 0.649999976,"vcf_freq": 0.439999998,"vcf_lfo": 0.159999996,"vcf_rel": 0,"vcf_reso": 0.5,"vcf_sus": 0.180000007,"vcf_vel": 0,"vibrato": 0.49000001},"state": [false,{}]},{"instanceId": 13,"label": "Very Soft Pad","controlValues": {"env_att": 0.349999994,"env_dec": 0.5,"env_rel": 0.699999988,"env_sus": 0.800000012,"gld_bend": 0.5,"gld_rate": 0.119999997,"glide": 0.379999995,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.5,"osc_fine": 0.270000011,"osc_mix": 0.389999986,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.300000012,"vcf_env": 0.5,"vcf_freq": 0.349999994,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 0.779999971,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 14,"label": "Water Velocity [SA]","controlValues": {"env_att": 0.0399999991,"env_dec": 0.75999999,"env_rel": 0.460000008,"env_sus": 0.109999999,"gld_bend": 0.5,"gld_rate": 0.49000001,"glide": 0,"lfo_rate": 0.879999995,"noise": 0,"octave": 0.379999995,"osc_fine": 0.349999994,"osc_mix": 0.75999999,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0.949999988,"vcf_dec": 0.560000002,"vcf_env": 1,"vcf_freq": 0.870000005,"vcf_lfo": 0.319999993,"vcf_rel": 1,"vcf_reso": 0.670000017,"vcf_sus": 0.720000029,"vcf_vel": 0.0900000036,"vibrato": 0.720000029},"state": [false,{}]},{"instanceId": 15,"label": "Whistler","controlValues": {"env_att": 0.680000007,"env_dec": 0.389999986,"env_rel": 0.360000014,"env_sus": 0.579999983,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.810000002,"noise": 0.379999995,"octave": 0.920000017,"osc_fine": 0.379999995,"osc_mix": 0.230000004,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.289999992,"vcf_env": 0.5,"vcf_freq": 0.330000013,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 1,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.639999986},"state": [false,{}]},{"instanceId": 16,"label": "Wobble Bass [SA]","controlValues": {"env_att": 0.0900000036,"env_dec": 0.5,"env_rel": 0.0700000003,"env_sus": 1,"gld_bend": 0.589999974,"gld_rate": 0.819999993,"glide": 0.639999986,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.239999995,"osc_fine": 0.219999999,"osc_mix": 1,"osc_tune": 0.25999999,"tuning": 0.5,"vcf_att": 0.200000003,"vcf_dec": 0.689999998,"vcf_env": 0.340000004,"vcf_freq": 0.720000029,"vcf_lfo": 0.340000004,"vcf_rel": 0.150000006,"vcf_reso": 0.469999999,"vcf_sus": 1,"vcf_vel": 0.819999993,"vibrato": 0.460000008},"state": [false,{}]},{"instanceId": 17,"label": "Helicopter","controlValues": {"env_att": 0.959999979,"env_dec": 0.5,"env_rel": 0.920000017,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.970000029,"noise": 1,"octave": 0,"osc_fine": 0.5,"osc_mix": 0,"osc_tune": 0.25,"tuning": 0.5,"vcf_att": 1,"vcf_dec": 1,"vcf_env": 0.689999998,"vcf_freq": 0.0799999982,"vcf_lfo": 1,"vcf_rel": 1,"vcf_reso": 0.360000014,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 18,"label": "Higher Synth [ZF]","controlValues": {"env_att": 0,"env_dec": 0.419999987,"env_rel": 0.219999999,"env_sus": 0,"gld_bend": 0.5,"gld_rate": 0,"glide": 0,"lfo_rate": 0.209999993,"noise": 0.159999996,"octave": 0.980000019,"osc_fine": 0.219999999,"osc_mix": 0.479999989,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.100000001,"vcf_env": 0.730000019,"vcf_freq": 0.5,"vcf_lfo": 0.300000012,"vcf_rel": 0.0700000003,"vcf_reso": 0.469999999,"vcf_sus": 0,"vcf_vel": 0.800000012,"vibrato": 0.589999974},"state": [false,{}]},{"instanceId": 19,"label": "Leslie Organ","controlValues": {"env_att": 0,"env_dec": 0.170000002,"env_rel": 0.280000001,"env_sus": 0.730000019,"gld_bend": 0.389999986,"gld_rate": 0.129999995,"glide": 0,"lfo_rate": 0.870000005,"noise": 0,"octave": 0.289999992,"osc_fine": 0.529999971,"osc_mix": 0,"osc_tune": 0.5,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.550000012,"vcf_env": 0.540000021,"vcf_freq": 0.379999995,"vcf_lfo": 0.200000003,"vcf_rel": 0.310000002,"vcf_reso": 0.74000001,"vcf_sus": 0.519999981,"vcf_vel": 0,"vibrato": 0.239999995},"state": [false,{}]},{"instanceId": 20,"label": "Low Pulses","controlValues": {"env_att": 0,"env_dec": 0.5,"env_rel": 0.300000012,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.810000002,"noise": 0,"octave": 0,"osc_fine": 0.300000012,"osc_mix": 0.970000029,"osc_tune": 0.25999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.769999981,"vcf_env": 0.519999981,"vcf_freq": 0.800000012,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 0.400000006,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.159999996},"state": [false,{}]},{"instanceId": 21,"label": "Mono Glide","controlValues": {"env_att": 0.370000005,"env_dec": 0.5,"env_rel": 0.379999995,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.460000008,"glide": 1,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.5,"osc_fine": 0.5,"osc_mix": 0,"osc_tune": 0.25,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.300000012,"vcf_env": 0.5,"vcf_freq": 0.50999999,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 0,"vcf_sus": 0,"vcf_vel": 0,"vibrato": 0.620000005},"state": [false,{}]},{"instanceId": 22,"label": "Monosynth","controlValues": {"env_att": 0.129999995,"env_dec": 0.300000012,"env_rel": 0.209999993,"env_sus": 0.75999999,"gld_bend": 0.540000021,"gld_rate": 0.349999994,"glide": 0.790000021,"lfo_rate": 0.579999983,"noise": 0,"octave": 0.360000014,"osc_fine": 0.50999999,"osc_mix": 0.620000005,"osc_tune": 0.25999999,"tuning": 0.5,"vcf_att": 0.0700000003,"vcf_dec": 0.519999981,"vcf_env": 0.50999999,"vcf_freq": 0.639999986,"vcf_lfo": 0.649999976,"vcf_rel": 0.839999974,"vcf_reso": 0.389999986,"vcf_sus": 0.239999995,"vcf_vel": 0,"vibrato": 0.300000012},"state": [false,{}]},{"instanceId": 23,"label": "Moogcury Lite","controlValues": {"env_att": 0,"env_dec": 0.5,"env_rel": 0.330000013,"env_sus": 0.200000003,"gld_bend": 0.349999994,"gld_rate": 0.150000006,"glide": 0.779999971,"lfo_rate": 0.379999995,"noise": 0,"octave": 0.119999997,"osc_fine": 0.209999993,"osc_mix": 0.810000002,"osc_tune": 1,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.469999999,"vcf_env": 0.689999998,"vcf_freq": 0.389999986,"vcf_lfo": 0.400000006,"vcf_rel": 0.370000005,"vcf_reso": 0.170000002,"vcf_sus": 0.189999998,"vcf_vel": 0.620000005,"vibrato": 0.529999971},"state": [false,{}]},{"instanceId": 24,"label": "Analog Bass 2","controlValues": {"env_att": 0,"env_dec": 0.610000014,"env_rel": 0.319999993,"env_sus": 1,"gld_bend": 0.860000014,"gld_rate": 0.189999998,"glide": 0.720000029,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.270000011,"osc_fine": 0.200000003,"osc_mix": 1,"osc_tune": 0.25,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0,"vcf_env": 0.939999998,"vcf_freq": 0.479999989,"vcf_lfo": 0,"vcf_rel": 0,"vcf_reso": 0.430000007,"vcf_sus": 0,"vcf_vel": 0.800000012,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 25,"label": "Brass Section","controlValues": {"env_att": 0.170000002,"env_dec": 0.5,"env_rel": 0.449999988,"env_sus": 0.800000012,"gld_bend": 0.360000014,"gld_rate": 0.280000001,"glide": 0,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.579999983,"osc_fine": 0.230000004,"osc_mix": 0.430000007,"osc_tune": 0.75999999,"tuning": 0.5,"vcf_att": 0.239999995,"vcf_dec": 0.159999996,"vcf_env": 0.589999974,"vcf_freq": 0.5,"vcf_lfo": 0,"vcf_rel": 0.0799999982,"vcf_reso": 0,"vcf_sus": 0.910000026,"vcf_vel": 0.5,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 26,"label": "Bass Clarinet","controlValues": {"env_att": 0.349999994,"env_dec": 0.649999976,"env_rel": 0.319999993,"env_sus": 0.649999976,"gld_bend": 0.5,"gld_rate": 0,"glide": 0.370000005,"lfo_rate": 0.790000021,"noise": 0.200000003,"octave": 0.349999994,"osc_fine": 0.50999999,"osc_mix": 1,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0,"vcf_env": 0.5,"vcf_freq": 0.50999999,"vcf_lfo": 0.109999999,"vcf_rel": 0.25,"vcf_reso": 0.100000001,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.49000001},"state": [false,{}]},{"instanceId": 27,"label": "303 Square Bass","controlValues": {"env_att": 0,"env_dec": 0.800000012,"env_rel": 0.239999995,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.49000001,"glide": 0.829999983,"lfo_rate": 0.25999999,"noise": 0,"octave": 0.0700000003,"osc_fine": 0.5,"osc_mix": 0.75,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0.140000001,"vcf_dec": 0.49000001,"vcf_env": 0.689999998,"vcf_freq": 0.550000012,"vcf_lfo": 0.349999994,"vcf_rel": 0.389999986,"vcf_reso": 0.75,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.49000001},"state": [false,{}]},{"instanceId": 28,"label": "Gangsta Whine","controlValues": {"env_att": 0.150000006,"env_dec": 0.5,"env_rel": 0.319999993,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.439999998,"glide": 0.959999979,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.829999983,"osc_fine": 0.519999981,"osc_mix": 0,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0,"vcf_env": 0.5,"vcf_freq": 0.409999996,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 0.460000008,"vcf_sus": 1,"vcf_vel": 0,"vibrato": 0.49000001},"state": [false,{}]},{"instanceId": 29,"label": "Ghost [SA]","controlValues": {"env_att": 0.370000005,"env_dec": 0.5,"env_rel": 0.540000021,"env_sus": 1,"gld_bend": 0.479999989,"gld_rate": 0.159999996,"glide": 0.449999988,"lfo_rate": 0.850000024,"noise": 0.430000007,"octave": 0.460000008,"osc_fine": 0.239999995,"osc_mix": 0.75,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.300000012,"vcf_env": 0.75,"vcf_freq": 0.379999995,"vcf_lfo": 0.159999996,"vcf_rel": 0.310000002,"vcf_reso": 0.579999983,"vcf_sus": 0.400000006,"vcf_vel": 0.810000002,"vibrato": 0.829999983},"state": [false,{}]},{"instanceId": 30,"label": "Pizzicato","controlValues": {"env_att": 0,"env_dec": 0.469999999,"env_rel": 0.300000012,"env_sus": 0,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.810000002,"noise": 0.800000012,"octave": 0.5,"osc_fine": 0.5,"osc_mix": 0,"osc_tune": 0.25,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.219999999,"vcf_env": 0.75,"vcf_freq": 0.230000004,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 0.200000003,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 31,"label": "Power PWM","controlValues": {"env_att": 0,"env_dec": 0.5,"env_rel": 0.479999989,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.709999979,"noise": 0,"octave": 0.349999994,"osc_fine": 0.219999999,"osc_mix": 1,"osc_tune": 0.270000011,"tuning": 0.5,"vcf_att": 0.239999995,"vcf_dec": 0.300000012,"vcf_env": 0.75,"vcf_freq": 0.819999993,"vcf_lfo": 0,"vcf_rel": 0.340000004,"vcf_reso": 0.129999995,"vcf_sus": 0.879999995,"vcf_vel": 0,"vibrato": 0.370000005},"state": [false,{}]},{"instanceId": 32,"label": "Rubber Backing [ZF]","controlValues": {"env_att": 0,"env_dec": 0.560000002,"env_rel": 0.319999993,"env_sus": 0,"gld_bend": 0.75999999,"gld_rate": 0.180000007,"glide": 0,"lfo_rate": 0.200000003,"noise": 0.219999999,"octave": 0.529999971,"osc_fine": 0.25999999,"osc_mix": 0.289999992,"osc_tune": 0.75999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.419999987,"vcf_env": 0.769999981,"vcf_freq": 0.349999994,"vcf_lfo": 0.140000001,"vcf_rel": 0.209999993,"vcf_reso": 0.150000006,"vcf_sus": 0.129999995,"vcf_vel": 0.540000021,"vibrato": 0.579999983},"state": [false,{}]},{"instanceId": 33,"label": "Rubber Bass [ZF]","controlValues": {"env_att": 0,"env_dec": 0.600000024,"env_rel": 0.219999999,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0.810000002,"lfo_rate": 0.189999998,"noise": 0,"octave": 0.170000002,"osc_fine": 0.660000026,"osc_mix": 0.49000001,"osc_tune": 0.25,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.379999995,"vcf_env": 0.75,"vcf_freq": 0.360000014,"vcf_lfo": 0.200000003,"vcf_rel": 0.25,"vcf_reso": 0.150000006,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 34,"label": "Sine Infra-Bass","controlValues": {"env_att": 0,"env_dec": 0.550000012,"env_rel": 0.300000012,"env_sus": 0.25,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0.649999976,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.140000001,"osc_fine": 0.5,"osc_mix": 0,"osc_tune": 0.25,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.300000012,"vcf_env": 0.529999971,"vcf_freq": 0.330000013,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 0.75999999,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.519999981},"state": [false,{}]},{"instanceId": 35,"label": "Soft E.Piano","controlValues": {"env_att": 0,"env_dec": 0.800000012,"env_rel": 0.439999998,"env_sus": 0,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.5,"osc_fine": 0.430000007,"osc_mix": 0.310000002,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.219999999,"vcf_env": 0.529999971,"vcf_freq": 0.340000004,"vcf_lfo": 0,"vcf_rel": 0.389999986,"vcf_reso": 0.25999999,"vcf_sus": 0,"vcf_vel": 0.629999995,"vibrato": 0.50999999},"state": [false,{}]},{"instanceId": 36,"label": "Soft Horn","controlValues": {"env_att": 0.0799999982,"env_dec": 0.5,"env_rel": 0.270000011,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.829999983,"noise": 0.100000001,"octave": 0.25,"osc_fine": 0.670000017,"osc_mix": 0.119999997,"osc_tune": 0.899999976,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.349999994,"vcf_env": 0.289999992,"vcf_freq": 0.5,"vcf_lfo": 0.119999997,"vcf_rel": 0.25,"vcf_reso": 0.209999993,"vcf_sus": 0.360000014,"vcf_vel": 0.600000024,"vibrato": 0.50999999},"state": [false,{}]},{"instanceId": 37,"label": "Soft Pick Bass","controlValues": {"env_att": 0.0399999991,"env_dec": 0.579999983,"env_rel": 0.219999999,"env_sus": 0,"gld_bend": 0.5,"gld_rate": 0.219999999,"glide": 0.709999979,"lfo_rate": 0.150000006,"noise": 0.330000013,"octave": 0.150000006,"osc_fine": 0.769999981,"osc_mix": 0.370000005,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0,"vcf_env": 0.709999979,"vcf_freq": 0.330000013,"vcf_lfo": 0.159999996,"vcf_rel": 0.25,"vcf_reso": 0.469999999,"vcf_sus": 0,"vcf_vel": 0.589999974,"vibrato": 0.439999998},"state": [false,{}]},{"instanceId": 38,"label": "Solid Backing","controlValues": {"env_att": 0,"env_dec": 0.5,"env_rel": 0.300000012,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.810000002,"noise": 0.5,"octave": 0.5,"osc_fine": 0.140000001,"osc_mix": 1,"osc_tune": 0.25999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.349999994,"vcf_env": 0.699999988,"vcf_freq": 0.300000012,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 0.25,"vcf_sus": 0,"vcf_vel": 0.629999995,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 39,"label": "Space Chimes [SA]","controlValues": {"env_att": 0.119999997,"env_dec": 0.219999999,"env_rel": 0.660000026,"env_sus": 0.550000012,"gld_bend": 0.5,"gld_rate": 0.49000001,"glide": 0.159999996,"lfo_rate": 0.889999986,"noise": 0,"octave": 1,"osc_fine": 0.5,"osc_mix": 0.879999995,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0.850000024,"vcf_dec": 0.689999998,"vcf_env": 0.660000026,"vcf_freq": 0.49000001,"vcf_lfo": 0.0799999982,"vcf_rel": 0.469999999,"vcf_reso": 0.819999993,"vcf_sus": 0.75999999,"vcf_vel": 0.889999986,"vibrato": 0.340000004},"state": [false,{}]},{"instanceId": 40,"label": "Hard Lead [SA]","controlValues": {"env_att": 0.0700000003,"env_dec": 0.910000026,"env_rel": 0.150000006,"env_sus": 1,"gld_bend": 1,"gld_rate": 0.239999995,"glide": 0.180000007,"lfo_rate": 0.839999974,"noise": 0,"octave": 0.49000001,"osc_fine": 0.529999971,"osc_mix": 0.709999979,"osc_tune": 0.75,"tuning": 0.5,"vcf_att": 1,"vcf_dec": 0.140000001,"vcf_env": 0.689999998,"vcf_freq": 0.560000002,"vcf_lfo": 0.189999998,"vcf_rel": 0.949999988,"vcf_reso": 0.519999981,"vcf_sus": 0.649999976,"vcf_vel": 0.699999988,"vibrato": 0.330000013},"state": [false,{}]},{"instanceId": 41,"label": "Hard Organ","controlValues": {"env_att": 0.0399999991,"env_dec": 0.0799999982,"env_rel": 0.0399999991,"env_sus": 0.720000029,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.769999981,"noise": 0,"octave": 0.579999983,"osc_fine": 0.370000005,"osc_mix": 0.889999986,"osc_tune": 0.910000026,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.370000005,"vcf_env": 0.540000021,"vcf_freq": 0.50999999,"vcf_lfo": 0,"vcf_rel": 1,"vcf_reso": 0.620000005,"vcf_sus": 0,"vcf_vel": 0,"vibrato": 0.49000001},"state": [false,{}]},{"instanceId": 42,"label": "Squelch Bass","controlValues": {"env_att": 0,"env_dec": 0.5,"env_rel": 0.0700000003,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0.709999979,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.239999995,"osc_fine": 0.219999999,"osc_mix": 1,"osc_tune": 0.25999999,"tuning": 0.5,"vcf_att": 0.479999989,"vcf_dec": 0.689999998,"vcf_env": 0.25999999,"vcf_freq": 0.670000017,"vcf_lfo": 0,"vcf_rel": 0.150000006,"vcf_reso": 0.699999988,"vcf_sus": 1,"vcf_vel": 0.5,"vibrato": 0.460000008},"state": [false,{}]},{"instanceId": 43,"label": "Squelchy Frog","controlValues": {"env_att": 0,"env_dec": 0.699999988,"env_rel": 0.180000007,"env_sus": 0.649999976,"gld_bend": 0,"gld_rate": 0.769999981,"glide": 0.449999988,"lfo_rate": 0.319999993,"noise": 0,"octave": 0.0599999987,"osc_fine": 0.230000004,"osc_mix": 0.5,"osc_tune": 0.409999996,"tuning": 0.5,"vcf_att": 0.330000013,"vcf_dec": 0.5,"vcf_env": 0.949999988,"vcf_freq": 0.400000006,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 0.649999976,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 1},"state": [false,{}]},{"instanceId": 44,"label": "Steel Drums [ZF]","controlValues": {"env_att": 0.119999997,"env_dec": 0.479999989,"env_rel": 0.49000001,"env_sus": 0,"gld_bend": 0.699999988,"gld_rate": 0.180000007,"glide": 0,"lfo_rate": 0.529999971,"noise": 0.340000004,"octave": 0.560000002,"osc_fine": 0.189999998,"osc_mix": 0.810000002,"osc_tune": 0.75999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.419999987,"vcf_env": 0.540000021,"vcf_freq": 0.400000006,"vcf_lfo": 0.170000002,"vcf_rel": 0.469999999,"vcf_reso": 0.300000012,"vcf_sus": 0.230000004,"vcf_vel": 0.400000006,"vibrato": 0.360000014},"state": [false,{}]},{"instanceId": 45,"label": "Synth Brass","controlValues": {"env_att": 0.330000013,"env_dec": 0.74000001,"env_rel": 0.409999996,"env_sus": 0.75999999,"gld_bend": 0.280000001,"gld_rate": 0.300000012,"glide": 0,"lfo_rate": 0.810000002,"noise": 0.230000004,"octave": 0.5,"osc_fine": 0.25,"osc_mix": 0.400000006,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0.389999986,"vcf_dec": 0.300000012,"vcf_env": 0.75,"vcf_freq": 0.389999986,"vcf_lfo": 0,"vcf_rel": 0.25,"vcf_reso": 0.150000006,"vcf_sus": 0.819999993,"vcf_vel": 0.5,"vibrato": 0.469999999},"state": [false,{}]},{"instanceId": 46,"label": "Synth Strings","controlValues": {"env_att": 0.819999993,"env_dec": 0.699999988,"env_rel": 0.419999987,"env_sus": 1,"gld_bend": 0.349999994,"gld_rate": 0,"glide": 0,"lfo_rate": 0.839999974,"noise": 0.300000012,"octave": 0.469999999,"osc_fine": 0.239999995,"osc_mix": 1,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.670000017,"vcf_env": 0.75,"vcf_freq": 0.419999987,"vcf_lfo": 0.140000001,"vcf_rel": 0.970000029,"vcf_reso": 0.25999999,"vcf_sus": 0.550000012,"vcf_vel": 0.689999998,"vibrato": 0.670000017},"state": [false,{}]},{"instanceId": 47,"label": "Synth Strings 2","controlValues": {"env_att": 0.460000008,"env_dec": 0.800000012,"env_rel": 0.389999986,"env_sus": 1,"gld_bend": 0.5,"gld_rate": 0.49000001,"glide": 0,"lfo_rate": 0.790000021,"noise": 0,"octave": 0.680000007,"osc_fine": 0.289999992,"osc_mix": 0.75,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0.75999999,"vcf_dec": 0.289999992,"vcf_env": 0.689999998,"vcf_freq": 0.550000012,"vcf_lfo": 0.0799999982,"vcf_rel": 1,"vcf_reso": 0.159999996,"vcf_sus": 0.75999999,"vcf_vel": 0.200000003,"vibrato": 0.270000011},"state": [false,{}]},{"instanceId": 48,"label": "Synth Tom","controlValues": {"env_att": 0.100000001,"env_dec": 0.5,"env_rel": 0.5,"env_sus": 0,"gld_bend": 0.939999998,"gld_rate": 0.75999999,"glide": 0,"lfo_rate": 0.810000002,"noise": 0.699999988,"octave": 0,"osc_fine": 0.5,"osc_mix": 0,"osc_tune": 0.25,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.589999974,"vcf_env": 0.75999999,"vcf_freq": 0.300000012,"vcf_lfo": 0,"vcf_rel": 0.589999974,"vcf_reso": 0.330000013,"vcf_sus": 0,"vcf_vel": 0.680000007,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 49,"label": "Thip","controlValues": {"env_att": 0,"env_dec": 0.460000008,"env_rel": 0.300000012,"env_sus": 0,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.810000002,"noise": 0.779999971,"octave": 0.479999989,"osc_fine": 0.50999999,"osc_mix": 1,"osc_tune": 0.370000005,"tuning": 0.5,"vcf_att": 0.0199999996,"vcf_dec": 0.200000003,"vcf_env": 0.970000029,"vcf_freq": 0,"vcf_lfo": 0,"vcf_rel": 0.200000003,"vcf_reso": 1,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.5},"state": [false,{}]},{"instanceId": 50,"label": "Thumb Piano","controlValues": {"env_att": 0,"env_dec": 0.389999986,"env_rel": 0.479999989,"env_sus": 0,"gld_bend": 0.5,"gld_rate": 0.349999994,"glide": 0,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.709999979,"osc_fine": 1,"osc_mix": 0.720000029,"osc_tune": 0.819999993,"tuning": 0.5,"vcf_att": 0,"vcf_dec": 0.449999988,"vcf_env": 0.540000021,"vcf_freq": 0.370000005,"vcf_lfo": 0,"vcf_rel": 0.389999986,"vcf_reso": 0.469999999,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.600000024},"state": [false,{}]},{"instanceId": 51,"label": "Trumpet","controlValues": {"env_att": 0.239999995,"env_dec": 0.600000024,"env_rel": 0.100000001,"env_sus": 0.800000012,"gld_bend": 0.5,"gld_rate": 0.0599999987,"glide": 0.819999993,"lfo_rate": 0.75,"noise": 0.25,"octave": 0.689999998,"osc_fine": 0.50999999,"osc_mix": 0,"osc_tune": 0.50999999,"tuning": 0.5,"vcf_att": 0.209999993,"vcf_dec": 0.150000006,"vcf_env": 0.319999993,"vcf_freq": 0.569999993,"vcf_lfo": 0.150000006,"vcf_rel": 0.25,"vcf_reso": 0,"vcf_sus": 0,"vcf_vel": 0.5,"vibrato": 0.550000012},"state": [false,{}]},{"instanceId": 52,"label": "Velocity Backing [SA]","controlValues": {"env_att": 0.109999999,"env_dec": 0.479999989,"env_rel": 0.319999993,"env_sus": 0.980000019,"gld_bend": 0.319999993,"gld_rate": 0.0799999982,"glide": 0,"lfo_rate": 0.810000002,"noise": 0,"octave": 0.5,"osc_fine": 0.790000021,"osc_mix": 0.409999996,"osc_tune": 0.5,"tuning": 0.5,"vcf_att": 0.610000014,"vcf_dec": 0.870000005,"vcf_env": 0.340000004,"vcf_freq": 0.49000001,"vcf_lfo": 0,"vcf_rel": 0.930000007,"vcf_reso": 0.00999999978,"vcf_sus": 1,"vcf_vel": 0.930000007,"vibrato": 0.5},"state": [false,{}]}],"nextInstanceId": 53} \ No newline at end of file diff --git a/default_presets/plugin_presets/29.json b/default_presets/plugin_presets/29.json new file mode 100644 index 0000000..7d95f12 --- /dev/null +++ b/default_presets/plugin_presets/29.json @@ -0,0 +1 @@ +{"pluginUri": "http://drobilla.net/plugins/mda/Leslie","presets": [{"instanceId": 1,"label": "Default","controlValues": {"hi_depth": 0.600000024,"hi_throb": 0.699999988,"hi_width": 0.699999988,"lo_throb": 0.600000024,"lo_width": 0.5,"mode": 0.5,"output": 0.5,"speed": 0.5,"x_over": 0.479999989},"state": [false,{}]},{"instanceId": 2,"label": "Slow","controlValues": {"hi_depth": 0.75,"hi_throb": 0.569999993,"hi_width": 0.699999988,"lo_throb": 0.600000024,"lo_width": 0.5,"mode": 0.5,"output": 0.5,"speed": 0.5,"x_over": 0.479999989},"state": [false,{}]},{"instanceId": 3,"label": "Fast","controlValues": {"hi_depth": 0.600000024,"hi_throb": 0.699999988,"hi_width": 0.699999988,"lo_throb": 0.600000024,"lo_width": 0.5,"mode": 1,"output": 0.5,"speed": 0.5,"x_over": 0.479999989},"state": [false,{}]}],"nextInstanceId": 4} \ No newline at end of file diff --git a/default_presets/plugin_presets/30.json b/default_presets/plugin_presets/30.json new file mode 100644 index 0000000..fac5ca3 --- /dev/null +++ b/default_presets/plugin_presets/30.json @@ -0,0 +1 @@ +{"pluginUri": "http://drobilla.net/plugins/mda/Piano","presets": [{"instanceId": 1,"label": "Broken Piano","controlValues": {"env_decay": 0.0500000007,"env_release": 0.957000017,"fine_tuning": 0.449999988,"hardness_offset": 0.5,"muffling_filter": 0.298999995,"polyphony": 0.330000013,"random_detuning": 0.717999995,"stereo_width": 0.5,"stretch_tuning": 0,"vel_sensitivity": 0,"vel_to_hardness": 0.5,"vel_to_muffling": 1},"state": [false,{}]},{"instanceId": 2,"label": "Plain Piano","controlValues": {"env_decay": 0.5,"env_release": 0.5,"fine_tuning": 0.5,"hardness_offset": 0.5,"muffling_filter": 0.750999987,"polyphony": 0,"random_detuning": 0,"stereo_width": 0,"stretch_tuning": 0.5,"vel_sensitivity": 0.451999992,"vel_to_hardness": 0.5,"vel_to_muffling": 0},"state": [false,{}]},{"instanceId": 3,"label": "MDA Piano","controlValues": {"env_decay": 0.5,"env_release": 0.5,"fine_tuning": 0.5,"hardness_offset": 0.5,"muffling_filter": 0.802999973,"polyphony": 0.330000013,"random_detuning": 0.246000007,"stereo_width": 0.5,"stretch_tuning": 0.5,"vel_sensitivity": 0.375999987,"vel_to_hardness": 0.5,"vel_to_muffling": 0.250999987},"state": [false,{}]},{"instanceId": 4,"label": "Compressed Piano","controlValues": {"env_decay": 0.90200001,"env_release": 0.398999989,"fine_tuning": 0.5,"hardness_offset": 0.623000026,"muffling_filter": 1,"polyphony": 0.330000013,"random_detuning": 0,"stereo_width": 0.499000013,"stretch_tuning": 0.5,"vel_sensitivity": 0.298999995,"vel_to_hardness": 0.5,"vel_to_muffling": 0.331},"state": [false,{}]},{"instanceId": 5,"label": "Dark Piano","controlValues": {"env_decay": 0.5,"env_release": 0.601999998,"fine_tuning": 0.5,"hardness_offset": 0,"muffling_filter": 0.30399999,"polyphony": 0.330000013,"random_detuning": 0.317000002,"stereo_width": 0.651000023,"stretch_tuning": 0.5,"vel_sensitivity": 0.335999995,"vel_to_hardness": 0.5,"vel_to_muffling": 0.200000003},"state": [false,{}]},{"instanceId": 6,"label": "Concert Piano","controlValues": {"env_decay": 0.648000002,"env_release": 0.5,"fine_tuning": 0.5,"hardness_offset": 0.5,"muffling_filter": 0.298000008,"polyphony": 0.356000006,"random_detuning": 0.338999987,"stereo_width": 0.850000024,"stretch_tuning": 0.660000026,"vel_sensitivity": 0.550000012,"vel_to_hardness": 0.5,"vel_to_muffling": 0.601999998},"state": [false,{}]},{"instanceId": 7,"label": "School Piano","controlValues": {"env_decay": 0.449999988,"env_release": 0.59799999,"fine_tuning": 0.5,"hardness_offset": 0.625999987,"muffling_filter": 0.602999985,"polyphony": 0.330000013,"random_detuning": 0.421000004,"stereo_width": 0.331,"stretch_tuning": 0.800999999,"vel_sensitivity": 0.173999995,"vel_to_hardness": 0.5,"vel_to_muffling": 0.5},"state": [false,{}]},{"instanceId": 8,"label": "Dance Piano","controlValues": {"env_decay": 0.398999989,"env_release": 0.250999987,"fine_tuning": 0.5,"hardness_offset": 1,"muffling_filter": 0.671999991,"polyphony": 0.330000013,"random_detuning": 0.282999992,"stereo_width": 0.248999998,"stretch_tuning": 0.666999996,"vel_sensitivity": 0.127000004,"vel_to_hardness": 0.5,"vel_to_muffling": 0.123999998},"state": [false,{}]}],"nextInstanceId": 9} \ No newline at end of file diff --git a/default_presets/plugin_presets/31.json b/default_presets/plugin_presets/31.json new file mode 100644 index 0000000..304cae2 --- /dev/null +++ b/default_presets/plugin_presets/31.json @@ -0,0 +1 @@ +{"pluginUri": "http://drobilla.net/plugins/mda/Splitter","presets": [{"instanceId": 1,"label": "Frequency/Level Splitter","controlValues": {"envelope": 0.5,"freq": 0.5,"freq_sw": 0.25,"level": 0.5,"level_sw": 0.5,"mode": 0,"output": 0.5},"state": [false,{}]},{"instanceId": 2,"label": "Pass Peaks Only","controlValues": {"envelope": 0.5,"freq": 0.5,"freq_sw": 0.5,"level": 0.5,"level_sw": 0,"mode": 0,"output": 0.5},"state": [false,{}]},{"instanceId": 3,"label": "Stereo Crossover","controlValues": {"envelope": 0.5,"freq": 0.5,"freq_sw": 0.25,"level": 0.5,"level_sw": 0.5,"mode": 0.666666985,"output": 0.5},"state": [false,{}]}],"nextInstanceId": 4} \ No newline at end of file diff --git a/default_presets/plugin_presets/32.json b/default_presets/plugin_presets/32.json new file mode 100644 index 0000000..8c5ebf1 --- /dev/null +++ b/default_presets/plugin_presets/32.json @@ -0,0 +1 @@ +{"pluginUri": "http://drobilla.net/plugins/mda/ThruZero","presets": [{"instanceId": 1,"label": "Phase Canceller","controlValues": {"depth": 0.200000003,"depth_mod": 1,"feedback": 0.300000012,"mix": 0.469999999,"rate": 0.5},"state": [false,{}]},{"instanceId": 2,"label": "Mad Modulator","controlValues": {"depth": 1,"depth_mod": 1,"feedback": 0.75,"mix": 0.5,"rate": 0.75},"state": [false,{}]},{"instanceId": 3,"label": "Chorus Doubler","controlValues": {"depth": 0.600000024,"depth_mod": 0.699999988,"feedback": 0.300000012,"mix": 0.349999994,"rate": 0.600000024},"state": [false,{}]},{"instanceId": 4,"label": "Thru-Zero Flanger","controlValues": {"depth": 0.430000007,"depth_mod": 1,"feedback": 0.300000012,"mix": 0.469999999,"rate": 0.300000012},"state": [false,{}]}],"nextInstanceId": 5} \ No newline at end of file diff --git a/default_presets/plugin_presets/33.json b/default_presets/plugin_presets/33.json new file mode 100644 index 0000000..6b97b01 --- /dev/null +++ b/default_presets/plugin_presets/33.json @@ -0,0 +1 @@ +{"pluginUri": "http://drobilla.net/plugins/mda/Vocoder","presets": [{"instanceId": 1,"label": "Default","controlValues": {"envelope": 0.159999996,"filter_q": 0.550000012,"hi_band": 0.400000006,"hi_thru": 0.400000006,"mid_freq": 0.666700006,"mod_in": 0,"output": 0.5,"quality": 0},"state": [false,{}]},{"instanceId": 2,"label": "Old Vocoder","controlValues": {"envelope": 0.159999996,"filter_q": 0.550000012,"hi_band": 0,"hi_thru": 0,"mid_freq": 0.5,"mod_in": 0,"output": 0.5,"quality": 0},"state": [false,{}]},{"instanceId": 3,"label": "Pad Vocoder","controlValues": {"envelope": 0.779999971,"filter_q": 0.550000012,"hi_band": 0.400000006,"hi_thru": 0.400000006,"mid_freq": 0.300000012,"mod_in": 0,"output": 0.5,"quality": 0},"state": [false,{}]},{"instanceId": 4,"label": "16 Band Vocoder","controlValues": {"envelope": 0.159999996,"filter_q": 0.550000012,"hi_band": 0.400000006,"hi_thru": 0.400000006,"mid_freq": 0.666700006,"mod_in": 0,"output": 0.5,"quality": 1},"state": [false,{}]},{"instanceId": 5,"label": "Choral Vocoder","controlValues": {"envelope": 0.159999996,"filter_q": 0.699999988,"hi_band": 0,"hi_thru": 0.400000006,"mid_freq": 0.5,"mod_in": 0,"output": 0.5,"quality": 0},"state": [false,{}]}],"nextInstanceId": 6} \ No newline at end of file diff --git a/default_presets/plugin_presets/34.json b/default_presets/plugin_presets/34.json new file mode 100644 index 0000000..7cd5501 --- /dev/null +++ b/default_presets/plugin_presets/34.json @@ -0,0 +1 @@ +{"pluginUri": "http://drobilla.net/plugins/mda/EPiano","presets": [{"instanceId": 1,"label": "Bright","controlValues": {"env_decay": 0.5,"env_release": 0.5,"fine_tuning": 0.5,"hardness": 1,"lfo_rate": 0.649999976,"modulation": 0.5,"overdrive": 0.5,"polyphonic": 1,"random_tuning": 0.145999998,"stereo_width": 0.5,"treble_boost": 0.800000012,"vel_sense": 0.25},"state": [false,{}]},{"instanceId": 2,"label": "Default","controlValues": {"env_decay": 0.5,"env_release": 0.5,"fine_tuning": 0.5,"hardness": 0.5,"lfo_rate": 0.649999976,"modulation": 0.5,"overdrive": 0,"polyphonic": 1,"random_tuning": 0.145999998,"stereo_width": 0.5,"treble_boost": 0.5,"vel_sense": 0.25},"state": [false,{}]},{"instanceId": 3,"label": "Tremolo","controlValues": {"env_decay": 0.5,"env_release": 0.5,"fine_tuning": 0.5,"hardness": 0.5,"lfo_rate": 0.649999976,"modulation": 0.75,"overdrive": 0,"polyphonic": 1,"random_tuning": 0.246000007,"stereo_width": 0.5,"treble_boost": 0.5,"vel_sense": 0.25},"state": [false,{}]},{"instanceId": 4,"label": "Mellow","controlValues": {"env_decay": 0.5,"env_release": 0.5,"fine_tuning": 0.5,"hardness": 0,"lfo_rate": 0.649999976,"modulation": 0.5,"overdrive": 0,"polyphonic": 1,"random_tuning": 0.246000007,"stereo_width": 0.5,"treble_boost": 0,"vel_sense": 0.25},"state": [false,{}]},{"instanceId": 5,"label": "Autopan","controlValues": {"env_decay": 0.5,"env_release": 0.5,"fine_tuning": 0.5,"hardness": 0.5,"lfo_rate": 0.649999976,"modulation": 0.25,"overdrive": 0,"polyphonic": 1,"random_tuning": 0.246000007,"stereo_width": 0.5,"treble_boost": 0.5,"vel_sense": 0.25},"state": [false,{}]}],"nextInstanceId": 6} \ No newline at end of file diff --git a/default_presets/plugin_presets/index.json b/default_presets/plugin_presets/index.json index f3fda51..2e33843 100644 --- a/default_presets/plugin_presets/index.json +++ b/default_presets/plugin_presets/index.json @@ -1 +1 @@ -{"entries": [{"pluginUri": "urn:zamaudio:ZaMaximX2","fileName": "1.json"},{"pluginUri": "urn:zamaudio:ZaMultiComp","fileName": "2.json"},{"pluginUri": "urn:zamaudio:ZaMultiCompX2","fileName": "3.json"},{"pluginUri": "urn:zamaudio:ZamComp","fileName": "4.json"},{"pluginUri": "urn:zamaudio:ZamCompX2","fileName": "5.json"},{"pluginUri": "urn:zamaudio:ZamDelay","fileName": "6.json"},{"pluginUri": "urn:zamaudio:ZamDynamicEQ","fileName": "7.json"},{"pluginUri": "urn:zamaudio:ZamEQ2","fileName": "8.json"},{"pluginUri": "urn:zamaudio:ZamGEQ31","fileName": "9.json"},{"pluginUri": "urn:zamaudio:ZamGate","fileName": "10.json"},{"pluginUri": "urn:zamaudio:ZamGateX2","fileName": "11.json"},{"pluginUri": "urn:zamaudio:ZamGrains","fileName": "12.json"},{"pluginUri": "urn:zamaudio:ZamHeadX2","fileName": "13.json"},{"pluginUri": "urn:zamaudio:ZamPhono","fileName": "14.json"},{"pluginUri": "urn:zamaudio:ZamTube","fileName": "15.json"},{"pluginUri": "urn:zamaudio:ZamVerb","fileName": "16.json"},{"pluginUri": "http://two-play.com/plugins/toob-delay","fileName": "17.json"},{"pluginUri": "http://two-play.com/plugins/toob-ml","fileName": "18.json"}],"nextInstanceId": 19} \ No newline at end of file +{"entries": [{"pluginUri": "urn:zamaudio:ZaMaximX2","fileName": "1.json"},{"pluginUri": "urn:zamaudio:ZaMultiComp","fileName": "2.json"},{"pluginUri": "urn:zamaudio:ZaMultiCompX2","fileName": "3.json"},{"pluginUri": "urn:zamaudio:ZamComp","fileName": "4.json"},{"pluginUri": "urn:zamaudio:ZamCompX2","fileName": "5.json"},{"pluginUri": "urn:zamaudio:ZamDelay","fileName": "6.json"},{"pluginUri": "urn:zamaudio:ZamDynamicEQ","fileName": "7.json"},{"pluginUri": "urn:zamaudio:ZamEQ2","fileName": "8.json"},{"pluginUri": "urn:zamaudio:ZamGEQ31","fileName": "9.json"},{"pluginUri": "urn:zamaudio:ZamGate","fileName": "10.json"},{"pluginUri": "urn:zamaudio:ZamGateX2","fileName": "11.json"},{"pluginUri": "urn:zamaudio:ZamGrains","fileName": "12.json"},{"pluginUri": "urn:zamaudio:ZamHeadX2","fileName": "13.json"},{"pluginUri": "urn:zamaudio:ZamPhono","fileName": "14.json"},{"pluginUri": "urn:zamaudio:ZamTube","fileName": "15.json"},{"pluginUri": "urn:zamaudio:ZamVerb","fileName": "16.json"},{"pluginUri": "http://two-play.com/plugins/toob-delay","fileName": "17.json"},{"pluginUri": "http://two-play.com/plugins/toob-ml","fileName": "18.json"},{"pluginUri": "http://calf.sourceforge.net/plugins/Filter","fileName": "19.json"},{"pluginUri": "http://calf.sourceforge.net/plugins/Flanger","fileName": "20.json"},{"pluginUri": "http://calf.sourceforge.net/plugins/MonoCompressor","fileName": "21.json"},{"pluginUri": "http://calf.sourceforge.net/plugins/Monosynth","fileName": "22.json"},{"pluginUri": "http://calf.sourceforge.net/plugins/Organ","fileName": "23.json"},{"pluginUri": "http://calf.sourceforge.net/plugins/Reverb","fileName": "24.json"},{"pluginUri": "http://calf.sourceforge.net/plugins/Wavetable","fileName": "25.json"},{"pluginUri": "http://drobilla.net/plugins/mda/DX10","fileName": "26.json"},{"pluginUri": "http://drobilla.net/plugins/mda/Detune","fileName": "27.json"},{"pluginUri": "http://drobilla.net/plugins/mda/JX10","fileName": "28.json"},{"pluginUri": "http://drobilla.net/plugins/mda/Leslie","fileName": "29.json"},{"pluginUri": "http://drobilla.net/plugins/mda/Piano","fileName": "30.json"},{"pluginUri": "http://drobilla.net/plugins/mda/Splitter","fileName": "31.json"},{"pluginUri": "http://drobilla.net/plugins/mda/ThruZero","fileName": "32.json"},{"pluginUri": "http://drobilla.net/plugins/mda/Vocoder","fileName": "33.json"},{"pluginUri": "http://drobilla.net/plugins/mda/EPiano","fileName": "34.json"}],"nextInstanceId": 35} \ No newline at end of file diff --git a/default_presets/presets/Default+Bank.bank b/default_presets/presets/Default+Bank.bank index 3f10372..172ec14 100644 --- a/default_presets/presets/Default+Bank.bank +++ b/default_presets/presets/Default+Bank.bank @@ -1 +1 @@ -{"name": "","nextInstanceId": 20,"selectedPreset": 13,"presets": [{"instanceId": 13,"preset": {"name": "Jazz","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -49.1093903},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 18,"uri": "http://two-play.com/plugins/toob-tone-stack","isEnabled": true,"controlValues": [{"key": "bass","value": 0.11666666},{"key": "mid","value": 0.5},{"key": "treble","value": 0.283333331},{"key": "ampmodel","value": 1}],"pluginName": "TooB Tone Stack","midiBindings": [ ]},{"instanceId": 30,"uri": "http://two-play.com/plugins/toob-power-stage-2","isEnabled": true,"controlValues": [{"key": "trim1","value": 0},{"key": "locut1","value": 30},{"key": "hicut1","value": 19000},{"key": "shape1","value": 0},{"key": "gain1","value": 0.458333343},{"key": "bias1","value": 0},{"key": "trim2","value": 0},{"key": "locut2","value": 30},{"key": "hicut2","value": 19000},{"key": "shape2","value": 0},{"key": "gain2","value": 0.383333325},{"key": "bias2","value": 0},{"key": "gain2_enable","value": 1},{"key": "trim3","value": 0},{"key": "locut3","value": 30},{"key": "hicut3","value": 19000},{"key": "shape3","value": 0},{"key": "gain3","value": 0},{"key": "bias3","value": 0},{"key": "gain3_enable","value": 1},{"key": "sag","value": 0.316666663},{"key": "sagd","value": 0.325000018},{"key": "master","value": -12.75},{"key": "sagf","value": 13}],"pluginName": "TooB Power Stage","midiBindings": [ ]},{"instanceId": 20,"uri": "http://two-play.com/plugins/toob-cab-sim","isEnabled": true,"controlValues": [{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "comb","value": 0},{"key": "combf","value": 2000},{"key": "trim","value": 0}],"pluginName": "TooB Cab Simulator","midiBindings": [ ]},{"instanceId": 33,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 12},{"key": "feedback","value": 39}],"pluginName": "TooB Delay","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": false,"controlValues": [{"key": "dryWet","value": 0.300000012},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.491666675}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 33}},{"instanceId": 15,"preset": {"name": "Jazz ML","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 37,"uri": "uri://two-play/pipedal/pedalboard#Empty","isEnabled": true,"controlValues": [ ],"pluginName": "","midiBindings": [ ]},{"instanceId": 38,"uri": "uri://two-play/pipedal/pedalboard#Empty","isEnabled": true,"controlValues": [ ],"pluginName": "","midiBindings": [ ]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "bass","value": 0.5},{"key": "mid","value": 0.5},{"key": "treble","value": 0.5},{"key": "model","value": 0},{"key": "gain","value": 3},{"key": "master","value": 0}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 35,"uri": "uri://two-play/pipedal/pedalboard#Empty","isEnabled": true,"controlValues": [ ],"pluginName": "","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 39}},{"instanceId": 17,"preset": {"name": "Sparkling Clean","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 27},{"key": "feedback","value": 39}],"pluginName": "TooB Delay","midiBindings": [ ]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": -3},{"key": "bass","value": 0.650000036},{"key": "mid","value": 0.5},{"key": "treble","value": 0.550000012},{"key": "model","value": 19},{"key": "gain","value": 0},{"key": "master","value": 1.5}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 45}},{"instanceId": 18,"preset": {"name": "Light Crunch","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 27},{"key": "feedback","value": 39}],"pluginName": "TooB Delay","midiBindings": [ ]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 2.5},{"key": "bass","value": 0.650000036},{"key": "mid","value": 0.5},{"key": "treble","value": 0.266666681},{"key": "model","value": 17},{"key": "gain","value": 0},{"key": "master","value": 2}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 45}},{"instanceId": 19,"preset": {"name": "Heavy","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -65.5},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 27},{"key": "feedback","value": 39.1666679}],"pluginName": "TooB Delay","midiBindings": [ ]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 2.5},{"key": "bass","value": 0.650000036},{"key": "mid","value": 0.5},{"key": "treble","value": 0.266666681},{"key": "model","value": 18},{"key": "gain","value": 0},{"key": "master","value": -10}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 45}},{"instanceId": 20,"preset": {"name": "Scream","items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -54},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": -15.75},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -64.5},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}]},{"instanceId": 47,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 12.5},{"key": "model","value": 29},{"key": "gain","value": 3},{"key": "master","value": 6.5},{"key": "bass","value": 0.5},{"key": "mid","value": 0.5},{"key": "treble","value": 0.5}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 10.333333},{"key": "feedback","value": 39.1666679}],"pluginName": "TooB Delay","midiBindings": [ ]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 2.5},{"key": "bass","value": 0.5},{"key": "mid","value": 0.5},{"key": "treble","value": 0.5},{"key": "model","value": 12},{"key": "gain","value": 10},{"key": "master","value": -10}],"pluginName": "TooB ML Amplifier","midiBindings": [ ]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.0416666716},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ]}],"nextInstanceId": 47}}]} \ No newline at end of file +{"name": "","nextInstanceId": 20,"selectedPreset": 15,"presets": [{"instanceId": 13,"preset": {"name": "Jazz","input_volume_db": 0,"output_volume_db": 0,"items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -49.1093903},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 18,"uri": "http://two-play.com/plugins/toob-tone-stack","isEnabled": true,"controlValues": [{"key": "bass","value": 0.11666666},{"key": "mid","value": 0.5},{"key": "treble","value": 0.283333331},{"key": "ampmodel","value": 1}],"pluginName": "TooB Tone Stack","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 30,"uri": "http://two-play.com/plugins/toob-power-stage-2","isEnabled": true,"controlValues": [{"key": "trim1","value": 0},{"key": "locut1","value": 30},{"key": "hicut1","value": 19000},{"key": "shape1","value": 0},{"key": "gain1","value": 0.458333343},{"key": "bias1","value": 0},{"key": "trim2","value": 0},{"key": "locut2","value": 30},{"key": "hicut2","value": 19000},{"key": "shape2","value": 0},{"key": "gain2","value": 0.383333325},{"key": "bias2","value": 0},{"key": "gain2_enable","value": 1},{"key": "trim3","value": 0},{"key": "locut3","value": 30},{"key": "hicut3","value": 19000},{"key": "shape3","value": 0},{"key": "gain3","value": 0},{"key": "bias3","value": 0},{"key": "gain3_enable","value": 1},{"key": "sag","value": 0.316666663},{"key": "sagd","value": 0.325000018},{"key": "master","value": -12.75},{"key": "sagf","value": 13}],"pluginName": "TooB Power Stage","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 20,"uri": "http://two-play.com/plugins/toob-cab-sim","isEnabled": true,"controlValues": [{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "comb","value": 0},{"key": "combf","value": 2000},{"key": "trim","value": 0}],"pluginName": "TooB Cab Simulator","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 33,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 12},{"key": "feedback","value": 39}],"pluginName": "TooB Delay","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": false,"controlValues": [{"key": "dryWet","value": 0.300000012},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.491666675}],"pluginName": "TooB Freeverb","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]}],"nextInstanceId": 33}},{"instanceId": 15,"preset": {"name": "Jazz ML","input_volume_db": 0,"output_volume_db": 0,"items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 37,"uri": "uri://two-play/pipedal/pedalboard#Empty","isEnabled": true,"controlValues": [ ],"pluginName": "","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 38,"uri": "uri://two-play/pipedal/pedalboard#Empty","isEnabled": true,"controlValues": [ ],"pluginName": "","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "bass","value": 0.5},{"key": "mid","value": 0.5},{"key": "treble","value": 0.5},{"key": "model","value": 0},{"key": "gain","value": 3},{"key": "master","value": 0}],"pluginName": "TooB ML Amplifier","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 35,"uri": "uri://two-play/pipedal/pedalboard#Empty","isEnabled": true,"controlValues": [ ],"pluginName": "","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]}],"nextInstanceId": 39}},{"instanceId": 17,"preset": {"name": "Sparkling Clean","input_volume_db": 0,"output_volume_db": 0,"items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 27},{"key": "feedback","value": 39}],"pluginName": "TooB Delay","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": -3},{"key": "bass","value": 0.650000036},{"key": "mid","value": 0.5},{"key": "treble","value": 0.550000012},{"key": "model","value": 19},{"key": "gain","value": 0},{"key": "master","value": 1.5}],"pluginName": "TooB ML Amplifier","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]}],"nextInstanceId": 45}},{"instanceId": 18,"preset": {"name": "Light Crunch","input_volume_db": 0,"output_volume_db": 0,"items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -80},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 27},{"key": "feedback","value": 39}],"pluginName": "TooB Delay","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 2.5},{"key": "bass","value": 0.650000036},{"key": "mid","value": 0.5},{"key": "treble","value": 0.266666681},{"key": "model","value": 17},{"key": "gain","value": 0},{"key": "master","value": 2}],"pluginName": "TooB ML Amplifier","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]}],"nextInstanceId": 45}},{"instanceId": 19,"preset": {"name": "Heavy","input_volume_db": 0,"output_volume_db": 0,"items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -23.1093884},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": 0},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -65.5},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 27},{"key": "feedback","value": 39.1666679}],"pluginName": "TooB Delay","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 2.5},{"key": "bass","value": 0.650000036},{"key": "mid","value": 0.5},{"key": "treble","value": 0.266666681},{"key": "model","value": 18},{"key": "gain","value": 0},{"key": "master","value": -10}],"pluginName": "TooB ML Amplifier","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.150000006},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]}],"nextInstanceId": 45}},{"instanceId": 20,"preset": {"name": "Scream","input_volume_db": 0,"output_volume_db": 0,"items": [{"instanceId": 16,"uri": "http://two-play.com/plugins/toob-tuner","isEnabled": true,"controlValues": [{"key": "REFFREQ","value": 440},{"key": "THRESHOLD","value": -54},{"key": "MUTE","value": 0}],"pluginName": "TooB Tuner","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 17,"uri": "http://two-play.com/plugins/toob-input_stage","isEnabled": true,"controlValues": [{"key": "trim","value": -15.75},{"key": "locut","value": 120},{"key": "bright","value": 0},{"key": "brightf","value": 1300},{"key": "hicut","value": 6000},{"key": "gate_t","value": -64.5},{"key": "boost","value": 0}],"pluginName": "TooB Input Stage","midiBindings": [{"channel": -1,"symbol": "__bypass","bindingType": 2,"note": 72,"control": 4,"minValue": 0,"maxValue": 1,"rotaryScale": 1,"linearControlType": 0,"switchControlType": 0}],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 47,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 12.5},{"key": "model","value": 29},{"key": "gain","value": 3},{"key": "master","value": 6.5},{"key": "bass","value": 0.5},{"key": "mid","value": 0.5},{"key": "treble","value": 0.5}],"pluginName": "TooB ML Amplifier","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 42,"uri": "http://two-play.com/plugins/toob-chorus","isEnabled": false,"controlValues": [{"key": "rate","value": 0.291666657},{"key": "depth","value": 0.375}],"pluginName": "TooB CE-2 Chorus","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 41,"uri": "http://two-play.com/plugins/toob-delay","isEnabled": true,"controlValues": [{"key": "delay","value": 340},{"key": "level","value": 10.333333},{"key": "feedback","value": 39.1666679}],"pluginName": "TooB Delay","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 39,"uri": "http://two-play.com/plugins/toob-ml","isEnabled": true,"controlValues": [{"key": "trim","value": 2.5},{"key": "bass","value": 0.5},{"key": "mid","value": 0.5},{"key": "treble","value": 0.5},{"key": "model","value": 12},{"key": "gain","value": 10},{"key": "master","value": -10}],"pluginName": "TooB ML Amplifier","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]},{"instanceId": 31,"uri": "http://two-play.com/plugins/toob-freeverb","isEnabled": true,"controlValues": [{"key": "dryWet","value": 0.0416666716},{"key": "roomSize","value": 0.625},{"key": "damping","value": 0.574999988}],"pluginName": "TooB Freeverb","midiBindings": [ ],"stateUpdateCount": 0,"lv2State": [false,{}]}],"nextInstanceId": 47}}]} \ No newline at end of file diff --git a/docs/Installing.md b/docs/Installing.md index 8c2eb7c..d07c32a 100644 --- a/docs/Installing.md +++ b/docs/Installing.md @@ -13,14 +13,14 @@ page_icon: img/Install4.jpg Download the most recent Debian (.deb) package for your platform: -- [Ubuntu/Raspberry Pi OS (64-bit) v1.0.19](https://github.com/rerdavies/pipedal/releases/download/v1.0.19/pipedal_1.0.19_arm64.deb) +- [Ubuntu/Raspberry Pi OS (64-bit) v1.1.20](https://github.com/rerdavies/pipedal/releases/download/v1.1.20/pipedal_1.1.20_arm64.deb) Install the package by running ``` sudo apt update cd ~/Downloads - sudo apt-get install ./pipedal_1.0.19_arm64.deb + sudo apt-get install ./pipedal_1.1.20_arm64.deb ``` On Raspberry Pi OS, if you have a graphical desktop installed, you can also install the package by double-clicking on the downloaded package in the File Manager. diff --git a/docs/ReleaseNotes.md b/docs/ReleaseNotes.md new file mode 100644 index 0000000..324cb12 --- /dev/null +++ b/docs/ReleaseNotes.md @@ -0,0 +1,19 @@ +# Release Notes + +## PiPedal 1.1.20 + +Features: + +- Two new plugins: TooB Convolution Reverb, and TooB Cab IR. + +- Output ports for LV2 plugins are now displayed (vu meters and status controls) + +- File selection dialog, and uploads for LV2 atom:path Properties for 3rd party LV2 plugins. + +Bug fixes: + +- Improvements to onboarding procedure. + +- Problems with restarting audio after changing audio parameters. + +- Occasional loss of audio after reboot caused by ALSA USB initialization race conditions. \ No newline at end of file diff --git a/docs/download.md b/docs/download.md index f54549e..9f46c4d 100644 --- a/docs/download.md +++ b/docs/download.md @@ -4,14 +4,14 @@ Download the most recent Debian (.deb) package for your platform: -- [Ubuntu or Raspberry Pi OS (64-bit)](https://github.com/rerdavies/pipedal/releases/download/v1.0.19/pipedal_1.0.19_arm64.deb) v1.0.19 +- [Ubuntu or Raspberry Pi OS (64-bit)](https://github.com/rerdavies/pipedal/releases/download/v1.1.20/pipedal_1.1.20_arm64.deb) v1.1.20 Install the package by running ``` sudo apt update cd ~/Downloads - sudo apt-get install ./pipedal_1.0.19_arm64.deb + sudo apt-get install ./pipedal_1.1.20_arm64.deb ``` Follow the instructions in [_Configuring PiPedal After Installation_](https://rerdavies.github.io/pipedal/Configuring.html) to complete the installation. diff --git a/docs/index.md b/docs/index.md index 27ef9ff..74f4dd9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,12 +1,16 @@ -v1.0.19 +v1.1.20   To download PiPedal, click [here](download.md). + +NEW version 1.1 release. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details. + + Use your Raspberry Pi as a guitar effects pedal. Configure and control PiPedal with your phone or tablet. PiPedal running on a Raspberry Pi 4 provides stable super-low-latency audio via external USB audio devices, or internal Raspberry Pi audio hats. diff --git a/lv2/aarch64/ToobAmp.lv2/CabIR.ttl b/lv2/aarch64/ToobAmp.lv2/CabIR.ttl new file mode 100644 index 0000000..7f1c235 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/CabIR.ttl @@ -0,0 +1,431 @@ +@prefix doap: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@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 pipedal_ui: . +@prefix ui: . + +@prefix atom: . +@prefix patch: . +@prefix rdfs: . +@prefix state: . +@prefix urid: . +@prefix xsd: . + + +@prefix cabir: . +@prefix toobimpulse: . + + + +cabir:impulseFile1Group + a param:ControlGroup , + pg:InputGroup ; + lv2:name "Impulse Response 1" ; + lv2:symbol "impulse1" . + +cabir:impulseFile2Group + a param:ControlGroup , + pg:InputGroup ; + lv2:name "Impulse Response 2" ; + lv2:symbol "impulse2" . + +cabir:impulseFile3Group + a param:ControlGroup , + pg:InputGroup ; + lv2:name "Impulse Response 3" ; + lv2:symbol "impulse3" . + + +cabir:impulseFile + a rdf:property; + rdfs:label "IR"; + pg:group cabir:impulseFile1Group ; + + rdfs:range atom:Path. + +cabir:impulseFile2 + a rdf:property; + rdfs:label "IR"; + pg:group cabir:impulseFile2Group ; + rdfs:range atom:Path. + +cabir:impulseFile3 + a rdf:property; + rdfs:label "IR"; + pg:group cabir:impulseFile3Group ; + rdfs:range atom:Path. + + + + + + a foaf:Person ; + foaf:name "Robin Davies" ; + foaf:mbox ; + foaf:homepage . + + + a lv2:Plugin , + lv2:ReverbPlugin ; + doap:name "TooB Cab IR" , + "TooB Cab IR"@en-gb + ; + doap:license ; + doap:maintainer ; + lv2:minorVersion 0 ; + lv2:microVersion 14 ; + rdfs:comment """ + +TooB Cab IR is a convolution-based guitar cabinet impulse response simulator. + +TooB Cab IR allows you to select and mix impulse responses for up to three microphone positions. Mixing is done before convolution FFTs are calculated, +so there is no performance cost for using more than one impulse response file. + +Cab IR files are usually short, but sometimes include room response impulse files, which can be quite long. The Max T control determines the maximum length +to use for impulse response files. If the length of the impulse file is longer than the specified time, samples occuring after +the specified time are discarded, and the tail of the impulse convolution is fed back into the imput of the convolution. This ensures a smooth reverb tail, +and has little effect on the quality of the resulting reverb. If the impulse file is shorter than the specified time, then all samples in the impulse +file are used, and no feedback occurs. + +Toob Convolution Reverb comes with a nominal set of cabinet impulse files to get you started. You are strongly encouraged to seek out reverb impulse files +on the internet. + +Special thanks are extended to Kristoffer Ekstrand of Adventure Kid Research & Technology, who generously provided the base set of impulse files distributed with Toob Cab IR. + +--- + + ![CC-BY-4.0](/img/cc-by.png) + By: Kristoffer Ekstrand, Adventure Kid Research & Technology. + + The following files are licensed under a [Creative Commons Attribution 4.0 International License.][1] + +``` + 80s UK 001.wav + 80s UK 002.wav + 80s US 001.wav + 80s US 002.wav + Modern UK 001.wav + Modern UK 002.wav + Modern US 001.wav + Modern US 002.wav + Modern US 003.wav + Modern US 004.wav + Radio 001.wav + Speaker 001.wav + Speaker 002.wav + Vintage UK 001.wav + Vintage UK 002.wav + Vintage US 001.wav + Vintage US 002.wav +``` + +Source: + + +[1]: https://creativecommons.org/licenses/by/4.0/ + + + +""" ; + + mod:brand "TooB"; + mod:label "Convolution Reverb"; + lv2:requiredFeature urid:map, state:makePath, state:mapPath ; + lv2:optionalFeature state::freePath; + + lv2:extensionData state:interface; + + + lv2:optionalFeature lv2:hardRTCapable; + patch:readable + cabir:impulseFile, cabir:impulseFile2, cabir:impulseFile3; + patch:writable + cabir:impulseFile,cabir:impulseFile2,cabir:impulseFile3; + lv2:extensionData state:interface, + work:interface; + + lv2:port + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 0 ; + lv2:symbol "reverb_mix" ; + lv2:name "Volume"; + pg:group cabir:impulseFile1Group ; + + + lv2:default -10.0 ; + lv2:minimum -40.0 ; + lv2:maximum 20.0 ; + units:unit units:db ; + + lv2:scalePoint [ + rdfs:label "-INF" ; + rdf:value -40.0 + ]; + rdfs:comment "Volume for impulse file #1." ; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 1 ; + lv2:symbol "reverb_mix2" ; + lv2:name "Volume"; + pg:group cabir:impulseFile2Group ; + + lv2:default -10.0 ; + lv2:minimum -40.0 ; + lv2:maximum 20.0 ; + units:unit units:db ; + + lv2:scalePoint [ + rdfs:label "-INF" ; + rdf:value -40.0 + ]; + rdfs:comment "Volume for impulse file #2." ; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 2 ; + lv2:symbol "reverb_mix3" ; + lv2:name "Volume"; + pg:group cabir:impulseFile3Group ; + + lv2:default -10.0 ; + lv2:minimum -40.0 ; + lv2:maximum 20.0 ; + units:unit units:db ; + + lv2:scalePoint [ + rdfs:label "-INF" ; + rdf:value -40.0 + ]; + rdfs:comment "Volume for impulse file #3." ; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 3; + lv2:symbol "time" ; + lv2:name "Max T"; + lv2:default 2.0 ; + lv2:minimum 0.1 ; + lv2:maximum 6.0 ; + + lv2:portProperty epp:notAutomatic ; + lv2:portProperty epp:expensive ; + + units:unit units:s ; + + rdfs:comment "Maximum length of impulse data to use." ; + + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 4; + lv2:symbol "direct_mix" ; + lv2:name "Direct"; + lv2:default -40.0 ; + lv2:minimum -40.0 ; + lv2:maximum 20.0 ; + units:unit units:db ; + + lv2:scalePoint [ + rdfs:label "-INF" ; + rdf:value -40.0 + ]; + rdfs:comment "Direct mix. Set to minimum to disable." ; + + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 5 ; + lv2:symbol "predelay" ; + lv2:name "Predelay"; + lv2:portProperty epp:notOnGUI; + + lv2:default 0 ; + lv2:minimum 0 ; + lv2:maximum 1 ; + + lv2:portProperty lv2:enumeration ; + + lv2:scalePoint [ + rdfs:label "Remove" ; + rdf:value 0.0; + ], + [ + rdfs:label "Keep" ; + rdf:value 1.0; + ]; + rdfs:comment "Removes leading silence in impulse when set to false." ; + ], + + [ + a lv2:OutputPort , + lv2:ControlPort ; + + lv2:index 6 ; + lv2:symbol "loading_state" ; + lv2:name "Status"; + + lv2:portProperty lv2:enumeration ; + lv2:default 0.0 ; + lv2:minimum 0.0 ; + lv2:maximum 5.0 ; + + # NotLoaded = 0, + # Idle = 1, + # Error = 2, + # SentRequest = 3, + # GotResponse = 4, + # CleaningUp = 5, + + lv2:scalePoint [ + rdfs:label "Not loaded" ; + rdf:value 0.0 + ],[ + rdfs:label "Ready" ; + rdf:value 1.0 + ],[ + rdfs:label "Error" ; + rdf:value 2.0 + ],[ + rdfs:label "Loading" ; + rdf:value 3.0 + ],[ + rdfs:label "Loading" ; + rdf:value 4.0 + ],[ + rdfs:label "Loading" ; + rdf:value 5.0 + ]; + rdfs:comment "Plugin status." ; + ], + [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 7 ; + lv2:symbol "in" ; + lv2:name "In" + ], + [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 8 ; + lv2:symbol "out" ; + lv2:name "Out" + ], + [ + a atom:AtomPort , + lv2:InputPort; + atom:bufferType atom:Sequence ; + atom:supports patch:Message; + lv2:designation lv2:control ; + atom:supports patch:Message ; + + lv2:index 9 ; + lv2:symbol "control" ; + lv2:name "Control" ; + rdfs:comment "Control" ; + ] , [ + a atom:AtomPort , + lv2:OutputPort ; + atom:bufferType atom:Sequence ; + atom:supports patch:Message; + lv2:designation lv2:control ; + lv2:index 10; + lv2:symbol "notify" ; + lv2:name "Notify" ; + rdfs:comment "Notification" ; + ] + . + + + pipedal_ui:ui cabir:ui . + +cabir:ui + a pipedal_ui:ui ; + pipedal_ui:fileProperties + [ + a pipedal_ui:fileProperty; + rdfs:label "Impulse File" ; + lv2:index 0 ; + pg:group cabir:impulseFile1Group ; + + pipedal_ui:directory "CabIR"; + pipedal_ui:patchProperty cabir:impulseFile ; + pipedal_ui:fileTypes + [ + a pipedal_ui:fileType; + rdfs:label "WAV File"; + pipedal_ui:fileExtension ".wav"; + ]; + ],[ + a pipedal_ui:fileProperty; + rdfs:label "Impulse File" ; + lv2:index 0 ; + pg:group cabir:impulseFile2Group ; + + pipedal_ui:patchProperty cabir:impulseFile2 ; + pipedal_ui:directory "CabIR"; + pipedal_ui:fileTypes + [ + a pipedal_ui:fileType; + rdfs:label "WAV File"; + pipedal_ui:fileExtension ".wav"; + ]; + ],[ + a pipedal_ui:fileProperty; + rdfs:label "Impulse File" ; + lv2:index 0 ; + pg:group cabir:impulseFile3Group ; + + pipedal_ui:patchProperty cabir:impulseFile3 ; + pipedal_ui:directory "CabIR"; + pipedal_ui:fileTypes + [ + a pipedal_ui:fileType; + rdfs:label "WAV File"; + pipedal_ui:mimeType "audio/wav"; + ], + [ + a pipedal_ui:fileType; + rdfs:label "FLAC File"; + pipedal_ui:mimeType "audio/flac"; + ]; + ]; + ui:portNotification + [ + lv2:symbol "loading_state"; + ui:plugin ; + ui:protocol ui:floatProtocol; + # pipedal_ui:style pipedal_ui:text ; + # pipedal_ui:redLevel 0; + # pipedal_ui:yellowLevel -12; + # ui:portIndex 3; + + ] + . diff --git a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl index a9231d6..fa9b6ed 100644 --- a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl @@ -25,10 +25,10 @@ @prefix xsd: . -@prefix toobConvolutionReverb: . -@prefix toobImpulse: . - -toobImpulse:#impulseFile +@prefix toobcr: . +@prefix toobimpulse: . + +toobimpulse:impulseFile a rdf:property; rdfs:label "File"; rdfs:range atom:Path. @@ -154,16 +154,17 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 mod:brand "TooB"; mod:label "Convolution Reverb"; - lv2:requiredFeature urid:map ; + lv2:requiredFeature urid:map, state:makePath, state:mapPath ; + lv2:optionalFeature state::freePath; lv2:extensionData state:interface; lv2:optionalFeature lv2:hardRTCapable; patch:readable - toobImpulse:#impulseFile + toobimpulse:impulseFile ; patch:writable - toobImpulse:#impulseFile + toobimpulse:impulseFile ; lv2:extensionData state:interface, work:interface; @@ -220,6 +221,27 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 lv2:maximum 20.0 ; units:unit units:db ; + lv2:scalePoint [ + rdfs:label "-INF" ; + rdf:value -40.0 + ]; + rdfs:comment "Reverb mix. Set to minimum to disable." ; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 3 ; + lv2:portProperty epp:notOnGUI; + + lv2:symbol "reverb_mix2" ; + lv2:name "IR Mix"; + + lv2:default -10.0 ; + lv2:minimum -40.0 ; + lv2:maximum 20.0 ; + units:unit units:db ; + lv2:scalePoint [ rdfs:label "-INF" ; rdf:value -40.0 @@ -230,7 +252,28 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 a lv2:InputPort , lv2:ControlPort ; - lv2:index 3 ; + lv2:index 4 ; + lv2:portProperty epp:notOnGUI; + lv2:symbol "reverb_mix3" ; + lv2:name "IR Mix"; + + lv2:default -10.0 ; + lv2:minimum -40.0 ; + lv2:maximum 20.0 ; + units:unit units:db ; + + lv2:scalePoint [ + rdfs:label "-INF" ; + rdf:value -40.0 + ]; + rdfs:comment "Reverb mix. Set to minimum to disable." ; + ], + + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 5 ; lv2:symbol "predelay" ; lv2:name "Predelay"; @@ -255,7 +298,7 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 a lv2:OutputPort , lv2:ControlPort ; - lv2:index 4 ; + lv2:index 6 ; lv2:symbol "loading_state" ; lv2:name "Status"; @@ -295,14 +338,14 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 [ a lv2:AudioPort , lv2:InputPort ; - lv2:index 5 ; + lv2:index 7 ; lv2:symbol "in" ; lv2:name "In" ], [ a lv2:AudioPort , lv2:OutputPort ; - lv2:index 6 ; + lv2:index 8 ; lv2:symbol "out" ; lv2:name "Out" ], @@ -314,7 +357,7 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 lv2:designation lv2:control ; atom:supports patch:Message ; - lv2:index 7 ; + lv2:index 9 ; lv2:symbol "control" ; lv2:name "Control" ; rdfs:comment "Control" ; @@ -324,7 +367,7 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 atom:bufferType atom:Sequence ; atom:supports patch:Message; lv2:designation lv2:control ; - lv2:index 8; + lv2:index 10; lv2:symbol "notify" ; lv2:name "Notify" ; rdfs:comment "Notification" ; @@ -332,23 +375,28 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 . - pipedal_ui:ui toobConvolutionReverb:ui . + pipedal_ui:ui toobcr:ui . -toobConvolutionReverb:ui +toobcr:ui a pipedal_ui:ui ; pipedal_ui:fileProperties [ a pipedal_ui:fileProperty; rdfs:label "Impulse File" ; lv2:index 4 ; - pipedal_ui:patchProperty toobImpulse:impulseFile ; + pipedal_ui:patchProperty toobimpulse:impulseFile ; pipedal_ui:directory "ReverbImpulseFiles"; pipedal_ui:fileTypes [ a pipedal_ui:fileType; rdfs:label "WAV File"; - pipedal_ui:fileExtension ".wav"; - ]; + pipedal_ui:mimeType "audio/wav"; + ], + [ + a pipedal_ui:fileType; + rdfs:label "FLAC File"; + pipedal_ui:mimeType "audio/flac"; + ] ; ]; ui:portNotification [ diff --git a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.0 b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.0 index 3223651..de69364 120000 --- a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.0 +++ b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.0 @@ -1 +1 @@ -ToobAmp.so.0.1.7 \ No newline at end of file +ToobAmp.so.1.0.8 \ No newline at end of file diff --git a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.1.0.8 b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.1.0.8 new file mode 100644 index 0000000..9ad700b Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.1.0.8 differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s UK 001.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s UK 001.wav new file mode 100644 index 0000000..fed0220 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s UK 001.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s UK 002.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s UK 002.wav new file mode 100644 index 0000000..d3ad48e Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s UK 002.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s US 001.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s US 001.wav new file mode 100644 index 0000000..aeb26bd Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s US 001.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s US 002.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s US 002.wav new file mode 100644 index 0000000..289ddd0 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/80s US 002.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/AK_License.txt b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/AK_License.txt new file mode 100644 index 0000000..1c98d02 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/AK_License.txt @@ -0,0 +1,26 @@ +The following files have been graciously provided by Kristoffer Ekstrand (akak Adventure Kid), +and are licensed under a CC-BY-4.0 license: + +https://creativecommons.org/licenses/by/4.0/ + +80s UK 001.wav +80s UK 002.wav +80s US 001.wav +80s US 002.wav +Modern UK 001.wav +Modern UK 002.wav +Modern US 001.wav +Modern US 002.wav +Modern US 003.wav +Modern US 004.wav +Radio 001.wav +Speaker 001.wav +Speaker 002.wav +Vintage UK 001.wav +Vintage UK 002.wav +Vintage US 001.wav +Vintage US 002.wav + +By: Adventure Kid Research & Technology, Kristoffer Ekstrand. + +Source: https://www.adventurekid.se/akrt/free-reverb-impulse-responses/ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern UK 001.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern UK 001.wav new file mode 100644 index 0000000..91227c5 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern UK 001.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern UK 002.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern UK 002.wav new file mode 100644 index 0000000..0aff93c Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern UK 002.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 001.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 001.wav new file mode 100644 index 0000000..5f55247 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 001.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 002.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 002.wav new file mode 100644 index 0000000..aa6ad67 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 002.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 003.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 003.wav new file mode 100644 index 0000000..da81236 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 003.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 004.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 004.wav new file mode 100644 index 0000000..243abe5 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Modern US 004.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Radio 001.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Radio 001.wav new file mode 100644 index 0000000..474b605 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Radio 001.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Speaker 001.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Speaker 001.wav new file mode 100644 index 0000000..ae4f8a3 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Speaker 001.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Speaker 002.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Speaker 002.wav new file mode 100644 index 0000000..dcd7ddc Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Speaker 002.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage UK 001.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage UK 001.wav new file mode 100644 index 0000000..556d969 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage UK 001.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage UK 002.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage UK 002.wav new file mode 100644 index 0000000..28f1a9c Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage UK 002.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage US 001.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage US 001.wav new file mode 100644 index 0000000..a827d53 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage US 001.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage US 002.wav b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage US 002.wav new file mode 100644 index 0000000..14cc68b Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/CabIR/Vintage US 002.wav differ diff --git a/lv2/aarch64/ToobAmp.lv2/impulseFiles/reverb/tmp b/lv2/aarch64/ToobAmp.lv2/impulseFiles/reverb/tmp new file mode 100644 index 0000000..ad4e0fe Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/impulseFiles/reverb/tmp differ diff --git a/lv2/aarch64/ToobAmp.lv2/manifest.ttl b/lv2/aarch64/ToobAmp.lv2/manifest.ttl index b24ec53..7a0b9f8 100644 --- a/lv2/aarch64/ToobAmp.lv2/manifest.ttl +++ b/lv2/aarch64/ToobAmp.lv2/manifest.ttl @@ -11,12 +11,17 @@ lv2:binary ; rdfs:seeAlso . + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . + a lv2:Plugin ; lv2:binary ; rdfs:seeAlso . + a lv2:Plugin ; lv2:binary ; rdfs:seeAlso . @@ -52,231 +57,231 @@ - - modgui:gui [ - modgui:resourcesDirectory ; - modgui:iconTemplate ; - modgui:stylesheet ; - modgui:screenshot ; - modgui:thumbnail ; - modgui:javascript ; +# +# modgui:gui [ +# modgui:resourcesDirectory ; +# modgui:iconTemplate ; +# modgui:stylesheet ; +# modgui:screenshot ; +# modgui:thumbnail ; +# modgui:javascript ; - modgui:brand "TooB" ; - modgui:label "TooB Power Stage" ; +# modgui:brand "TooB" ; +# modgui:label "TooB Power Stage" ; - modgui:monitoredOutputs [ lv2:symbol "notify"] ; - modgui:port [ - lv2:index 0 ; - lv2:symbol "trim1" ; - lv2:name "TRIM" ; - ] , [ - lv2:index 1 ; - lv2:symbol "gain1" ; - lv2:name "GAIN" ; - ] , [ - lv2:index 2 ; - lv2:symbol "locut1" ; - lv2:name "LO CUT" ; - ] , [ - lv2:index 3 ; - lv2:symbol "hicut1" ; - lv2:name "HI CUT" ; - ], [ - lv2:index 22 ; - lv2:symbol "shape1" ; - lv2:name "SHAPE1" ; - ], [ - lv2:index 4 ; - lv2:symbol "gain2_enable" ; - lv2:name "Ena" ; - ] , [ - lv2:index 5 ; - lv2:symbol "trim2" ; - lv2:name "TRIM" ; - ] , [ - lv2:index 6 ; - lv2:symbol "gain2" ; - lv2:name "GAIN" ; - ] , [ - lv2:index 7 ; - lv2:symbol "locut2" ; - lv2:name "LO CUT" ; - ] , [ - lv2:index 8 ; - lv2:symbol "hicut2" ; - lv2:name "HI CUT" ; - ], [ - lv2:index 23 ; - lv2:symbol "shape2" ; - lv2:name "SHAPE2" ; - ] , [ - lv2:index 9 ; - lv2:symbol "gain3_enable" ; - lv2:name "Ena" ; - ] , - [ - lv2:index 10 ; - lv2:symbol "trim3" ; - lv2:name "TRIM" ; - ] , [ - lv2:index 11 ; - lv2:symbol "gain3" ; - lv2:name "GAIN" ; - ] , [ - lv2:index 12 ; - lv2:symbol "locut3" ; - lv2:name "LO CUT" ; - ] , [ - lv2:index 13 ; - lv2:symbol "hicut3" ; - lv2:name "HI CUT" ; - ] , [ - lv2:index 24 ; - lv2:symbol "shape3" ; - lv2:name "SHAPE3" ; - ], [ - lv2:index 14 ; - lv2:symbol "sag" ; - lv2:name "SAG" ; - ] , [ - lv2:index 15 ; - lv2:symbol "sagd" ; - lv2:name "SAGD" ; - ], [ - lv2:index 16 ; - lv2:symbol "master" ; - lv2:name "MASTER" ; - ], - [ - a lv2:InputPort , - lv2:ControlPort ; +# modgui:monitoredOutputs [ lv2:symbol "notify"] ; +# modgui:port [ +# lv2:index 0 ; +# lv2:symbol "trim1" ; +# lv2:name "TRIM" ; +# ] , [ +# lv2:index 1 ; +# lv2:symbol "gain1" ; +# lv2:name "GAIN" ; +# ] , [ +# lv2:index 2 ; +# lv2:symbol "locut1" ; +# lv2:name "LO CUT" ; +# ] , [ +# lv2:index 3 ; +# lv2:symbol "hicut1" ; +# lv2:name "HI CUT" ; +# ], [ +# lv2:index 22 ; +# lv2:symbol "shape1" ; +# lv2:name "SHAPE1" ; +# ], [ +# lv2:index 4 ; +# lv2:symbol "gain2_enable" ; +# lv2:name "Ena" ; +# ] , [ +# lv2:index 5 ; +# lv2:symbol "trim2" ; +# lv2:name "TRIM" ; +# ] , [ +# lv2:index 6 ; +# lv2:symbol "gain2" ; +# lv2:name "GAIN" ; +# ] , [ +# lv2:index 7 ; +# lv2:symbol "locut2" ; +# lv2:name "LO CUT" ; +# ] , [ +# lv2:index 8 ; +# lv2:symbol "hicut2" ; +# lv2:name "HI CUT" ; +# ], [ +# lv2:index 23 ; +# lv2:symbol "shape2" ; +# lv2:name "SHAPE2" ; +# ] , [ +# lv2:index 9 ; +# lv2:symbol "gain3_enable" ; +# lv2:name "Ena" ; +# ] , +# [ +# lv2:index 10 ; +# lv2:symbol "trim3" ; +# lv2:name "TRIM" ; +# ] , [ +# lv2:index 11 ; +# lv2:symbol "gain3" ; +# lv2:name "GAIN" ; +# ] , [ +# lv2:index 12 ; +# lv2:symbol "locut3" ; +# lv2:name "LO CUT" ; +# ] , [ +# lv2:index 13 ; +# lv2:symbol "hicut3" ; +# lv2:name "HI CUT" ; +# ] , [ +# lv2:index 24 ; +# lv2:symbol "shape3" ; +# lv2:name "SHAPE3" ; +# ], [ +# lv2:index 14 ; +# lv2:symbol "sag" ; +# lv2:name "SAG" ; +# ] , [ +# lv2:index 15 ; +# lv2:symbol "sagd" ; +# lv2:name "SAGD" ; +# ], [ +# lv2:index 16 ; +# lv2:symbol "master" ; +# lv2:name "MASTER" ; +# ], +# [ +# a lv2:InputPort , +# lv2:ControlPort ; - lv2:index 21 ; - lv2:symbol "sagf" ; - lv2:name "SagF"; - ] - ; - ] . +# lv2:index 21 ; +# lv2:symbol "sagf" ; +# lv2:name "SagF"; +# ] +# ; +# ] . - - modgui:gui [ - modgui:resourcesDirectory ; - modgui:javascript ; - modgui:iconTemplate ; - modgui:stylesheet ; - modgui:screenshot ; - modgui:thumbnail ; +# +# modgui:gui [ +# modgui:resourcesDirectory ; +# modgui:javascript ; +# modgui:iconTemplate ; +# modgui:stylesheet ; +# modgui:screenshot ; +# modgui:thumbnail ; - modgui:brand "TooB" ; - modgui:label "TooB Input Stage" ; +# modgui:brand "TooB" ; +# modgui:label "TooB Input Stage" ; - modgui:monitoredOutputs [ lv2:symbol "notify"] ; - modgui:port [ - lv2:index 0 ; - lv2:symbol "trim" ; - lv2:name "Trim" ; - ] , [ - lv2:index 1 ; - lv2:symbol "locut" ; - lv2:name "Lo Cut" ; - ] , [ - lv2:index 2 ; - lv2:symbol "bright" ; - lv2:name "Bright" ; - ] , [ - lv2:index 3 ; - lv2:symbol "brightf" ; - lv2:name "Bright F" ; - ] , [ - lv2:index 4 ; - lv2:symbol "hicut" ; - lv2:name "Hi Cut" ; - ] , [ - lv2:index 5 ; - lv2:symbol "gate_t" ; - lv2:name "Gate T" ; - ] , [ - lv2:index 6 ; - lv2:symbol "boost" ; - lv2:name "Boost" ; - ] - ; - ] . +# modgui:monitoredOutputs [ lv2:symbol "notify"] ; +# modgui:port [ +# lv2:index 0 ; +# lv2:symbol "trim" ; +# lv2:name "Trim" ; +# ] , [ +# lv2:index 1 ; +# lv2:symbol "locut" ; +# lv2:name "Lo Cut" ; +# ] , [ +# lv2:index 2 ; +# lv2:symbol "bright" ; +# lv2:name "Bright" ; +# ] , [ +# lv2:index 3 ; +# lv2:symbol "brightf" ; +# lv2:name "Bright F" ; +# ] , [ +# lv2:index 4 ; +# lv2:symbol "hicut" ; +# lv2:name "Hi Cut" ; +# ] , [ +# lv2:index 5 ; +# lv2:symbol "gate_t" ; +# lv2:name "Gate T" ; +# ] , [ +# lv2:index 6 ; +# lv2:symbol "boost" ; +# lv2:name "Boost" ; +# ] +# ; +# ] . - - modgui:gui [ - modgui:resourcesDirectory ; - modgui:javascript ; - modgui:iconTemplate ; - modgui:stylesheet ; - modgui:screenshot ; - modgui:thumbnail ; +# +# modgui:gui [ +# modgui:resourcesDirectory ; +# modgui:javascript ; +# modgui:iconTemplate ; +# modgui:stylesheet ; +# modgui:screenshot ; +# modgui:thumbnail ; - modgui:brand "TooB" ; - modgui:label "TooB Cab Simulator" ; +# modgui:brand "TooB" ; +# modgui:label "TooB Cab Simulator" ; - modgui:monitoredOutputs [ lv2:symbol "notify"] ; - modgui:port [ - lv2:index 0 ; - lv2:symbol "locut" ; - lv2:name "Lo Cut" ; - ] , [ - lv2:index 1 ; - lv2:symbol "bright" ; - lv2:name "Bright" ; - ] , [ - lv2:index 2 ; - lv2:symbol "brightf" ; - lv2:name "F" ; - ] , [ - lv2:index 3 ; - lv2:symbol "hicut" ; - lv2:name "Hi Cut" ; - ], [ - lv2:index 4 ; - lv2:symbol "comb" ; - lv2:name "Comb" ; - ], [ - lv2:index 5 ; - lv2:symbol "combf" ; - lv2:name "F" ; - ], [ - lv2:index 6 ; - lv2:symbol "trim" ; - lv2:name "Trim" ; - ] - ; - ] . +# modgui:monitoredOutputs [ lv2:symbol "notify"] ; +# modgui:port [ +# lv2:index 0 ; +# lv2:symbol "locut" ; +# lv2:name "Lo Cut" ; +# ] , [ +# lv2:index 1 ; +# lv2:symbol "bright" ; +# lv2:name "Bright" ; +# ] , [ +# lv2:index 2 ; +# lv2:symbol "brightf" ; +# lv2:name "F" ; +# ] , [ +# lv2:index 3 ; +# lv2:symbol "hicut" ; +# lv2:name "Hi Cut" ; +# ], [ +# lv2:index 4 ; +# lv2:symbol "comb" ; +# lv2:name "Comb" ; +# ], [ +# lv2:index 5 ; +# lv2:symbol "combf" ; +# lv2:name "F" ; +# ], [ +# lv2:index 6 ; +# lv2:symbol "trim" ; +# lv2:name "Trim" ; +# ] +# ; +# ] . - - modgui:gui [ - modgui:resourcesDirectory ; - modgui:javascript ; - modgui:iconTemplate ; - modgui:stylesheet ; - modgui:screenshot ; - modgui:thumbnail ; +# +# modgui:gui [ +# modgui:resourcesDirectory ; +# modgui:javascript ; +# modgui:iconTemplate ; +# modgui:stylesheet ; +# modgui:screenshot ; +# modgui:thumbnail ; - modgui:brand "TooB" ; - modgui:label "TooB Tone Stack" ; +# modgui:brand "TooB" ; +# modgui:label "TooB Tone Stack" ; - modgui:monitoredOutputs [ lv2:symbol "notify"] ; - modgui:port [ - lv2:index 0 ; - lv2:symbol "bass" ; - lv2:name "Bass" ; - ] , [ - lv2:index 1 ; - lv2:symbol "mid" ; - lv2:name "Mid" ; - ], [ - lv2:index 2 ; - lv2:symbol "treble" ; - lv2:name "Treble" ; - ] , [ - lv2:index 3 ; - lv2:symbol "ampmodel" ; - lv2:name "Amp Model" ; - ] - ; - ] . \ No newline at end of file +# modgui:monitoredOutputs [ lv2:symbol "notify"] ; +# modgui:port [ +# lv2:index 0 ; +# lv2:symbol "bass" ; +# lv2:name "Bass" ; +# ] , [ +# lv2:index 1 ; +# lv2:symbol "mid" ; +# lv2:name "Mid" ; +# ], [ +# lv2:index 2 ; +# lv2:symbol "treble" ; +# lv2:name "Treble" ; +# ] , [ +# lv2:index 3 ; +# lv2:symbol "ampmodel" ; +# lv2:name "Amp Model" ; +# ] +# ; +# ] . \ No newline at end of file diff --git a/react/CMakeLists.txt b/react/CMakeLists.txt index ce21af3..d70a1f0 100644 --- a/react/CMakeLists.txt +++ b/react/CMakeLists.txt @@ -21,176 +21,206 @@ add_custom_command( WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/react DEPENDS - src/AlsaMidiDeviceInfo.tsx - src/SearchControl.tsx - src/SplitControlView.tsx - src/WifiConfigSettings.tsx - src/FullScreenIME.tsx + src/OkCancelDialog.tsx + src/PluginControl.tsx + src/reportWebVitals.ts src/JackHostStatus.tsx + src/PluginPresetsDialog.tsx + src/ToobSpectrumAnalyzerView.tsx + src/MidiBindingsDialog.tsx + src/MidiBinding.tsx + src/TemporaryDrawer.tsx + src/ToobFrequencyResponseView.tsx src/index.css - src/setupTests.ts - src/SearchFilter.tsx + src/PluginOutputControl.tsx + src/BankDialog.tsx + src/VuMeter.tsx + src/StringBuilder.tsx + src/FilePropertyDialog.tsx + src/GxTunerControl.tsx + src/App.tsx + src/GxTunerView.tsx + src/Rect.tsx + src/ToobSpectrumResponseView.tsx + src/DialogEx.tsx + src/GovernorSettings.tsx + src/FilePropertyControl.tsx + src/JackServerSettingsDialog.tsx + src/ZoomedUiControl.tsx + src/Pedal.tsx + src/FullScreenIME.tsx + src/PluginPreset.tsx + src/SystemMidiBindingsDialog.tsx + src/AppThemed.tsx src/MainPage.tsx src/PiPedalModel.tsx - src/AppThemed.css + src/PedalboardView.tsx + src/ControlViewFactory.tsx + src/PiPedalSocket.tsx + src/PluginClass.tsx + src/SplitControlView.tsx + src/logo.svg + src/ToobToneStackView.tsx + src/Banks.tsx + src/ToobPowerStage2View.tsx + src/ListSelectDialog.tsx + src/ToobWaveShapeView.tsx + src/PluginInfoDialog.tsx + src/SearchFilter.tsx + src/SearchControl.tsx + src/JackServerSettings.tsx + src/WifiChannel.tsx + src/WifiConfigDialog.tsx + src/App.test.tsx src/PluginPresetSelector.tsx - src/Pedal.tsx - src/ToobMLView.tsx - src/SettingsDialog.tsx + src/ObservableProperty.tsx + src/PresetDialog.tsx + src/AndroidHost.tsx + src/SelectHoverBackground.tsx src/WifiDirectConfigDialog.tsx src/WifiDirectConfigSettings.tsx - src/PiPedalSocket.tsx - src/ToobFrequencyResponseView.tsx - src/ControlViewFactory.tsx - src/Utility.tsx - src/ToobToneStackView.tsx - src/SelectHoverBackground.tsx - src/MidiBindingsDialog.tsx - src/TemporaryDrawer.tsx - src/GxTunerView.tsx - src/ToobInputStageView.tsx - src/DraggableGrid.tsx - src/JackStatusView.tsx - src/PluginControl.tsx - src/XxxSnippet.tsx - src/PluginPreset.tsx - src/Jack.tsx - src/AlsaDeviceInfo.tsx - src/MidiBinding.tsx - src/PiPedalError.tsx - src/IControlViewFactory.tsx - src/Lv2Plugin.tsx - src/Pedalboard.tsx - src/AndroidHost.tsx - src/PedalboardView.tsx - src/PresetDialog.tsx - src/AppThemed.tsx - src/ZoomedDial.tsx - src/RenameDialog.tsx - src/SplitUiControls.tsx - src/GovernorSettings.tsx - src/AboutDialog.tsx - src/ToobSpectrumResponseView.tsx - src/PluginControlView.tsx - src/NoChangePassword.tsx - src/ToobSpectrumAnalyzerView.tsx - src/MidiBindingView.tsx - src/GxTunerControl.tsx - src/Banks.tsx - src/PluginPresetsDialog.tsx - src/BankDialog.tsx - src/UploadPresetDialog.tsx - src/ToobPowerStage2View.tsx - src/index.tsx - src/Units.tsx - src/VuMeter.tsx - src/App.test.tsx - src/DialogEx.tsx - src/StringBuilder.tsx - src/SelectChannelsDialog.tsx + src/WifiConfigSettings.tsx src/Draggable.tsx - src/ZoomedUiControl.tsx - src/logo.svg - src/Rect.tsx - src/PluginClass.tsx - src/reportWebVitals.ts - src/PluginIcon.tsx - src/App.tsx - src/ResizeResponsiveComponent.tsx - src/SvgPathBuilder.tsx + src/JsonAtom.tsx + src/SplitUiControls.tsx + src/SelectChannelsDialog.tsx + src/ToobMLView.tsx + src/IControlViewFactory.tsx + src/AppThemed.css + src/ZoomedDial.tsx + src/Units.tsx + src/UploadPresetDialog.tsx src/NumericInput.tsx - src/JackServerSettings.tsx - src/ListSelectDialog.tsx - src/react-app-env.d.ts - src/JackServerSettingsDialog.tsx - src/ObservableProperty.tsx + src/Pedalboard.tsx src/SelectMidiChannelsDialog.tsx - src/WifiChannel.tsx - src/LoadPluginDialog.tsx - src/WifiConfigDialog.tsx - src/PluginInfoDialog.tsx - src/ToobWaveShapeView.tsx - src/ToobCabSimView.tsx + src/AlsaMidiDeviceInfo.tsx + src/ResizeResponsiveComponent.tsx + src/RenameDialog.tsx + src/SystemMidiBindingView.tsx + src/OldDeleteIcon.tsx + src/ToobInputStageView.tsx + src/XxxSnippet.tsx + src/NoChangePassword.tsx + src/react-app-env.d.ts + src/PiPedalError.tsx + src/AlsaDeviceInfo.tsx + src/index.tsx + src/SettingsDialog.tsx + src/PluginControlView.tsx src/PresetSelector.tsx - src/OkCancelDialog.tsx - - public/css/roboto.css - public/fonts/Roboto-BlackItalic.woff2 - public/fonts/Roboto-Black.woff2 - public/fonts/Roboto-BoldItalic.woff2 - public/fonts/Roboto-Bold.woff2 - public/fonts/Roboto-Italic.woff2 - public/fonts/Roboto-LightItalic.woff2 - public/fonts/Roboto-Light.woff2 - public/fonts/Roboto-MediumItalic.woff2 - public/fonts/Roboto-Medium.woff2 - public/fonts/Roboto-Regular.woff2 - public/fonts/Roboto-ThinItalic.woff2 - public/fonts/Roboto-Thin.woff2 - - public/iso_codes.json - public/logo512.png - public/index.html - public/manifest.json - public/var - public/var/current_pedalboard.json - public/var/uiplugins.json - public/var/config.json - public/var/plugin_classes.json - public/logo192.png - public/serve.json - public/robots.txt - public/sample_lv2_plugins.json - public/logo192x.png - public/img/fx_analyzer.svg - public/img/fx_flanger.svg - public/img/cx_stereo.svg - public/img/fx_split_a.svg - public/img/fx_dial.svg - public/img/drive_file_rename_outline_black_24dp.svg - public/img/fx_filter.svg - public/img/fx_filter_hp.svg - public/img/cx_mono.svg - public/img/fx_limiter.svg - public/img/fx_converter.svg - public/img/fx_simulator.svg - public/img/fx_delay.svg - public/img/fx_reverb.svg - public/img/fx_empty.svg - public/img/fx_eq.svg - public/img/edit_banks.svg - public/img/fx_gate.svg - public/img/settings_black_24dp.svg - public/img/help_outline_black_24dp.svg - public/img/fx_oscillator.svg - public/img/fx_split_b.svg - public/img/fx_phaser.svg - public/img/fx_amplifier.svg - public/img/fx_plugin.svg - public/img/ic_drawer.svg - public/img/ic_drawer_2.png - - public/img/fx_terminal.svg - public/img/fx_spatial.svg - public/img/fx_pitch.svg - public/img/ic_logo.svg - public/img/fx_flanger2.svg - public/img/fx_function.svg - public/img/fx_lr.svg - public/img/fx_generator.svg - public/img/fx_spectral.svg - public/img/fx_chorus.svg - public/img/fx_utility.svg - public/img/fx_mixer.svg - public/img/ic_presets.svg - public/img/fx_instrument.svg - public/img/fx_modulator.svg - public/img/fx_compressor.svg - public/img/fx_constant.svg - public/img/fx_distortion.svg - public/img/save_bank_as.svg - public/favicon.ico - + src/ToobCabSimView.tsx + src/Utility.tsx + src/Lv2Plugin.tsx + src/Jack.tsx + src/JackStatusView.tsx + src/AboutDialog.tsx + src/setupTests.ts + src/DraggableGrid.tsx + src/SvgPathBuilder.tsx + src/LoadPluginDialog.tsx + src/MidiBindingView.tsx + src/PluginIcon.tsx + src/UploadFileDialog.tsx + + public/ + public/css + public/css/roboto.css + public/logo192x.png + public/robots.txt + public/img + public/img/ic_drawer_2.png + public/img/fx_constant.svg + public/img/cx_mono.svg + public/img/cx_stereo.svg + public/img/fx_distortion.svg + public/img/fx_oscillator.svg + public/img/settings_black_24dp.svg + public/img/fx_filter.svg + public/img/delete_outline_black_24dp.svg + public/img/fx_function.svg + public/img/fx_generator.svg + public/img/old_delete_outline_black_24dp.svg + public/img/ic_bank.svg + public/img/fx_compressor.svg + public/img/file_download_black_24dp.svg + public/img/fx_filter_hp.svg + public/img/fx_plugin.svg + public/img/fx_error.svg + public/img/fx_gate.svg + public/img/cc-by.png + public/img/ic_midi.svg + public/img/ic_pluginpreset.svg + public/img/fx_split_a.svg + public/img/fx_utility.svg + public/img/ic_navigate_before.svg + public/img/ic_drawer_2.svg + public/img/ic_pluginpreset2.svg + public/img/fx_parametric_eq.svg + public/img/fx_terminal.svg + public/img/ic_presets.svg + public/img/VST_Logo_Steinberg.ico + public/img/fx_flanger.svg + public/img/fx_analyzer.svg + public/img/fx_delay.svg + public/img/fx_spectral.svg + public/img/edit_banks.svg + public/img/fx_chorus.svg + public/img/fx_simulator.svg + public/img/drive_file_rename_outline_black_24dp.svg + public/img/fx_mixer.svg + public/img/fx_eq.svg + public/img/fx_modulator.svg + public/img/file_upload_black_24dp.svg + public/img/fx_pitch.svg + public/img/ic_navigate_next.svg + public/img/fx_phaser.svg + public/img/ic_drawer.svg + public/img/fx_amplifier.svg + public/img/save_bank_as.svg + public/img/fx_lr.svg + public/img/fx_instrument.svg + public/img/fx_reverb.svg + public/img/fx_limiter.svg + public/img/VST_Logo_Steinberg.png + public/img/fx_empty.svg + public/img/fx_dial.svg + public/img/ic_logo.svg + public/img/help_outline_black_24dp.svg + public/img/fx_flanger2.svg + public/img/old_delete_outline_white_24dp.svg + public/img/fx_split_b.svg + public/img/fx_spatial.svg + public/img/fx_converter.svg + public/img/vst.svg + public/img/vst.png + public/sample_lv2_plugins.json + public/serve.json + public/fonts + public/fonts/Roboto-LightItalic.woff2 + public/fonts/Roboto-Light.woff2 + public/fonts/Roboto-BlackItalic.woff2 + public/fonts/Roboto-ThinItalic.woff2 + public/fonts/Roboto-Bold.woff2 + public/fonts/Roboto-Italic.woff2 + public/fonts/Roboto-Black.woff2 + public/fonts/Roboto-BoldItalic.woff2 + public/fonts/Roboto-Regular.woff2 + public/fonts/Roboto-Medium.woff2 + public/fonts/Roboto-Thin.woff2 + public/fonts/LICENSE.txt + public/fonts/Roboto-MediumItalic.woff2 + public/favicon.ico + public/iso_codes.json + public/logo192.png + public/logo512.png + public/index.html + public/manifest.json + public/var + public/var/config.json + public/var/current_pedalboard.json + public/var/uiplugins.json + public/var/plugin_classes.json + ) add_custom_target ( diff --git a/react/src/AppThemed.tsx b/react/src/AppThemed.tsx index 702d74f..d7fa9fc 100644 --- a/react/src/AppThemed.tsx +++ b/react/src/AppThemed.tsx @@ -837,9 +837,11 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent< > - { - this.model_.alertMessage.get() - } + + { + this.state.alertDialogMessage + } + diff --git a/react/src/FilePropertyControl.tsx b/react/src/FilePropertyControl.tsx index 8990edd..b09cf66 100644 --- a/react/src/FilePropertyControl.tsx +++ b/react/src/FilePropertyControl.tsx @@ -27,15 +27,12 @@ import { Theme } from '@mui/material/styles'; import { WithStyles } from '@mui/styles'; import createStyles from '@mui/styles/createStyles'; import withStyles from '@mui/styles/withStyles'; -import { PiPedalFileProperty } from './Lv2Plugin'; +import { UiFileProperty } from './Lv2Plugin'; import Typography from '@mui/material/Typography'; import { PiPedalModel, PiPedalModelFactory, ListenHandle, StateChangedHandle } from './PiPedalModel'; import ButtonBase from '@mui/material/ButtonBase' import MoreHorizIcon from '@mui/icons-material/MoreHoriz'; - - - - +import {PedalboardItem} from './Pedalboard'; export const StandardItemSize = { width: 80, height: 140 } @@ -73,13 +70,14 @@ const styles = (theme: Theme) => createStyles({ export interface FilePropertyControlProps extends WithStyles { - instanceId: number; - fileProperty: PiPedalFileProperty; - onFileClick: (fileProperty: PiPedalFileProperty, value: string) => void; + fileProperty: UiFileProperty; + pedalboardItem: PedalboardItem; + onFileClick: (fileProperty: UiFileProperty, value: string) => void; theme: Theme; } type FilePropertyControlState = { error: boolean; + hasValue: boolean; value: string; }; @@ -96,6 +94,7 @@ const FilePropertyControl = this.state = { error: false, + hasValue: false, value: "", }; this.model = PiPedalModelFactory.getInstance(); @@ -108,12 +107,12 @@ const FilePropertyControl = refreshPatchProperty() { - this.model.getPatchProperty(this.props.instanceId, this.props.fileProperty.patchProperty) + this.model.getPatchProperty(this.props.pedalboardItem.instanceId, this.props.fileProperty.patchProperty) .then( (json: any) => { if (json && json.otype_ === "Path") { let path = json.value as string; - this.setState({ value: path }); + this.setState({ value: path, hasValue: true }); } } ) @@ -138,7 +137,7 @@ const FilePropertyControl = } this.refreshPatchProperty(); this.stateChangedHandle = this.model.addLv2StateChangedListener( - this.props.instanceId, + this.props.pedalboardItem.instanceId, () => { this.refreshPatchProperty(); }); @@ -149,19 +148,25 @@ const FilePropertyControl = this.model.removeLv2StateChangedListener(this.stateChangedHandle); } } + private mounted: boolean = false; componentDidMount() { + this.mounted = true; this.subscribeToPropertyGet(); } componentWillUnmount() { this.unsubscribeToPropertyGet(); + this.mounted = false; } componentDidUpdate(prevProps: Readonly, prevState: Readonly, snapshot?: any): void { if (prevProps.fileProperty.patchProperty !== this.props.fileProperty.patchProperty - || prevProps.instanceId !== this.props.instanceId) { - this.setState({ value: "" }); + || prevProps.pedalboardItem.instanceId !== this.props.pedalboardItem.instanceId + || prevProps.pedalboardItem.stateUpdateCount !== this.props.pedalboardItem.stateUpdateCount + + ) { this.unsubscribeToPropertyGet(); this.subscribeToPropertyGet(); } + } @@ -193,9 +198,15 @@ const FilePropertyControl = //let classes = this.props.classes; let fileProperty = this.props.fileProperty; - let value = this.fileNameOnly(this.state.value); - if (!value || value.length === 0) { - value = "\u00A0"; + let value = "\u00A0"; + if (this.state.hasValue) + { + if (this.state.value.length === 0) + { + value = ""; + } else { + value = this.fileNameOnly(this.state.value); + } } let item_width = 264; diff --git a/react/src/FilePropertyDialog.tsx b/react/src/FilePropertyDialog.tsx index cc4ef23..1880e4b 100644 --- a/react/src/FilePropertyDialog.tsx +++ b/react/src/FilePropertyDialog.tsx @@ -33,7 +33,7 @@ import IconButton from '@mui/material/IconButton'; import OldDeleteIcon from './OldDeleteIcon'; import ResizeResponsiveComponent from './ResizeResponsiveComponent'; -import { PiPedalFileProperty } from './Lv2Plugin'; +import { UiFileProperty } from './Lv2Plugin'; import ButtonBase from '@mui/material/ButtonBase'; import Typography from '@mui/material/Typography'; import DialogEx from './DialogEx'; @@ -42,9 +42,9 @@ import OkCancelDialog from './OkCancelDialog'; export interface FilePropertyDialogProps { open: boolean, - fileProperty: PiPedalFileProperty, + fileProperty: UiFileProperty, selectedFile: string, - onOk: (fileProperty: PiPedalFileProperty, selectedItem: string) => void, + onOk: (fileProperty: UiFileProperty, selectedItem: string) => void, onCancel: () => void }; @@ -53,6 +53,8 @@ export interface FilePropertyDialogState { selectedFile: string; hasSelection: boolean; files: string[]; + columns: number; + columnWidth: number; openUploadFileDialog: boolean; openConfirmDeleteDialog: boolean; }; @@ -70,13 +72,33 @@ export default class FilePropertyDialog extends ResizeResponsiveComponent { if (this.mounted) { + files.splice(0,0,""); this.setState({ files: files, hasSelection: this.isFileInList(files, this.state.selectedFile) }); } }).catch((error) => { @@ -98,10 +121,39 @@ export default class FilePropertyDialog extends ResizeResponsiveComponent, prevState: Readonly, snapshot?: any): void { super.componentDidUpdate?.(prevProps, prevState, snapshot); @@ -118,6 +171,11 @@ export default class FilePropertyDialog extends ResizeResponsiveComponent this.props.onCancel()} open={this.props.open} tag="FilePropertyDialog" fullWidth maxWidth="xl" style={{ height: "90%" }} @@ -223,22 +287,40 @@ export default class FilePropertyDialog extends ResizeResponsiveComponent
 
-
-
+
+
this.onMeasureRef(element)} + style={{ flex: "1 1 100%", display: "flex", flexFlow: "row wrap", + justifyContent: "flex-start", alignContent: "flex-start", paddingLeft: 16, paddingTop: 16,paddingBottom: 16 }}> { + (this.state.columns !== 0) && // don't render until we have number of columns derived from layout. this.state.files.map( (value: string, index: number) => { + let displayValue = value; + if (displayValue === "") + { + displayValue = ""; + } else { + displayValue = this.fileNameOnly(value); + } let selected = value === this.state.selectedFile; let selectBg = selected ? "rgba(0,0,0,0.15)" : "rgba(0,0,0,0.0)"; + let scrollRef: ((element: HTMLDivElement | null) => void) | undefined = undefined; + if (selected) + { + scrollRef = (element)=> { this.onScrollRef(element)}; + } + return ( this.onSelectValue(value)} onDoubleClick={()=> {this.onDoubleClickValue(value);}} > -
-
+
+
- {this.fileNameOnly(value)} + {displayValue}
); @@ -265,7 +347,11 @@ export default class FilePropertyDialog extends ResizeResponsiveComponent { this.props.onCancel(); }} aria-label="cancel"> Cancel -
diff --git a/react/src/Lv2Plugin.tsx b/react/src/Lv2Plugin.tsx index 7265a1b..af174da 100644 --- a/react/src/Lv2Plugin.tsx +++ b/react/src/Lv2Plugin.tsx @@ -107,23 +107,78 @@ export class PortGroup { program_list_id: number = -1; }; -export class PiPedalFileType { - deserialize(input: any): PiPedalFileType { +export class UiFileType { + deserialize(input: any): UiFileType { this.name = input.name; this.fileExtension = input.fileExtension; + this.mimeType = input.mimeType; return this; } - static deserialize_array(input: any): PiPedalFileType[] + static deserialize_array(input: any): UiFileType[] { - let result: PiPedalFileType[] = []; + let result: UiFileType[] = []; for (let i = 0; i < input.length; ++i) { - result[i] = new PiPedalFileType().deserialize(input[i]); + result[i] = new UiFileType().deserialize(input[i]); + } + return result; + } + + private static IsAndroid() : boolean + { + return /Android/i.test(navigator.userAgent); + } + static MergeMimeTypes(fileTypes: UiFileType[]): string + { + if (fileTypes.length === 0) { + return ""; + } + let result = fileTypes[0].mimeType; + for (let i = 1; i < fileTypes.length; ++i) + { + let fileType = fileTypes[i]; + if (fileType.mimeType !== result) + { + if (result.startsWith("audio/") && fileType.mimeType.startsWith("audio/")) + { + result = "audio/*"; + } else if (result.startsWith("video/") && fileType.mimeType.startsWith("video/")) + { + result = "video/*"; + } else if (result.startsWith("text/") && fileType.mimeType.startsWith("text/")) + { + result = "text/*"; + } else { + result = "application/octet-stream"; + } + } + } + if (this.IsAndroid()) + { + if (result.startsWith("audio/")) result = "audio/*"; + if (result.startsWith("video/")) result = "video/*"; + if (result.startsWith("text/")) result = "text/*"; + } else { + // chrome desktop thinks "application/octet-stream" is .exe, .com, or .bat. + // Feed it file extensions isntead. + if (result = "application/octet-stream") + { + result = ""; + for (let i = 0; i < fileTypes.length; ++i) + { + if (i !== 0) + { + result += ','; + } + result += fileTypes[i].fileExtension; + } + } } return result; } name: string = ""; fileExtension: string = ""; + mimeType: string = ""; } export class UiPropertyNotification { @@ -150,23 +205,23 @@ export class UiPropertyNotification { protocol: string = ""; }; -export class PiPedalFileProperty { - deserialize(input: any): PiPedalFileProperty +export class UiFileProperty { + deserialize(input: any): UiFileProperty { this.label = input.label; - this.fileTypes = PiPedalFileType.deserialize_array(input.fileTypes); + this.fileTypes = UiFileType.deserialize_array(input.fileTypes); this.patchProperty = input.patchProperty; this.directory = input.directory; this.index = input.index; this.portGroup = input.portGroup; return this; } - static deserialize_array(input: any): PiPedalFileProperty[] + static deserialize_array(input: any): UiFileProperty[] { - let result: PiPedalFileProperty[] = []; + let result: UiFileProperty[] = []; for (let i = 0; i < input.length; ++i) { - result[i] = new PiPedalFileProperty().deserialize(input[i]); + result[i] = new UiFileProperty().deserialize(input[i]); } return result; } @@ -191,7 +246,7 @@ export class PiPedalFileProperty { if (this.fileTypes.length === 0) { return true; } - let extension = PiPedalFileProperty.getFileExtension(filename); + let extension = UiFileProperty.getFileExtension(filename); for (let fileType of this.fileTypes) { if (fileType.fileExtension === extension ) @@ -203,7 +258,7 @@ export class PiPedalFileProperty { } label: string = ""; - fileTypes: PiPedalFileType[] = []; + fileTypes: UiFileType[] = []; patchProperty: string = ""; directory: string = ""; index: number = -1; @@ -226,7 +281,7 @@ export class Lv2Plugin implements Deserializable { this.port_groups = PortGroup.deserialize_array(input.port_groups); if (input.fileProperties) { - this.fileProperties = PiPedalFileProperty.deserialize_array(input.fileProperties) + this.fileProperties = UiFileProperty.deserialize_array(input.fileProperties) } else { this.fileProperties = []; } @@ -251,7 +306,7 @@ export class Lv2Plugin implements Deserializable { comment: string = ""; ports: Port[] = Port.EmptyPorts; port_groups: PortGroup[] = []; - fileProperties: PiPedalFileProperty[] = []; + fileProperties: UiFileProperty[] = []; uiPortNotifications: UiPropertyNotification[] = []; } @@ -508,7 +563,7 @@ export class UiControl implements Deserializable { } formatDisplayValue(value: number): string { - if (this.integer_property || this.enumeration_property) { + if (this.integer_property) { value = Math.round(value); } @@ -614,7 +669,7 @@ export class UiPlugin implements Deserializable { this.port_groups = PortGroup.deserialize_array(input.port_groups); if (input.fileProperties) { - this.fileProperties = PiPedalFileProperty.deserialize_array(input.fileProperties) + this.fileProperties = UiFileProperty.deserialize_array(input.fileProperties) } else { this.fileProperties = []; } @@ -682,7 +737,7 @@ export class UiPlugin implements Deserializable { description: string = ""; controls: UiControl[] = []; port_groups: PortGroup[] = []; - fileProperties: PiPedalFileProperty[] = []; + fileProperties: UiFileProperty[] = []; is_vst3 : boolean = false; } diff --git a/react/src/Pedalboard.tsx b/react/src/Pedalboard.tsx index 093bf2e..44d78e7 100644 --- a/react/src/Pedalboard.tsx +++ b/react/src/Pedalboard.tsx @@ -67,6 +67,7 @@ export class PedalboardItem implements Deserializable { this.controlValues = ControlValue.deserializeArray(input.controlValues); this.vstState = input.vstState ?? ""; + this.stateUpdateCount = input.stateUpdateCount; this.lv2State = input.lv2State; return this; } @@ -195,6 +196,7 @@ export class PedalboardItem implements Deserializable { controlValues: ControlValue[] = ControlValue.EmptyArray; midiBindings: MidiBinding[] = []; vstState: string = ""; + stateUpdateCount: number = 0; lv2State: [boolean,any] = [false,{}] }; diff --git a/react/src/PiPedalModel.tsx b/react/src/PiPedalModel.tsx index faae50a..a5c8e1e 100644 --- a/react/src/PiPedalModel.tsx +++ b/react/src/PiPedalModel.tsx @@ -17,7 +17,7 @@ // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -import { UiPlugin, UiControl, PluginType, PiPedalFileProperty } from './Lv2Plugin'; +import { UiPlugin, UiControl, PluginType, UiFileProperty } from './Lv2Plugin'; import { PiPedalArgumentError, PiPedalStateError } from './PiPedalError'; @@ -588,6 +588,10 @@ export class PiPedalModel //implements PiPedalModel } else if (message === "onSystemMidiBindingsChanged") { let bindings = MidiBinding.deserialize_array(body); this.systemMidiBindings.set(bindings); + } else if (message === "onErrorMessage") + { + this.showAlert(body as string); + } else { throw new PiPedalStateError("Unrecognized message received from server: " + message); } @@ -1054,6 +1058,8 @@ export class PiPedalModel //implements PiPedalModel handleOnLoadPluginPreset(instanceId: number, controlValues: ControlValue[]) { + // note that plugins with state are dealt with server-side. + // if we made it here, we can just load the controls. let pedalboard = this.pedalboard.get(); if (pedalboard === undefined) throw new PiPedalStateError("Pedalboard not ready."); let newPedalboard = pedalboard.clone(); @@ -1342,13 +1348,15 @@ export class PiPedalModel //implements PiPedalModel while (true) { let v = it.next(); if (v.done) break; - let item = v.value; + let item = v.value; if (item.instanceId === itemId) { + item.deserialize(new PedalboardItem()); // skeezy way to re-initialize. item.instanceId = ++newPedalboard.nextInstanceId; item.uri = selectedUri; item.pluginName = plugin.name; item.controlValues = this.getDefaultValues(item.uri); item.isEnabled = true; + // lv2State: not valid. vstState : not valid. this.pedalboard.set(newPedalboard); this.updateServerPedalboard() return item.instanceId; @@ -1590,7 +1598,7 @@ export class PiPedalModel //implements PiPedalModel }); } - requestFileList(piPedalFileProperty: PiPedalFileProperty): Promise { + requestFileList(piPedalFileProperty: UiFileProperty): Promise { return nullCast(this.webSocket) .request('requestFileList', piPedalFileProperty); } diff --git a/react/src/PluginControlView.tsx b/react/src/PluginControlView.tsx index 6645c1b..62be402 100644 --- a/react/src/PluginControlView.tsx +++ b/react/src/PluginControlView.tsx @@ -23,7 +23,7 @@ import { WithStyles } from '@mui/styles'; import createStyles from '@mui/styles/createStyles'; import withStyles from '@mui/styles/withStyles'; import { PiPedalModel, PiPedalModelFactory } from './PiPedalModel'; -import { UiPlugin, UiControl, PiPedalFileProperty, ScalePoint } from './Lv2Plugin'; +import { UiPlugin, UiControl, UiFileProperty, ScalePoint } from './Lv2Plugin'; import { Pedalboard, PedalboardItem, ControlValue } from './Pedalboard'; @@ -239,7 +239,7 @@ type PluginControlViewState = { imeCaption: string; imeInitialHeight: number; showFileDialog: boolean, - dialogFileProperty: PiPedalFileProperty, + dialogFileProperty: UiFileProperty, dialogFileValue: string }; @@ -260,7 +260,7 @@ const PluginControlView = imeCaption: "", imeInitialHeight: 0, showFileDialog: false, - dialogFileProperty: new PiPedalFileProperty(), + dialogFileProperty: new UiFileProperty(), dialogFileValue: "" } @@ -323,10 +323,10 @@ const PluginControlView = }); } - makeFilePropertyUI(fileProperty: PiPedalFileProperty): ReactNode { + makeFilePropertyUI(fileProperty: UiFileProperty): ReactNode { return (( - { this.setState({ showFileDialog: true, dialogFileProperty: fileProperty, dialogFileValue: selectedFile }); diff --git a/react/src/PluginPresetsDialog.tsx b/react/src/PluginPresetsDialog.tsx index d7ff77e..acd54b8 100644 --- a/react/src/PluginPresetsDialog.tsx +++ b/react/src/PluginPresetsDialog.tsx @@ -259,7 +259,7 @@ const PluginPresetsDialog = withStyles(styles, { withTheme: true })(
- noWrap + {presetEntry.label}
diff --git a/react/src/SelectHoverBackground.tsx b/react/src/SelectHoverBackground.tsx index 09588d3..ea0fc20 100644 --- a/react/src/SelectHoverBackground.tsx +++ b/react/src/SelectHoverBackground.tsx @@ -80,13 +80,10 @@ export const SelectHoverBackground = } handleMouseOver(e: SyntheticEvent): void { - console.log("onMouseOver") if (this.props.showHover ?? true) { if (this.hoverElementRef.current) { this.hoverElementRef.current.style.display = "block"; - } else { - console.log("No hoverElementRef") } } @@ -96,9 +93,7 @@ export const SelectHoverBackground = if (this.hoverElementRef.current) { this.hoverElementRef.current.style.display = "none"; - } else { - console.log("No hoverElementRef") - } + } } } diff --git a/react/src/UploadFileDialog.tsx b/react/src/UploadFileDialog.tsx index 477e14f..cfb8444 100644 --- a/react/src/UploadFileDialog.tsx +++ b/react/src/UploadFileDialog.tsx @@ -27,7 +27,7 @@ import DialogActions from '@mui/material/DialogActions'; import DialogContent from '@mui/material/DialogContent'; import ResizeResponsiveComponent from './ResizeResponsiveComponent'; import Typography from '@mui/material/Typography'; -import { PiPedalFileProperty } from './Lv2Plugin'; +import { UiFileProperty,UiFileType } from './Lv2Plugin'; import SvgIcon from '@mui/material/SvgIcon'; import ErrorIcon from '@mui/icons-material/Error'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; @@ -45,7 +45,7 @@ export interface UploadFileDialogProps { onClose: () => void, onUploaded: (fileName: string) => void, uploadPage: string, - fileProperty: PiPedalFileProperty + fileProperty: UiFileProperty }; @@ -204,6 +204,10 @@ export default class UploadFileDialog extends ResizeResponsiveComponent) { + private static IsAndroid() : boolean + { + return /Android/i.test(navigator.userAgent); + } + + handleButtonSelect(e: any) { if (e.currentTarget.files) { this.uploadFiles(e.currentTarget.files); } @@ -290,20 +299,13 @@ export default class UploadFileDialog extends ResizeResponsiveComponent this.handleClose()} fullScreen={this.state.fullScreen} @@ -321,7 +323,7 @@ export default class UploadFileDialog extends ResizeResponsiveComponent
{!this.hasFileList() && ( - Drop files here + + { isAndroid? "Select files": "Drop files here" } )} {this.hasFileList() && (
@@ -381,15 +384,15 @@ export default class UploadFileDialog extends ResizeResponsiveComponent
diff --git a/react/tmp.txt b/react/tmp.txt deleted file mode 100644 index 86dae80..0000000 --- a/react/tmp.txt +++ /dev/null @@ -1,81 +0,0 @@ -src/SearchControl.tsx -src/SplitControlView.tsx -src/WifiConfigSettings.tsx -src/FullScreenIME.tsx -src/JackHostStatus.tsx -src/SearchFilter.tsx -src/MainPage.tsx -src/PiPedalModel.tsx -src/PluginPresetSelector.tsx -src/Pedal.tsx -src/ToobMLView.tsx -src/SettingsDialog.tsx -src/PiPedalSocket.tsx -src/ToobFrequencyResponseView.tsx -src/ControlViewFactory.tsx -src/Utility.tsx -src/ToobToneStackView.tsx -src/SelectHoverBackground.tsx -src/MidiBindingsDialog.tsx -src/TemporaryDrawer.tsx -src/GxTunerView.tsx -src/ToobInputStageView.tsx -src/DraggableGrid.tsx -src/JackStatusView.tsx -src/PluginControl.tsx -src/XxxSnippet.tsx -src/PluginPreset.tsx -src/Jack.tsx -src/AlsaDeviceInfo.tsx -src/MidiBinding.tsx -src/PiPedalError.tsx -src/IControlViewFactory.tsx -src/Lv2Plugin.tsx -src/Pedalboard.tsx -src/PedalboardView.tsx -src/PresetDialog.tsx -src/AppThemed.tsx -src/ZoomedDial.tsx -src/RenameDialog.tsx -src/SplitUiControls.tsx -src/GovernorSettings.tsx -src/AboutDialog.tsx -src/ToobSpectrumResponseView.tsx -src/PluginControlView.tsx -src/NoChangePassword.tsx -src/ToobSpectrumAnalyzerView.tsx -src/MidiBindingView.tsx -src/GxTunerControl.tsx -src/Banks.tsx -src/PluginPresetsDialog.tsx -src/BankDialog.tsx -src/UploadPresetDialog.tsx -src/ToobPowerStage2View.tsx -src/index.tsx -src/Units.tsx -src/VuMeter.tsx -src/App.test.tsx -src/DialogEx.tsx -src/StringBuilder.tsx -src/SelectChannelsDialog.tsx -src/Draggable.tsx -src/ZoomedUiControl.tsx -src/Rect.tsx -src/PluginClass.tsx -src/PluginIcon.tsx -src/App.tsx -src/ResizeResponsiveComponent.tsx -src/SvgPathBuilder.tsx -src/NumericInput.tsx -src/JackServerSettings.tsx -src/ListSelectDialog.tsx -src/JackServerSettingsDialog.tsx -src/ObservableProperty.tsx -src/SelectMidiChannelsDialog.tsx -src/WifiChannel.tsx -src/LoadPluginDialog.tsx -src/WifiConfigDialog.tsx -src/PluginInfoDialog.tsx -src/ToobWaveShapeView.tsx -src/ToobCabSimView.tsx -src/PresetSelector.tsx diff --git a/reset_presets b/reset_presets new file mode 100755 index 0000000..fbd6ea5 --- /dev/null +++ b/reset_presets @@ -0,0 +1,8 @@ +#!/usr/bin/bash +# Set presets and plugin presets to default. +rm -rf /var/pipedal/plugin_presets +rm -rf /var/pipedal/presets +mkdir /var/pipedal/plugin_presets +mkdir /var/pipedal/presets +cp -r default_presets/plugin_presets /var/pipedal/plugin_presets/ +cp -r default_presets/presets /var/pipedal/presets/ diff --git a/src/AudioHost.cpp b/src/AudioHost.cpp index 22a8459..cc51c83 100644 --- a/src/AudioHost.cpp +++ b/src/AudioHost.cpp @@ -349,7 +349,6 @@ private: audioDriver->Close(); StopReaderThread(); - pHost->GetHostWorkerThread()->Close(); // release any pdealboards owned by the process thread. @@ -1164,6 +1163,21 @@ public: RealtimeNextMidiProgramRequest request; hostReader.read(&request); pNotifyCallbacks->OnNotifyNextMidiProgram(request); + } else if (command == RingBufferCommand::Lv2ErrorMessage) + { + size_t size; + int64_t instanceId; + hostReader.read(&instanceId); + hostReader.read(&size); + if (this->atomBuffer.size() < size+1) + { + this->atomBuffer.resize(size+1); + } + hostReader.read(size, &(atomBuffer[0])); + char *p = (char*)&(atomBuffer[0]); + p[size] = 0; + std::string message(p); + pNotifyCallbacks->OnNotifyLv2RealtimeError(instanceId,message); } else { @@ -1243,6 +1257,10 @@ public: this->inputRingBuffer.reset(); this->outputRingBuffer.reset(); + this->hostReader.Reset(); + this->hostWriter.Reset(); + this->realtimeReader.Reset(); + this->realtimeWriter.Reset(); this->channelSelection = channelSelection; diff --git a/src/AudioHost.hpp b/src/AudioHost.hpp index 9c43b91..ad86f7c 100644 --- a/src/AudioHost.hpp +++ b/src/AudioHost.hpp @@ -154,6 +154,7 @@ public: virtual void OnNotifyMidiProgramChange(RealtimeMidiProgramRequest&midiProgramRequest) = 0; virtual void OnNotifyNextMidiProgram(const RealtimeNextMidiProgramRequest&request) = 0; + virtual void OnNotifyLv2RealtimeError(int64_t instanceId,const std::string &error) = 0; }; @@ -195,6 +196,7 @@ public: virtual void SetListenForAtomOutput(bool listen) = 0; virtual void UpdatePluginStates(Pedalboard& pedalboard) = 0; + virtual void UpdatePluginState(PedalboardItem& pedalboardItem) = 0; virtual void Open(const JackServerSettings&jackServerSettings,const JackChannelSelection & channelSelection) = 0; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0bcb15f..d854595 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -141,6 +141,8 @@ else() endif() set (PIPEDAL_SOURCES + MimeTypes.cpp MimeTypes.hpp + inverting_mutex.hpp DbDezipper.hpp DbDezipper.cpp WebServerLog.hpp @@ -277,6 +279,8 @@ target_link_libraries(pipedald PRIVATE ################################# add_executable(pipedaltest testMain.cpp + + InvertingMutexTest.cpp jsonTest.cpp json_variant.cpp json_variant.hpp diff --git a/src/IEffect.hpp b/src/IEffect.hpp index fd82b68..b16ad96 100644 --- a/src/IEffect.hpp +++ b/src/IEffect.hpp @@ -59,5 +59,8 @@ namespace pipedal { virtual bool IsVst3() const = 0; virtual bool GetLv2State(Lv2PluginState*state) = 0; + + virtual bool HasErrorMessage() const = 0; + virtual const char*TakeErrorMessage() = 0; }; } //namespace \ No newline at end of file diff --git a/src/IHost.hpp b/src/IHost.hpp index 39ef5d1..0a8444d 100644 --- a/src/IHost.hpp +++ b/src/IHost.hpp @@ -49,5 +49,6 @@ namespace pipedal { virtual std::shared_ptr GetHostWorkerThread() = 0; virtual IEffect *CreateEffect(PedalboardItem &pedalboard) = 0; + }; } \ No newline at end of file diff --git a/src/InvertingMutexTest.cpp b/src/InvertingMutexTest.cpp new file mode 100644 index 0000000..626676b --- /dev/null +++ b/src/InvertingMutexTest.cpp @@ -0,0 +1,71 @@ +// Copyright (c) 2022 Robin Davies +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#include "pch.h" +#include "catch.hpp" +#include +#include +#include + +#include "json.hpp" +#include "json_variant.hpp" +#include +#include +#include "inverting_mutex.hpp" +#include +#include +#include +#include "util.hpp" + +using namespace pipedal; +using namespace std; +using namespace std::chrono; + +TEST_CASE("inverting_mutext test", "[inverting_mutex_test]") +{ + + inverting_mutex mutex; + + { + std::thread thread( + [&mutex]() mutable + { + nice(5); + { + std::lock_guard lock(mutex); + SetThreadName("imTest"); + cout << "Thread holds lock" << endl; + std::this_thread::sleep_for(3s); + + std::this_thread::sleep_for(1s); + cout << "Thread releases lock" << endl; + } + }); + std::this_thread::sleep_for(std::chrono::seconds(1)); + + { + std::lock_guard lock(mutex); // cause the thread to avoid priority-inversion. + cout << "Main resumed." << endl; + } + { + std::lock_guard lock(mutex); + } + thread.join(); + } +} diff --git a/src/LogFeature.cpp b/src/LogFeature.cpp index 776a3cc..aaafd3f 100644 --- a/src/LogFeature.cpp +++ b/src/LogFeature.cpp @@ -50,29 +50,38 @@ int LogFeature::vprintf(LV2_URID type,const char*fmt, va_list va) { std::lock_guard guard(logMutex); - const char* prefix = ""; - char buffer[1024]; - int result = vsnprintf(buffer, sizeof(buffer), fmt, va); + int result = 0; + if (this->logMessageListener) + { + const char* prefix = ""; + char buffer[1024]; + strcpy(buffer,messagePrefix.c_str()); + char *p = buffer+messagePrefix.length(); - if (type == uris.ridError) - { - Lv2Log::error(buffer); + + result = vsnprintf(p, sizeof(buffer)-messagePrefix.length(), fmt, va); + buffer[sizeof(buffer)-1] = '\0'; + + if (type == uris.ridError) + { + logMessageListener->OnLogError(buffer); + } + else if (type == uris.ridWarning) + { + logMessageListener->OnLogWarning(buffer); + } + else if (type == uris.ridNote) + { + logMessageListener->OnLogInfo(buffer); + } + else if (type == uris.ridTrace) + { + logMessageListener->OnLogDebug(buffer); + } + else { + logMessageListener->OnLogInfo(buffer); + } } - else if (type == uris.ridWarning) - { - Lv2Log::warning(buffer); - } - else if (type == uris.ridNote) - { - Lv2Log::info(buffer); - } - else if (type == uris.ridTrace) - { - Lv2Log::debug(buffer); - } - else { - Lv2Log::info(buffer); - } return result; } @@ -85,9 +94,11 @@ LogFeature::LogFeature() log.printf = printfFn; log.vprintf = vprintfFn; } -void LogFeature::Prepare(MapFeature*map) +void LogFeature::Prepare(MapFeature*map, const std::string &messagePrefix, LogMessageListener*listener) { uris.Map(map); + this->messagePrefix = messagePrefix; + this->logMessageListener = listener; } diff --git a/src/LogFeature.hpp b/src/LogFeature.hpp index 2db4f18..20ba951 100644 --- a/src/LogFeature.hpp +++ b/src/LogFeature.hpp @@ -35,8 +35,17 @@ namespace pipedal { class LogFeature { - + public: + class LogMessageListener { + public: + virtual void OnLogError(const char*message) = 0; + virtual void OnLogWarning(const char*message) = 0; + virtual void OnLogInfo(const char*message) = 0; + virtual void OnLogDebug(const char*message) = 0; + }; private: + LogMessageListener *logMessageListener = nullptr; + std::string messagePrefix; LV2_URID nextAtom = 0; LV2_Feature feature; LV2_Log_Log log; @@ -59,7 +68,8 @@ namespace pipedal { public: LogFeature(); - void Prepare(MapFeature* map); + void Prepare(MapFeature* map, const std::string &messagePrefix, LogMessageListener*listener); + void LogError(const char*fmt,...); void LogWarning(const char*fmt,...); @@ -84,5 +94,6 @@ namespace pipedal { int vprintf(LV2_URID type, const char* fmt, va_list va); + }; } \ No newline at end of file diff --git a/src/Lv2Effect.cpp b/src/Lv2Effect.cpp index e0d4768..06fd457 100644 --- a/src/Lv2Effect.cpp +++ b/src/Lv2Effect.cpp @@ -54,6 +54,7 @@ Lv2Effect::Lv2Effect( { auto pWorld = pHost_->getWorld(); + logFeature.Prepare(&(pHost_->GetMapFeature()),info_->name() + ": ",this); this->bypassStartingSamples = (uint32_t)(pHost->GetSampleRate() * BYPASS_TIME_S); this->bypass = pedalboardItem.isEnabled(); @@ -71,6 +72,8 @@ Lv2Effect::Lv2Effect( LV2_Feature *const *features = pHost_->GetLv2Features(); + this->features.push_back(logFeature.GetFeature()); + for (auto p = features; *p != nullptr; ++p) { this->features.push_back(*p); @@ -92,7 +95,7 @@ Lv2Effect::Lv2Effect( } this->features.push_back(nullptr); - LV2_Feature **myFeatures = &this->features[0]; + const LV2_Feature **myFeatures = &this->features[0]; LilvInstance *pInstance = nullptr; try { @@ -676,4 +679,28 @@ bool Lv2Effect::GetLv2State(Lv2PluginState*state) } +void Lv2Effect::OnLogError(const char*message) +{ + // only errors get transmitted to the client. + strncpy(this->errorMessage,message,sizeof(errorMessage)); + errorMessage[sizeof(errorMessage)-1] = '\0'; + this->hasErrorMessage = true; +} + +void Lv2Effect::OnLogWarning(const char*message) +{ + Lv2Log::warning(message); + +} +void Lv2Effect::OnLogInfo(const char*message) +{ + Lv2Log::info(message); + +} +void Lv2Effect::OnLogDebug(const char*message) +{ + Lv2Log::debug(message); + +} + diff --git a/src/Lv2Effect.hpp b/src/Lv2Effect.hpp index e423a1f..194643b 100644 --- a/src/Lv2Effect.hpp +++ b/src/Lv2Effect.hpp @@ -34,6 +34,7 @@ #include "lv2/atom.lv2/forge.h" #include "AtomBuffer.hpp" #include "StateInterface.hpp" +#include "LogFeature.hpp" namespace pipedal @@ -41,12 +42,19 @@ namespace pipedal class RealtimeRingBufferWriter; - class Lv2Effect : public IEffect + class Lv2Effect : public IEffect, private LogFeature::LogMessageListener { private: + virtual void OnLogError(const char*message); + virtual void OnLogWarning(const char*message); + virtual void OnLogInfo(const char*message); + virtual void OnLogDebug(const char*message); + + private: + std::unique_ptr stateInterface; void RestoreState(const PedalboardItem&pedalboardItem); - + LogFeature logFeature; std::map patchPropertyPrototypes; IHost *pHost = nullptr; @@ -74,7 +82,7 @@ namespace pipedal std::vector inputAtomBuffers; std::vector outputAtomBuffers; - std::vector features; + std::vector features; LV2_Feature *work_schedule_feature = nullptr; virtual std::string GetUri() const { return info->uri(); } @@ -169,6 +177,7 @@ namespace pipedal void BypassTo(float value); public: + virtual bool GetLv2State(Lv2PluginState*state); virtual void RequestPatchProperty(LV2_URID uridUri); virtual void SetPatchProperty(LV2_URID uridUri,size_t size, LV2_Atom*value); @@ -187,7 +196,8 @@ namespace pipedal } - + bool hasErrorMessage = false; + char errorMessage[1024]; public: Lv2Effect( IHost *pHost, @@ -195,7 +205,8 @@ namespace pipedal const PedalboardItem &pedalboardItem); ~Lv2Effect(); - + bool HasErrorMessage() const { return this->hasErrorMessage; } + const char*TakeErrorMessage() { this->hasErrorMessage = false; return this->errorMessage; } virtual void ResetAtomBuffers(); virtual uint64_t GetInstanceId() const { return instanceId; } diff --git a/src/Lv2Pedalboard.cpp b/src/Lv2Pedalboard.cpp index 717af99..4cf6a35 100644 --- a/src/Lv2Pedalboard.cpp +++ b/src/Lv2Pedalboard.cpp @@ -46,6 +46,8 @@ std::vector Lv2Pedalboard::AllocateAudioBuffers(int nChannels) return result; } + + int Lv2Pedalboard::GetControlIndex(uint64_t instanceId, const std::string &symbol) { for (int i = 0; i < realtimeEffects.size(); ++i) @@ -60,7 +62,9 @@ int Lv2Pedalboard::GetControlIndex(uint64_t instanceId, const std::string &symbo } std::vector Lv2Pedalboard::PrepareItems( std::vector &items, - std::vector inputBuffers) + std::vector inputBuffers, + Lv2PedalboardErrorList&errorList + ) { for (int i = 0; i < items.size(); ++i) { @@ -84,8 +88,8 @@ std::vector Lv2Pedalboard::PrepareItems( this->processActions.push_back(preMixAction); - std::vector topResult = PrepareItems(item.topChain(), topInputs); - std::vector bottomResult = PrepareItems(item.bottomChain(), bottomInputs); + std::vector topResult = PrepareItems(item.topChain(), topInputs,errorList); + std::vector bottomResult = PrepareItems(item.bottomChain(), bottomInputs,errorList); this->processActions.push_back( [pSplit](uint32_t frames) @@ -113,6 +117,12 @@ std::vector Lv2Pedalboard::PrepareItems( { Lv2Log::warning(SS(e.what())); } + if (pLv2Effect->HasErrorMessage()) + { + std::string error = pLv2Effect->TakeErrorMessage(); + Lv2Log::error(error); + errorList.push_back({item.instanceId(), error}); + } if (pLv2Effect) { @@ -206,7 +216,7 @@ std::vector Lv2Pedalboard::PrepareItems( return inputBuffers; } -void Lv2Pedalboard::Prepare(IHost *pHost, Pedalboard &pedalboard) +void Lv2Pedalboard::Prepare(IHost *pHost, Pedalboard &pedalboard, Lv2PedalboardErrorList &errorList) { this->pHost = pHost; @@ -224,7 +234,7 @@ void Lv2Pedalboard::Prepare(IHost *pHost, Pedalboard &pedalboard) this->pedalboardInputBuffers.push_back(bufferPool.AllocateBuffer(pHost->GetMaxAudioBufferSize())); } - auto outputs = PrepareItems(pedalboard.items(), this->pedalboardInputBuffers); + auto outputs = PrepareItems(pedalboard.items(), this->pedalboardInputBuffers,errorList); int nOutputs = pHost->GetNumberOfOutputAudioChannels(); if (nOutputs == 1) { @@ -396,6 +406,14 @@ bool Lv2Pedalboard::Run(float **inputBuffers, float **outputBuffers, uint32_t sa { processActions[i](samples); } + for (size_t i = 0; i < this->effects.size(); ++i) + { + IEffect* effect = effects[i].get(); + if (effect->HasErrorMessage()) + { + ringBufferWriter->WriteLv2ErrorMessage(effect->GetInstanceId(),effect->TakeErrorMessage()); + } + } for (size_t i = 0; i < samples; ++i) { float volume = outputVolume.Tick(); diff --git a/src/Lv2Pedalboard.hpp b/src/Lv2Pedalboard.hpp index fda1555..d79e657 100644 --- a/src/Lv2Pedalboard.hpp +++ b/src/Lv2Pedalboard.hpp @@ -35,6 +35,16 @@ class RealtimeVuBuffers; class RealtimePatchPropertyRequest; class RealtimeRingBufferWriter; +struct Lv2PedalboardError { + int64_t intanceId; + std::string message; +}; + +class Lv2PedalboardErrorList: public std::vector // (forward declaration issues with a using statement) +{ + +}; + class Lv2Pedalboard { IHost *pHost = nullptr; @@ -86,7 +96,8 @@ class Lv2Pedalboard { std::vector PrepareItems( std::vector & items, - std::vector inputBuffers + std::vector inputBuffers, + Lv2PedalboardErrorList &errorList ); void PrepareMidiMap(const Pedalboard&pedalboard); @@ -99,7 +110,7 @@ public: Lv2Pedalboard() { } ~Lv2Pedalboard() { } - void Prepare(IHost *pHost,Pedalboard&pedalboard); + void Prepare(IHost *pHost,Pedalboard&pedalboard, Lv2PedalboardErrorList &errorList); std::vector GetEffects() { return realtimeEffects; } diff --git a/src/MapPathFeature.cpp b/src/MapPathFeature.cpp index b47b081..85040cd 100644 --- a/src/MapPathFeature.cpp +++ b/src/MapPathFeature.cpp @@ -36,10 +36,15 @@ MapPathFeature::MapPathFeature(const std::filesystem::path &storagePath) lv2_state_make_path.handle = (LV2_State_Make_Path_Handle*)this; lv2_state_make_path.path = FnAbsolutePath; + lv2_state_free_path.handle = (LV2_State_Free_Path_Handle*)this; + lv2_state_free_path.free_path = FnFreePath; + mapPathFeature.URI = LV2_STATE__mapPath; mapPathFeature.data = (void*)&lv2_state_map_path; makePathFeature.URI = LV2_STATE__makePath; makePathFeature.data = (void*)&lv2_state_make_path; + freePathFeature.URI = LV2_STATE__freePath; + freePathFeature.data = (void*)&lv2_state_free_path; } void MapPathFeature::Prepare(MapFeature* map) @@ -47,6 +52,16 @@ void MapPathFeature::Prepare(MapFeature* map) } +void MapPathFeature::FreePath(char *path) +{ + free(path); +} + +void MapPathFeature::FnFreePath(LV2_State_Free_Path_Handle handle, char* path) +{ + ((MapPathFeature*)handle)->FreePath(path); +} + /*static*/ char *MapPathFeature::FnAbsolutePath( LV2_State_Map_Path_Handle handle, @@ -57,6 +72,10 @@ void MapPathFeature::Prepare(MapFeature* map) char *MapPathFeature::AbsolutePath(const char *abstract_path) { + if (strlen(abstract_path) == 0) + { + return strdup(""); + } std::filesystem::path t (abstract_path); if (t.is_absolute()) { return strdup(abstract_path); @@ -75,6 +94,10 @@ char *MapPathFeature::FnAbstractPath( char *MapPathFeature::AbstractPath(const char *absolute_path) { + if (strlen(absolute_path) == 0) + { + return strdup(""); + } if (strncmp(storagePath.c_str(),absolute_path,storagePath.length()) == 0) { const char*result = absolute_path + storagePath.length(); diff --git a/src/MapPathFeature.hpp b/src/MapPathFeature.hpp index 10df165..bf6f8bd 100644 --- a/src/MapPathFeature.hpp +++ b/src/MapPathFeature.hpp @@ -32,16 +32,25 @@ namespace pipedal void SetPluginStoragePath(const std::filesystem::path&path) { storagePath = path;} const LV2_Feature*GetMapPathFeature() { return &mapPathFeature;} const LV2_Feature*GetMakePathFeature() { return &makePathFeature;} + const LV2_Feature*GetFreePathFeature() { return &freePathFeature;} private: char *AbsolutePath(const char *abstract_path); static char *FnAbsolutePath(LV2_State_Map_Path_Handle handle, const char *abstract_path); + + LV2_State_Map_Path lv2_state_map_path; LV2_State_Make_Path lv2_state_make_path; + LV2_State_Free_Path lv2_state_free_path; + + void FreePath(char *path); + static void FnFreePath(LV2_State_Free_Path_Handle handle, char* path); + LV2_Feature mapPathFeature; LV2_Feature makePathFeature; + LV2_Feature freePathFeature; char *AbstractPath(const char *abstract_path); static char * FnAbstractPath( diff --git a/src/MimeTypes.cpp b/src/MimeTypes.cpp new file mode 100644 index 0000000..91538cb --- /dev/null +++ b/src/MimeTypes.cpp @@ -0,0 +1,160 @@ +// Copyright (c) 2023 Robin Davies +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +#include "MimeTypes.hpp" + +using namespace pipedal; + +void MimeTypes::MaybeInitialize() +{ + if (!initialized) + { + initialized = true; + AddMimeType("MP3", "audio/mpeg"); + AddMimeType("MPGA", "audio/mpeg"); + AddMimeType("M4A", "audio/mp4"); + AddMimeType("WAV", "audio/x-wav"); + AddMimeType("WAV", "audio/wav"); + AddMimeType("AMR", "audio/amr"); + AddMimeType("AWB", "audio/amr-wb"); + AddMimeType("WMA", "audio/x-ms-wma"); + AddMimeType("OGG", "audio/ogg"); + AddMimeType("OGG", "application/ogg"); + AddMimeType("OGA", "application/ogg"); + AddMimeType("AAC", "audio/aac"); + AddMimeType("AAC", "audio/aac-adts"); + AddMimeType("MKA", "audio/x-matroska"); + AddMimeType("MID", "audio/midi"); + AddMimeType("MIDI", "audio/midi"); + AddMimeType("XMF", "audio/midi"); + AddMimeType("RTTTL", "audio/midi"); + AddMimeType("SMF", "audio/sp-midi"); + AddMimeType("IMY", "audio/imelody"); + AddMimeType("RTX", "audio/midi"); + AddMimeType("OTA", "audio/midi"); + AddMimeType("MXMF", "audio/midi"); + + AddMimeType("MPEG", "video/mpeg"); + AddMimeType("MPG", "video/mpeg"); + AddMimeType("MP4", "video/mp4"); + AddMimeType("M4V", "video/mp4"); + AddMimeType("3GP", "video/3gpp"); + AddMimeType("3GPP", "video/3gpp"); + AddMimeType("3G2", "video/3gpp2"); + AddMimeType("3GPP2", "video/3gpp2"); + AddMimeType("MKV", "video/x-matroska"); + AddMimeType("WEBM", "video/webm"); + AddMimeType("TS", "video/mp2ts"); + AddMimeType("AVI", "video/avi"); + AddMimeType("WMV", "video/x-ms-wmv"); + AddMimeType("ASF", "video/x-ms-asf"); + AddMimeType("JPG", "image/jpeg"); + AddMimeType("JPEG", "image/jpeg"); + AddMimeType("GIF", "image/gif"); + AddMimeType("PNG", "image/png"); + AddMimeType("BMP", "image/x-ms-bmp"); + AddMimeType("WBMP", "image/vnd.wap.wbmp"); + AddMimeType("WEBP", "image/webp"); + + AddMimeType("M3U", "audio/x-mpegurl"); + AddMimeType("M3U", "application/x-mpegurl"); + AddMimeType("PLS", "audio/x-scpls"); + AddMimeType("WPL", "application/vnd.ms-wpl"); + AddMimeType("M3U8", "application/vnd.apple.mpegurl"); + AddMimeType("M3U8", "audio/mpegurl"); + AddMimeType("M3U8", "audio/x-mpegurl"); + AddMimeType("FL", "application/x-android-drm-fl"); + AddMimeType("TXT", "text/plain"); + AddMimeType("HTM", "text/html"); + AddMimeType("HTML", "text/html"); + AddMimeType("PDF", "application/pdf"); + AddMimeType("DOC", "application/msword"); + AddMimeType("XLS", "application/vnd.ms-excel"); + AddMimeType("PPT", "application/mspowerpoint"); + AddMimeType("FLAC", "audio/x-flac"); + AddMimeType("FLAC", "audio/flac"); + AddMimeType("ZIP", "application/zip"); + AddMimeType("MPG", "video/mp2p"); + AddMimeType("MPEG", "video/mp2p"); + + } +} + +static MimeTypes staticContruct; + +static std::string empty; + +const std::string& MimeTypes::MimeTypeFromExtension(const std::string &extension) +{ + MaybeInitialize(); + auto iter = extensionToMimeType.find(extension); + if (iter == extensionToMimeType.end()) return empty; + return iter->second; +} + +const std::string& MimeTypes::ExtensionFromMimeType(const std::string &mimeType) +{ + MaybeInitialize(); + auto iter = mimeTypeToExtension.find(mimeType); + if (iter == mimeTypeToExtension.end()) return empty; + return iter->second; +} + + +static std::string toLower(const std::string&value) +{ + std::string result; + result.resize(value.length()); + for (size_t i = 0; i < value.length(); ++i) + { + char c = value[i]; + if (c >= 'A' && c <= 'Z') + { + c += 'a'-'A'; + } + result[i] = c; + } + return result; +} + +void MimeTypes::AddMimeType(const std::string&extension_, const std::string&mimeType) +{ + std::string extension = "." + toLower(extension_); + mimeTypeToExtension[mimeType] = extension; + extensionToMimeType[extension] = mimeType; + if (mimeType.starts_with("audio/")) + { + audioExtensions.insert(extension); + } + if (mimeType.starts_with("video/")) + { + videoExtensions.insert(extension); + } + +} + +std::map MimeTypes::mimeTypeToExtension; +std::map MimeTypes::extensionToMimeType; +std::set MimeTypes::audioExtensions; +std::set MimeTypes::videoExtensions; +bool MimeTypes::initialized; + + + diff --git a/src/MimeTypes.hpp b/src/MimeTypes.hpp new file mode 100644 index 0000000..d7fd8c9 --- /dev/null +++ b/src/MimeTypes.hpp @@ -0,0 +1,41 @@ +// Copyright (c) 2023 Robin Davies +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#pragma once + +#include +#include +#include + +namespace pipedal { + class MimeTypes { + public: + + static const std::string& MimeTypeFromExtension(const std::string &extension); + static const std::string& ExtensionFromMimeType(const std::string &mimeType); + private: + static void AddMimeType(const std::string&extension, const std::string&mimeType); + static std::map mimeTypeToExtension; + static std::map extensionToMimeType; + static std::set audioExtensions; + static std::set videoExtensions; + static void MaybeInitialize(); + static bool initialized; + }; +} \ No newline at end of file diff --git a/src/Pedalboard.cpp b/src/Pedalboard.cpp index 9b4ab2f..448ba7f 100644 --- a/src/Pedalboard.cpp +++ b/src/Pedalboard.cpp @@ -199,6 +199,7 @@ JSON_MAP_BEGIN(PedalboardItem) JSON_MAP_REFERENCE_CONDITIONAL(PedalboardItem,topChain,IsPedalboardSplitItem) JSON_MAP_REFERENCE_CONDITIONAL(PedalboardItem,bottomChain,&IsPedalboardSplitItem) JSON_MAP_REFERENCE(PedalboardItem,midiBindings) + JSON_MAP_REFERENCE(PedalboardItem,stateUpdateCount) JSON_MAP_REFERENCE(PedalboardItem,lv2State) JSON_MAP_END() diff --git a/src/Pedalboard.hpp b/src/Pedalboard.hpp index 79befbf..463eb14 100644 --- a/src/Pedalboard.hpp +++ b/src/Pedalboard.hpp @@ -85,6 +85,7 @@ class PedalboardItem: public JsonMemberWritable { std::vector bottomChain_; std::vector midiBindings_; std::string vstState_; + uint32_t stateUpdateCount_ = 0; Lv2PluginState lv2State_; public: ControlValue*GetControlValue(const std::string&symbol); @@ -101,6 +102,7 @@ public: GETTER_SETTER_VEC(topChain) GETTER_SETTER_VEC(bottomChain) GETTER_SETTER_VEC(midiBindings) + GETTER_SETTER(stateUpdateCount) GETTER_SETTER_REF(lv2State) diff --git a/src/PiPedalModel.cpp b/src/PiPedalModel.cpp index 46062a5..ae70abc 100644 --- a/src/PiPedalModel.cpp +++ b/src/PiPedalModel.cpp @@ -236,7 +236,7 @@ void PiPedalModel::Load() if (jackServerSettings.IsValid()) { this->jackConfiguration.AlsaInitialize(this->jackServerSettings); - if (jackServerSettings.IsValid()) + if (!jackServerSettings.IsValid()) { for (size_t retry = 0; retry < 5; ++retry) { @@ -267,11 +267,11 @@ void PiPedalModel::Load() try { audioHost->Open(this->jackServerSettings, selection); + bool loadedSuccessfully = false; try { - std::shared_ptr lv2Pedalboard{this->lv2Host.CreateLv2Pedalboard(this->pedalboard)}; - this->lv2Pedalboard = lv2Pedalboard; - audioHost->SetPedalboard(lv2Pedalboard); + LoadCurrentPedalboard(); + loadedSuccessfully = true; } catch (const std::exception &e) { @@ -360,8 +360,15 @@ void PiPedalModel::PreviewControl(int64_t clientId, int64_t pedalItemId, const s void PiPedalModel::OnNotifyLv2StateChanged(uint64_t instanceId) { std::lock_guard lock(mutex); - SetPresetChanged(-1, true); - + PedalboardItem *item = pedalboard.GetItem(instanceId); + if (item != nullptr) + { + item->stateUpdateCount(item->stateUpdateCount()+1); + + this->audioHost->UpdatePluginState(*item); + this->FirePedalboardChanged(-1,false); + this->SetPresetChanged(-1, true); + } { // take a snapshot incase a client unsusbscribes in the notification handler (in which case the mutex won't protect us) IPiPedalModelSubscriber **t = new IPiPedalModelSubscriber *[this->subscribers.size()]; @@ -503,7 +510,7 @@ void PiPedalModel::FireBanksChanged(int64_t clientId) delete[] t; } -void PiPedalModel::FirePedalboardChanged(int64_t clientId) +void PiPedalModel::FirePedalboardChanged(int64_t clientId,bool loadAudioThread) { // noify subscribers. IPiPedalModelSubscriber **t = new IPiPedalModelSubscriber *[this->subscribers.size()]; @@ -518,14 +525,16 @@ void PiPedalModel::FirePedalboardChanged(int64_t clientId) } delete[] t; - // notify the audio thread. - if (audioHost->IsOpen()) + if (loadAudioThread) { - std::shared_ptr lv2Pedalboard{this->lv2Host.CreateLv2Pedalboard(this->pedalboard)}; - this->lv2Pedalboard = lv2Pedalboard; - audioHost->SetPedalboard(lv2Pedalboard); - UpdateRealtimeVuSubscriptions(); - UpdateRealtimeMonitorPortSubscriptions(); + // notify the audio thread. + if (audioHost->IsOpen()) + { + LoadCurrentPedalboard(); + + UpdateRealtimeVuSubscriptions(); + UpdateRealtimeMonitorPortSubscriptions(); + } } } void PiPedalModel::SetPedalboard(int64_t clientId, Pedalboard &pedalboard) @@ -1148,9 +1157,10 @@ void PiPedalModel::RestartAudio() this->lv2Host.OnConfigurationChanged(jackConfiguration, channelSelection); - std::shared_ptr lv2Pedalboard{this->lv2Host.CreateLv2Pedalboard(this->pedalboard)}; - this->lv2Pedalboard = lv2Pedalboard; - audioHost->SetPedalboard(lv2Pedalboard); + std::vector errorMessages; + + LoadCurrentPedalboard(); + this->UpdateRealtimeVuSubscriptions(); UpdateRealtimeMonitorPortSubscriptions(); } @@ -1711,6 +1721,8 @@ void PiPedalModel::LoadPluginPreset(int64_t pluginInstanceId, uint64_t presetIns PedalboardItem *pedalboardItem = this->pedalboard.GetItem(pluginInstanceId); if (pedalboardItem != nullptr) { + int32_t oldStateUpdateCount = pedalboardItem->stateUpdateCount(); + PluginPresetValues presetValues = storage.GetPluginPresetValues(pedalboardItem->uri(), presetInstanceId); // if the plugin has state, we have to rebuild the pedalboard, since setting state is not thread-safe. @@ -1736,6 +1748,7 @@ void PiPedalModel::LoadPluginPreset(int64_t pluginInstanceId, uint64_t presetIns delete[] t; } else { pedalboardItem->lv2State(presetValues.state); + pedalboardItem->stateUpdateCount(oldStateUpdateCount+1); FirePedalboardChanged(-1); // does a complete reload of both client and audio server. } this->SetPresetChanged(-1, true); @@ -1985,5 +1998,34 @@ uint64_t PiPedalModel::CreateNewPreset() return storage.CreateNewPreset(); } +bool PiPedalModel::LoadCurrentPedalboard() +{ + Lv2PedalboardErrorList errorMessages; + std::shared_ptr lv2Pedalboard{this->lv2Host.CreateLv2Pedalboard(this->pedalboard,errorMessages)}; + this->lv2Pedalboard = lv2Pedalboard; + // apply the error messages to the lv2Pedalboard. + // return true if the error messages have changed. + audioHost->SetPedalboard(lv2Pedalboard); + return true; +} + +void PiPedalModel::OnNotifyLv2RealtimeError(int64_t instanceId,const std::string &error) +{ + std::lock_guard lock(mutex); + + // Notify clients. + size_t n = subscribers.size(); + IPiPedalModelSubscriber **t = new IPiPedalModelSubscriber *[n]; + for (size_t i = 0; i < n; ++i) + { + t[i] = this->subscribers[i]; + } + for (size_t i = 0; i < n; ++i) + { + t[i]->OnErrorMessage(error); + } + delete[] t; + +} + - diff --git a/src/PiPedalModel.hpp b/src/PiPedalModel.hpp index f3db2be..2f5e92d 100644 --- a/src/PiPedalModel.hpp +++ b/src/PiPedalModel.hpp @@ -76,6 +76,7 @@ namespace pipedal virtual void OnShowStatusMonitorChanged(bool show) = 0; virtual void OnSystemMidiBindingsChanged(const std::vector&bindings) = 0; virtual void OnPatchPropertyChanged(int64_t clientId, int64_t instanceId,const std::string& propertyUri,const json_variant& value) = 0; + virtual void OnErrorMessage(const std::string&message) = 0; virtual void Close() = 0; }; @@ -137,7 +138,7 @@ namespace pipedal void SetPresetChanged(int64_t clientId, bool value); void FirePresetsChanged(int64_t clientId); void FirePluginPresetsChanged(const std::string &pluginUri); - void FirePedalboardChanged(int64_t clientId); + void FirePedalboardChanged(int64_t clientId, bool reloadAudioThread = true); void FireChannelSelectionChanged(int64_t clientId); void FireBanksChanged(int64_t clientId); void FireJackConfigurationChanged(const JackConfiguration &jackConfiguration); @@ -177,6 +178,8 @@ namespace pipedal ; virtual void OnNotifyMidiProgramChange(RealtimeMidiProgramRequest &midiProgramRequest) override; virtual void OnNotifyNextMidiProgram(const RealtimeNextMidiProgramRequest&request) override; + virtual void OnNotifyLv2RealtimeError(int64_t instanceId,const std::string &error) override; + void UpdateVst3Settings(Pedalboard &pedalboard); @@ -324,6 +327,8 @@ namespace pipedal void DeleteSampleFile(const std::filesystem::path &fileName); std::string UploadUserFile(const std::string &directory, const std::string &patchProperty,const std::string&filename,const std::string&fileBody); uint64_t CreateNewPreset(); + + bool LoadCurrentPedalboard(); }; } // namespace pipedal. \ No newline at end of file diff --git a/src/PiPedalSocket.cpp b/src/PiPedalSocket.cpp index e321053..1e3450c 100644 --- a/src/PiPedalSocket.cpp +++ b/src/PiPedalSocket.cpp @@ -1498,6 +1498,10 @@ private: Send("onLv2StateChanged",instanceId); } + virtual void OnErrorMessage(const std::string&message) + { + Send("onErrorMessage",message); + } virtual void OnPatchPropertyChanged(int64_t clientId, int64_t instanceId,const std::string& propertyUri,const json_variant& value) { PatchPropertyChangedBody body; diff --git a/src/PiPedalUI.cpp b/src/PiPedalUI.cpp index 372eb5c..4764f78 100644 --- a/src/PiPedalUI.cpp +++ b/src/PiPedalUI.cpp @@ -25,6 +25,7 @@ #include "PiPedalUI.hpp" #include "PluginHost.hpp" #include "ss.hpp" +#include "MimeTypes.hpp" using namespace pipedal; @@ -65,7 +66,7 @@ PiPedalUI::PiPedalUI(PluginHost *pHost, const LilvNode *uiNode, const std::files lilv_nodes_free(fileNodes); } -PiPedalFileType::PiPedalFileType(PluginHost *pHost, const LilvNode *node) +UiFileType::UiFileType(PluginHost *pHost, const LilvNode *node) { auto pWorld = pHost->getWorld(); @@ -93,7 +94,28 @@ PiPedalFileType::PiPedalFileType(PluginHost *pHost, const LilvNode *node) } else { - throw std::logic_error("pipedal_ui:fileType is missing fileExtension property."); + this->fileExtension_ = ""; + } + AutoLilvNode mimeType = lilv_world_get( + pWorld, + node, + pHost->lilvUris.pipedalUI__mimeType, + nullptr); + if (mimeType) + { + this->mimeType_ = mimeType.AsString(); + } + if (fileExtension_ == "") + { + fileExtension_ = MimeTypes::ExtensionFromMimeType(mimeType_); + } + if (mimeType_ == "") + { + mimeType_ = MimeTypes::MimeTypeFromExtension(fileExtension_); + if (mimeType_ == "") + { + mimeType_ = "application/octet-stream"; + } } } UiFileProperty::UiFileProperty(PluginHost *pHost, const LilvNode *node, const std::filesystem::path &resourcePath) @@ -165,12 +187,12 @@ UiFileProperty::UiFileProperty(PluginHost *pHost, const LilvNode *node, const st this->portGroup_ = portGroup.AsUri(); } - this->fileTypes_ = PiPedalFileType::GetArray(pHost, node, pHost->lilvUris.pipedalUI__fileTypes); + this->fileTypes_ = UiFileType::GetArray(pHost, node, pHost->lilvUris.pipedalUI__fileTypes); } -std::vector PiPedalFileType::GetArray(PluginHost *pHost, const LilvNode *node, const LilvNode *uri) +std::vector UiFileType::GetArray(PluginHost *pHost, const LilvNode *node, const LilvNode *uri) { - std::vector result; + std::vector result; LilvWorld *pWorld = pHost->getWorld(); LilvNodes *fileTypeNodes = lilv_world_find_nodes(pWorld, node, pHost->lilvUris.pipedalUI__fileTypes, nullptr); @@ -179,7 +201,7 @@ std::vector PiPedalFileType::GetArray(PluginHost *pHost, const const LilvNode *fileTypeNode = lilv_nodes_get(fileTypeNodes, i); try { - PiPedalFileType fileType = PiPedalFileType(pHost, fileTypeNode); + UiFileType fileType = UiFileType(pHost, fileTypeNode); result.push_back(std::move(fileType)); } catch (const std::exception &e) @@ -313,6 +335,28 @@ PiPedalUI::PiPedalUI(std::vector &&fileProperties) this->fileProperties_ = std::move(fileProperties); } +UiFileType::UiFileType(const std::string&label, const std::string &fileType) +: label_(label) +, fileExtension_(fileType) +{ + if (fileType.starts_with('.')) + { + fileExtension_ = fileType; + mimeType_ = MimeTypes::MimeTypeFromExtension(fileType); + if (mimeType_ == "") + { + mimeType_ = "application/octet-stream"; + } + } else { + fileExtension_ = MimeTypes::ExtensionFromMimeType(fileType); // (may be blank, esp. for audio/* and video/*. + mimeType_ = fileType; + } + if (mimeType_ == "*") + { + mimeType_ = "application/octet-stream"; + } +} + JSON_MAP_BEGIN(UiPortNotification) JSON_MAP_REFERENCE(UiPortNotification, portIndex) JSON_MAP_REFERENCE(UiPortNotification, symbol) @@ -320,9 +364,10 @@ JSON_MAP_REFERENCE(UiPortNotification, plugin) JSON_MAP_REFERENCE(UiPortNotification, protocol) JSON_MAP_END() -JSON_MAP_BEGIN(PiPedalFileType) -JSON_MAP_REFERENCE(PiPedalFileType, label) -JSON_MAP_REFERENCE(PiPedalFileType, fileExtension) +JSON_MAP_BEGIN(UiFileType) +JSON_MAP_REFERENCE(UiFileType, label) +JSON_MAP_REFERENCE(UiFileType, mimeType) +JSON_MAP_REFERENCE(UiFileType, fileExtension) JSON_MAP_END() JSON_MAP_BEGIN(UiFileProperty) diff --git a/src/PiPedalUI.hpp b/src/PiPedalUI.hpp index 01949b3..90886b8 100644 --- a/src/PiPedalUI.hpp +++ b/src/PiPedalUI.hpp @@ -45,6 +45,7 @@ #define PIPEDAL_UI__fileType PIPEDAL_UI_PREFIX "fileType" #define PIPEDAL_UI__fileExtension PIPEDAL_UI_PREFIX "fileExtension" +#define PIPEDAL_UI__mimeType PIPEDAL_UI_PREFIX "mimeType" #define PIPEDAL_UI__outputPorts PIPEDAL_UI_PREFIX "outputPorts" #define PIPEDAL_UI__text PIPEDAL_UI_PREFIX "text" @@ -55,21 +56,25 @@ namespace pipedal { class PluginHost; - class PiPedalFileType { + class UiFileType { private: std::string label_; + std::string mimeType_; std::string fileExtension_; public: - PiPedalFileType() { } - PiPedalFileType(PluginHost*pHost, const LilvNode*node); + UiFileType() { } + UiFileType(PluginHost*pHost, const LilvNode*node); + UiFileType(const std::string&label, const std::string &fileType); - static std::vector GetArray(PluginHost*pHost, const LilvNode*node,const LilvNode*uri); + + static std::vector GetArray(PluginHost*pHost, const LilvNode*node,const LilvNode*uri); const std::string& label() const { return label_;} const std::string &fileExtension() const { return fileExtension_; } + const std::string &mimeType() const { return mimeType_; } public: - DECLARE_JSON_MAP(PiPedalFileType); + DECLARE_JSON_MAP(UiFileType); }; @@ -96,7 +101,7 @@ namespace pipedal { std::string label_; std::int64_t index_ = -1; std::string directory_; - std::vector fileTypes_; + std::vector fileTypes_; std::string patchProperty_; std::string portGroup_; public: @@ -111,7 +116,8 @@ namespace pipedal { const std::string &directory() const { return directory_; } const std::string&portGroup() const { return portGroup_; } - const std::vector &fileTypes() const { return fileTypes_; } + const std::vector &fileTypes() const { return fileTypes_; } + std::vector &fileTypes() { return fileTypes_; } const std::string &patchProperty() const { return patchProperty_; } bool IsValidExtension(const std::string&extension) const; diff --git a/src/PluginHost.cpp b/src/PluginHost.cpp index 6090f7f..49fe770 100644 --- a/src/PluginHost.cpp +++ b/src/PluginHost.cpp @@ -158,6 +158,7 @@ void PluginHost::LilvUris::Initialize(LilvWorld *pWorld) pipedalUI__fileTypes = lilv_new_uri(pWorld, PIPEDAL_UI__fileTypes); pipedalUI__fileProperty = lilv_new_uri(pWorld, PIPEDAL_UI__fileProperty); pipedalUI__fileExtension = lilv_new_uri(pWorld, PIPEDAL_UI__fileExtension); + pipedalUI__mimeType = lilv_new_uri(pWorld, PIPEDAL_UI__mimeType); pipedalUI__outputPorts = lilv_new_uri(pWorld, PIPEDAL_UI__outputPorts); pipedalUI__text = lilv_new_uri(pWorld, PIPEDAL_UI__text); @@ -191,35 +192,13 @@ void PluginHost::LilvUris::Initialize(LilvWorld *pWorld) patch__writable = lilv_new_uri(pWorld,LV2_PATCH__writable); patch__readable = lilv_new_uri(pWorld,LV2_PATCH__readable); + + dc__format = lilv_new_uri(pWorld, "http://purl.org/dc/terms/format"); + } void PluginHost::LilvUris::Free() { - rdfs__Comment.Free(); - port_logarithmic.Free(); - port__display_priority.Free(); - port_range_steps.Free(); - integer_property_uri.Free(); - enumeration_property_uri.Free(); - core__toggled.Free(); - portprops__not_on_gui_property_uri.Free(); - midi__event.Free(); - core__designation.Free(); - portgroups__group.Free(); - units__unit.Free(); - atom__bufferType.Free(); - presets__preset.Free(); - rdfs__label.Free(); - lv2core__symbol.Free(); - lv2core__name.Free(); - - time_Position.Free(); - time_barBeat.Free(); - time_beatsPerMinute.Free(); - time_speed.Free(); - - appliesTo.Free(); - isA.Free(); } static std::string nodeAsString(const LilvNode *node) @@ -273,17 +252,15 @@ PluginHost::PluginHost() { pWorld = nullptr; - LV2_Feature **features = new LV2_Feature *[10]; lv2Features.push_back(mapFeature.GetMapFeature()); lv2Features.push_back(mapFeature.GetUnmapFeature()); - logFeature.Prepare(&mapFeature); - lv2Features.push_back(logFeature.GetFeature()); optionsFeature.Prepare(mapFeature, 44100, this->GetMaxAudioBufferSize(), this->GetAtomBufferSize()); mapPathFeature.Prepare(&mapFeature); lv2Features.push_back(mapPathFeature.GetMapPathFeature()); lv2Features.push_back(mapPathFeature.GetMakePathFeature()); + lv2Features.push_back(mapPathFeature.GetFreePathFeature()); lv2Features.push_back(optionsFeature.GetFeature()); lv2Features.push_back(nullptr); @@ -633,9 +610,26 @@ std::shared_ptr Lv2PluginInfo::FindWritablePathProperties(PluginHost path = path.parent_path(); std::string lv2DirectoryName = path.filename().string(); // we have a valid path property! + + + auto fileProperty = + std::make_shared( + strLabel,propertyUri.AsUri(),lv2DirectoryName); + + + AutoLilvNodes dc_types = lilv_world_find_nodes(pWorld,propertyUri,lv2Host->lilvUris.dc__format,nullptr); + LILV_FOREACH(nodes, i, dc_types) + { + AutoLilvNode dc_type = lilv_nodes_get(dc_types,i); + std::string fileType = dc_type.AsString(); + std::string label = ""; + fileProperty->fileTypes().push_back(UiFileType(label,fileType)); + } + + + fileProperties.push_back( - std::make_shared( - strLabel,propertyUri.AsUri(),lv2DirectoryName) + fileProperty ); } @@ -1129,12 +1123,12 @@ std::shared_ptr PluginHost::GetPluginInfo(const std::string &uri) return nullptr; } -Lv2Pedalboard *PluginHost::CreateLv2Pedalboard(Pedalboard &pedalboard) +Lv2Pedalboard *PluginHost::CreateLv2Pedalboard(Pedalboard &pedalboard, Lv2PedalboardErrorList &errorMessages) { Lv2Pedalboard *pPedalboard = new Lv2Pedalboard(); try { - pPedalboard->Prepare(this, pedalboard); + pPedalboard->Prepare(this, pedalboard,errorMessages); return pPedalboard; } catch (const std::exception &e) diff --git a/src/PluginHost.hpp b/src/PluginHost.hpp index 94d8357..ae35994 100644 --- a/src/PluginHost.hpp +++ b/src/PluginHost.hpp @@ -23,10 +23,8 @@ #include #include "json.hpp" #include "PluginType.hpp" -#include "Pedalboard.hpp" #include #include "MapFeature.hpp" -#include "LogFeature.hpp" #include "OptionsFeature.hpp" #include #include @@ -49,6 +47,7 @@ namespace pipedal // forward declarations class Lv2Effect; class Lv2Pedalboard; + class Lv2PedalboardErrorList; class PluginHost; class JackConfiguration; class JackChannelSelection; @@ -674,6 +673,7 @@ namespace pipedal AutoLilvNode pipedalUI__fileTypes; AutoLilvNode pipedalUI__fileExtension; + AutoLilvNode pipedalUI__mimeType; AutoLilvNode pipedalUI__outputPorts; AutoLilvNode pipedalUI__text; @@ -696,6 +696,8 @@ namespace pipedal AutoLilvNode patch__writable; AutoLilvNode patch__readable; + + AutoLilvNode dc__format; }; LilvUris lilvUris; @@ -715,7 +717,6 @@ namespace pipedal std::vector lv2Features; MapFeature mapFeature; - LogFeature logFeature; OptionsFeature optionsFeature; MapPathFeature mapPathFeature; @@ -747,19 +748,19 @@ namespace pipedal public: void LogError(const std::string &message) { - logFeature.LogError("%s", message.c_str()); + Lv2Log::error(message); } void LogWarning(const std::string &message) { - logFeature.LogWarning("%s", message.c_str()); + Lv2Log::warning(message); } void LogNote(const std::string &message) { - logFeature.LogNote("%s", message.c_str()); + Lv2Log::info(message); } void LogTrace(const std::string &message) { - logFeature.LogTrace("%s", message.c_str()); + Lv2Log::debug(message); } virtual LilvWorld *getWorld() { @@ -801,7 +802,7 @@ namespace pipedal IHost *asIHost() { return this; } - virtual Lv2Pedalboard *CreateLv2Pedalboard(Pedalboard &pedalboard); + virtual Lv2Pedalboard *CreateLv2Pedalboard(Pedalboard &pedalboard,Lv2PedalboardErrorList &errorList); void setSampleRate(double sampleRate) { diff --git a/src/RingBuffer.hpp b/src/RingBuffer.hpp index ab1b32a..e4b02e8 100644 --- a/src/RingBuffer.hpp +++ b/src/RingBuffer.hpp @@ -44,8 +44,8 @@ namespace pipedal bool mlocked = false; size_t ringBufferSize; size_t ringBufferMask; - volatile int64_t readPosition = 0; // volatile = ordering barrier wrt writePosition - volatile int64_t writePosition = 0; // volatile = ordering barrier wrt/ readPosition + int64_t readPosition = 0; // volatile = ordering barrier wrt writePosition + int64_t writePosition = 0; // volatile = ordering barrier wrt/ readPosition std::mutex mutex; std::mutex writeMutex; @@ -85,6 +85,7 @@ namespace pipedal { this->readPosition = 0; this->writePosition = 0; + this->is_open = true; cvRead.notify_all(); } void close() diff --git a/src/RingBufferReader.hpp b/src/RingBufferReader.hpp index 4d193fc..41bdcd7 100644 --- a/src/RingBufferReader.hpp +++ b/src/RingBufferReader.hpp @@ -62,6 +62,8 @@ namespace pipedal Lv2StateChanged, SetInputVolume, SetOutputVolume, + Lv2ErrorMessage, + }; @@ -192,7 +194,7 @@ namespace pipedal : ringBuffer(ringBuffer) { } - + void Reset() { ringBuffer->reset(); } // 0 -> ready. -1: timed out. -2: closing. template RingBufferStatus wait_for(const std::chrono::duration& timeout) { @@ -287,6 +289,7 @@ namespace pipedal { } + void Reset() { ringBuffer->reset(); } template void write(RingBufferCommand command, const T &value) { @@ -464,6 +467,12 @@ namespace pipedal { write(RingBufferCommand::EffectReplaced, pedalboard); } + + void WriteLv2ErrorMessage(int64_t instanceId, const char*message) + { + size_t length = strlen(message); + write(RingBufferCommand::Lv2ErrorMessage,instanceId,length,(uint8_t*)message); + } }; typedef RingBufferReader RealtimeRingBufferReader; diff --git a/src/SplitEffect.hpp b/src/SplitEffect.hpp index 6fadb6e..0193b2d 100644 --- a/src/SplitEffect.hpp +++ b/src/SplitEffect.hpp @@ -296,7 +296,8 @@ namespace pipedal virtual std::string AtomToJson(uint8_t *pAtom) { return ""; } virtual std::string GetAtomObjectType(uint8_t*pData) { return "not implemented";} virtual bool GetLv2State(Lv2PluginState*state) { return false; } - + virtual bool HasErrorMessage() const { return false; } + const char* TakeErrorMessage() { return ""; } virtual bool IsVst3() const { return false; } public: diff --git a/src/StateInterface.cpp b/src/StateInterface.cpp index c23bc7e..38d1fcc 100644 --- a/src/StateInterface.cpp +++ b/src/StateInterface.cpp @@ -255,11 +255,12 @@ void Lv2PluginStateEntry::read_json(json_reader &reader) { std::string v; reader.read_member("value",&v); - value_.resize(v.length()); + value_.resize(v.length()+1); for (size_t i = 0; i < v.length(); ++i) { value_[i] = (uint8_t)v[i]; } + value_[v.length()] = 0; } else if (atomType_ == LV2_ATOM__Float) { float v; diff --git a/src/Worker.cpp b/src/Worker.cpp index 047400b..f3ec6c5 100644 --- a/src/Worker.cpp +++ b/src/Worker.cpp @@ -82,15 +82,16 @@ LV2_Worker_Status Worker::WorkerRespond(uint32_t size, const void *data) { { std::lock_guard lock(outstandingRequestMutex); - ++outstandingRequests; + ++outstandingResponses; } LV2_Worker_Status status; if (responseRingBuffer.writeSpace() < sizeof(size) + size) { { + Lv2Log::warning(SS("LV2 Worker response too large: " << size << " bytes.")); std::lock_guard lock(outstandingRequestMutex); - --outstandingRequests; - cvOutstandingRequests.notify_all(); + --outstandingResponses; + // no need to notify, because outstandingRequests will be decremented after return. } return LV2_WORKER_ERR_NO_SPACE; } @@ -123,7 +124,7 @@ bool Worker::EmitResponses() responseRingBuffer.read(sizeof(size), (uint8_t *)&size); if (size > responseBuffer.size()) { - responseBuffer.resize(size); + responseBuffer.resize(size); // allocation on the RT thread! But it's rare, and we have no choice. } uint8_t *pResponse = &(responseBuffer[0]); @@ -132,29 +133,34 @@ bool Worker::EmitResponses() workerInterface->work_response(lilvInstance->lv2_handle, size, pResponse); { std::lock_guard lock(outstandingRequestMutex); - --outstandingRequests; + --outstandingResponses; + cvOutstandingRequests.notify_all(); // must be done WITH the lock, since we may be destructed after the mutex is released. } - cvOutstandingRequests.notify_all(); } return emitted; } void Worker::WaitForAllResponses() { + using Clock = std::chrono::steady_clock; + auto startTime = Clock::now(); while (true) { + // can't do condition_variable::wait_until due to OS restrictions. + // instead, sleep briefly, waiting for wait tasks to complete. bool gotResponse = EmitResponses(); { std::unique_lock lock(outstandingRequestMutex); - if (outstandingRequests == 0) + if (outstandingRequests == 0 && outstandingResponses == 0) { break; } - if (!gotResponse) - { - cvOutstandingRequests.wait(lock); - } } + std::chrono::seconds waitDuration = std::chrono::duration_cast(Clock::now()-startTime); + if (waitDuration.count() > 5) { + throw std::logic_error("Timed out waiting for a Worker task to complete."); + } + std::this_thread::sleep_for(std::chrono::milliseconds(15)); } } @@ -165,10 +171,6 @@ LV2_Worker_Status Worker::ScheduleWork( { std::lock_guard lock(outstandingRequestMutex); ++outstandingRequests; - if (exiting) - { - return LV2_WORKER_ERR_NO_SPACE; - } } LV2_Worker_Status status = this->pHostWorker->ScheduleWork(this, size, data); if (status != LV2_Worker_Status::LV2_WORKER_SUCCESS) @@ -176,8 +178,9 @@ LV2_Worker_Status Worker::ScheduleWork( { std::lock_guard lock(outstandingRequestMutex); --outstandingRequests; + cvOutstandingRequests.notify_all(); // must be done WITH the lock! + return status; } - cvOutstandingRequests.notify_all(); } return status; } @@ -308,11 +311,14 @@ LV2_Worker_Status HostWorkerThread::ScheduleWork(Worker *worker, size_t size, co void Worker::RunBackgroundTask(size_t size, uint8_t *data) { workerInterface->work(lilvInstance->lv2_handle, worker_respond_fn, (LV2_Handle)this, size, data); - - bool notify = false; { - std::lock_guard lock(outstandingRequestMutex); - --outstandingRequests; + std::lock_guard lock { this->outstandingRequestMutex}; + --this->outstandingRequests; + if (this->outstandingRequests == 0) + { + this->cvOutstandingRequests.notify_all(); + } + } - cvOutstandingRequests.notify_all(); + } diff --git a/src/Worker.hpp b/src/Worker.hpp index 42ce6a7..277dcfb 100644 --- a/src/Worker.hpp +++ b/src/Worker.hpp @@ -40,6 +40,7 @@ #include #include "RingBuffer.hpp" #include +#include "inverting_mutex.hpp" namespace pipedal { @@ -60,7 +61,7 @@ namespace pipedal { RingBuffer requestRingBuffer; bool exiting = false; - std::mutex submitMutex; + inverting_mutex submitMutex; std::vector dataBuffer; @@ -86,9 +87,10 @@ namespace pipedal { LV2_Worker_Status WorkerRespond(uint32_t size,const void*data); - std::mutex outstandingRequestMutex; + inverting_mutex outstandingRequestMutex; std::condition_variable cvOutstandingRequests; int64_t outstandingRequests = 0; + int64_t outstandingResponses = 0; void WaitForAllResponses(); public: Worker(const std::shared_ptr& pHostWorker,LilvInstance *instance, const LV2_Worker_Interface *iface); diff --git a/src/inverting_mutex.hpp b/src/inverting_mutex.hpp new file mode 100644 index 0000000..4214f20 --- /dev/null +++ b/src/inverting_mutex.hpp @@ -0,0 +1,194 @@ +// Copyright (c) 2022 Robin Davies +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +/// @brief A mutex that handles priority-inversion. +/// The thread priority of a thread that holds the mutex is boosted to the highest priority of waiting threads, thereby avoiding priority inversion. +/// + +#ifdef WIN32 +static_assert("Fix me!"); +/// Windows has no such concept. The strategy will probably be to boost the priority of worker threads from +/// Nice(2) to something realtime, or work out a non-locking alternative. +/// Currently, the principle problem is the LV2 Worker thread (Pipedal project), which runs at nice(2) priority, which may cause priority inversions on +/// the realtime thread. Of some concern would be threads of BalancedConvolution (ToobAmp project). Longer convolution sections run below the +/// priority of the ALSA threads on linux, while shorter sections run above the priority of the ALSA thread. The convolution threads run +/// at high priority anyway, so priority inversion probably isn't a problem, even on Windows. +#endif + +#include +#include +#include +#include +#include +#include + +class inverting_mutex +{ +public: + using native_handle_type = pthread_mutex_t *; + + inverting_mutex() + { + + pthread_mutexattr_t mta; + + int rc = pthread_mutexattr_init(&mta); + if (rc != 0) + throw_system_error(rc); + + rc = pthread_mutexattr_setprotocol(&mta, PTHREAD_PRIO_INHERIT); + if (rc != 0) + throw_system_error(rc); + + rc = pthread_mutex_init(&mutex, &mta); + if (rc != 0) + throw_system_error(rc); + } + ~inverting_mutex() + { + pthread_mutex_destroy(&mutex); + } + + inverting_mutex(const inverting_mutex &) = delete; + inverting_mutex &operator=(const inverting_mutex &) = delete; + + void + lock() + { + int e = pthread_mutex_lock(&mutex); + + // EINVAL, EAGAIN, EBUSY, EINVAL, EDEADLK(may) + if (e) + throw_system_error(e); + } + + bool + try_lock() noexcept + { + // XXX EINVAL, EAGAIN, EBUSY + int rc = pthread_mutex_trylock(&mutex); + switch (rc) + { + case 0: + return true; + case EBUSY: + return false; + default: + throw_system_error(rc); + return false; + } + } + + template + bool + try_lock_for(const std::chrono::duration &rtime) + { + using clock = std::chrono::steady_clock; + auto rt = std::chrono::duration_cast(rtime); + if (std::ratio_greater()) + ++rt; + + auto t = clock::now() + rt; + return try_lock_until(t); + } + + template + bool + try_lock_until(const std::chrono::time_point &atime) + { + auto s = std::chrono::time_point_cast(atime); + auto ns = std::chrono::duration_cast(atime - s); + + timespec ts = { + static_cast(s.time_since_epoch().count()), + static_cast(ns.count())}; + + return !pthread_mutex_timedlock(&mutex, &ts); + } + + // template + // std::cv_status cond_wait_for(std::condition_variable &cond, const std::chrono::duration &rtime) + // { + // using clock = std::chrono::steady_clock; + // auto rt = std::chrono::duration_cast(rtime); + // if (std::ratio_greater()) + // ++rt; + + // auto t = clock::now() + rt; + // return cont_wait_until(cond,t); + + // } + // template + // std::cv_status cont_wait_until(std::condition_variable &cond,const std::chrono::time_point &atime) + // { + // auto s = std::chrono::time_point_cast(atime); + // auto ns = std::chrono::duration_cast(atime - s); + + // auto now = Clock::now(); + // auto sNow = std::chrono::time_point_cast(now); + // auto nsNow = std::chrono::duration_cast(now - s); + + // timespec tsNow = { + // static_cast(sNow.time_since_epoch().count()), + // static_cast(nsNow.count())}; + // (void)tsNow; + + + + // timespec ts = { + // static_cast(s.time_since_epoch().count()), + // static_cast(ns.count())}; + + // int rc = pthread_cond_timedwait(cond.native_handle(),this->native_handle(),&ts); + // switch (rc) + // { + // case 0: + // return std::cv_status::no_timeout; + // case ETIMEDOUT: + // return std::cv_status::timeout; + // default: + // throw_system_error(rc); + // return std::cv_status::timeout; + + // } + // } + void + unlock() + { + // XXX EINVAL, EAGAIN, EBUSY + int rc = pthread_mutex_unlock(&mutex); + if (rc != 0) + { + throw_system_error(rc); + } + } + + native_handle_type + native_handle() noexcept + { + return &mutex; + } + +private: + void throw_system_error(int e) + { + throw std::logic_error(strerror(e)); + } + pthread_mutex_t mutex; +}; \ No newline at end of file