diff --git a/.vscode/launch.json b/.vscode/launch.json index 933fc9a..894e5c8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,6 +7,7 @@ + { "name": "(gdb) generic", "type": "cppdbg", @@ -50,6 +51,10 @@ // it gets resolved by CMake Tools: "name": "PATH", "value": "$PATH:${command:cmake.launchTargetDirectory}" + }, + { + "name": "LD_LIBRARY_PATH", + "value": "/usr/local/lib/aarch64-linux-gnu" } ], "externalConsole": false, @@ -73,7 +78,8 @@ "args": [ //"[Dev]" -- all dev-machine tests. //"[json_variants]" // subtest of your choice, or none to run all of the tests. - "[inverting_mutex_test]" + //"[inverting_mutex_test]" + "[utf8_to_utf32]" ], "stopAtEntry": false, diff --git a/CMakeLists.txt b/CMakeLists.txt index cb1da23..880da08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,10 @@ cmake_minimum_required(VERSION 3.16.0) project(pipedal - VERSION 1.1.24 + VERSION 1.1.25 DESCRIPTION "PiPedal Guitar Effect Pedal For Raspberry Pi" HOMEPAGE_URL "https://rerdavies.github.io/pipedal" ) -set (DISPLAY_VERSION "v1.1.24") +set (DISPLAY_VERSION "v1.1.25") set (CMAKE_INSTALL_PREFIX "/usr/") diff --git a/README.md b/README.md index d79d481..cda1079 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
-Download: v1.1.24 +Download: v1.1.25 Website: [https://rerdavies.github.io/pipedal](https://rerdavies.github.io/pipedal). diff --git a/debian/control b/debian/control index 796b79d..4cdc359 100644 --- a/debian/control +++ b/debian/control @@ -9,6 +9,6 @@ Package: pipedal Pre-Depends: hostapd;authbind;dnsmasq Priority: optional Section: sound -Version: 1.1.24 +Version: 1.1.25 Installed-Size: 15147 diff --git a/default_presets.bak/plugin_presets/1.json b/default_presets.bak/plugin_presets/1.json deleted file mode 100644 index 475dd42..0000000 --- a/default_presets.bak/plugin_presets/1.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 3e16c07..0000000 --- a/default_presets.bak/plugin_presets/10.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 2469e52..0000000 --- a/default_presets.bak/plugin_presets/11.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index a33212f..0000000 --- a/default_presets.bak/plugin_presets/12.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 6db5588..0000000 --- a/default_presets.bak/plugin_presets/13.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 6bf0a82..0000000 --- a/default_presets.bak/plugin_presets/14.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 057c299..0000000 --- a/default_presets.bak/plugin_presets/15.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 71771df..0000000 --- a/default_presets.bak/plugin_presets/16.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index b55196b..0000000 --- a/default_presets.bak/plugin_presets/17.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index bde3480..0000000 --- a/default_presets.bak/plugin_presets/18.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index cfc3227..0000000 --- a/default_presets.bak/plugin_presets/2.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 58dd9ae..0000000 --- a/default_presets.bak/plugin_presets/3.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 8194191..0000000 --- a/default_presets.bak/plugin_presets/4.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index d355ddf..0000000 --- a/default_presets.bak/plugin_presets/5.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 5986d9f..0000000 --- a/default_presets.bak/plugin_presets/6.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 927ef51..0000000 --- a/default_presets.bak/plugin_presets/7.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 6d81e80..0000000 --- a/default_presets.bak/plugin_presets/8.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index b7c1c78..0000000 --- a/default_presets.bak/plugin_presets/9.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index f3fda51..0000000 --- a/default_presets.bak/plugin_presets/index.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 3f10372..0000000 --- a/default_presets.bak/presets/Default+Bank.bank +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 43e2843..0000000 --- a/default_presets.bak/presets/index.banks +++ /dev/null @@ -1 +0,0 @@ -{"selectedBank": 1,"nextInstanceId": 1,"entries": [{"instanceId": 1,"name": "Default Bank"}]} \ No newline at end of file diff --git a/default_presets/plugin_presets/1.json b/default_presets/plugin_presets/1.json deleted file mode 100644 index 475dd42..0000000 --- a/default_presets/plugin_presets/1.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/10.json b/default_presets/plugin_presets/10.json deleted file mode 100644 index 3e16c07..0000000 --- a/default_presets/plugin_presets/10.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/11.json b/default_presets/plugin_presets/11.json deleted file mode 100644 index 2469e52..0000000 --- a/default_presets/plugin_presets/11.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/12.json b/default_presets/plugin_presets/12.json deleted file mode 100644 index a33212f..0000000 --- a/default_presets/plugin_presets/12.json +++ /dev/null @@ -1 +0,0 @@ -{"pluginUri": "urn:zamaudio:ZamGrains","presets": [ ],"nextInstanceId": 1} \ No newline at end of file diff --git a/default_presets/plugin_presets/13.json b/default_presets/plugin_presets/13.json deleted file mode 100644 index 6db5588..0000000 --- a/default_presets/plugin_presets/13.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/14.json b/default_presets/plugin_presets/14.json deleted file mode 100644 index 6bf0a82..0000000 --- a/default_presets/plugin_presets/14.json +++ /dev/null @@ -1 +0,0 @@ -{"pluginUri": "urn:zamaudio:ZamPhono","presets": [ ],"nextInstanceId": 1} \ No newline at end of file diff --git a/default_presets/plugin_presets/15.json b/default_presets/plugin_presets/15.json deleted file mode 100644 index 057c299..0000000 --- a/default_presets/plugin_presets/15.json +++ /dev/null @@ -1 +0,0 @@ -{"pluginUri": "urn:zamaudio:ZamTube","presets": [ ],"nextInstanceId": 1} \ No newline at end of file diff --git a/default_presets/plugin_presets/16.json b/default_presets/plugin_presets/16.json deleted file mode 100644 index 71771df..0000000 --- a/default_presets/plugin_presets/16.json +++ /dev/null @@ -1 +0,0 @@ -{"pluginUri": "urn:zamaudio:ZamVerb","presets": [ ],"nextInstanceId": 1} \ No newline at end of file diff --git a/default_presets/plugin_presets/17.json b/default_presets/plugin_presets/17.json deleted file mode 100644 index b55196b..0000000 --- a/default_presets/plugin_presets/17.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/18.json b/default_presets/plugin_presets/18.json deleted file mode 100644 index bde3480..0000000 --- a/default_presets/plugin_presets/18.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/19.json b/default_presets/plugin_presets/19.json deleted file mode 100644 index f017130..0000000 --- a/default_presets/plugin_presets/19.json +++ /dev/null @@ -1 +0,0 @@ -{"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/2.json b/default_presets/plugin_presets/2.json deleted file mode 100644 index cfc3227..0000000 --- a/default_presets/plugin_presets/2.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/20.json b/default_presets/plugin_presets/20.json deleted file mode 100644 index 12b61ef..0000000 --- a/default_presets/plugin_presets/20.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index f0b292d..0000000 --- a/default_presets/plugin_presets/21.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 106f161..0000000 --- a/default_presets/plugin_presets/22.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 8d556c7..0000000 --- a/default_presets/plugin_presets/23.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index dc33991..0000000 --- a/default_presets/plugin_presets/24.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 2a81d26..0000000 --- a/default_presets/plugin_presets/25.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index e14aa08..0000000 --- a/default_presets/plugin_presets/26.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 752ed9c..0000000 --- a/default_presets/plugin_presets/27.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 3ae43bd..0000000 --- a/default_presets/plugin_presets/28.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 7d95f12..0000000 --- a/default_presets/plugin_presets/29.json +++ /dev/null @@ -1 +0,0 @@ -{"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/3.json b/default_presets/plugin_presets/3.json deleted file mode 100644 index 58dd9ae..0000000 --- a/default_presets/plugin_presets/3.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/30.json b/default_presets/plugin_presets/30.json deleted file mode 100644 index fac5ca3..0000000 --- a/default_presets/plugin_presets/30.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 304cae2..0000000 --- a/default_presets/plugin_presets/31.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 8c5ebf1..0000000 --- a/default_presets/plugin_presets/32.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 6b97b01..0000000 --- a/default_presets/plugin_presets/33.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 7cd5501..0000000 --- a/default_presets/plugin_presets/34.json +++ /dev/null @@ -1 +0,0 @@ -{"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/4.json b/default_presets/plugin_presets/4.json deleted file mode 100644 index 8194191..0000000 --- a/default_presets/plugin_presets/4.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/5.json b/default_presets/plugin_presets/5.json deleted file mode 100644 index d355ddf..0000000 --- a/default_presets/plugin_presets/5.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/6.json b/default_presets/plugin_presets/6.json deleted file mode 100644 index 5986d9f..0000000 --- a/default_presets/plugin_presets/6.json +++ /dev/null @@ -1 +0,0 @@ -{"pluginUri": "urn:zamaudio:ZamDelay","presets": [ ],"nextInstanceId": 1} \ No newline at end of file diff --git a/default_presets/plugin_presets/7.json b/default_presets/plugin_presets/7.json deleted file mode 100644 index 927ef51..0000000 --- a/default_presets/plugin_presets/7.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/8.json b/default_presets/plugin_presets/8.json deleted file mode 100644 index 6d81e80..0000000 --- a/default_presets/plugin_presets/8.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/9.json b/default_presets/plugin_presets/9.json deleted file mode 100644 index b7c1c78..0000000 --- a/default_presets/plugin_presets/9.json +++ /dev/null @@ -1 +0,0 @@ -{"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/plugin_presets/index.json b/default_presets/plugin_presets/index.json deleted file mode 100644 index 2e33843..0000000 --- a/default_presets/plugin_presets/index.json +++ /dev/null @@ -1 +0,0 @@ -{"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/docs/Installing.md b/docs/Installing.md index e1a2c0c..04e8ff6 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.1.24](https://github.com/rerdavies/pipedal/releases/download/v1.1.24/pipedal_1.1.24_arm64.deb) +- [Ubuntu/Raspberry Pi OS (64-bit) v1.1.25](https://github.com/rerdavies/pipedal/releases/download/v1.1.25/pipedal_1.1.25_arm64.deb) Install the package by running ``` sudo apt update cd ~/Downloads - sudo apt-get install ./pipedal_1.1.24_arm64.deb + sudo apt-get install ./pipedal_1.1.25_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 index aee9c70..67063fd 100644 --- a/docs/ReleaseNotes.md +++ b/docs/ReleaseNotes.md @@ -1,6 +1,6 @@ # Release Notes -## PiPedal 1.1.24 +## PiPedal 1.1.25 - Reduce TooB Convolution Reverb and Toob Cab IR CPU use by 90%. diff --git a/docs/download.md b/docs/download.md index 1c81e06..6104cab 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.1.24/pipedal_1.1.24_arm64.deb) v1.1.24 +- [Ubuntu or Raspberry Pi OS (64-bit)](https://github.com/rerdavies/pipedal/releases/download/v1.1.25/pipedal_1.1.25_arm64.deb) v1.1.25 Install the package by running ``` sudo apt update cd ~/Downloads - sudo apt-get install ./pipedal_1.1.24_arm64.deb + sudo apt-get install ./pipedal_1.1.25_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 21801a4..efad00a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,7 @@ -v1.1.24 +v1.1.25   diff --git a/install.sh b/install.sh index c4f0fbe..3113e24 100755 --- a/install.sh +++ b/install.sh @@ -1,5 +1,5 @@ #!/usr/bin/bash -# copy files. +# copy files to installation directories cmake --install build --prefix /usr --config Release -v # Done as an install action by the debian package. sudo /usr/bin/pipedalconfig --install diff --git a/installdbg b/installdbg deleted file mode 100755 index 89a3d3b..0000000 --- a/installdbg +++ /dev/null @@ -1 +0,0 @@ -cmake --install /home/patch/src/pipedal/build --prefix /usr/local --config Debug diff --git a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl index 4fd6783..e9a4893 100644 --- a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl @@ -49,10 +49,10 @@ toobimpulse:impulseFile doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 14 ; + lv2:microVersion 15 ; rdfs:comment """ -Convolution reverb is a notoriously compute-intensive effect. For best results, use the Max T control to constrain the length of the impulse file to +Convolution reverb is a notoriously compute-intensive effect. If you are having performance issues, use the Max T control to constrain the length of the impulse file to under two seconds. The Max T control affects how much of the impulse file is used. If the length of the impulse file is longer than the specified time, samples occuring after @@ -68,12 +68,11 @@ impulse signal; turning it off removes leading silence. If the the Direct mix co delaying the convolution reverb output; you want responses as quickly as possible; the Predelay control should be set to off. The leading silence in impulse files can sometimes be quite significant. -If the input file has 4 channels, Toob Convolution Reverb assumes the signal is in Ambisonic b-format, and downmixes the channels accordingly. Unfortunately, -it currently dowmixes the Ambisonic audio to mono. Exepct a stereo version of Toob Convolution Reverb in the near future, which will make better use of -Ambisonic source material. +If the input file has 4 channels, Toob Convolution Reverb assumes the signal is in Ambisonic b-format, and downmixes the ambisonic channels to mono. To generate +stereo reverb effects from ambisonic audio, use the stereo version of this plugin. -Toob Convolution Reverb comes with a nominal set of reverb impulse files to get you started. You are strongly encouraged to seek out reverb impulse files -on the internet. +Toob Convolution Reverb comes with a nominal set of reverb impulse files to get you started. You are strongly encouraged to explore the rich collections of +reverb impulse files that are widely available on the internet. Special thanks are extended to the the OpenAir project, wich graciously provided the base set of impulse files distributed with Toob Convolution Reverb under licensing terms that are compatible with the Toob Amp project's licensing terms. @@ -229,53 +228,11 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 ]; 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 - ]; - rdfs:comment "Reverb mix. Set to minimum to disable." ; - ], - [ - a lv2:InputPort , - lv2:ControlPort ; - - 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"; @@ -300,7 +257,7 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 a lv2:OutputPort , lv2:ControlPort ; - lv2:index 6 ; + lv2:index 4 ; lv2:symbol "loading_state" ; lv2:name "Status"; @@ -340,14 +297,14 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 [ a lv2:AudioPort , lv2:InputPort ; - lv2:index 7 ; + lv2:index 5 ; lv2:symbol "in" ; lv2:name "In" ], [ a lv2:AudioPort , lv2:OutputPort ; - lv2:index 8 ; + lv2:index 6 ; lv2:symbol "out" ; lv2:name "Out" ], @@ -359,7 +316,7 @@ Source: https://www.openair.hosted.york.ac.uk/?page_id=483 lv2:designation lv2:control ; atom:supports patch:Message ; - lv2:index 9 ; + lv2:index 7 ; lv2:symbol "control" ; lv2:name "Control" ; rdfs:comment "Control" ; @@ -369,7 +326,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 10; + lv2:index 8; lv2:symbol "notify" ; lv2:name "Notify" ; rdfs:comment "Notification" ; @@ -405,10 +362,5 @@ toobcr:ui 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/ConvolutionReverbStereo.ttl b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverbStereo.ttl new file mode 100644 index 0000000..7d6f8b7 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverbStereo.ttl @@ -0,0 +1,424 @@ +@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 toobcrs: . +@prefix toobimpulse: . + +toobimpulse:impulseFile + a lv2:Parameter; + rdfs:label "File"; + rdfs:range atom:Path. + + + + a foaf:Person ; + foaf:name "Robin Davies" ; + foaf:mbox ; + foaf:homepage . + + + a lv2:Plugin , + lv2:ReverbPlugin ; + doap:name "TooB Convolution Reverb (Stereo)" , + "TooB Convolution Reverb (Stereo)"@en-gb + ; + doap:license ; + doap:maintainer ; + lv2:minorVersion 0 ; + lv2:microVersion 15 ; + rdfs:comment """ + +Convolution reverb is a notoriously compute-intensive effect. If you are having performance issues, use the Max T control to constrain the length of the impulse file to +under two seconds. + +The Max T control affects how much of the impulse file is used. 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. + +Because reverb impulse files typically include the original sound, you will often get strange comb filter effects if you use the Direct mix control; +but this varies depending on the impulse file in question. Usually, the Direct mix control should be set to -INF. + +The Predelay control determines whether Toob Convolution Reverb will strip leading silence from the impulse data. Turning it on preserves silence in the +impulse signal; turning it off removes leading silence. If the the Direct mix control is set to -INF dB, there's no real point in +delaying the convolution reverb output; you want responses as quickly as possible; the Predelay control should be set to off. + The leading silence in impulse files can sometimes be quite significant. + +If the input file has 4 channels, Toob Convolution Reverb assumes the signal is in Ambisonic b-format, and downmixes the channels accordingly. Unfortunately, +it currently dowmixes the Ambisonic audio to mono. The Width control determines +how wide the stereo image is. + +Toob Convolution Reverb comes with a nominal set of reverb impulse files to get you started. You are strongly encouraged to explore the rich collections of +reverb impulse files that are widely available on the internet. + +Special thanks are extended to the the OpenAir project, wich graciously provided the base set of impulse files distributed with Toob Convolution Reverb under +licensing terms that are compatible with the Toob Amp project's licensing terms. + +--- + +Toob Convolution Reverb's impulse files were provided by the OpenAir project. +https://www.openair.hosted.york.ac.uk, under CC-By-4.0 licenses. + + + +Arthur Sykes Rymer Auditorium.wav + +--------------------------------------- + +By: www.openairlib.net, University of York + +This work is provided under a Creative Commons Attribution 4.0 International License. + +https://creativecommons.org/licenses/by/4.0/ + +Source: https://www.openair.hosted.york.ac.uk/?page_id=425 + + +Jack Lyons Hall, University of York.wav + +--------------------------------------- + +By: www.openairlib.net, Audiolab University of York, Alex Duffell, Aishwarya Sridhar, Zhong Li + +This work is provided under a Creative Commons Attribution 4.0 International License. + +https://creativecommons.org/licenses/by/4.0/ + +Source: https://www.openair.hosted.york.ac.uk/?page_id=571 + + + +Koli National Park - Winter.wav + +--------------------------------------- + +By: www.openairlib.net, Audio Lab University of York, Andrew Chadwick, Simon Shelley + +This work is provided under a Creative Commons Attribution 4.0 International License. +https://creativecommons.org/licenses/by/4.0/ + +Source: https://www.openair.hosted.york.ac.uk/?page_id=584 + + + +St. Margaret’s Church.wav + +--------------------------------------- + +By: www.openairlib.net, AudioLab University of York, www.ncem.co.uk + +This work is provided under a Creative Commons Attribution 4.0 International License. + +https://creativecommons.org/licenses/by/4.0/ + +Source: https://www.openair.hosted.york.ac.uk/?page_id=702 + + +Genesis 6 Studio Live Room.wav + +--------------------------------------- + +By: www.openairlib.net + +This work is provided under a Creative Commons Attribution 4.0 International License. + +https://creativecommons.org/licenses/by/4.0/ + +Source: https://www.openair.hosted.york.ac.uk/?page_id=483 + +""" ; + + mod:brand "TooB"; + mod:label "Convolution Reverb (Stereo)"; + lv2:requiredFeature urid:map; + lv2:optionalFeature state::freePath, state:makePath, state:mapPath, work:schedule ; + lv2:extensionData state:interface; + + + lv2:optionalFeature lv2:hardRTCapable; + + pg:mainInput toobcrs:mainIn ; + pg:mainOutput toobcrs:mainOut ; + + patch:readable + toobimpulse:impulseFile + ; + patch:writable + toobimpulse:impulseFile + ; + lv2:extensionData state:interface, + work:interface; + + lv2:port + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 0; + lv2:symbol "time" ; + lv2:name "Max T"; + lv2:portProperty epp:logarithmic; + + lv2:default 1.5 ; + lv2:minimum 0.1 ; + lv2:maximum 10.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 1; + 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 2 ; + lv2:symbol "reverb_mix" ; + lv2:name "Reverb"; + + 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 3 ; + lv2:symbol "width" ; + lv2:name "Width"; + + lv2:default 1.0 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + + rdfs:comment "Stereo image width." ; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:portProperty epp:notOnGUI; # doens't produce convincing stereo imaging. + lv2:index 4 ; + lv2:symbol "pan" ; + lv2:name "Pan"; + + lv2:default 0.0 ; + lv2:minimum -1.0 ; + lv2:maximum 1.0 ; + + rdfs:comment "Pan." ; + ], + + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 5 ; + lv2:symbol "predelay" ; + lv2:name "Predelay"; + + lv2:default 1 ; + 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 "inL" ; + lv2:name "InL" ; + lv2:designation pg:left ; + pg:group toobcrs:mainIn + + + ], + [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 8 ; + lv2:symbol "inR" ; + lv2:name "InR" ; + lv2:designation pg:right ; + pg:group toobcrs:mainIn; + ], + [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 9 ; + lv2:symbol "outL" ; + lv2:name "OutL" ; + lv2:designation pg:left ; + pg:group toobcrs:mainOut; + ], + [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 10 ; + lv2:symbol "outR" ; + lv2:name "OutR" ; + lv2:designation pg:right ; + pg:group toobcrs:mainOut; + ], + [ + a atom:AtomPort , + lv2:InputPort; + atom:bufferType atom:Sequence ; + atom:supports patch:Message; + lv2:designation lv2:control ; + atom:supports patch:Message ; + + lv2:index 11 ; + 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 12; + lv2:symbol "notify" ; + lv2:name "Notify" ; + rdfs:comment "Notification" ; + ] + . + + + pipedal_ui:ui toobcrs:ui . + +toobcrs:ui + a pipedal_ui:ui ; + pipedal_ui:fileProperties + [ + a pipedal_ui:fileProperty; + rdfs:label "Impulse File" ; + lv2:index 3 ; + pipedal_ui:patchProperty toobimpulse:impulseFile ; + pipedal_ui:directory "ReverbImpulseFiles"; + 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; + ] + . diff --git a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.0 b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.0 index aff62b5..760f896 120000 --- a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.0 +++ b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.0 @@ -1 +1 @@ -ToobAmp.so.1.0.14 \ No newline at end of file +ToobAmp.so.1.0.15 \ No newline at end of file diff --git a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.1.0.14 b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.1.0.14 index fc019c6..37c1de5 100644 Binary files a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.1.0.14 and b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.1.0.14 differ diff --git a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.1.0.15 b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.1.0.15 new file mode 100644 index 0000000..18ac8d1 Binary files /dev/null and b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so.1.0.15 differ diff --git a/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl b/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl index cc255ce..f6fb8ce 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl @@ -41,7 +41,7 @@ lv2:minorVersion 0 ; lv2:microVersion 14 ; rdfs:comment """ -Emulation of Boss CE-2 Chorus. +Emulation of a Boss CE-2 Chorus. """ ; @@ -72,7 +72,7 @@ Emulation of Boss CE-2 Chorus. lv2:default 0.5 ; lv2:minimum 0.0 ; lv2:maximum 1.0 ; - ], + ], [ a lv2:AudioPort , lv2:InputPort ; @@ -86,6 +86,13 @@ Emulation of Boss CE-2 Chorus. lv2:index 3 ; lv2:symbol "out" ; lv2:name "Out" + ], + [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 4 ; + lv2:symbol "outr" ; + lv2:name "OutR" ] . diff --git a/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl b/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl new file mode 100644 index 0000000..c72fa63 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl @@ -0,0 +1,135 @@ +@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 atom: . +@prefix patch: . +@prefix rdfs: . +@prefix state: . +@prefix urid: . +@prefix xsd: . +@prefix toobChorus: . + + + + a foaf:Person ; + foaf:name "Robin Davies" ; + foaf:mbox ; + foaf:homepage . + + + a lv2:Plugin , + lv2:FlangerPlugin ; + doap:name "TooB BF-2 Flanger" , + "TooB BF-2 Flanger"@en-gb + ; + doap:license ; + doap:maintainer ; + lv2:minorVersion 0 ; + lv2:microVersion 14 ; + rdfs:comment """ +Emulation of a Boss BF-2 Flanger*. + + +* Use of Boss Audio Systems trademarks is purely nominative. The TooB project is not associated in any way with, nor endorsed by Boss Audio Systems. + +""" ; + + mod:brand "TooB"; + mod:label "BF-2 Flanger"; + lv2:optionalFeature lv2:hardRTCapable; + + lv2:port + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 0; + lv2:symbol "manual" ; + rdfs:comment "LFO offset"; + lv2:name "Manual"; + lv2:default 0.5 ; + lv2:minimum 0.0; + lv2:maximum 1.0; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 1 ; + lv2:symbol "depth" ; + rdfs:comment "LFO depth"; + + lv2:name "Depth"; + + lv2:default 0.5 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 2 ; + lv2:symbol "rate" ; + lv2:name "Rate"; + rdfs:comment "LFO rate"; + + lv2:default 0.5 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + ], + [ + a lv2:OutputPort , + lv2:ControlPort ; + + lv2:index 3 ; + lv2:symbol "lfo" ; + lv2:name "LFO"; + + lv2:minimum -1.0 ; + lv2:maximum 1.0 ; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 4 ; + lv2:symbol "res" ; + lv2:name "Res"; + rdfs:comment "Delay feedback"; + + lv2:default 0.5 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + ], + [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 5 ; + lv2:symbol "in" ; + lv2:name "In" + ], + [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 6 ; + lv2:symbol "outl" ; + lv2:name "OutL" + ] + . + + diff --git a/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl b/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl new file mode 100644 index 0000000..be9d6e4 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl @@ -0,0 +1,145 @@ +@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 atom: . +@prefix patch: . +@prefix rdfs: . +@prefix state: . +@prefix urid: . +@prefix xsd: . +@prefix toobChorus: . + + + + a foaf:Person ; + foaf:name "Robin Davies" ; + foaf:mbox ; + foaf:homepage . + + + a lv2:Plugin , + lv2:FlangerPlugin ; + doap:name "TooB BF-2 Stereo Flanger" , + "TooB BF-2 Stereo Flanger"@en-gb + ; + doap:license ; + doap:maintainer ; + lv2:minorVersion 0 ; + lv2:microVersion 14 ; + rdfs:comment """ +Digital emulation of a Boss BF-2 Flanger*. + +WARNING: use of this plugin in monophonic signal chains, on some hosts, may completely cancel out the flanger effect, since the right channel is +created by subtracting the output of the flanger delay line instead of adding it. If you are using this effect in a monophonic effect chain, you +should use the monophonic version of this effect. + +* Use of Boss Audio Systems trademarks is purely nominative. The TooB project is not associated in any way with, nor endorsed by Boss Audio Systems. + +""" ; + + mod:brand "TooB"; + mod:label "BF-2 Stereo Flanger"; + lv2:optionalFeature lv2:hardRTCapable; + + lv2:port + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 0; + lv2:symbol "manual" ; + rdfs:comment "LFO offset"; + lv2:name "Manual"; + lv2:default 0.5 ; + lv2:minimum 0.0; + lv2:maximum 1.0; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 1 ; + lv2:symbol "depth" ; + rdfs:comment "LFO depth"; + + lv2:name "Depth"; + + lv2:default 0.5 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 2 ; + lv2:symbol "rate" ; + lv2:name "Rate"; + rdfs:comment "LFO rate"; + + lv2:default 0.5 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + ], + [ + a lv2:OutputPort , + lv2:ControlPort ; + + lv2:index 3 ; + lv2:symbol "lfo" ; + lv2:name "LFO"; + + lv2:minimum -1.0 ; + lv2:maximum 1.0 ; + ], + [ + a lv2:InputPort , + lv2:ControlPort ; + + lv2:index 4 ; + lv2:symbol "res" ; + lv2:name "Res"; + rdfs:comment "Delay feedback"; + + lv2:default 0.5 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + ], + [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 5 ; + lv2:symbol "in" ; + lv2:name "In" + ], + [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 6 ; + lv2:symbol "outl" ; + lv2:name "OutL" + ], + [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 7 ; + lv2:symbol "outr" ; + lv2:name "OutR" + ] + . + + diff --git a/lv2/aarch64/ToobAmp.lv2/manifest.ttl b/lv2/aarch64/ToobAmp.lv2/manifest.ttl index 7a0b9f8..e54157f 100644 --- a/lv2/aarch64/ToobAmp.lv2/manifest.ttl +++ b/lv2/aarch64/ToobAmp.lv2/manifest.ttl @@ -1,6 +1,7 @@ @prefix lv2: . @prefix rdfs: . -@prefix modgui: . +@prefix pset: . +@prefix tpset: . a lv2:Plugin ; @@ -11,6 +12,11 @@ lv2:binary ; rdfs:seeAlso . + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . + + a lv2:Plugin ; lv2:binary ; rdfs:seeAlso . @@ -54,234 +60,136 @@ lv2:binary ; rdfs:seeAlso . + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . + + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . + + +tpset:toob-flanger-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +tpset:toob-flanger-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +tpset:toob-flanger-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +tpset:toob-flanger-preset-3 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +tpset:toob-flanger-stereo-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +tpset:toob-flanger-stereo-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +tpset:toob-flanger-stereo-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +tpset:toob-flanger-stereo-preset-3 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# -# modgui:gui [ -# modgui:resourcesDirectory ; -# modgui:iconTemplate ; -# modgui:stylesheet ; -# modgui:screenshot ; -# modgui:thumbnail ; -# modgui:javascript ; +tpset:toob-delay-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# modgui:brand "TooB" ; -# modgui:label "TooB Power Stage" ; +tpset:toob-delay-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# 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 ; +tpset:toob-ml-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# lv2:index 21 ; -# lv2:symbol "sagf" ; -# lv2:name "SagF"; -# ] -# ; -# ] . +tpset:toob-ml-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# -# modgui:gui [ -# modgui:resourcesDirectory ; -# modgui:javascript ; -# modgui:iconTemplate ; -# modgui:stylesheet ; -# modgui:screenshot ; -# modgui:thumbnail ; +tpset:toob-ml-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# modgui:brand "TooB" ; -# modgui:label "TooB Input Stage" ; +tpset:toob-freeverb-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# 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" ; -# ] -# ; -# ] . +tpset:toob-freeverb-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# -# modgui:gui [ -# modgui:resourcesDirectory ; -# modgui:javascript ; -# modgui:iconTemplate ; -# modgui:stylesheet ; -# modgui:screenshot ; -# modgui:thumbnail ; +tpset:toob-freeverb-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# modgui:brand "TooB" ; -# modgui:label "TooB Cab Simulator" ; +### +tpset:toob-convolution-reverb-stereo-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# 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" ; -# ] -# ; -# ] . +tpset:toob-convolution-reverb-stereo-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# -# modgui:gui [ -# modgui:resourcesDirectory ; -# modgui:javascript ; -# modgui:iconTemplate ; -# modgui:stylesheet ; -# modgui:screenshot ; -# modgui:thumbnail ; +tpset:toob-convolution-reverb-stereo-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# modgui:brand "TooB" ; -# modgui:label "TooB Tone Stack" ; +tpset:toob-convolution-reverb-stereo-preset-3 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +### +tpset:toob-convolution-reverb-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +tpset:toob-convolution-reverb-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +tpset:toob-convolution-reverb-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . + +tpset:toob-convolution-reverb-preset-3 + a pset:Preset ; + lv2:appliesTo ; + rdfs:seeAlso . -# 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/lv2/aarch64/ToobAmp.lv2/toob-convolution-reverb-presets.ttl b/lv2/aarch64/ToobAmp.lv2/toob-convolution-reverb-presets.ttl new file mode 100644 index 0000000..6908af6 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/toob-convolution-reverb-presets.ttl @@ -0,0 +1,102 @@ +@prefix lv2: . +@prefix rdfs: . +@prefix pset: . +@prefix tpset: . +@prefix state: . + +tpset:toob-convolution-reverb-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Hall" ; + lv2:port [ + lv2:symbol "direct_mix" ; + pset:value -2.222214 ; + ] , [ + lv2:symbol "loading_state" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "predelay" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "reverb_mix" ; + pset:value -12.77779 ; + ] , [ + lv2:symbol "time" ; + pset:value 1.5 ; + ] ; + state:state [ + "ReverbImpulseFiles/St. Margaret\u0027s Church.wav" ; + ] . + +tpset:toob-convolution-reverb-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Large Hall" ; + lv2:port [ + lv2:symbol "direct_mix" ; + pset:value -3.333313 ; + ] , [ + lv2:symbol "loading_state" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "predelay" ; + pset:value 1.0 ; + ] , [ + lv2:symbol "reverb_mix" ; + pset:value -15.0 ; + ] , [ + lv2:symbol "time" ; + pset:value 1.5 ; + ] ; + state:state [ + "ReverbImpulseFiles/Jack Lyons Hall, University of York.wav" ; + ] . + +tpset:toob-convolution-reverb-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Club" ; + lv2:port [ + lv2:symbol "direct_mix" ; + pset:value -40.0 ; + ] , [ + lv2:symbol "loading_state" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "predelay" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "reverb_mix" ; + pset:value -5.0 ; + ] , [ + lv2:symbol "time" ; + pset:value 1.5 ; + ] ; + state:state [ + "ReverbImpulseFiles/Arthur Sykes Rymer Auditorium.wav" ; + ] . + +tpset:toob-convolution-reverb-preset-3 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Live Room" ; + lv2:port [ + lv2:symbol "direct_mix" ; + pset:value -1.111115 ; + ] , [ + lv2:symbol "loading_state" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "predelay" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "reverb_mix" ; + pset:value -9.444443 ; + ] , [ + lv2:symbol "time" ; + pset:value 1.5 ; + ] ; + state:state [ + "ReverbImpulseFiles/Genesis 6 Studio Live Room.wav" ; + ] . + diff --git a/lv2/aarch64/ToobAmp.lv2/toob-convolution-reverb-stereo-presets.ttl b/lv2/aarch64/ToobAmp.lv2/toob-convolution-reverb-stereo-presets.ttl new file mode 100644 index 0000000..f73fba6 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/toob-convolution-reverb-stereo-presets.ttl @@ -0,0 +1,114 @@ +@prefix lv2: . +@prefix rdfs: . +@prefix pset: . +@prefix tpset: . +@prefix state: . + +tpset:toob-convolution-reverb-stereo-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Hall" ; + lv2:port [ + lv2:symbol "direct_mix" ; + pset:value -2.222214 ; + ] , [ + lv2:symbol "loading_state" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "predelay" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "reverb_mix" ; + pset:value -12.77779 ; + ] , [ + lv2:symbol "time" ; + pset:value 1.5 ; + ] , [ + lv2:symbol "width" ; + pset:value 1.0 ; + ] ; + state:state [ + "ReverbImpulseFiles/St. Margaret\u0027s Church.wav" ; + ] . + +tpset:toob-convolution-reverb-stereo-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Large Hall" ; + lv2:port [ + lv2:symbol "direct_mix" ; + pset:value -3.333313 ; + ] , [ + lv2:symbol "loading_state" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "predelay" ; + pset:value 1.0 ; + ] , [ + lv2:symbol "reverb_mix" ; + pset:value -15.0 ; + ] , [ + lv2:symbol "time" ; + pset:value 1.5 ; + ] , [ + lv2:symbol "width" ; + pset:value 1.0 ; + ] ; + state:state [ + "ReverbImpulseFiles/Jack Lyons Hall, University of York.wav" ; + ] . + +tpset:toob-convolution-reverb-stereo-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Club" ; + lv2:port [ + lv2:symbol "direct_mix" ; + pset:value -40.0 ; + ] , [ + lv2:symbol "loading_state" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "predelay" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "reverb_mix" ; + pset:value -5.0 ; + ] , [ + lv2:symbol "time" ; + pset:value 1.5 ; + ] , [ + lv2:symbol "width" ; + pset:value 1.0 ; + ] ; + state:state [ + "ReverbImpulseFiles/Arthur Sykes Rymer Auditorium.wav" ; + ] . + +tpset:toob-convolution-reverb-stereo-preset-3 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Live Room" ; + lv2:port [ + lv2:symbol "direct_mix" ; + pset:value -1.111115 ; + ] , [ + lv2:symbol "loading_state" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "predelay" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "reverb_mix" ; + pset:value -9.444443 ; + ] , [ + lv2:symbol "time" ; + pset:value 1.5 ; + ] , [ + lv2:symbol "width" ; + pset:value 1.0 ; + ] ; + state:state [ + "ReverbImpulseFiles/Genesis 6 Studio Live Room.wav" ; + ] . + diff --git a/lv2/aarch64/ToobAmp.lv2/toob-delay-presets.ttl b/lv2/aarch64/ToobAmp.lv2/toob-delay-presets.ttl new file mode 100644 index 0000000..5a9983a --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/toob-delay-presets.ttl @@ -0,0 +1,35 @@ +@prefix lv2: . +@prefix rdfs: . +@prefix pset: . +@prefix tpset: . + +tpset:toob-delay-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Classic" ; + lv2:port [ + lv2:symbol "delay" ; + pset:value 340.0 ; + ] , [ + lv2:symbol "feedback" ; + pset:value 39.1667 ; + ] , [ + lv2:symbol "level" ; + pset:value 27.0 ; + ] . + +tpset:toob-delay-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Slapback" ; + lv2:port [ + lv2:symbol "delay" ; + pset:value 94.6447 ; + ] , [ + lv2:symbol "feedback" ; + pset:value 39.1667 ; + ] , [ + lv2:symbol "level" ; + pset:value 42.0 ; + ] . + diff --git a/lv2/aarch64/ToobAmp.lv2/toob-flanger-presets.ttl b/lv2/aarch64/ToobAmp.lv2/toob-flanger-presets.ttl new file mode 100644 index 0000000..ac3bd50 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/toob-flanger-presets.ttl @@ -0,0 +1,77 @@ +@prefix lv2: . +@prefix rdfs: . +@prefix pset: . +@prefix tpset: . + +tpset:toob-flanger-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Vibe" ; + lv2:port [ + lv2:symbol "depth" ; + pset:value 0.341667 ; + ] , [ + lv2:symbol "manual" ; + pset:value 0.3 ; + ] , [ + lv2:symbol "rate" ; + pset:value 0.991667 ; + ] , [ + lv2:symbol "res" ; + pset:value 0.35 ; + ] . + +tpset:toob-flanger-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Default" ; + lv2:port [ + lv2:symbol "depth" ; + pset:value 0.5 ; + ] , [ + lv2:symbol "manual" ; + pset:value 0.5 ; + ] , [ + lv2:symbol "rate" ; + pset:value 0.5 ; + ] , [ + lv2:symbol "res" ; + pset:value 0.5 ; + ] . + +tpset:toob-flanger-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Chorus" ; + lv2:port [ + lv2:symbol "depth" ; + pset:value 0.158333 ; + ] , [ + lv2:symbol "manual" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "rate" ; + pset:value 0.925 ; + ] , [ + lv2:symbol "res" ; + pset:value 0.0 ; + ] . + +tpset:toob-flanger-preset-3 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Rotary" ; + lv2:port [ + lv2:symbol "depth" ; + pset:value 0.675 ; + ] , [ + lv2:symbol "manual" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "rate" ; + pset:value 0.966667 ; + ] , [ + lv2:symbol "res" ; + pset:value 0.0 ; + ] . + diff --git a/lv2/aarch64/ToobAmp.lv2/toob-flanger-stereo-presets.ttl b/lv2/aarch64/ToobAmp.lv2/toob-flanger-stereo-presets.ttl new file mode 100644 index 0000000..c7e0550 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/toob-flanger-stereo-presets.ttl @@ -0,0 +1,77 @@ +@prefix lv2: . +@prefix rdfs: . +@prefix pset: . +@prefix tpset: . + +tpset:toob-flanger-stereo-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Vibe" ; + lv2:port [ + lv2:symbol "depth" ; + pset:value 0.341667 ; + ] , [ + lv2:symbol "manual" ; + pset:value 0.3 ; + ] , [ + lv2:symbol "rate" ; + pset:value 0.991667 ; + ] , [ + lv2:symbol "res" ; + pset:value 0.35 ; + ] . + +tpset:toob-flanger-stereo-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Default" ; + lv2:port [ + lv2:symbol "depth" ; + pset:value 0.5 ; + ] , [ + lv2:symbol "manual" ; + pset:value 0.5 ; + ] , [ + lv2:symbol "rate" ; + pset:value 0.5 ; + ] , [ + lv2:symbol "res" ; + pset:value 0.5 ; + ] . + +tpset:toob-flanger-stereo-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Chorus" ; + lv2:port [ + lv2:symbol "depth" ; + pset:value 0.158333 ; + ] , [ + lv2:symbol "manual" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "rate" ; + pset:value 0.925 ; + ] , [ + lv2:symbol "res" ; + pset:value 0.0 ; + ] . + +tpset:toob-flanger-stereo-preset-3 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Rotary" ; + lv2:port [ + lv2:symbol "depth" ; + pset:value 0.675 ; + ] , [ + lv2:symbol "manual" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "rate" ; + pset:value 0.966667 ; + ] , [ + lv2:symbol "res" ; + pset:value 0.0 ; + ] . + diff --git a/lv2/aarch64/ToobAmp.lv2/toob-freeverb-presets.ttl b/lv2/aarch64/ToobAmp.lv2/toob-freeverb-presets.ttl new file mode 100644 index 0000000..9f61d91 --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/toob-freeverb-presets.ttl @@ -0,0 +1,50 @@ +@prefix lv2: . +@prefix rdfs: . +@prefix pset: . +@prefix tpset: . + +tpset:toob-freeverb-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Room" ; + lv2:port [ + lv2:symbol "damping" ; + pset:value 0.9851851 ; + ] , [ + lv2:symbol "dryWet" ; + pset:value 0.6537038 ; + ] , [ + lv2:symbol "roomSize" ; + pset:value 0.3 ; + ] . + +tpset:toob-freeverb-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Cathedral" ; + lv2:port [ + lv2:symbol "damping" ; + pset:value 1.0 ; + ] , [ + lv2:symbol "dryWet" ; + pset:value 0.564815 ; + ] , [ + lv2:symbol "roomSize" ; + pset:value 0.8555557 ; + ] . + +tpset:toob-freeverb-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Hall" ; + lv2:port [ + lv2:symbol "damping" ; + pset:value 1.0 ; + ] , [ + lv2:symbol "dryWet" ; + pset:value 0.6740743 ; + ] , [ + lv2:symbol "roomSize" ; + pset:value 0.6333336 ; + ] . + diff --git a/lv2/aarch64/ToobAmp.lv2/toob-ml-presets.ttl b/lv2/aarch64/ToobAmp.lv2/toob-ml-presets.ttl new file mode 100644 index 0000000..f4ee07f --- /dev/null +++ b/lv2/aarch64/ToobAmp.lv2/toob-ml-presets.ttl @@ -0,0 +1,86 @@ +@prefix lv2: . +@prefix rdfs: . +@prefix pset: . +@prefix tpset: . + +tpset:toob-ml-preset-0 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Fender Clean" ; + lv2:port [ + lv2:symbol "bass" ; + pset:value 0.783333 ; + ] , [ + lv2:symbol "gain" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "master" ; + pset:value 1.5 ; + ] , [ + lv2:symbol "mid" ; + pset:value 0.5 ; + ] , [ + lv2:symbol "model" ; + pset:value 8.0 ; + ] , [ + lv2:symbol "treble" ; + pset:value 0.55 ; + ] , [ + lv2:symbol "trim" ; + pset:value -3.0 ; + ] . + +tpset:toob-ml-preset-1 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Mesa Crunch" ; + lv2:port [ + lv2:symbol "bass" ; + pset:value 0.65 ; + ] , [ + lv2:symbol "gain" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "master" ; + pset:value 1.5 ; + ] , [ + lv2:symbol "mid" ; + pset:value 0.5 ; + ] , [ + lv2:symbol "model" ; + pset:value 17.0 ; + ] , [ + lv2:symbol "treble" ; + pset:value 0.55 ; + ] , [ + lv2:symbol "trim" ; + pset:value -3.0 ; + ] . + +tpset:toob-ml-preset-2 + a pset:Preset ; + lv2:appliesTo ; + rdfs:label "Sparkling Clean" ; + lv2:port [ + lv2:symbol "bass" ; + pset:value 0.65 ; + ] , [ + lv2:symbol "gain" ; + pset:value 0.0 ; + ] , [ + lv2:symbol "master" ; + pset:value 1.5 ; + ] , [ + lv2:symbol "mid" ; + pset:value 0.5 ; + ] , [ + lv2:symbol "model" ; + pset:value 19.0 ; + ] , [ + lv2:symbol "treble" ; + pset:value 0.55 ; + ] , [ + lv2:symbol "trim" ; + pset:value -3.0 ; + ] . + diff --git a/previewPages b/previewPages.sh similarity index 71% rename from previewPages rename to previewPages.sh index e5df2e5..1860b96 100755 --- a/previewPages +++ b/previewPages.sh @@ -1,3 +1,5 @@ +#!/bin/bash +# preview gihub.io site. # requires installation of jeckyll. See github docs pages. cd docs diff --git a/react/src/AppThemed.tsx b/react/src/AppThemed.tsx index 144e8d1..d1195c3 100644 --- a/react/src/AppThemed.tsx +++ b/react/src/AppThemed.tsx @@ -139,7 +139,7 @@ const appStyles = (theme: Theme) => createStyles({ loadingBox: { position: "relative", top: "20%", - width: "120px", + width: "240px", color: "#888", marginLeft: "auto", marginRight: "auto", diff --git a/react/src/Pedalboard.tsx b/react/src/Pedalboard.tsx index 44d78e7..3e48629 100644 --- a/react/src/Pedalboard.tsx +++ b/react/src/Pedalboard.tsx @@ -69,6 +69,7 @@ export class PedalboardItem implements Deserializable { this.vstState = input.vstState ?? ""; this.stateUpdateCount = input.stateUpdateCount; this.lv2State = input.lv2State; + this.lilvPresetUri = input.lilvPresetUri; return this; } deserialize(input: any): PedalboardItem { @@ -197,7 +198,8 @@ export class PedalboardItem implements Deserializable { midiBindings: MidiBinding[] = []; vstState: string = ""; stateUpdateCount: number = 0; - lv2State: [boolean,any] = [false,{}] + lv2State: [boolean,any] = [false,{}]; + lilvPresetUri: string = ""; }; diff --git a/react/src/PedalboardView.tsx b/react/src/PedalboardView.tsx index 99b47dd..4ff409d 100644 --- a/react/src/PedalboardView.tsx +++ b/react/src/PedalboardView.tsx @@ -1131,11 +1131,9 @@ const PedalboardView = } else { item.numberOfOutputs = bottomOutputs; } - } else if (splitter.getSplitType() === SplitType.Lr) { - item.numberOfOutputs = (topOutputs !== 0 && bottomOutputs !== 0) ? 2: 0; } else { - item.numberOfOutputs = CalculateConnection(topOutputs,bottomOutputs); - } + item.numberOfOutputs = (topOutputs >= 1 || bottomOutputs >= 1) ? 2: 1; + } } else if (item.isStart()) { item.numberOfOutputs = Math.min(PiPedalModelFactory.getInstance().jackSettings.get().inputAudioPorts.length,2); diff --git a/react/src/PiPedalModel.tsx b/react/src/PiPedalModel.tsx index 32c571f..cf378fb 100644 --- a/react/src/PiPedalModel.tsx +++ b/react/src/PiPedalModel.tsx @@ -1513,6 +1513,15 @@ export class PiPedalModel //implements PiPedalModel } addPedalboardItem(instanceId: number, append: boolean): number { let pedalboard = this.pedalboard.get(); + if (instanceId === Pedalboard.START_CONTROL && append) + { + instanceId = pedalboard.items[0].instanceId; + append = false; + } else if (instanceId === Pedalboard.END_CONTROL && !append) + { + instanceId = pedalboard.items[pedalboard.items.length-1].instanceId; + append = true; + } let newPedalboard = pedalboard.clone(); this.updateVst3State(newPedalboard); @@ -1529,6 +1538,18 @@ export class PiPedalModel //implements PiPedalModel } addPedalboardSplitItem(instanceId: number, append: boolean): number { let pedalboard = this.pedalboard.get(); + + if (instanceId === Pedalboard.START_CONTROL && append) + { + instanceId = pedalboard.items[0].instanceId; + append = false; + } else if (instanceId === Pedalboard.END_CONTROL && !append) + { + instanceId = pedalboard.items[pedalboard.items.length-1].instanceId; + append = true; + } + + let newPedalboard = pedalboard.clone(); this.updateVst3State(newPedalboard); diff --git a/react/src/PiPedalSocket.tsx b/react/src/PiPedalSocket.tsx index e388dcc..6564cba 100644 --- a/react/src/PiPedalSocket.tsx +++ b/react/src/PiPedalSocket.tsx @@ -214,7 +214,7 @@ class PiPedalSocket { enterBackgroundState() { this.isBackground = true; - this.socket?.close(); + this.close(); } exitBackgroundState() @@ -261,7 +261,7 @@ class PiPedalSocket { this.socket.onerror = null; this.socket.onmessage = null; this.socket.onopen = null; - this.socket?.close(); + this.socket.close(); } } catch (ignored) { diff --git a/react/src/PluginOutputControl.tsx b/react/src/PluginOutputControl.tsx index 5ac874c..8dbfa43 100644 --- a/react/src/PluginOutputControl.tsx +++ b/react/src/PluginOutputControl.tsx @@ -24,7 +24,7 @@ import createStyles from '@mui/styles/createStyles'; import withStyles from '@mui/styles/withStyles'; import { UiControl } from './Lv2Plugin'; import Typography from '@mui/material/Typography'; -import { PiPedalModel, PiPedalModelFactory, MonitorPortHandle } from './PiPedalModel'; +import { PiPedalModel, PiPedalModelFactory, MonitorPortHandle,State } from './PiPedalModel'; @@ -87,6 +87,16 @@ const PluginOutputControl = value: 0 }; this.model = PiPedalModelFactory.getInstance(); + this.onConnectionStateChanged = this.onConnectionStateChanged.bind(this); + } + + private onConnectionStateChanged(state: State) + { + if (state === State.Ready) + { + this.unsubscribe(); + this.subscribe(); + } } private mounted: boolean = false; @@ -95,16 +105,27 @@ const PluginOutputControl = super.componentWillUnmount(); } this.mounted = false; + this.model.state.removeOnChangedHandler(this.onConnectionStateChanged); this.unsubscribe(); } componentDidMount(): void { this.mounted = true; this.subscribe(); + this.model.state.addOnChangedHandler(this.onConnectionStateChanged); + if (super.componentDidMount) { super.componentDidMount(); } } + componentDidUpdate(prevProps: Readonly, prevState: Readonly, snapshot?: any): void { + if (prevProps.instanceId !== this.props.instanceId) + { + this.unsubscribe(); + this.subscribe(); + } + } + private VU_HEIGHT = 48-2; private animationHandle: number | undefined = undefined; @@ -207,7 +228,7 @@ const PluginOutputControl =
-
+
diff --git a/react/src/PluginPresetSelector.tsx b/react/src/PluginPresetSelector.tsx index c877a67..fa37aa3 100644 --- a/react/src/PluginPresetSelector.tsx +++ b/react/src/PluginPresetSelector.tsx @@ -96,6 +96,19 @@ const PluginPresetSelector = { this.handlePresetsMenuClose(); this.model.loadPluginPreset(this.props.instanceId,instanceId); + let presetName = this.getPresetName(instanceId); + this.setState({saveAsName: presetName}); + } + getPresetName(instanceId: number) + { + for (let preset of this.state.presets.presets) + { + if (preset.instanceId === instanceId) + { + return preset.label; + } + } + return ""; } handlePresetMenuClick(e: SyntheticEvent): void { diff --git a/react/src/PluginPresetsDialog.tsx b/react/src/PluginPresetsDialog.tsx index acd54b8..cd3df43 100644 --- a/react/src/PluginPresetsDialog.tsx +++ b/react/src/PluginPresetsDialog.tsx @@ -85,7 +85,8 @@ const styles = (theme: Theme) => createStyles({ }, dialogTitle: { marginLeft: theme.spacing(2), - flex: 1, + textOverflow: "ellipsis", + flex: "1 1", }, itemFrame: { display: "flex", @@ -382,7 +383,7 @@ const PluginPresetsDialog = withStyles(styles, { withTheme: true })( )} - + { title } {(this.props.presets.getItem(this.state.selectedItem) != null) diff --git a/react/src/PresetSelector.tsx b/react/src/PresetSelector.tsx index 7249f6f..2067c6f 100644 --- a/react/src/PresetSelector.tsx +++ b/react/src/PresetSelector.tsx @@ -318,7 +318,7 @@ const PresetSelector = onChange={(e, extra) => this.handleChange(e, extra)} onClose={(e) => this.handleSelectClose(e)} displayEmpty - value={presets.selectedInstanceId} + value={presets.selectedInstanceId === 0? '' : presets.selectedInstanceId} inputProps={{ classes: { icon: classes.icon }, 'aria-label': "Select preset" diff --git a/src/AtomBuffer.hpp b/src/AtomBuffer.hpp index bf0fa70..a3caaa9 100644 --- a/src/AtomBuffer.hpp +++ b/src/AtomBuffer.hpp @@ -25,7 +25,7 @@ #pragma once #include -#include "lv2/atom.lv2/atom.h" +#include "lv2/atom/atom.h" namespace pipedal { diff --git a/src/AtomConverter.cpp b/src/AtomConverter.cpp index be3f8d1..4d3af39 100644 --- a/src/AtomConverter.cpp +++ b/src/AtomConverter.cpp @@ -28,7 +28,7 @@ #include #include "json.hpp" #include "ss.hpp" -#include "lv2/atom.lv2/util.h" +#include "lv2/atom/util.h" using namespace pipedal; diff --git a/src/AtomConverter.hpp b/src/AtomConverter.hpp index c6adfe8..9ac7a64 100644 --- a/src/AtomConverter.hpp +++ b/src/AtomConverter.hpp @@ -27,8 +27,8 @@ #include #include #include "MapFeature.hpp" -#include "lv2/atom.lv2/atom.h" -#include "lv2/atom.lv2/forge.h" +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" #include "json_variant.hpp" namespace pipedal diff --git a/src/AtomConverterTest.cpp b/src/AtomConverterTest.cpp index 3751a32..b99316e 100644 --- a/src/AtomConverterTest.cpp +++ b/src/AtomConverterTest.cpp @@ -27,8 +27,8 @@ #include "json.hpp" #include "json_variant.hpp" #include "AtomConverter.hpp" -#include "lv2/atom.lv2/util.h" -#include "lv2/patch.lv2/patch.h" +#include "lv2/atom/util.h" +#include "lv2/patch/patch.h" #include "MapFeature.hpp" #include diff --git a/src/AudioHost.cpp b/src/AudioHost.cpp index cc51c83..4979455 100644 --- a/src/AudioHost.cpp +++ b/src/AudioHost.cpp @@ -188,7 +188,7 @@ private: static constexpr size_t DEFERRED_MIDI_BUFFER_SIZE = 1024; uint8_t deferredMidiMessages[DEFERRED_MIDI_BUFFER_SIZE]; - size_t deferredMidiMessageCount; + size_t deferredMidiMessageCount = 0; bool midiProgramChangePending = false; int selectedBank = -1; int64_t midiProgramChangeId = 0; diff --git a/src/AutoLilvNode.hpp b/src/AutoLilvNode.hpp index 8d9522b..732e02e 100644 --- a/src/AutoLilvNode.hpp +++ b/src/AutoLilvNode.hpp @@ -63,6 +63,14 @@ namespace pipedal { Free(); this->node = node; + this->isConst = false; + return *this; + } + AutoLilvNode &operator=(const LilvNode *node) + { + Free(); + this->node = const_cast(node); + this->isConst = true; return *this; } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d854595..7511b06 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -80,8 +80,8 @@ endif() # Use LV2 headers from the /usr/lib directory. -set (LV2DEV_INCLUDE_DIRS /usr/lib) - +#set (LV2DEV_INCLUDE_DIRS /usr/lib) +set (LV2DEV_INCLUDE_DIRS ) pkg_check_modules(JACK "jack") if(!JACK_FOUND) @@ -284,6 +284,10 @@ add_executable(pipedaltest testMain.cpp jsonTest.cpp json_variant.cpp json_variant.hpp + + utilTest.cpp + util.cpp + util.hpp AlsaDriverTest.cpp AvahiServiceTest.cpp @@ -565,6 +569,7 @@ add_test(NAME DevTest COMMAND pipedaltest "[Dev]") ################################# + add_executable(pipedalconfig PrettyPrinter.hpp ServiceConfiguration.cpp ServiceConfiguration.hpp @@ -615,6 +620,20 @@ add_executable(pipedal_latency_test target_link_libraries(pipedal_latency_test PRIVATE pthread asound ) + +add_executable(capturepresets + CapturePresetsMain.cpp + Storage.cpp + Storage.hpp + CommandLineParser.hpp +) + +target_include_directories(capturepresets PRIVATE ${PIPEDAL_INCLUDES}) + +target_link_libraries(capturepresets ${PIPEDAL_LIBS}) + + + add_executable(pipedaladmind AdminMain.cpp CommandLineParser.hpp UnixSocket.cpp UnixSocket.hpp ServiceConfiguration.cpp ServiceConfiguration.hpp diff --git a/src/CapturePresetsMain.cpp b/src/CapturePresetsMain.cpp new file mode 100644 index 0000000..7f9dd4f --- /dev/null +++ b/src/CapturePresetsMain.cpp @@ -0,0 +1,305 @@ +#include "Storage.hpp" +#include "CommandLineParser.hpp" +#include +#include +#include "Uri.hpp" +#include "ss.hpp" +#include +#include "util.hpp" + +using namespace pipedal; +using namespace std; +using namespace std::filesystem; + +Storage storage; + +static std::string GetPluginid(const std::string &pluginUrl) +{ + uri uri_(pluginUrl); + return uri_.segments()[uri_.segment_count() - 1]; +} + +static char hexC[] = "0123456788ABCDEF"; + +static void EncodeTurtleStringBody(std::stringstream&ss,const std::string &value) +{ + std::u32string u32String = ToUtf32(value); + for (auto c : u32String) + { + if (c >= ' ' && c <= 0x7F && c != '\"' && c != '\'' && c != '<' && c != '>' && c != '\\' && c != '%') + { + ss << (char)c; + } + else if (c < 0x10000) + { + ss << "\\u" + << hexC[(c >> 12) & 0x0F] + << hexC[(c >> 8) & 0x0F] + << hexC[(c >> 4) & 0x0F] + << hexC[(c >> 0) & 0x0F]; + } + else + { + ss << "\\U" + << hexC[(c >> 28) & 0x0F] + << hexC[(c >> 24) & 0x0F] + << hexC[(c >> 20) & 0x0F] + << hexC[(c >> 16) & 0x0F] + << hexC[(c >> 12) & 0x0F] + << hexC[(c >> 8) & 0x0F] + << hexC[(c >> 4) & 0x0F] + << hexC[(c >> 0) & 0x0F]; + } + } + +} + +static std::string EncodeTurtleString(const std::string &value) +{ + std::stringstream ss; + ss << '"'; + EncodeTurtleStringBody(ss,value); + ss << '"'; + return ss.str(); +} + +static std::string ToString(const std::vector&value) +{ + const char*start = (const char*)(&value[0]); + const char*end = start+value.size(); + while (end != start && end[-1] == 0) + { + --end; + } + + return std::string(start,end); + +} +static std::string EncodeTurtleString(const std::vector &value) +{ + return EncodeTurtleString(ToString(value)); +} + + + +static std::string EncodeTurtlePath(const std::string &value) +{ + std::stringstream ss; + ss << '<'; + EncodeTurtleStringBody(ss,value); + ss << '>'; + return ss.str(); +} + +static std::string EncodeTurtlePath(const std::vector&value) +{ + return EncodeTurtlePath(ToString(value)); +} + +std::string GetFileName(const std::string &uri) +{ + std::string id = GetPluginid(uri); + return id + "-presets.ttl"; +} + +void WritePrefixes(ofstream &f) +{ + f + << "@prefix lv2: ." << endl + << "@prefix rdfs: ." << endl + << "@prefix pset: ." << endl + << "@prefix tpset: ." << endl + << "@prefix state: ." << endl + + << endl; +} + +static void WriteSeeAlso(ofstream &f, const std::string &uri) +{ + std::string id = GetPluginid(uri); + PluginPresets presets = storage.GetPluginPresets(uri); + + f << "###" << endl; + + for (size_t i = 0; i < presets.presets_.size(); ++i) + { + std::string presetId = SS("tpset:" << id << "-preset-" << i); + f << presetId << endl + << " a pset:Preset ;" << endl + << " lv2:appliesTo <" << uri << "> ;" << endl + << " rdfs:seeAlso " + << "<" << GetFileName(uri) << "> ." << endl; + f << endl; + } +} + +std::string EncodeTurtleFloat(float value) +{ + int64_t iValue = (int64_t)value; + if (iValue == value) + { + return SS(iValue << ".0"); + } + std::stringstream s; + s << setprecision(7) << value; + return s.str(); +} +std::string EncodeTurtleDouble(double value) +{ + int64_t iValue = (int64_t)value; + std::stringstream s; + s << '\"'; + if (iValue == value) + { + if (iValue == value) + { + s << iValue << ".0"; + } + + } else { + s << setprecision(15) << value; + } + s << "\"^^xsd:double"; + return s.str(); +} + +void WritePresetFile(const path &outputDirectory, const std::string &uri) +{ + std::string id = GetPluginid(uri); + path fileName = outputDirectory / GetFileName(uri); + ofstream f(fileName); + if (!f.is_open()) + { + throw logic_error(SS("Can't write to " << fileName)); + } + + cout << "Writing preset file " << fileName << endl; + + + WritePrefixes(f); + + PluginPresets presets = storage.GetPluginPresets(uri); + + for (size_t i = 0; i < presets.presets_.size(); ++i) + { + std::string presetId = SS("tpset:" << id << "-preset-" << i); + const auto &preset = presets.presets_[i]; + + f << presetId << endl + << " a pset:Preset ; " << endl + << " lv2:appliesTo <" << uri << "> ;" << endl + << " rdfs:label " << EncodeTurtleString(preset.label_) << " ;" << endl; + if (preset.controlValues_.size() != 0) + { + f << " lv2:port "; + bool firstTime = true; + for (const auto &value : preset.controlValues_) + { + if (!firstTime) + { + f << " , "; + } + firstTime = false; + f << "[" << endl + << " lv2:symbol " << EncodeTurtleString(value.first) << " ;" << endl + << " pset:value " << EncodeTurtleFloat(value.second) << " ;" << endl; + f << " ]"; + } + if (preset.state_.isValid_ && preset.state_.values_.size() != 0) + { + f << " ;" << endl; + f << " state:state [" << endl; + for (const auto &stateValue : preset.state_.values_) + { + f << " <" + << stateValue.first << "> "; + const auto& t = stateValue.second; + if (t.atomType_ == LV2_ATOM__String) + { + f << EncodeTurtleString(t.value_); + } else if (t.atomType_ == LV2_ATOM__Path) + { + // encode it as a string, because Turtle paths have additional sematics. + // The type will be corrected at restore time. + f << EncodeTurtleString(t.value_); + } else if (t.atomType_ == LV2_ATOM__Float) + { + float *v = (float*)(&(t.value_[0])); + f << EncodeTurtleFloat(*v); + } else if (t.atomType_ == LV2_ATOM__Double) + { + double *v = (double*)(&(t.value_[0])); + f << EncodeTurtleDouble(*v); + } else if (t.atomType_ == LV2_ATOM__Int) + { + int32_t *v = (int32_t*)(&t.value_[0]); + f << *v; + } else if (t.atomType_ == LV2_ATOM__Long) + { + int64_t *v = (int64_t*)(&t.value_[0]); + f << *v; + } + f << " ;" << endl; + + } + f << " ] ." << endl; + + } else { + f << " ." << endl; + } + } + f << endl; + } +} + +int main(int argc, const char *argv[]) +{ + // A utility for the ToobAmp project which converts Pipedal presets to LV2 presets so + // that they can be imported as pre-declared presets respective TTL files. + + path outputPath = "/tmp/ToobPresets"; + + // Capture all ToobAmp plugin presets in LV2 format. + // CommandLineParser commandLineParser; + // commandLineParser.Parse(argc,argv); + try + { + + storage.SetConfigRoot("/etc/pipedal/config"); + storage.SetDataRoot("/var/pipedal"); + storage.Initialize(); + + const PluginPresetIndex &index = storage.GetPluginPresetIndex(); + + std::filesystem::create_directories(outputPath); + + { + ofstream f(outputPath / "add_to_manifest.ttl"); + + WritePrefixes(f); + + for (const auto &entry : index.entries_) + { + if (entry.pluginUri_.starts_with("http://two-play.com/plugins/")) + { + cout << "Writing manifest.ttl declerations: " << entry.pluginUri_ << endl; + WriteSeeAlso(f, entry.pluginUri_); + } + } + } + + for (const auto &entry : index.entries_) + { + if (entry.pluginUri_.starts_with("http://two-play.com/plugins/")) + { + WritePresetFile(outputPath, entry.pluginUri_); + } + } + } + catch (const std::exception &e) + { + cout << "ERROR: " << e.what() << endl; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} diff --git a/src/IEffect.hpp b/src/IEffect.hpp index b16ad96..c711109 100644 --- a/src/IEffect.hpp +++ b/src/IEffect.hpp @@ -19,8 +19,8 @@ #pragma once -#include -#include +#include +#include namespace pipedal { diff --git a/src/LogFeature.hpp b/src/LogFeature.hpp index 20ba951..600d06b 100644 --- a/src/LogFeature.hpp +++ b/src/LogFeature.hpp @@ -19,14 +19,14 @@ #pragma once -#include "lv2.h" +//#include "lv2.h" -#include "lv2/atom.lv2/atom.h" -#include "lv2/atom.lv2/util.h" -#include "lv2/log.lv2/logger.h" -#include "lv2/midi.lv2/midi.h" -#include "lv2/urid.lv2/urid.h" -#include "lv2/atom.lv2/atom.h" +#include "lv2/atom/atom.h" +#include "lv2/atom/util.h" +#include "lv2/log/logger.h" +#include "lv2/midi/midi.h" +#include "lv2/urid/urid.h" +#include "lv2/atom/atom.h" #include "MapFeature.hpp" #include #include diff --git a/src/Lv2Effect.cpp b/src/Lv2Effect.cpp index 06fd457..52472ee 100644 --- a/src/Lv2Effect.cpp +++ b/src/Lv2Effect.cpp @@ -22,22 +22,22 @@ #include "PiPedalException.hpp" #include #include -#include "lv2/atom.lv2/atom.h" -#include "lv2/atom.lv2/util.h" -#include "lv2.h" -#include "lv2/log.lv2/log.h" -#include "lv2/log.lv2/logger.h" -#include "lv2/midi.lv2/midi.h" -#include "lv2/urid.lv2/urid.h" -#include "lv2/log.lv2/logger.h" -#include "lv2/uri-map.lv2/uri-map.h" -#include "lv2/atom.lv2/forge.h" -#include "lv2/state.lv2/state.h" -#include "lv2/worker.lv2/worker.h" -#include "lv2/patch.lv2/patch.h" -#include "lv2/parameters.lv2/parameters.h" -#include "lv2/units.lv2/units.h" -#include "lv2/atom.lv2/util.h" +#include "lv2/atom/atom.h" +#include "lv2/atom/util.h" +//#include "lv2.h" +#include "lv2/log/log.h" +#include "lv2/log/logger.h" +#include "lv2/midi/midi.h" +#include "lv2/urid/urid.h" +#include "lv2/log/logger.h" +#include "lv2/uri-map/uri-map.h" +#include "lv2/atom/forge.h" +#include "lv2/state/state.h" +#include "lv2/worker/worker.h" +#include "lv2/patch/patch.h" +#include "lv2/parameters/parameters.h" +#include "lv2/units/units.h" +#include "lv2/atom/util.h" #include "AudioHost.hpp" #include #include "RingBufferReader.hpp" @@ -49,7 +49,7 @@ const float BYPASS_TIME_S = 0.1f; Lv2Effect::Lv2Effect( IHost *pHost_, const std::shared_ptr &info_, - const PedalboardItem &pedalboardItem) + PedalboardItem &pedalboardItem) : pHost(pHost_), pInstance(nullptr), info(info_), urids(pHost) { auto pWorld = pHost_->getWorld(); @@ -144,7 +144,26 @@ Lv2Effect::Lv2Effect( PreparePortIndices(); ConnectControlPorts(); - RestoreState(pedalboardItem); + if (!pedalboardItem.lilvPresetUri().empty()) + { + AutoLilvNode presetNode = lilv_new_uri(pWorld,pedalboardItem.lilvPresetUri().c_str()); + lilv_world_load_resource(pWorld,presetNode); + LilvState*pState = lilv_state_new_from_world(pWorld,pHost->GetMapFeature().GetMap(),presetNode); + if (pState) + { + if (this->stateInterface) + { + this->stateInterface->RestoreState(pState); + } + lilv_state_free(pState); + } + // now that we've loaded the preset, clear the uri, and save new state + // Why? because lilv doesn't provide facilities for reading state. + pedalboardItem.lv2State(this->stateInterface->Save()); + pedalboardItem.lilvPresetUri(""); + } else { + RestoreState(pedalboardItem); + } } void Lv2Effect::RestoreState(const PedalboardItem&pedalboardItem) { @@ -412,6 +431,9 @@ void Lv2Effect::Run(uint32_t samples,RealtimeRingBufferWriter *realtimeRingBuffe { CopyBuffer(this->inputAudioBuffers[0], this->outputAudioBuffers[0], samples); CopyBuffer(this->inputAudioBuffers[0], this->outputAudioBuffers[1], samples); + } else { + CopyBuffer(this->inputAudioBuffers[0], this->outputAudioBuffers[0], samples); + CopyBuffer(this->inputAudioBuffers[1], this->outputAudioBuffers[1], samples); } } } // else leave the output alone. @@ -667,6 +689,7 @@ bool Lv2Effect::GetLv2State(Lv2PluginState*state) state->Erase(); return false; } + *state = this->stateInterface->Save(); state->isValid_ = true; return true; diff --git a/src/Lv2Effect.hpp b/src/Lv2Effect.hpp index 194643b..3c69c0c 100644 --- a/src/Lv2Effect.hpp +++ b/src/Lv2Effect.hpp @@ -27,11 +27,11 @@ #include "IEffect.hpp" #include "Worker.hpp" -#include "lv2/patch.lv2/patch.h" -#include "lv2/log.lv2/log.h" -#include "lv2/log.lv2/logger.h" +#include "lv2/patch/patch.h" +#include "lv2/log/log.h" +#include "lv2/log/logger.h" #include "lv2/lv2plug.in/ns/extensions/units/units.h" -#include "lv2/atom.lv2/forge.h" +#include "lv2/atom/forge.h" #include "AtomBuffer.hpp" #include "StateInterface.hpp" #include "LogFeature.hpp" @@ -202,7 +202,7 @@ namespace pipedal Lv2Effect( IHost *pHost, const std::shared_ptr &info, - const PedalboardItem &pedalboardItem); + PedalboardItem &pedalboardItem); ~Lv2Effect(); bool HasErrorMessage() const { return this->hasErrorMessage; } diff --git a/src/Lv2EventBufferWriter.hpp b/src/Lv2EventBufferWriter.hpp index 5bc39e5..ac0d341 100644 --- a/src/Lv2EventBufferWriter.hpp +++ b/src/Lv2EventBufferWriter.hpp @@ -42,9 +42,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include -#include -#include +#include +#include +#include #include namespace pipedal diff --git a/src/Lv2Pedalboard.cpp b/src/Lv2Pedalboard.cpp index 4cf6a35..be3442f 100644 --- a/src/Lv2Pedalboard.cpp +++ b/src/Lv2Pedalboard.cpp @@ -21,7 +21,6 @@ #include "Lv2Pedalboard.hpp" #include "Lv2Effect.hpp" - #include "SplitEffect.hpp" #include "RingBufferReader.hpp" #include "VuUpdate.hpp" @@ -46,8 +45,6 @@ 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) @@ -63,8 +60,7 @@ int Lv2Pedalboard::GetControlIndex(uint64_t instanceId, const std::string &symbo std::vector Lv2Pedalboard::PrepareItems( std::vector &items, std::vector inputBuffers, - Lv2PedalboardErrorList&errorList - ) + Lv2PedalboardErrorList &errorList) { for (int i = 0; i < items.size(); ++i) { @@ -88,14 +84,17 @@ std::vector Lv2Pedalboard::PrepareItems( this->processActions.push_back(preMixAction); - std::vector topResult = PrepareItems(item.topChain(), topInputs,errorList); - std::vector bottomResult = PrepareItems(item.bottomChain(), bottomInputs,errorList); + std::vector topResult = PrepareItems(item.topChain(), topInputs, errorList); + std::vector bottomResult = PrepareItems(item.bottomChain(), bottomInputs, errorList); this->processActions.push_back( [pSplit](uint32_t frames) { pSplit->PostMix(frames); }); + auto controlValue = item.GetControlValue("splitType"); + // if split is L/R, always output stereo. - pSplit->SetChainBuffers(topInputs, bottomInputs, topResult, bottomResult); + bool forceStereo = (controlValue != nullptr && controlValue->value() == 2); + pSplit->SetChainBuffers(topInputs, bottomInputs, topResult, bottomResult,forceStereo); for (int i = 0; i < item.controlValues().size(); ++i) { @@ -110,22 +109,25 @@ std::vector Lv2Pedalboard::PrepareItems( else { - IEffect* pLv2Effect = nullptr; - try { - pLv2Effect = this->pHost->CreateEffect(item); - } catch (const std::exception &e) + IEffect *pLv2Effect = nullptr; + try + { + pLv2Effect = this->pHost->CreateEffect(item); + } + catch (const std::exception &e) { Lv2Log::warning(SS(e.what())); } - if (pLv2Effect->HasErrorMessage()) - { - std::string error = pLv2Effect->TakeErrorMessage(); - Lv2Log::error(error); - errorList.push_back({item.instanceId(), error}); - } if (pLv2Effect) { + if (pLv2Effect->HasErrorMessage()) + { + std::string error = pLv2Effect->TakeErrorMessage(); + Lv2Log::error(error); + errorList.push_back({item.instanceId(), error}); + } + pEffect = pLv2Effect; uint64_t instanceId = pEffect->GetInstanceId(); @@ -161,9 +163,9 @@ std::vector Lv2Pedalboard::PrepareItems( } this->processActions.push_back( - [pLv2Effect,this](uint32_t frames) + [pLv2Effect, this](uint32_t frames) { - pLv2Effect->Run(frames,this->ringBufferWriter); + pLv2Effect->Run(frames, this->ringBufferWriter); }); } } @@ -224,17 +226,16 @@ void Lv2Pedalboard::Prepare(IHost *pHost, Pedalboard &pedalboard, Lv2PedalboardE outputVolume.SetSampleRate((float)(this->pHost->GetSampleRate())); inputVolume.SetMinDb(-60); outputVolume.SetMinDb(-60); - + inputVolume.SetTarget(pedalboard.input_volume_db()); outputVolume.SetTarget(pedalboard.output_volume_db()); - for (int i = 0; i < pHost->GetNumberOfInputAudioChannels(); ++i) { this->pedalboardInputBuffers.push_back(bufferPool.AllocateBuffer(pHost->GetMaxAudioBufferSize())); } - auto outputs = PrepareItems(pedalboard.items(), this->pedalboardInputBuffers,errorList); + auto outputs = PrepareItems(pedalboard.items(), this->pedalboardInputBuffers, errorList); int nOutputs = pHost->GetNumberOfOutputAudioChannels(); if (nOutputs == 1) { @@ -265,7 +266,9 @@ void Lv2Pedalboard::PrepareMidiMap(const PedalboardItem &pedalboardItem) if (pluginInfo == nullptr && pedalboardItem.uri() == SPLIT_PEDALBOARD_ITEM_URI) { pPluginInfo = GetSplitterPluginInfo(); - } else { + } + else + { pPluginInfo = pluginInfo.get(); } @@ -277,24 +280,26 @@ void Lv2Pedalboard::PrepareMidiMap(const PedalboardItem &pedalboardItem) { auto &binding = pedalboardItem.midiBindings()[bindingIndex]; { - const Lv2PortInfo*pPortInfo; + const Lv2PortInfo *pPortInfo; int controlIndex; if (binding.symbol() == "__bypass") { pPortInfo = GetBypassPortInfo(); controlIndex = -1; - } else { - try { + } + else + { + try + { pPortInfo = &pluginInfo->getPort(binding.symbol()); controlIndex = this->GetControlIndex(pedalboardItem.instanceId(), binding.symbol()); - } catch (const std::exception&ignored) + } + catch (const std::exception &ignored) { continue; } - - } - + MidiMapping mapping; mapping.pluginInfo = pluginInfo; // for lifetime management. We're holding internal pointers to this. May save us in a disorderly shutdown. mapping.pPortInfo = pPortInfo; @@ -384,14 +389,14 @@ static void Copy(float *input, float *output, uint32_t samples) output[i] = input[i]; } } -bool Lv2Pedalboard::Run(float **inputBuffers, float **outputBuffers, uint32_t samples, RealtimeRingBufferWriter*ringBufferWriter) +bool Lv2Pedalboard::Run(float **inputBuffers, float **outputBuffers, uint32_t samples, RealtimeRingBufferWriter *ringBufferWriter) { this->ringBufferWriter = ringBufferWriter; for (size_t i = 0; i < this->pedalboardInputBuffers.size(); ++i) { if (inputBuffers[i] == nullptr) { - return false; + return false; } } for (size_t i = 0; i < samples; ++i) @@ -399,7 +404,7 @@ bool Lv2Pedalboard::Run(float **inputBuffers, float **outputBuffers, uint32_t sa float volume = this->inputVolume.Tick(); for (int c = 0; c < this->pedalboardInputBuffers.size(); ++c) { - this->pedalboardInputBuffers[c][i] = inputBuffers[c][i]*volume; + this->pedalboardInputBuffers[c][i] = inputBuffers[c][i] * volume; } } for (int i = 0; i < this->processActions.size(); ++i) @@ -408,10 +413,10 @@ bool Lv2Pedalboard::Run(float **inputBuffers, float **outputBuffers, uint32_t sa } for (size_t i = 0; i < this->effects.size(); ++i) { - IEffect* effect = effects[i].get(); + IEffect *effect = effects[i].get(); if (effect->HasErrorMessage()) { - ringBufferWriter->WriteLv2ErrorMessage(effect->GetInstanceId(),effect->TakeErrorMessage()); + ringBufferWriter->WriteLv2ErrorMessage(effect->GetInstanceId(), effect->TakeErrorMessage()); } } for (size_t i = 0; i < samples; ++i) @@ -419,7 +424,7 @@ bool Lv2Pedalboard::Run(float **inputBuffers, float **outputBuffers, uint32_t sa float volume = outputVolume.Tick(); for (size_t c = 0; c < this->pedalboardOutputBuffers.size(); ++c) { - outputBuffers[c][i] = this->pedalboardOutputBuffers[c][i]*volume; + outputBuffers[c][i] = this->pedalboardOutputBuffers[c][i] * volume; } } return true; @@ -442,7 +447,7 @@ void Lv2Pedalboard::SetBypass(int effectIndex, bool enabled) effect->SetBypass(enabled); } -void Lv2Pedalboard::ComputeVus(RealtimeVuBuffers *vuConfiguration, uint32_t samples, float**inputBuffers, float**outputBuffers) +void Lv2Pedalboard::ComputeVus(RealtimeVuBuffers *vuConfiguration, uint32_t samples, float **inputBuffers, float **outputBuffers) { for (size_t i = 0; i < vuConfiguration->enabledIndexes.size(); ++i) { @@ -453,25 +458,30 @@ void Lv2Pedalboard::ComputeVus(RealtimeVuBuffers *vuConfiguration, uint32_t samp if (this->pedalboardInputBuffers.size() > 1) { GetInputBuffers(); - pUpdate->AccumulateInputs(inputBuffers[0],inputBuffers[1],samples); - pUpdate->AccumulateOutputs(&(this->pedalboardInputBuffers[0][0]),&(this->pedalboardInputBuffers[1][0]),samples); // after outputVolume applied. - } else { - pUpdate->AccumulateInputs(inputBuffers[0],samples); - pUpdate->AccumulateOutputs(&(this->pedalboardInputBuffers[0][0]),samples); // after input volume applied. + pUpdate->AccumulateInputs(inputBuffers[0], inputBuffers[1], samples); + pUpdate->AccumulateOutputs(&(this->pedalboardInputBuffers[0][0]), &(this->pedalboardInputBuffers[1][0]), samples); // after outputVolume applied. } - } else if (index == Pedalboard::OUTPUT_VOLUME_ID) + else + { + pUpdate->AccumulateInputs(inputBuffers[0], samples); + pUpdate->AccumulateOutputs(&(this->pedalboardInputBuffers[0][0]), samples); // after input volume applied. + } + } + else if (index == Pedalboard::OUTPUT_VOLUME_ID) { if (this->pedalboardOutputBuffers.size() > 1) { - pUpdate->AccumulateInputs(&(this->pedalboardOutputBuffers[0][0]),&(this->pedalboardOutputBuffers[1][0]),samples); - pUpdate->AccumulateOutputs(outputBuffers[0],outputBuffers[1],samples); - } else { - pUpdate->AccumulateInputs(&(this->pedalboardOutputBuffers[0][0]),samples); - pUpdate->AccumulateOutputs(outputBuffers[0],samples); + pUpdate->AccumulateInputs(&(this->pedalboardOutputBuffers[0][0]), &(this->pedalboardOutputBuffers[1][0]), samples); + pUpdate->AccumulateOutputs(outputBuffers[0], outputBuffers[1], samples); + } + else + { + pUpdate->AccumulateInputs(&(this->pedalboardOutputBuffers[0][0]), samples); + pUpdate->AccumulateOutputs(outputBuffers[0], samples); } - } - else { + else + { auto effect = this->realtimeEffects[index]; if (effect->GetNumberOfInputAudioPorts() == 1) @@ -516,22 +526,25 @@ void Lv2Pedalboard::ProcessParameterRequests(RealtimePatchPropertyRequest *pPara if (pEffect == nullptr) { pParameterRequests->errorMessage = "No such effect."; - - } else if (pEffect->IsVst3()) + } + else if (pEffect->IsVst3()) { pParameterRequests->errorMessage = "Not supported for VST3 plugins"; - } else { - Lv2Effect *pLv2Effect = dynamic_cast(pEffect); + } + else + { + Lv2Effect *pLv2Effect = dynamic_cast(pEffect); if (pParameterRequests->requestType == RealtimePatchPropertyRequest::RequestType::PatchGet) { pLv2Effect->RequestPatchProperty(pParameterRequests->uridUri); - } else if (pParameterRequests->requestType == RealtimePatchPropertyRequest::RequestType::PatchSet) { + } + else if (pParameterRequests->requestType == RealtimePatchPropertyRequest::RequestType::PatchSet) + { pLv2Effect->SetPatchProperty( pParameterRequests->uridUri, pParameterRequests->GetSize(), - (LV2_Atom*)pParameterRequests->GetBuffer() - ); + (LV2_Atom *)pParameterRequests->GetBuffer()); } } pParameterRequests = pParameterRequests->pNext; @@ -548,13 +561,14 @@ void Lv2Pedalboard::GatherPatchProperties(RealtimePatchPropertyRequest *pParamet if (effect == nullptr) { pParameterRequests->errorMessage = "No such effect."; - } else if (effect->IsVst3()) + } + else if (effect->IsVst3()) { pParameterRequests->errorMessage = "Not supported for VST3"; } else { - Lv2Effect *pLv2Effect = dynamic_cast(effect); + Lv2Effect *pLv2Effect = dynamic_cast(effect); pLv2Effect->GatherPatchProperties(pParameterRequests); } } diff --git a/src/Lv2Pedalboard.hpp b/src/Lv2Pedalboard.hpp index d79e657..f78cfe0 100644 --- a/src/Lv2Pedalboard.hpp +++ b/src/Lv2Pedalboard.hpp @@ -23,7 +23,7 @@ #include "Lv2Effect.hpp" #include "BufferPool.hpp" #include -#include +#include #include #include "DbDezipper.hpp" diff --git a/src/MapFeature.hpp b/src/MapFeature.hpp index b4a82e3..7c9c38b 100644 --- a/src/MapFeature.hpp +++ b/src/MapFeature.hpp @@ -19,13 +19,14 @@ #pragma once -#include "lv2.h" +//#include "lv2.h" -#include "lv2/log.lv2/log.h" -#include "lv2/log.lv2/logger.h" -#include "lv2/midi.lv2/midi.h" -#include "lv2/urid.lv2/urid.h" -#include "lv2/atom.lv2/atom.h" +#include "lv2/core/lv2.h" +#include "lv2/log/logger.h" +#include "lv2/log/log.h" +#include "lv2/midi/midi.h" +#include "lv2/urid/urid.h" +#include "lv2/atom/atom.h" #include #include #include diff --git a/src/MapPathFeature.hpp b/src/MapPathFeature.hpp index bf6f8bd..e256c72 100644 --- a/src/MapPathFeature.hpp +++ b/src/MapPathFeature.hpp @@ -18,7 +18,7 @@ // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #pragma once -#include "lv2/state.lv2/state.h" +#include "lv2/state/state.h" #include #include "MapFeature.hpp" diff --git a/src/OptionsFeature.cpp b/src/OptionsFeature.cpp index 4dbaf3e..8575007 100644 --- a/src/OptionsFeature.cpp +++ b/src/OptionsFeature.cpp @@ -19,19 +19,19 @@ #include "pch.h" #include "OptionsFeature.hpp" -#include "lv2/atom.lv2/atom.h" -#include "lv2/atom.lv2/util.h" -#include "lv2/log.lv2/log.h" -#include "lv2/log.lv2/logger.h" -#include "lv2/midi.lv2/midi.h" -#include "lv2/urid.lv2/urid.h" -#include "lv2/log.lv2/logger.h" -#include "lv2/uri-map.lv2/uri-map.h" -#include "lv2/atom.lv2/forge.h" -#include "lv2/worker.lv2/worker.h" -#include "lv2/patch.lv2/patch.h" -#include "lv2/parameters.lv2/parameters.h" -#include "lv2/units.lv2/units.h" +#include "lv2/atom/atom.h" +#include "lv2/atom/util.h" +#include "lv2/log/log.h" +#include "lv2/log/logger.h" +#include "lv2/midi/midi.h" +#include "lv2/urid/urid.h" +#include "lv2/log/logger.h" +#include "lv2/uri-map/uri-map.h" +#include "lv2/atom/forge.h" +#include "lv2/worker/worker.h" +#include "lv2/patch/patch.h" +#include "lv2/parameters/parameters.h" +#include "lv2/units/units.h" #include #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h" diff --git a/src/Pedalboard.cpp b/src/Pedalboard.cpp index 448ba7f..e4fa4d5 100644 --- a/src/Pedalboard.cpp +++ b/src/Pedalboard.cpp @@ -24,7 +24,7 @@ using namespace pipedal; -static const PedalboardItem* GetItem_(const std::vector&items,long pedalboardItemId) +static const PedalboardItem* GetItem_(const std::vector&items,int64_t pedalboardItemId) { for (size_t i = 0; i < items.size(); ++i) { @@ -64,11 +64,11 @@ std::vector Pedalboard::GetAllPlugins() } -const PedalboardItem*Pedalboard::GetItem(long pedalItemId) const +const PedalboardItem*Pedalboard::GetItem(int64_t pedalItemId) const { return GetItem_(this->items(),pedalItemId); } -PedalboardItem*Pedalboard::GetItem(long pedalItemId) +PedalboardItem*Pedalboard::GetItem(int64_t pedalItemId) { return const_cast(GetItem_(this->items(),pedalItemId)); } @@ -86,7 +86,7 @@ ControlValue* PedalboardItem::GetControlValue(const std::string&symbol) return nullptr; } -bool Pedalboard::SetItemEnabled(long pedalItemId, bool enabled) +bool Pedalboard::SetItemEnabled(int64_t pedalItemId, bool enabled) { PedalboardItem*item = GetItem(pedalItemId); if (!item) return false; @@ -100,7 +100,7 @@ bool Pedalboard::SetItemEnabled(long pedalItemId, bool enabled) } -bool Pedalboard::SetControlValue(long pedalItemId, const std::string &symbol, float value) +bool Pedalboard::SetControlValue(int64_t pedalItemId, const std::string &symbol, float value) { PedalboardItem*item = GetItem(pedalItemId); if (!item) return false; @@ -201,6 +201,7 @@ JSON_MAP_BEGIN(PedalboardItem) JSON_MAP_REFERENCE(PedalboardItem,midiBindings) JSON_MAP_REFERENCE(PedalboardItem,stateUpdateCount) JSON_MAP_REFERENCE(PedalboardItem,lv2State) + JSON_MAP_REFERENCE(PedalboardItem,lilvPresetUri) JSON_MAP_END() diff --git a/src/Pedalboard.hpp b/src/Pedalboard.hpp index 463eb14..af4dda2 100644 --- a/src/Pedalboard.hpp +++ b/src/Pedalboard.hpp @@ -87,6 +87,7 @@ class PedalboardItem: public JsonMemberWritable { std::string vstState_; uint32_t stateUpdateCount_ = 0; Lv2PluginState lv2State_; + std::string lilvPresetUri_; public: ControlValue*GetControlValue(const std::string&symbol); @@ -104,6 +105,8 @@ public: GETTER_SETTER_VEC(midiBindings) GETTER_SETTER(stateUpdateCount) GETTER_SETTER_REF(lv2State) + Lv2PluginState&lv2State() { return lv2State_; } // non-const version. + GETTER_SETTER_REF(lilvPresetUri) bool isSplit() const @@ -142,14 +145,14 @@ class Pedalboard { public: static constexpr int64_t INPUT_VOLUME_ID = -2; // synthetic PedalboardItem for input volume. static constexpr int64_t OUTPUT_VOLUME_ID = -3; // synthetic PedalboardItem for output volume. - bool SetControlValue(long pedalItemId, const std::string &symbol, float value); - bool SetItemEnabled(long pedalItemId, bool enabled); + bool SetControlValue(int64_t pedalItemId, const std::string &symbol, float value); + bool SetItemEnabled(int64_t pedalItemId, bool enabled); - PedalboardItem*GetItem(long pedalItemId); - const PedalboardItem*GetItem(long pedalItemId) const; + PedalboardItem*GetItem(int64_t pedalItemId); + const PedalboardItem*GetItem(int64_t pedalItemId) const; std::vectorGetAllPlugins(); - bool HasItem(long pedalItemid) const { return GetItem(pedalItemid) != nullptr; } + bool HasItem(int64_t pedalItemid) const { return GetItem(pedalItemid) != nullptr; } GETTER_SETTER_REF(name) GETTER_SETTER_VEC(items) diff --git a/src/PiPedalModel.cpp b/src/PiPedalModel.cpp index ae70abc..4f16959 100644 --- a/src/PiPedalModel.cpp +++ b/src/PiPedalModel.cpp @@ -452,9 +452,23 @@ void PiPedalModel::SetControl(int64_t clientId, int64_t pedalItemId, const std:: { { std::lock_guard lock(mutex); + + if (!this->pedalboard.SetControlValue(pedalItemId, symbol, value)) + { + return; + } + + + PedalboardItem*item = pedalboard.GetItem(pedalItemId); + + // change of split type requires rebuild of the effect + // since it can change the number of output channels. + if (item != nullptr && item->isSplit() && symbol == "splitType") + { + this->FirePedalboardChanged(clientId); + return; + } PreviewControl(clientId, pedalItemId, symbol, value); - this->pedalboard.SetControlValue(pedalItemId, symbol, value); - IEffect *pEffect = this->lv2Pedalboard->GetEffect(pedalItemId); { @@ -512,6 +526,17 @@ void PiPedalModel::FireBanksChanged(int64_t clientId) void PiPedalModel::FirePedalboardChanged(int64_t clientId,bool loadAudioThread) { + if (loadAudioThread) + { + // notify the audio thread. + if (audioHost->IsOpen()) + { + LoadCurrentPedalboard(); + + UpdateRealtimeVuSubscriptions(); + UpdateRealtimeMonitorPortSubscriptions(); + } + } // noify subscribers. IPiPedalModelSubscriber **t = new IPiPedalModelSubscriber *[this->subscribers.size()]; for (size_t i = 0; i < subscribers.size(); ++i) @@ -525,17 +550,6 @@ void PiPedalModel::FirePedalboardChanged(int64_t clientId,bool loadAudioThread) } delete[] t; - if (loadAudioThread) - { - // notify the audio thread. - if (audioHost->IsOpen()) - { - LoadCurrentPedalboard(); - - UpdateRealtimeVuSubscriptions(); - UpdateRealtimeMonitorPortSubscriptions(); - } - } } void PiPedalModel::SetPedalboard(int64_t clientId, Pedalboard &pedalboard) { @@ -1725,13 +1739,18 @@ void PiPedalModel::LoadPluginPreset(int64_t pluginInstanceId, uint64_t presetIns 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. + // Same goes if lilvPresetUri is not empty. + + // lilvPresetUri: use lilv to load the preset from the RDF model. Occurs when using a factory preset + // that has state:state, because lilv doesn't allow us to read this data, but does load it. + // This is a transient condition. for (auto&control : presetValues.controls) { this->pedalboard.SetControlValue(pluginInstanceId, control.key(), control.value()); } - if (!presetValues.state.isValid_) + if ((!presetValues.state.isValid_) && presetValues.lilvPresetUri.empty()) { audioHost->SetPluginPreset(pluginInstanceId, presetValues.controls); @@ -1748,6 +1767,7 @@ void PiPedalModel::LoadPluginPreset(int64_t pluginInstanceId, uint64_t presetIns delete[] t; } else { pedalboardItem->lv2State(presetValues.state); + pedalboardItem->lilvPresetUri(presetValues.lilvPresetUri); pedalboardItem->stateUpdateCount(oldStateUpdateCount+1); FirePedalboardChanged(-1); // does a complete reload of both client and audio server. } @@ -2003,8 +2023,9 @@ 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. + // return true if the error messages have changed audioHost->SetPedalboard(lv2Pedalboard); return true; } diff --git a/src/PluginHost.cpp b/src/PluginHost.cpp index 181dc5e..d586620 100644 --- a/src/PluginHost.cpp +++ b/src/PluginHost.cpp @@ -30,10 +30,10 @@ #include "Lv2Pedalboard.hpp" #include "OptionsFeature.hpp" #include "JackConfiguration.hpp" -#include "lv2/urid.lv2/urid.h" -#include "lv2/ui.lv2/ui.h" -#include "lv2.h" -#include "lv2/atom.lv2/atom.h" +#include "lv2/urid/urid.h" +#include "lv2/ui/ui.h" +//#include "lv2.h" +#include "lv2/atom/atom.h" #include "lv2/time/time.h" #include "lv2/state/state.h" #include "lv2/lv2plug.in/ns/ext/buf-size/buf-size.h" @@ -71,20 +71,23 @@ namespace pipedal static const char *LV2_MIDI_PLUGIN = "http://lv2plug.in/ns/lv2core#MIDIPlugin"; - class PluginHost::Urids { public: Urids(MapFeature &mapFeature) { - atom_Float = mapFeature.GetUrid(LV2_ATOM__Float); + atom__Float = mapFeature.GetUrid(LV2_ATOM__Float); + atom__Double = mapFeature.GetUrid(LV2_ATOM__Double); + atom_Int = mapFeature.GetUrid(LV2_ATOM__Int); ui__portNotification = mapFeature.GetUrid(LV2_UI__portNotification); ui__plugin = mapFeature.GetUrid(LV2_UI__plugin); ui__protocol = mapFeature.GetUrid(LV2_UI__protocol); ui__floatProtocol = mapFeature.GetUrid(LV2_UI__protocol); ui__peakProtocol = mapFeature.GetUrid(LV2_UI__peakProtocol); } - LV2_URID atom_Float; + LV2_URID atom__Float; + LV2_URID atom__Double; + LV2_URID atom_Int; LV2_URID ui__portNotification; LV2_URID ui__plugin; LV2_URID ui__protocol; @@ -103,33 +106,33 @@ void PluginHost::SetConfiguration(const PiPedalConfiguration &configuration) void PluginHost::LilvUris::Initialize(LilvWorld *pWorld) { rdfs__Comment = lilv_new_uri(pWorld, PluginHost::RDFS__comment); - rdfs__range = lilv_new_uri(pWorld,PluginHost::RDFS__range); + rdfs__range = lilv_new_uri(pWorld, PluginHost::RDFS__range); port_logarithmic = lilv_new_uri(pWorld, LV2_PORT_PROPS__logarithmic); port__display_priority = lilv_new_uri(pWorld, LV2_PORT_PROPS__displayPriority); port_range_steps = lilv_new_uri(pWorld, LV2_PORT_PROPS__rangeSteps); integer_property_uri = lilv_new_uri(pWorld, LV2_CORE__integer); enumeration_property_uri = lilv_new_uri(pWorld, LV2_CORE__enumeration); core__toggled = lilv_new_uri(pWorld, LV2_CORE__toggled); - core__connectionOptional = lilv_new_uri(pWorld,LV2_CORE__connectionOptional); + core__connectionOptional = lilv_new_uri(pWorld, LV2_CORE__connectionOptional); portprops__not_on_gui_property_uri = lilv_new_uri(pWorld, LV2_PORT_PROPS__notOnGUI); midi__event = lilv_new_uri(pWorld, LV2_MIDI__MidiEvent); core__designation = lilv_new_uri(pWorld, LV2_CORE__designation); portgroups__group = lilv_new_uri(pWorld, LV2_PORT_GROUPS__group); units__unit = lilv_new_uri(pWorld, LV2_UNITS__unit); - invada_units__unit = lilv_new_uri(pWorld, "http://lv2plug.in/ns/extension/units#unit"); // a typo in invada plugin ttl files. + invada_units__unit = lilv_new_uri(pWorld, "http://lv2plug.in/ns/extension/units#unit"); // a typo in invada plugin ttl files. invada_portprops__logarithmic = lilv_new_uri(pWorld, "http://lv2plug.in/ns/dev/extportinfo#logarithmic"); // a typo in invada plugin ttl files. atom__bufferType = lilv_new_uri(pWorld, LV2_ATOM__bufferType); atom__Path = lilv_new_uri(pWorld, LV2_ATOM__Path); presets__preset = lilv_new_uri(pWorld, LV2_PRESETS__Preset); + state__state = lilv_new_uri(pWorld,LV2_STATE__state); rdfs__label = lilv_new_uri(pWorld, LILV_NS_RDFS "label"); lv2core__symbol = lilv_new_uri(pWorld, LV2_CORE__symbol); lv2core__name = lilv_new_uri(pWorld, LV2_CORE__name); lv2core__index = lilv_new_uri(pWorld, LV2_CORE__index); - lv2core__Parameter = lilv_new_uri(pWorld,LV2_CORE_PREFIX "Parameter"); - + lv2core__Parameter = lilv_new_uri(pWorld, LV2_CORE_PREFIX "Parameter"); pipedalUI__ui = lilv_new_uri(pWorld, PIPEDAL_UI__ui); pipedalUI__fileProperties = lilv_new_uri(pWorld, PIPEDAL_UI__fileProperties); @@ -142,16 +145,14 @@ void PluginHost::LilvUris::Initialize(LilvWorld *pWorld) pipedalUI__outputPorts = lilv_new_uri(pWorld, PIPEDAL_UI__outputPorts); pipedalUI__text = lilv_new_uri(pWorld, PIPEDAL_UI__text); - ui__portNotification = lilv_new_uri(pWorld, LV2_UI__portNotification); ui__plugin = lilv_new_uri(pWorld, LV2_UI__plugin); ui__protocol = lilv_new_uri(pWorld, LV2_UI__protocol); ui__floatProtocol = lilv_new_uri(pWorld, LV2_UI__protocol); ui__peakProtocol = lilv_new_uri(pWorld, LV2_UI__peakProtocol); - ui__portIndex = lilv_new_uri(pWorld,LV2_UI__portIndex); - lv2__symbol = lilv_new_uri(pWorld,LV2_CORE__symbol); - - + ui__portIndex = lilv_new_uri(pWorld, LV2_UI__portIndex); + lv2__symbol = lilv_new_uri(pWorld, LV2_CORE__symbol); + lv2__port = lilv_new_uri(pWorld, LV2_CORE__port); // ui:portNotification // [ @@ -170,11 +171,10 @@ void PluginHost::LilvUris::Initialize(LilvWorld *pWorld) appliesTo = lilv_new_uri(pWorld, LV2_CORE__appliesTo); - patch__writable = lilv_new_uri(pWorld,LV2_PATCH__writable); - patch__readable = lilv_new_uri(pWorld,LV2_PATCH__readable); + 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() @@ -355,14 +355,14 @@ void PluginHost::LoadPluginClassesFromLilv() if (lv2Class && lv2Class->parent_uri().size() != 0) { - std::shared_ptr parentClass = GetPluginClass(lv2Class->parent_uri()); - if (parentClass) - { - Lv2PluginClass *ccClass = const_cast(lv2Class.get()); - ccClass->set_parent(parentClass); - Lv2PluginClass *ccParentClass = parentClass.get(); - ccParentClass->add_child(lv2Class); - } + std::shared_ptr parentClass = GetPluginClass(lv2Class->parent_uri()); + if (parentClass) + { + Lv2PluginClass *ccClass = const_cast(lv2Class.get()); + ccClass->set_parent(parentClass); + Lv2PluginClass *ccParentClass = parentClass.get(); + ccParentClass->add_child(lv2Class); + } } } } @@ -405,30 +405,30 @@ void PluginHost::Load(const char *lv2Path) if (pluginInfo->hasCvPorts()) { - Lv2Log::debug("Plugin %s (%s) skipped. (Has CV ports).", pluginInfo->name().c_str(), pluginInfo->uri().c_str()); + Lv2Log::debug("Plugin %s (%s) skipped. (Has CV ports).", pluginInfo->name().c_str(), pluginInfo->uri().c_str()); } #if !SUPPORT_MIDI else if (pluginInfo->plugin_class() == LV2_MIDI_PLUGIN) { - Lv2Log::debug("Plugin %s (%s) skipped. (MIDI Plugin).", pluginInfo->name().c_str(), pluginInfo->uri().c_str()); + Lv2Log::debug("Plugin %s (%s) skipped. (MIDI Plugin).", pluginInfo->name().c_str(), pluginInfo->uri().c_str()); } #endif else if (!pluginInfo->is_valid()) { - auto &ports = pluginInfo->ports(); - for (int i = 0; i < ports.size(); ++i) + auto &ports = pluginInfo->ports(); + for (int i = 0; i < ports.size(); ++i) + { + auto &port = ports[i]; + if (!port->is_valid()) { - auto &port = ports[i]; - if (!port->is_valid()) - { - Lv2Log::debug("Plugin port %s:%s is invalid.", pluginInfo->name().c_str(), port->name().c_str()); - } + Lv2Log::debug("Plugin port %s:%s is invalid.", pluginInfo->name().c_str(), port->name().c_str()); } - Lv2Log::debug("Plugin %s (%s) skipped. Not valid.", pluginInfo->name().c_str(), pluginInfo->uri().c_str()); + } + Lv2Log::debug("Plugin %s (%s) skipped. Not valid.", pluginInfo->name().c_str(), pluginInfo->uri().c_str()); } else { - this->plugins_.push_back(pluginInfo); + this->plugins_.push_back(pluginInfo); } } auto messages = stdoutCapture.GetOutputLines(); @@ -457,28 +457,28 @@ void PluginHost::Load(const char *lv2Path) if (plugin->is_valid()) { #if SUPPORT_MIDI - if (info.audio_inputs() == 0 && !info.has_midi_input()) - { - Lv2Log::debug("Plugin %s (%s) skipped. No inputs.", plugin->name().c_str(), plugin->uri().c_str()); - } - else if (info.audio_outputs() == 0 && !info.has_midi_output()) - { - Lv2Log::debug("Plugin %s (%s) skipped. No audio outputs.", plugin->name().c_str(), plugin->uri().c_str()); - } + if (info.audio_inputs() == 0 && !info.has_midi_input()) + { + Lv2Log::debug("Plugin %s (%s) skipped. No inputs.", plugin->name().c_str(), plugin->uri().c_str()); + } + else if (info.audio_outputs() == 0 && !info.has_midi_output()) + { + Lv2Log::debug("Plugin %s (%s) skipped. No audio outputs.", plugin->name().c_str(), plugin->uri().c_str()); + } #else - if (info.audio_inputs() == 0) - { - Lv2Log::debug("Plugin %s (%s) skipped. No audio inputs.", plugin->name().c_str(), plugin->uri().c_str()); - } - else if (info.audio_outputs() == 0) - { - Lv2Log::debug("Plugin %s (%s) skipped. No audio outputs.", plugin->name().c_str(), plugin->uri().c_str()); - } + if (info.audio_inputs() == 0) + { + Lv2Log::debug("Plugin %s (%s) skipped. No audio inputs.", plugin->name().c_str(), plugin->uri().c_str()); + } + else if (info.audio_outputs() == 0) + { + Lv2Log::debug("Plugin %s (%s) skipped. No audio outputs.", plugin->name().c_str(), plugin->uri().c_str()); + } #endif - else - { - ui_plugins_.push_back(std::move(info)); - } + else + { + ui_plugins_.push_back(std::move(info)); + } } } @@ -493,8 +493,8 @@ void PluginHost::Load(const char *lv2Path) const auto &vst3PluginList = this->vst3Host->getPluginList(); for (const auto &vst3Plugin : vst3PluginList) { - // copy not move! - ui_plugins_.push_back(vst3Plugin->pluginInfo_); + // copy not move! + ui_plugins_.push_back(vst3Plugin->pluginInfo_); } auto ui_compare = [&collation]( Lv2PluginUiInfo &left, @@ -511,7 +511,6 @@ void PluginHost::Load(const char *lv2Path) #endif }; - static std::vector nodeAsStringArray(const LilvNodes *nodes) { std::vector result; @@ -523,12 +522,10 @@ static std::vector nodeAsStringArray(const LilvNodes *nodes) } const char *PluginHost::RDFS__comment = "http://www.w3.org/2000/01/rdf-schema#" - "comment"; + "comment"; const char *PluginHost::RDFS__range = "http://www.w3.org/2000/01/rdf-schema#" - "range"; - - + "range"; LilvNode *PluginHost::get_comment(const std::string &uri) { @@ -554,20 +551,20 @@ bool Lv2PluginInfo::HasFactoryPresets(PluginHost *lv2Host, const LilvPlugin *plu return result; } -std::shared_ptr Lv2PluginInfo::FindWritablePathProperties(PluginHost *lv2Host,const LilvPlugin*pPlugin) +std::shared_ptr Lv2PluginInfo::FindWritablePathProperties(PluginHost *lv2Host, const LilvPlugin *pPlugin) { - // example: + // example: // // a lv2:Parameter; // rdfs:label "Model"; // rdfs:range atom:Path. - // ... - // patch:writable ; + // ... + // patch:writable ; - LilvWorld* pWorld = lv2Host->getWorld(); + LilvWorld *pWorld = lv2Host->getWorld(); AutoLilvNode pluginUri = lilv_plugin_get_uri(pPlugin); - AutoLilvNodes patchWritables = lilv_world_find_nodes(pWorld,pluginUri,lv2Host->lilvUris.patch__writable,nullptr); + AutoLilvNodes patchWritables = lilv_world_find_nodes(pWorld, pluginUri, lv2Host->lilvUris.patch__writable, nullptr); std::vector fileProperties; @@ -576,13 +573,13 @@ std::shared_ptr Lv2PluginInfo::FindWritablePathProperties(PluginHost AutoLilvNode propertyUri = lilv_nodes_get(patchWritables, iNode); if (propertyUri) { - // isA lv2:Parameter? - if (lilv_world_ask(pWorld,propertyUri,lv2Host->lilvUris.isA,lv2Host->lilvUris.lv2core__Parameter)) + // isA lv2:Parameter? + if (lilv_world_ask(pWorld, propertyUri, lv2Host->lilvUris.isA, lv2Host->lilvUris.lv2core__Parameter)) { // rfs:range atom:Path? - if (lilv_world_ask(pWorld,propertyUri,lv2Host->lilvUris.rdfs__range,lv2Host->lilvUris.atom__Path)) + if (lilv_world_ask(pWorld, propertyUri, lv2Host->lilvUris.rdfs__range, lv2Host->lilvUris.atom__Path)) { - AutoLilvNode label = lilv_world_get(pWorld,propertyUri,lv2Host->lilvUris.rdfs__label,nullptr); + AutoLilvNode label = lilv_world_get(pWorld, propertyUri, lv2Host->lilvUris.rdfs__label, nullptr); std::string strLabel = label.AsString(); if (strLabel.length() != 0) { @@ -591,33 +588,25 @@ std::shared_ptr Lv2PluginInfo::FindWritablePathProperties(PluginHost std::string lv2DirectoryName = path.filename().string(); // we have a valid path property! + auto fileProperty = + std::make_shared( + strLabel, propertyUri.AsUri(), lv2DirectoryName); - auto fileProperty = - std::make_shared( - strLabel,propertyUri.AsUri(),lv2DirectoryName); - - - AutoLilvNodes dc_types = lilv_world_find_nodes(pWorld,propertyUri,lv2Host->lilvUris.dc__format,nullptr); + 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); + 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)); + fileProperty->fileTypes().push_back(UiFileType(label, fileType)); } - - fileProperties.push_back( - fileProperty - ); - + fileProperty); } } - } } - } if (fileProperties.size() != 0) { @@ -625,7 +614,6 @@ std::shared_ptr Lv2PluginInfo::FindWritablePathProperties(PluginHost } return std::shared_ptr(); - } Lv2PluginInfo::Lv2PluginInfo(PluginHost *lv2Host, LilvWorld *pWorld, const LilvPlugin *pPlugin) @@ -685,15 +673,15 @@ Lv2PluginInfo::Lv2PluginInfo(PluginHost *lv2Host, LilvWorld *pWorld, const LilvP std::shared_ptr portInfo = std::make_shared(lv2Host, pPlugin, pPort); if (!portInfo->is_valid()) { - isValid = false; + isValid = false; } const auto &portGroup = portInfo->port_group(); if (portGroup.size() != 0) { - if (std::find(portGroups.begin(), portGroups.end(), portGroup) == portGroups.end()) - { - portGroups.push_back(portGroup); - } + if (std::find(portGroups.begin(), portGroups.end(), portGroup) == portGroups.end()) + { + portGroups.push_back(portGroup); + } } ports_.push_back(std::move(portInfo)); } @@ -707,8 +695,8 @@ Lv2PluginInfo::Lv2PluginInfo(PluginHost *lv2Host, LilvWorld *pWorld, const LilvP { if (!this->IsSupportedFeature(this->required_features_[i])) { - Lv2Log::debug("%s (%s) requires feature %s.", this->name_.c_str(), this->uri_.c_str(), this->required_features_[i].c_str()); - isValid = false; + Lv2Log::debug("%s (%s) requires feature %s.", this->name_.c_str(), this->uri_.c_str(), this->required_features_[i].c_str()); + isValid = false; } } @@ -724,9 +712,11 @@ Lv2PluginInfo::Lv2PluginInfo(PluginHost *lv2Host, LilvWorld *pWorld, const LilvP if (pipedalUINode) { this->piPedalUI_ = std::make_shared(lv2Host, pipedalUINode, std::filesystem::path(bundlePath)); - } else { - // look for - this->piPedalUI_ = FindWritablePathProperties(lv2Host,pPlugin); + } + else + { + // look for + this->piPedalUI_ = FindWritablePathProperties(lv2Host, pPlugin); } int nInputs = 0; @@ -788,7 +778,7 @@ bool Lv2PluginInfo::IsSupportedFeature(const std::string &feature) const for (int i = 0; i < supportedFeatures.size(); ++i) { if (supportedFeatures[i] == feature) - return true; + return true; } return false; } @@ -864,7 +854,7 @@ Lv2PortInfo::Lv2PortInfo(PluginHost *host, const LilvPlugin *plugin, const LilvP auto priority_node = lilv_nodes_get_first(priority_nodes); if (priority_node) { - this->display_priority_ = lilv_node_as_int(priority_node); + this->display_priority_ = lilv_node_as_int(priority_node); } } @@ -875,7 +865,7 @@ Lv2PortInfo::Lv2PortInfo(PluginHost *host, const LilvPlugin *plugin, const LilvP auto range_steps_node = lilv_nodes_get_first(range_steps_nodes); if (range_steps_node) { - this->range_steps_ = lilv_node_as_int(range_steps_node); + this->range_steps_ = lilv_node_as_int(range_steps_node); } } this->integer_property_ = lilv_port_has_property(plugin, pPort, host->lilvUris.integer_property_uri); @@ -884,7 +874,7 @@ Lv2PortInfo::Lv2PortInfo(PluginHost *host, const LilvPlugin *plugin, const LilvP this->toggled_property_ = lilv_port_has_property(plugin, pPort, host->lilvUris.core__toggled); this->not_on_gui_ = lilv_port_has_property(plugin, pPort, host->lilvUris.portprops__not_on_gui_property_uri); - this->connection_optional_ = lilv_port_has_property(plugin,pPort,host->lilvUris.core__connectionOptional); + this->connection_optional_ = lilv_port_has_property(plugin, pPort, host->lilvUris.core__connectionOptional); LilvScalePoints *pScalePoints = lilv_port_get_scale_points(plugin, pPort); LILV_FOREACH(scale_points, iSP, pScalePoints) @@ -921,23 +911,26 @@ Lv2PortInfo::Lv2PortInfo(PluginHost *host, const LilvPlugin *plugin, const LilvP if (unitsValueUri) { this->units_ = UriToUnits(nodeAsString(unitsValueUri)); - } else { + } + else + { // invada plugins use the wrong URI. AutoLilvNode invadaUnitsValueUri = lilv_port_get(plugin, pPort, host->lilvUris.invada_units__unit); if (invadaUnitsValueUri) { std::string uri = nodeAsString(invadaUnitsValueUri); - static const char*INCORRECT_URI = "http://lv2plug.in/ns/extension/units#"; - static const char*CORRECT_URI = "http://lv2plug.in/ns/extensions/units#"; + static const char *INCORRECT_URI = "http://lv2plug.in/ns/extension/units#"; + static const char *CORRECT_URI = "http://lv2plug.in/ns/extensions/units#"; if (uri.starts_with(INCORRECT_URI)) { - uri = uri.replace(0,strlen(INCORRECT_URI),CORRECT_URI); + uri = uri.replace(0, strlen(INCORRECT_URI), CORRECT_URI); } this->units_ = UriToUnits(uri); - } else { + } + else + { this->units(Units::none); } - } AutoLilvNode commentNode = lilv_port_get(plugin, pPort, host->lilvUris.rdfs__Comment); @@ -963,9 +956,9 @@ Lv2PluginClasses PluginHost::GetPluginPortClass(const LilvPlugin *lilvPlugin, co { LILV_FOREACH(nodes, iNode, nodes) { - const LilvNode *node = lilv_nodes_get(nodes, iNode); - std::string classUri = nodeAsString(node); - result.push_back(classUri); + const LilvNode *node = lilv_nodes_get(nodes, iNode); + std::string classUri = nodeAsString(node); + result.push_back(classUri); } } return Lv2PluginClasses(result); @@ -994,7 +987,7 @@ bool Lv2PluginClasses::is_a(PluginHost *lv2Plugins, const char *classUri) const { if (lv2Plugins->is_a(classUri_, i)) { - return true; + return true; } } return false; @@ -1038,39 +1031,39 @@ Lv2PluginUiInfo::Lv2PluginUiInfo(PluginHost *pHost, const Lv2PluginInfo *plugin) } for (auto port : plugin->ports()) { - + if (port->is_input()) { - if (port->is_control_port()) + if (port->is_control_port()) + { + controls_.push_back(Lv2PluginUiPort(plugin, port.get())); + } + else if (port->is_atom_port()) + { + if (port->supports_midi()) { - controls_.push_back(Lv2PluginUiPort(plugin, port.get())); - } - else if (port->is_atom_port()) - { - if (port->supports_midi()) - { - has_midi_input_ = true; - } - } - else if (port->is_audio_port()) - { - ++audio_inputs_; + has_midi_input_ = true; } + } + else if (port->is_audio_port()) + { + ++audio_inputs_; + } } else if (port->is_output()) { - if (port->is_control_port()) - { - controls_.push_back(Lv2PluginUiPort(plugin, port.get())); - } - else if (port->is_atom_port() && port->supports_midi()) - { - this->has_midi_output_ = true; - } - else if (port->is_audio_port()) - { - ++audio_outputs_; - } + if (port->is_control_port()) + { + controls_.push_back(Lv2PluginUiPort(plugin, port.get())); + } + else if (port->is_atom_port() && port->supports_midi()) + { + this->has_midi_output_ = true; + } + else if (port->is_audio_port()) + { + ++audio_outputs_; + } } } for (auto &portGroup : plugin->port_groups()) @@ -1097,7 +1090,7 @@ std::shared_ptr PluginHost::GetPluginInfo(const std::string &uri) { if ((*i)->uri() == uri) { - return (*i); + return (*i); } } return nullptr; @@ -1108,7 +1101,7 @@ Lv2Pedalboard *PluginHost::CreateLv2Pedalboard(Pedalboard &pedalboard, Lv2Pedalb Lv2Pedalboard *pPedalboard = new Lv2Pedalboard(); try { - pPedalboard->Prepare(this, pedalboard,errorMessages); + pPedalboard->Prepare(this, pedalboard, errorMessages); return pPedalboard; } catch (const std::exception &e) @@ -1134,7 +1127,7 @@ void PluginHost::fn_LilvSetPortValueFunc(const char *port_symbol, PluginHost *pHost = pData->pHost; std::vector *pResult = pData->pResult; LV2_URID valueType = (LV2_URID)type; - if (valueType != pHost->urids->atom_Float) + if (valueType != pHost->urids->atom__Float) { throw PiPedalStateException("Preset format not supported."); } @@ -1169,27 +1162,27 @@ std::vector PluginHost::LoadFactoryPluginPreset( if (presetUri == thisPresetUri) { - /*********************************/ + /*********************************/ - // AutoLilvNode uriNode = lilv_new_uri(pWorld, presetUri.c_str()); + // AutoLilvNode uriNode = lilv_new_uri(pWorld, presetUri.c_str()); - auto lilvState = lilv_state_new_from_world(pWorld, GetLv2UridMap(), preset); + auto lilvState = lilv_state_new_from_world(pWorld, GetLv2UridMap(), preset); - if (lilvState == nullptr) - { - throw PiPedalStateException("Preset not found."); - } + if (lilvState == nullptr) + { + throw PiPedalStateException("Preset not found."); + } - StateCallbackData cbData; - cbData.pHost = this; - cbData.pResult = &result; - auto n = lilv_state_get_num_properties(lilvState); - lilv_state_emit_port_values(lilvState, fn_LilvSetPortValueFunc, &cbData); + StateCallbackData cbData; + cbData.pHost = this; + cbData.pResult = &result; + auto n = lilv_state_get_num_properties(lilvState); + lilv_state_emit_port_values(lilvState, fn_LilvSetPortValueFunc, &cbData); - lilv_state_free(lilvState); - break; + lilv_state_free(lilvState); + break; - /*********************************/ + /*********************************/ } } lilv_nodes_free(presets); @@ -1209,11 +1202,17 @@ void PluginHost::PortValueCallback(const char *symbol, void *user_data, const vo PresetCallbackState *pState = static_cast(user_data); PluginHost *pHost = pState->pHost; - if (type == pHost->urids->atom_Float) + if (type == pHost->urids->atom__Double) + { + (*pState->values)[symbol] = (float)(*static_cast(value)); + } else if (type == pHost->urids->atom__Float) { (*pState->values)[symbol] = *static_cast(value); } - else + else if (type == pHost->urids->atom_Int) + { + (*pState->values)[symbol] = *static_cast(value); + } else { pState->failed = true; } @@ -1244,16 +1243,30 @@ PluginPresets PluginHost::GetFactoryPluginPresets(const std::string &pluginUri) LilvState *state = lilv_state_new_from_world(pWorld, this->mapFeature.GetMap(), preset); if (state != nullptr) { - std::string label = lilv_state_get_label(state); + const char *t = this->mapFeature.UridToString(14); + const char *tLabel = lilv_state_get_label(state); + if (tLabel != nullptr) + { + std::string strLabel = tLabel; std::map controlValues; PresetCallbackState cbData{this, &controlValues, false}; lilv_state_emit_port_values(state, PortValueCallback, (void *)&cbData); + + + int numProperties = lilv_state_get_num_properties(state); + // can't handle std:state part of preset. + if (numProperties == 0) + { + if (!cbData.failed) + { + result.presets_.push_back(PluginPreset(result.nextInstanceId_++, strLabel, controlValues, Lv2PluginState())); + } + } else { + result.presets_.push_back(PluginPreset::MakeLilvPreset(result.nextInstanceId_++, strLabel, controlValues, lilv_node_as_uri(preset))); + } lilv_state_free(state); - if (!cbData.failed) - { - result.presets_.push_back(PluginPreset(result.nextInstanceId_++, label, controlValues,Lv2PluginState())); - } + } } } lilv_nodes_free(presets); @@ -1267,13 +1280,13 @@ IEffect *PluginHost::CreateEffect(PedalboardItem &pedalboardItem) #if ENABLE_VST3 try { - Vst3Effect::Ptr vst3Plugin = this->vst3Host->CreatePlugin(pedalboardItem, this); - return vst3Plugin.release(); + Vst3Effect::Ptr vst3Plugin = this->vst3Host->CreatePlugin(pedalboardItem, this); + return vst3Plugin.release(); } catch (const std::exception &e) { - Lv2Log::error(std::string("Failed to create VST3 plugin: ") + e.what()); - throw; + Lv2Log::error(std::string("Failed to create VST3 plugin: ") + e.what()); + throw; } #else Lv2Log::error(std::string("VST3 support not enabled at compile time.")); @@ -1285,7 +1298,7 @@ IEffect *PluginHost::CreateEffect(PedalboardItem &pedalboardItem) { auto info = this->GetPluginInfo(pedalboardItem.uri()); if (!info) - return nullptr; + return nullptr; return new Lv2Effect(this, info, pedalboardItem); } @@ -1443,20 +1456,21 @@ json_map::storage_type Lv2PluginUiPort::jmap{{ json_map::storage_type Lv2PluginUiInfo::jmap{ - {json_map::reference("uri", &Lv2PluginUiInfo::uri_), - json_map::reference("name", &Lv2PluginUiInfo::name_), - json_map::enum_reference("plugin_type", &Lv2PluginUiInfo::plugin_type_, get_plugin_type_enum_converter()), - json_map::reference("plugin_display_type", &Lv2PluginUiInfo::plugin_display_type_), - json_map::reference("author_name", &Lv2PluginUiInfo::author_name_), - json_map::reference("author_homepage", &Lv2PluginUiInfo::author_homepage_), - json_map::reference("audio_inputs", &Lv2PluginUiInfo::audio_inputs_), - json_map::reference("audio_outputs", &Lv2PluginUiInfo::audio_outputs_), - json_map::reference("description", &Lv2PluginUiInfo::description_), - json_map::reference("has_midi_input", &Lv2PluginUiInfo::has_midi_input_), - json_map::reference("has_midi_output", &Lv2PluginUiInfo::has_midi_output_), - json_map::reference("controls", &Lv2PluginUiInfo::controls_), - json_map::reference("port_groups", &Lv2PluginUiInfo::port_groups_), - json_map::reference("is_vst3", &Lv2PluginUiInfo::is_vst3_), - json_map::reference("fileProperties", &Lv2PluginUiInfo::fileProperties_), - json_map::reference("uiPortNotifications", &Lv2PluginUiInfo::uiPortNotifications_), - }}; + { + json_map::reference("uri", &Lv2PluginUiInfo::uri_), + json_map::reference("name", &Lv2PluginUiInfo::name_), + json_map::enum_reference("plugin_type", &Lv2PluginUiInfo::plugin_type_, get_plugin_type_enum_converter()), + json_map::reference("plugin_display_type", &Lv2PluginUiInfo::plugin_display_type_), + json_map::reference("author_name", &Lv2PluginUiInfo::author_name_), + json_map::reference("author_homepage", &Lv2PluginUiInfo::author_homepage_), + json_map::reference("audio_inputs", &Lv2PluginUiInfo::audio_inputs_), + json_map::reference("audio_outputs", &Lv2PluginUiInfo::audio_outputs_), + json_map::reference("description", &Lv2PluginUiInfo::description_), + json_map::reference("has_midi_input", &Lv2PluginUiInfo::has_midi_input_), + json_map::reference("has_midi_output", &Lv2PluginUiInfo::has_midi_output_), + json_map::reference("controls", &Lv2PluginUiInfo::controls_), + json_map::reference("port_groups", &Lv2PluginUiInfo::port_groups_), + json_map::reference("is_vst3", &Lv2PluginUiInfo::is_vst3_), + json_map::reference("fileProperties", &Lv2PluginUiInfo::fileProperties_), + json_map::reference("uiPortNotifications", &Lv2PluginUiInfo::uiPortNotifications_), + }}; diff --git a/src/PluginHost.hpp b/src/PluginHost.hpp index ae35994..bfbae52 100644 --- a/src/PluginHost.hpp +++ b/src/PluginHost.hpp @@ -31,7 +31,7 @@ #include #include "IHost.hpp" -#include "lv2.h" +//#include "lv2.h" #include "Units.hpp" #include "PluginPreset.hpp" @@ -659,6 +659,7 @@ namespace pipedal AutoLilvNode atom__bufferType; AutoLilvNode atom__Path; AutoLilvNode presets__preset; + AutoLilvNode state__state; AutoLilvNode rdfs__label; AutoLilvNode lv2core__symbol; AutoLilvNode lv2core__name; @@ -693,6 +694,7 @@ namespace pipedal AutoLilvNode ui__peakProtocol; AutoLilvNode ui__portIndex; AutoLilvNode lv2__symbol; + AutoLilvNode lv2__port; AutoLilvNode patch__writable; AutoLilvNode patch__readable; @@ -788,6 +790,13 @@ namespace pipedal return this->mapFeature.GetMap(); } static void PortValueCallback(const char *symbol, void *user_data, const void *value, uint32_t size, uint32_t type); + static void StateRestoreCallback( + const char* port_symbol, + void* user_data, + const void* value, + uint32_t size, + uint32_t type); + virtual IEffect *CreateEffect(PedalboardItem &pedalboardItem); void LoadPluginClassesFromLilv(); diff --git a/src/PluginPreset.cpp b/src/PluginPreset.cpp index bc28cd9..e41166b 100644 --- a/src/PluginPreset.cpp +++ b/src/PluginPreset.cpp @@ -28,6 +28,7 @@ JSON_MAP_BEGIN(PluginPreset) JSON_MAP_REFERENCE(PluginPreset,label) JSON_MAP_REFERENCE(PluginPreset,controlValues) JSON_MAP_REFERENCE(PluginPreset,state) + JSON_MAP_REFERENCE(PluginPreset,lilvPresetUri) JSON_MAP_END() JSON_MAP_BEGIN(PluginPresets) diff --git a/src/PluginPreset.hpp b/src/PluginPreset.hpp index c139e59..e27dec1 100644 --- a/src/PluginPreset.hpp +++ b/src/PluginPreset.hpp @@ -97,8 +97,23 @@ public: { } + static PluginPreset MakeLilvPreset( + uint64_t instanceId, + const std::string&label, + const std::map & controlValues, + const char*presetUri + ) { + PluginPreset preset; + preset.instanceId_ = instanceId; + preset.label_ = label; + preset.lilvPresetUri_ = presetUri; + preset.controlValues_ = controlValues; + return preset; + } + uint64_t instanceId_; std::string label_; + std::string lilvPresetUri_; std::map controlValues_; Lv2PluginState state_; DECLARE_JSON_MAP(PluginPreset); diff --git a/src/RingBufferReader.hpp b/src/RingBufferReader.hpp index 41bdcd7..34996ae 100644 --- a/src/RingBufferReader.hpp +++ b/src/RingBufferReader.hpp @@ -23,7 +23,7 @@ #include "Lv2Log.hpp" #include "VuUpdate.hpp" #include "AudioHost.hpp" -#include "lv2/atom.lv2/atom.h" +#include "lv2/atom/atom.h" #include namespace pipedal { diff --git a/src/SplitEffect.cpp b/src/SplitEffect.cpp index f4d1d13..13ba886 100644 --- a/src/SplitEffect.cpp +++ b/src/SplitEffect.cpp @@ -25,8 +25,8 @@ using namespace pipedal; - -static std::shared_ptr MakeBypassPortInfo() { +static std::shared_ptr MakeBypassPortInfo() +{ std::shared_ptr bypassPortInfo = std::make_shared(); bypassPortInfo->symbol("__bypass"); bypassPortInfo->name("Bypass"); @@ -49,10 +49,8 @@ const Lv2PortInfo *pipedal::GetBypassPortInfo() } // Just enough to do control value defaulting, and midi value mapping :-/ - - - -static Lv2PluginInfo makeSplitterPluginInfo() { +static Lv2PluginInfo makeSplitterPluginInfo() +{ Lv2PluginInfo result; result.uri(SPLIT_PEDALBOARD_ITEM_URI); result.name("Split"); @@ -60,7 +58,7 @@ static Lv2PluginInfo makeSplitterPluginInfo() { result.comment("Internal only."); result.is_valid(true); - std::shared_ptr splitTypeControl= std::make_shared(); + std::shared_ptr splitTypeControl = std::make_shared(); splitTypeControl->symbol(SPLIT_SPLITTYPE_KEY); splitTypeControl->name("Type"); splitTypeControl->is_input(true); @@ -71,18 +69,14 @@ static Lv2PluginInfo makeSplitterPluginInfo() { splitTypeControl->default_value(0); splitTypeControl->enumeration_property(true); splitTypeControl->scale_points().push_back( - Lv2ScalePoint(0,"A/B") - ); + Lv2ScalePoint(0, "A/B")); splitTypeControl->scale_points().push_back( - Lv2ScalePoint(1,"Mix") - ); + Lv2ScalePoint(1, "Mix")); splitTypeControl->scale_points().push_back( - Lv2ScalePoint(1,"L/R") - ); + Lv2ScalePoint(1, "L/R")); result.ports().push_back(splitTypeControl); - - std::shared_ptr abControl= std::make_shared(); + std::shared_ptr abControl = std::make_shared(); abControl->symbol(SPLIT_SELECT_KEY); abControl->name("Select"); abControl->is_input(true); @@ -93,14 +87,12 @@ static Lv2PluginInfo makeSplitterPluginInfo() { abControl->default_value(0); abControl->enumeration_property(true); abControl->scale_points().push_back( - Lv2ScalePoint(0,"A") - ); + Lv2ScalePoint(0, "A")); abControl->scale_points().push_back( - Lv2ScalePoint(1,"B") - ); + Lv2ScalePoint(1, "B")); result.ports().push_back(abControl); - std::shared_ptr mixControl= std::make_shared(); + std::shared_ptr mixControl = std::make_shared(); mixControl->symbol(SPLIT_MIX_KEY); mixControl->name("Mix"); mixControl->is_input(true); @@ -112,7 +104,7 @@ static Lv2PluginInfo makeSplitterPluginInfo() { result.ports().push_back(mixControl); - std::shared_ptr panLControl= std::make_shared(); + std::shared_ptr panLControl = std::make_shared(); panLControl->symbol(SPLIT_PANL_KEY); panLControl->name("Pan L"); panLControl->is_input(true); @@ -124,7 +116,7 @@ static Lv2PluginInfo makeSplitterPluginInfo() { result.ports().push_back(panLControl); - std::shared_ptr volLControl= std::make_shared(); + std::shared_ptr volLControl = std::make_shared(); volLControl->symbol(SPLIT_VOLL_KEY); volLControl->name("Vol L"); volLControl->is_input(true); @@ -134,12 +126,11 @@ static Lv2PluginInfo makeSplitterPluginInfo() { volLControl->max_value(12); volLControl->default_value(-3); volLControl->scale_points().push_back( - Lv2ScalePoint(-60,"-INF") - ); + Lv2ScalePoint(-60, "-INF")); result.ports().push_back(volLControl); - std::shared_ptr panRControl= std::make_shared(); + std::shared_ptr panRControl = std::make_shared(); panRControl->symbol(SPLIT_PANR_KEY); panRControl->name("Pan R"); panRControl->is_input(true); @@ -151,7 +142,7 @@ static Lv2PluginInfo makeSplitterPluginInfo() { result.ports().push_back(panRControl); - std::shared_ptr volRControl= std::make_shared(); + std::shared_ptr volRControl = std::make_shared(); volRControl->symbol(SPLIT_VOLR_KEY); volRControl->name("Vol R"); volRControl->is_input(true); @@ -161,24 +152,260 @@ static Lv2PluginInfo makeSplitterPluginInfo() { volRControl->max_value(12); volRControl->default_value(-3); volRControl->scale_points().push_back( - Lv2ScalePoint(-60,"-INF") - ); + Lv2ScalePoint(-60, "-INF")); result.ports().push_back(volRControl); - - - - return result; } - Lv2PluginInfo g_splitterPluginInfo = makeSplitterPluginInfo(); -const Lv2PluginInfo * pipedal::GetSplitterPluginInfo() { return &g_splitterPluginInfo; } +const Lv2PluginInfo *pipedal::GetSplitterPluginInfo() { return &g_splitterPluginInfo; } +int SplitEffect::GetControlIndex(const std::string &symbol) const +{ + if (symbol == "splitType") + return SPLIT_TYPE_CTL; + if (symbol == "select") + return SELECT_CTL; + if (symbol == "mix") + return MIX_CTL; + if (symbol == "panL") + return PANL_CTL; + if (symbol == "volL") + return VOLL_CTL; + if (symbol == "panR") + return PANR_CTL; + if (symbol == "volR") + return VOLR_CTL; + return -1; +} +void SplitEffect::Activate() +{ + activated = true; + updateMixFunction(); + snapToMixTarget(); + mixBottomInputs.clear(); + mixTopInputs.clear(); + if (outputBuffers.size() == 1) + { + mixTopInputs.push_back(this->topOutputs[0]); + mixBottomInputs.push_back(this->bottomOutputs[0]); + } + else + { + if (this->topOutputs.size() == 1) + { + mixTopInputs.push_back(topOutputs[0]); + mixTopInputs.push_back(topOutputs[0]); + } + else + { + mixTopInputs.push_back(topOutputs[0]); + mixTopInputs.push_back(topOutputs[1]); + } + if (this->bottomOutputs.size() == 1) + { + mixBottomInputs.push_back(bottomOutputs[0]); + mixBottomInputs.push_back(bottomOutputs[0]); + } + else + { + mixBottomInputs.push_back(bottomOutputs[0]); + mixBottomInputs.push_back(bottomOutputs[1]); + } + } +} +void SplitEffect::Deactivate() +{ + activated = false; +} +void SplitEffect::SetChainBuffers( + const std::vector &topInputs, + const std::vector &bottomInputs, + const std::vector &topOutputs, + const std::vector &bottomOutputs, + bool forceStereo) +{ + this->topInputs = topInputs; + this->bottomInputs = bottomInputs; + this->topOutputs = topOutputs; + this->bottomOutputs = bottomOutputs; + + if (forceStereo) + { + numberOfOutputPorts = 2; + } else { + if (topOutputs.size() > 1 || bottomOutputs.size() > 1) + { + numberOfOutputPorts = 2; + } else { + numberOfOutputPorts = 1; + } + } + if (this->topOutputs.size() == 1 && numberOfOutputPorts != 1) + { + this->topOutputs.push_back(this->topOutputs[0]); + } + if (this->bottomOutputs.size() == 1 && numberOfOutputPorts != 1) + { + this->bottomOutputs.push_back(this->bottomOutputs[0]); + } + outputBuffers.resize(numberOfOutputPorts); +} + +void SplitEffect::snapToMixTarget() +{ + this->blendLTop = targetBlendLTop; + this->blendRTop = targetBlendRTop; + this->blendRBottom = targetBlendRBottom; + this->blendLBottom = targetBlendLBottom; + this->blendFadeSamples = 0; + this->blendDxLTop = 0; + this->blendDxRTop = 0; + this->blendDxLBottom = 0; + this->blendDxRBottom = 0; +} + +void SplitEffect::mixToTarget() +{ + uint32_t transitionSamples = (uint32_t)(this->sampleRate * MIX_TRANSITION_TIME_S); + if (transitionSamples < 1) + transitionSamples = 1; + double dxScale = 1.0 / transitionSamples; + this->blendFadeSamples = transitionSamples; + this->blendDxLTop = dxScale * (this->targetBlendLTop - this->blendLTop); + this->blendDxRTop = dxScale * (this->targetBlendRTop - this->blendRTop); + this->blendDxLBottom = dxScale * (this->targetBlendLBottom - this->blendLBottom); + this->blendDxRBottom = dxScale * (this->targetBlendRBottom - this->blendRBottom); +} + +void SplitEffect::mixTo(float value) +{ + float blend = (value + 1) * 0.5f; + this->targetBlendRTop = this->targetBlendLTop = 1 - blend; + this->targetBlendLBottom = this->targetBlendRBottom = blend; + mixToTarget(); +} +void SplitEffect::mixTo(float panL, float volL, float panR, float volR) +{ + float aTop = (volL <= SPLIT_DB_MIN) ? 0 : db2a(volL); + float aBottom = (volR <= SPLIT_DB_MIN) ? 0 : db2a(volR); + if (this->outputBuffers.size() == 1) + { + // ignore pan. The R values actually have no effect. + this->targetBlendLTop = this->targetBlendRTop = aTop; + this->targetBlendLBottom = this->targetBlendRBottom = aBottom; + } + else + { + float blendTop = (panL + 1) * 0.5; + float blendBottom = (panR + 1) * 0.5; + this->targetBlendLTop = (1 - blendTop) * aTop; + this->targetBlendRTop = (blendTop)*aTop; + this->targetBlendLBottom = (1 - blendBottom) * aBottom; + this->targetBlendRBottom = (blendBottom)*aBottom; + } + mixToTarget(); +} +float SplitEffect::GetControlValue(int portIndex) const +{ + switch (portIndex) + { + case -1: /* (bypass) */ + return 1; + case SPLIT_TYPE_CTL: + { + return (int)(this->splitType); + } + case SELECT_CTL: + { + return selectA ? 0 : 1; + } + case MIX_CTL: + return mix; + case PANL_CTL: + return this->panL; + case VOLL_CTL: + return this->volL; + case PANR_CTL: + return this->panR; + case VOLR_CTL: + return this->volR; + default: + throw PiPedalArgumentException("Invalid argument"); + } +} + +void SplitEffect::SetControl(int index, float value) +{ + switch (index) + { + case -1: /* (bypass) */ + return; // no can bypass. + case SPLIT_TYPE_CTL: + { + SplitType t = valueToSplitType(value); + if (splitType != t) + { + splitType = t; + updateMixFunction(); + } + break; + } + case SELECT_CTL: + { + bool t = value == 0; + if (selectA != t) + { + selectA = t; + + if (splitType == SplitType::Ab) + { + mixTo(selectA ? -1 : 1); + } + } + break; + } + case MIX_CTL: + mix = value; + if (splitType == SplitType::Mix) + { + mixTo(value); + } + break; + case PANL_CTL: + panL = value; + if (splitType == SplitType::Lr) + { + mixTo(panL, volL, panR, volR); + } + break; + case VOLL_CTL: + volL = value; + if (splitType == SplitType::Lr) + { + mixTo(panL, volL, panR, volR); + } + break; + case PANR_CTL: + panR = value; + if (splitType == SplitType::Lr) + { + mixTo(panL, volL, panR, volR); + } + break; + case VOLR_CTL: + volR = value; + if (splitType == SplitType::Lr) + { + mixTo(panL, volL, panR, volR); + } + break; + } +} diff --git a/src/SplitEffect.hpp b/src/SplitEffect.hpp index 0193b2d..b1cdbc1 100644 --- a/src/SplitEffect.hpp +++ b/src/SplitEffect.hpp @@ -314,132 +314,39 @@ namespace pipedal } + static constexpr int SPLIT_TYPE_CTL = 0; + static constexpr int SELECT_CTL = 1; + static constexpr int MIX_CTL = 2; + static constexpr int PANL_CTL = 3; + static constexpr int VOLL_CTL = 4; + static constexpr int PANR_CTL = 5; + static constexpr int VOLR_CTL = 6; + + virtual uint64_t GetInstanceId() const { return instanceId; } - void Activate() - { - activated = true; - updateMixFunction(); - snapToMixTarget(); + void Activate(); + void Deactivate(); - mixBottomInputs.clear(); - mixTopInputs.clear(); - - if (outputBuffers.size() == 1) - { - mixTopInputs.push_back(this->topOutputs[0]); - mixBottomInputs.push_back(this->bottomOutputs[0]); - } - else - { - if (this->topOutputs.size() == 1) - { - mixTopInputs.push_back(topOutputs[0]); - mixTopInputs.push_back(topOutputs[0]); - } - else - { - mixTopInputs.push_back(topOutputs[0]); - mixTopInputs.push_back(topOutputs[1]); - } - if (this->bottomOutputs.size() == 1) - { - mixBottomInputs.push_back(bottomOutputs[0]); - mixBottomInputs.push_back(bottomOutputs[0]); - } - else - { - mixBottomInputs.push_back(bottomOutputs[0]); - mixBottomInputs.push_back(bottomOutputs[1]); - } - } - } - void Deactivate() - { - activated = false; - } - - void SetChainBuffers( + void SetChainBuffers( const std::vector &topInputs, const std::vector &bottomInputs, const std::vector &topOutputs, - const std::vector &bottomOutputs) - { - this->topInputs = topInputs; - this->bottomInputs = bottomInputs; - this->topOutputs = topOutputs; - this->bottomOutputs = bottomOutputs; + const std::vector &bottomOutputs, + bool forceStereoOutput); - numberOfOutputPorts = topOutputs.size() > 1 || bottomOutputs.size() > 1 ? 2 : 1; - outputBuffers.resize(numberOfOutputPorts); - } virtual void ResetAtomBuffers() {} - virtual int GetControlIndex(const std::string &symbol) const - { - if (symbol == "splitType") - return 0; - if (symbol == "select") - return 1; - if (symbol == "mix") - return 2; - return -1; - } - void snapToMixTarget() - { - this->blendLTop = targetBlendLTop; - this->blendRTop = targetBlendRTop; - this->blendRBottom = targetBlendRBottom; - this->blendLBottom = targetBlendLBottom; - this->blendFadeSamples = 0; - this->blendDxLTop = 0; - this->blendDxRTop = 0; - this->blendDxLBottom = 0; - this->blendDxRBottom = 0; - } - void mixToTarget() - { - uint32_t transitionSamples = (uint32_t)(this->sampleRate * MIX_TRANSITION_TIME_S); - if (transitionSamples < 1) - transitionSamples = 1; - double dxScale = 1.0 / transitionSamples; - this->blendFadeSamples = transitionSamples; - this->blendDxLTop = dxScale * (this->targetBlendLTop - this->blendLTop); - this->blendDxRTop = dxScale * (this->targetBlendRTop - this->blendRTop); - this->blendDxLBottom = dxScale * (this->targetBlendLBottom - this->blendLBottom); - this->blendDxRBottom = dxScale * (this->targetBlendRBottom - this->blendRBottom); - } - void mixTo(float value) - { - float blend = (value + 1) * 0.5f; - this->targetBlendRTop = this->targetBlendLTop = 1 - blend; - this->targetBlendLBottom = this->targetBlendLBottom = blend; - mixToTarget(); - } - void mixTo(float panL, float volL, float panR, float volR) - { - float aTop = (volL <= SPLIT_DB_MIN) ? 0 : db2a(volL); - float aBottom = (volL <= SPLIT_DB_MIN) ? 0 : db2a(volR); - if (this->outputBuffers.size() == 1) - { - // ignore pan. The R values actually have no effect. - this->targetBlendLTop = this->targetBlendRTop = aTop; - this->targetBlendLBottom = this->targetBlendRBottom = aBottom; - } - else - { - float blendTop = (panL + 1) * 0.5; - float blendBottom = (panR + 1) * 0.5; - this->targetBlendLTop = (1 - blendTop) * aTop; - this->targetBlendRTop = (blendTop)*aTop; - this->targetBlendLBottom = (1 - blendBottom) * aBottom; - this->targetBlendRBottom = (blendBottom)*aBottom; - } - mixToTarget(); - } + virtual int GetControlIndex(const std::string &symbol) const; + void snapToMixTarget(); + + void mixToTarget(); + void mixTo(float value); + void mixTo(float panL, float volL, float panR, float volR); + virtual void SetBypass(bool enabled) { throw PiPedalArgumentException("Not implmented. Should not have been called."); @@ -448,102 +355,9 @@ namespace pipedal virtual float GetOutputControlValue(int index) const { return GetControlValue(index); } + virtual float GetControlValue(int portIndex) const; + virtual void SetControl(int index, float value); - virtual float GetControlValue(int portIndex) const - { - switch (portIndex) - { - case -1: /* (bypass) */ - return 1; - case 0: - { - return (int)(this->splitType); - } - case 1: - { - return selectA ? 0 : 1; - } - case 2: - return mix; - case 3: - return this->panL; - case 4: - return this->volL; - case 5: - return this->panR; - case 6: - return this->volR; - default: - throw PiPedalArgumentException("Invalid argument"); - } - } - virtual void SetControl(int index, float value) - { - switch (index) - { - case -1: /* (bypass) */ - return; // no can bypass. - case 0: - { - SplitType t = valueToSplitType(value); - if (splitType != t) - { - splitType = t; - updateMixFunction(); - } - break; - } - case 1: - { - bool t = value == 0; - if (selectA != t) - { - selectA = t; - - if (splitType == SplitType::Ab) - { - mixTo(selectA ? -1 : 1); - } - } - break; - } - case 2: - mix = value; - if (splitType == SplitType::Mix) - { - mixTo(value); - } - break; - case 3: - panL = value; - if (splitType == SplitType::Lr) - { - mixTo(panL, volL, panR, volR); - } - break; - case 4: - volL = value; - if (splitType == SplitType::Lr) - { - mixTo(panL, volL, panR, volR); - } - break; - case 5: - panR = value; - if (splitType == SplitType::Lr) - { - mixTo(panL, volL, panR, volR); - } - break; - case 6: - volR = value; - if (splitType == SplitType::Lr) - { - mixTo(panL, volL, panR, volR); - } - break; - } - } virtual int GetNumberOfOutputAudioPorts() const { diff --git a/src/StateInterface.cpp b/src/StateInterface.cpp index 38d1fcc..7d27742 100644 --- a/src/StateInterface.cpp +++ b/src/StateInterface.cpp @@ -121,6 +121,7 @@ Lv2PluginState StateInterface::Save() features); CheckState(status); CheckState(callState.status); + callState.state.isValid_ = true; } catch (const std::exception &e) { @@ -130,6 +131,10 @@ Lv2PluginState StateInterface::Save() return std::move(callState.state); } +void StateInterface::RestoreState(LilvState*pLv2State) +{ + lilv_state_restore(pLv2State,this->pInstance,nullptr,nullptr,LV2_STATE_IS_POD,&(features[0])); +} void StateInterface::Restore(const Lv2PluginState &state) { RestoreCallState callState; diff --git a/src/StateInterface.hpp b/src/StateInterface.hpp index f12fa24..1b579db 100644 --- a/src/StateInterface.hpp +++ b/src/StateInterface.hpp @@ -20,11 +20,12 @@ #pragma once #include "lilv/lilv.h" -#include "lv2/state.lv2/state.h" +#include "lv2/state/state.h" #include #include "json_variant.hpp" #include "MapFeature.hpp" #include "IHost.hpp" +#include "lilv/lilv.h" namespace pipedal { @@ -65,6 +66,7 @@ namespace pipedal public: Lv2PluginState Save(); void Restore(const Lv2PluginState &state); + void RestoreState(LilvState *pLv2State); private: struct Urids { diff --git a/src/Storage.cpp b/src/Storage.cpp index eb039ff..c18a4f1 100644 --- a/src/Storage.cpp +++ b/src/Storage.cpp @@ -196,12 +196,13 @@ void Storage::MaybeCopyDefaultPresets() presetsDirectory); } - auto pluginDirectory = this->GetPluginPresetsDirectory(); - if (!std::filesystem::exists(pluginDirectory / "index.json")) - { - CopyDirectory(this->configRoot / "default_presets" / "plugin_presets", - pluginDirectory); - } + // Obsolete: TooB effects now have correct preset declarations. + //auto pluginDirectory = this->GetPluginPresetsDirectory(); + // if (!std::filesystem::exists(pluginDirectory / "index.json")) + // { + // CopyDirectory(this->configRoot / "default_presets" / "plugin_presets", + // pluginDirectory); + // } } void Storage::Initialize() { @@ -350,7 +351,7 @@ void Storage::SavePluginPresetIndex() throw PiPedalException(SS("Can't write to " << path)); } - json_writer writer(os); + json_writer writer(os,false); writer.write(this->pluginPresetIndex); } } @@ -359,7 +360,7 @@ void Storage::SaveBankIndex() { std::ofstream os; os.open(GetIndexFileName(), std::ios_base::trunc); - json_writer writer(os); + json_writer writer(os,false); writer.write(this->bankIndex); } @@ -434,7 +435,7 @@ void Storage::SaveBankFile(const std::string &name, const BankFile &bankFile) { std::ofstream s; s.open(fileName, std::ios_base::trunc); - json_writer writer(s); + json_writer writer(s,false); writer.write(bankFile); if (std::filesystem::exists(backupFile)) { @@ -721,7 +722,7 @@ void Storage::SaveChannelSelection() try { std::ofstream s(fileName); - json_writer writer(s); + json_writer writer(s,false); writer.write(this->jackChannelSelection); } catch (const std::exception &e) @@ -910,7 +911,7 @@ int64_t Storage::UploadBank(BankFile &bankFile, int64_t uploadAfter) { throw PiPedalException("Can't write to bank file."); } - json_writer writer(f); + json_writer writer(f,false); writer.write(bankFile); lastBank = this->bankIndex.addBank(lastBank, bankFile.name()); @@ -932,7 +933,7 @@ void Storage::SaveUserSettings() { throw PiPedalException("Unable to write to " + ((std::string)path)); } - json_writer writer(f); + json_writer writer(f,false); writer.write(userSettings); } } @@ -968,7 +969,7 @@ void Storage::SetWifiConfigSettings(const WifiConfigSettings &wifiConfigSettings { throw PiPedalException("Unable to write to " + ((std::string)path)); } - json_writer writer(f); + json_writer writer(f,false); writer.write(©ToSave); } @@ -1077,7 +1078,7 @@ void Storage::SaveCurrentPreset(const CurrentPreset ¤tPreset) std::filesystem::path path = GetCurrentPresetPath(); std::ofstream f(path); - json_writer writer(f); + json_writer writer(f,false); writer.write(currentPreset); } catch (std::exception &) @@ -1157,7 +1158,7 @@ void Storage::SavePluginPresets(const std::string &pluginUri, const PluginPreset { throw PiPedalException(SS("Can't write to " << path)); } - json_writer writer(os); + json_writer writer(os,false); writer.write(presets); } if (std::filesystem::exists(path)) @@ -1226,6 +1227,7 @@ PluginPresetValues Storage::GetPluginPresetValues(const std::string &pluginUri, result.controls.push_back(ControlValue(valuePair.first.c_str(), valuePair.second)); } result.state = preset.state_; + result.lilvPresetUri = preset.lilvPresetUri_; return result; } } @@ -1398,7 +1400,7 @@ void Storage::SetFavorites(const std::map &favorites) f.open(fileName); if (f.is_open()) { - json_writer writer(f); + json_writer writer(f,false); writer.write(favorites); } } @@ -1427,7 +1429,7 @@ void Storage::SetJackServerSettings(const pipedal::JackServerSettings &jackConfi f.open(fileName); if (f.is_open()) { - json_writer writer(f); + json_writer writer(f,false); writer.write(jackConfiguration); } #if JACK_HOST @@ -1442,7 +1444,7 @@ void Storage::SetSystemMidiBindings(const std::vector &bindings) f.open(fileName); if (f.is_open()) { - json_writer writer(f); + json_writer writer(f,false); writer.write(bindings); } } @@ -1630,6 +1632,11 @@ std::string Storage::UploadUserFile(const std::string &directory, const std::str return path.string(); } +const PluginPresetIndex& Storage::GetPluginPresetIndex() +{ + return pluginPresetIndex; +} + JSON_MAP_BEGIN(UserSettings) JSON_MAP_REFERENCE(UserSettings, governor) JSON_MAP_REFERENCE(UserSettings, showStatusMonitor) diff --git a/src/Storage.hpp b/src/Storage.hpp index 6c0d4b4..4cbee39 100644 --- a/src/Storage.hpp +++ b/src/Storage.hpp @@ -57,6 +57,7 @@ struct PluginPresetValues { std::vector controls; Lv2PluginState state; + std::string lilvPresetUri; }; // controls user-defined storage. Implmentation hidden to allow to later migration to a database (perhaps) @@ -173,6 +174,7 @@ private: bool pluginPresetIndexChanged = false; void LoadPluginPresetIndex(); void SavePluginPresetIndex(); + std::filesystem::path GetPluginPresetPath(const std::string &pluginUri) const; bool IsValidSampleFile(const std::filesystem::path&fileName); std::filesystem::path MakeUserFilePath(const std::string &directory, const std::string&filename); @@ -181,6 +183,8 @@ public: bool HasPluginPresets(const std::string&pluginUri) const; void SavePluginPresets(const std::string&pluginUri, const PluginPresets&presets); PluginPresets GetPluginPresets(const std::string&pluginUri) const; + const PluginPresetIndex& GetPluginPresetIndex(); + PluginUiPresets GetPluginUiPresets(const std::string&pluginUri) const; PluginPresetValues GetPluginPresetValues(const std::string&pluginUri, uint64_t instanceId); diff --git a/src/Uri.hpp b/src/Uri.hpp index 0e4dadf..b07d9cf 100644 --- a/src/Uri.hpp +++ b/src/Uri.hpp @@ -70,6 +70,10 @@ public: { set(text); } + uri(const std::string&text) + { + set(text.c_str()); + } void set(const char*text); void set(const char*start, const char*end); private: diff --git a/src/WebServer.cpp b/src/WebServer.cpp index 7e919f7..2534c01 100644 --- a/src/WebServer.cpp +++ b/src/WebServer.cpp @@ -261,7 +261,7 @@ namespace pipedal this->socketHandler = nullptr; webSocket = nullptr; pServer = nullptr; - Lv2Log::info("WebSocketSession closed."); + Lv2Log::info(SS("WebSocketSession closed. " << fromAddress)); } using ptr = std::shared_ptr; WebSocketSession(WebServerImpl *pServer, server::connection_ptr &webSocket) diff --git a/src/Worker.hpp b/src/Worker.hpp index 277dcfb..8c54507 100644 --- a/src/Worker.hpp +++ b/src/Worker.hpp @@ -21,17 +21,16 @@ #pragma once #include -#include "lv2.h" +//#include "lv2.h" -#include "lv2/atom.lv2/atom.h" -#include "lv2/atom.lv2/util.h" -#include "lv2.h" -#include "lv2/log.lv2/log.h" -#include "lv2/log.lv2/logger.h" -#include "lv2/midi.lv2/midi.h" -#include "lv2/urid.lv2/urid.h" -#include "lv2/atom.lv2/atom.h" -#include "lv2/worker.lv2/worker.h" +#include "lv2/atom/atom.h" +#include "lv2/atom/util.h" +#include "lv2/log/log.h" +#include "lv2/log/logger.h" +#include "lv2/midi/midi.h" +#include "lv2/urid/urid.h" +#include "lv2/atom/atom.h" +#include "lv2/worker/worker.h" #include "condition_variable" #include diff --git a/src/json.cpp b/src/json.cpp index 06c9d6d..d945199 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -23,11 +23,12 @@ #include #include "PiPedalException.hpp" #include "json_variant.hpp" - +#include "util.hpp" using namespace pipedal; + uint32_t json_writer::continuation_byte(std::string_view::iterator &p, std::string_view::const_iterator end) { if (p == end) diff --git a/src/main.cpp b/src/main.cpp index d9f386b..5abba1d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -167,7 +167,7 @@ public: PluginPresets pluginPresets = model->GetPluginPresets(pluginUri); std::stringstream s; - json_writer writer(s); + json_writer writer(s,false); writer.write(pluginPresets); *pContent = s.str(); } @@ -184,7 +184,7 @@ public: file.selectedPreset(newInstanceId); std::stringstream s; - json_writer writer(s); + json_writer writer(s,false); writer.write(file); *pContent = s.str(); *pName = pedalboard.name(); @@ -597,12 +597,12 @@ int main(int argc, char *argv[]) if (help) { - std::cout << "Usage: pipedal [] [options...]\n\n" + std::cout << "Usage: pipedald [] [options...]\n\n" << "Options:\n" - << " -systemd: Log to systemd journals, wait for jack service.\n" + << " -systemd: Log to systemd journals instead of to the console.\n" << " -port: Port to listen on e.g. 0.0.0.0:80\n" << "Example:\n" - << " pipedal /etc/pipedal/config /etc/pipedal/react -port 0.0.0.0:80 \n" + << " pipedald /etc/pipedal/config /etc/pipedal/react -port 0.0.0.0:80 \n" "\n" "Description:\n\n" " Configuration is read from /config.json\n" @@ -611,7 +611,7 @@ int main(int argc, char *argv[]) "\n" " While debugging, bind the port to 0.0.0.0:8080, and connect to the default React\n" " server that's provided when you run 'npm run start' in 'react/src'. By default, the\n" - " React app will connect to the socket server on 0.0.0.0:8080.\n\n"; + " React debug server will connect to the socket server on 0.0.0.0:8080.\n\n"; return error ? EXIT_FAILURE : EXIT_SUCCESS; } diff --git a/src/pch.h b/src/pch.h index 6b26a1e..7dca65f 100644 --- a/src/pch.h +++ b/src/pch.h @@ -19,6 +19,7 @@ #pragma once + // Diagnostic type used to report calculated type T in an error message. template class TypeDisplay; @@ -44,20 +45,20 @@ template class TypeDisplay; #endif /* -#include +#include -#include "lv2/atom.lv2/atom.h" -#include "lv2/atom.lv2/util.h" -#include "lv2/log.lv2/log.h" -#include "lv2/log.lv2/logger.h" -#include "lv2/midi.lv2/midi.h" -#include "lv2/urid.lv2/urid.h" -#include "lv2/log.lv2/logger.h" -#include "lv2/uri-map.lv2/uri-map.h" -#include "lv2/atom.lv2/forge.h" -#include "lv2/worker.lv2/worker.h" -#include "lv2/patch.lv2/patch.h" -#include "lv2/parameters.lv2/parameters.h" -#include "lv2/units.lv2/units.h" +#include "lv2/atom/atom.h" +#include "lv2/atom/util.h" +#include "lv2/log/log.h" +#include "lv2/log/logger.h" +#include "lv2/midi/midi.h" +#include "lv2/urid/urid.h" +#include "lv2/log/logger.h" +#include "lv2/uri-map/uri-map.h" +#include "lv2/atom/forge.h" +#include "lv2/worker/worker.h" +#include "lv2/patch/patch.h" +#include "lv2/parameters/parameters.h" +#include "lv2/units/units.h" */ #include "ss.hpp" diff --git a/src/util.cpp b/src/util.cpp index 7a55525..4247a7b 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -26,6 +26,8 @@ #include #include // for gettid() +#include +#include using namespace pipedal; @@ -39,4 +41,62 @@ void pipedal::SetThreadName(const std::string &name) } pthread_t pid = pthread_self(); pthread_setname_np(pid,threadName.c_str()); -} \ No newline at end of file +} + + +static const uint8_t utf8extraBytes[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 +}; + +constexpr char32_t ILLEGAL_CHAR32 = U'⊗'; +static const uint8_t utf8Offset[] = { 0,0b11000000, 0b11100000,0b11110000,0b11111000,0b11111100}; + +std::u32string pipedal::ToUtf32(const std::string &s) +{ + std::basic_stringstream result; + + auto p = s.begin(); + auto end = s.end(); + + while (p != end) + { + uint8_t c = (uint8_t)(*p++); + if (c < 0x80) + { + result << (char32_t)c; + } else { + auto extraBytes = utf8extraBytes[c]; + if (extraBytes == 0) + { + result << ILLEGAL_CHAR32; + } else if (p+extraBytes > end) + { + result << ILLEGAL_CHAR32; + break; + } else { + char32_t cResult = c -= utf8Offset[extraBytes]; + while (extraBytes != 0) + { + c = *p++; + --extraBytes; + if (c < 0x80 || c >= 0xC0) + { + result << ILLEGAL_CHAR32; + p += extraBytes; + break; + } + cResult = (cResult << 6) + (c & 0x3F); + } + result << cResult; + } + } + } + return result.str(); +} diff --git a/src/util.hpp b/src/util.hpp index 952ea44..7f5b80f 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -29,4 +29,7 @@ namespace pipedal { return str.size() >= suffix.size() && 0 == str.compare(str.size()-suffix.size(), suffix.size(), suffix); } void SetThreadName(const std::string &name); + + std::u32string ToUtf32(const std::string &s); + } diff --git a/src/utilTest.cpp b/src/utilTest.cpp new file mode 100644 index 0000000..f420c68 --- /dev/null +++ b/src/utilTest.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2023 Robin E. R. Davies + * All rights reserved. + + * 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 "util.hpp" +#include "catch.hpp" + +using namespace pipedal; + + + +TEST_CASE("utf8 to utf32 test", "[utf8_to_utf32][Build][Dev]") +{ + std::u32string t = ToUtf32((const char*)u8"0AZ|£ǧ谸😊"); + std::u32string expected = U"0AZ|£ǧ谸😊"; + + REQUIRE(t == expected); + +}