From a4e955df97b8d572727866f572830074baaefaab Mon Sep 17 00:00:00 2001 From: xivilay Date: Fri, 10 Feb 2023 10:54:18 +0100 Subject: [PATCH 01/24] chore: add roli blocks module as git submodule --- .gitmodules | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitmodules b/.gitmodules index 12fbc81..463a8cc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "external/juce"] path = external/juce url = https://github.com/juce-framework/JUCE +[submodule "external/roli_blocks_basics"] + path = external/roli_blocks_basics + url = https://github.com/WeAreROLI/roli_blocks_basics From 4d37fe5cd2dbc7fe2b8526dce4d04fe692f7fad8 Mon Sep 17 00:00:00 2001 From: xivilay Date: Fri, 10 Feb 2023 10:54:46 +0100 Subject: [PATCH 02/24] chore: integrated roli_blocks into build --- CMakeLists.txt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 01640a1..aab7600 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,13 +7,15 @@ if(CMAKE_BUILD_TYPE MATCHES "Debug") endif() set(VERSION "0.6.1") -set(JUCE_DIR "external/juce") -set(SRC_DIR "./src") + set(FORMATS "Standalone" "LV2" "VST3") +set(SRC_DIR "./src") +set(JUCE_DIR "external/juce") set(REACT_JUCE "react_juce") -# see https://github.com/nick-thompson/react-juce/tree/master/react_juce -set(REACT_JUCE_DIR "external/react-juce/${REACT_JUCE}") # path to REACT JUCE +set(ROLI_BLOCKS "roli_blocks_basics") +set(BLOCKS_DIR "external/${ROLI_BLOCKS}") +set(REACT_JUCE_DIR "external/react-juce/${REACT_JUCE}") set(JS_BUNDLE_PATH "./ui/build/js/bundle.js") set(CMAKE_CXX_STANDARD 17) @@ -23,6 +25,7 @@ project(${PROJECT_NAME} VERSION ${VERSION}) add_subdirectory(${JUCE_DIR} "juce") +juce_add_module(${BLOCKS_DIR}) juce_add_module(${REACT_JUCE_DIR}) if(WIN32) @@ -102,6 +105,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE juce::juce_gui_basics juce::juce_gui_extra + ${ROLI_BLOCKS} ${REACT_JUCE} BinaryData ) \ No newline at end of file From fe70de490d4e87fc81e464660fe63d128bb5077d Mon Sep 17 00:00:00 2001 From: xivilay Date: Fri, 10 Feb 2023 10:55:08 +0100 Subject: [PATCH 03/24] chore: updated vscode tasks --- .vscode/launch.json | 7 +++++ .vscode/tasks.json | 69 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index 67d2500..07633ab 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -13,6 +13,13 @@ "request": "attach", "name": "Attach to AudioHost", "pid": "${command:pickMyProcess}" + }, + { + "name": "start debug", + "type": "cppvsdbg", + "cwd": "${workspaceRoot}", + "request": "launch", + "program": "${workspaceRoot}/build/ScaleRemapperDev_artefacts/Debug/Standalone/ScaleRemapperDev.exe" } ] } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 7fdc06a..dd65f97 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -10,6 +10,24 @@ "detail": "webpack --mode=production", "hide": true }, + { + "type": "npm", + "script": "build-dev", + "path": "ui", + "problemMatcher": [], + "label": "yarn build ui debug", + "detail": "webpack --mode=development", + "hide": true + }, + { + "type": "process", + "command": "xcopy", + "args": ["/y", "${workspaceRoot}\\ui\\build\\js", "${workspaceRoot}\\build\\ScaleRemapperDev_artefacts\\Debug\\Standalone\\js\\"], + "problemMatcher": [], + "label": "copy js assets", + "dependsOn": ["yarn build ui debug"], + "hide": true + }, { "type": "process", "command": "cmake", @@ -30,6 +48,26 @@ "problemMatcher": [], "hide": true }, + { + "type": "process", + "command": "cmake", + "args": [ + "-A", + "x64", + "../", + "-D", + "CMAKE_BUILD_TYPE=Debug" + ], + "label": "cmake prepare build debug", + "options": { + "cwd": "${workspaceRoot}/build" + }, + "dependsOn": [ + "copy js assets" + ], + "problemMatcher": [], + "hide": true + }, { "type": "process", "command": "cmake", @@ -49,6 +87,25 @@ ], "hide": true }, + { + "type": "process", + "command": "cmake", + "args": [ + "--build", + ".", + "--config", + "Debug" + ], + "label": "cmake build debug", + "options": { + "cwd": "${workspaceRoot}/build" + }, + "problemMatcher": [], + "dependsOn": [ + "cmake prepare build debug" + ], + "hide": true + }, { "type": "process", "command": "./ScaleRemapper_artefacts/Release/Standalone/ScaleRemapper.exe", @@ -60,6 +117,18 @@ "dependsOn": [ "cmake build" ] + }, + { + "type": "process", + "command": "./ScaleRemapperDev_artefacts/Debug/Standalone/ScaleRemapperDev.exe", + "label": "build & run executable (debug)", + "options": { + "cwd": "${workspaceRoot}/build/" + }, + "problemMatcher": [], + "dependsOn": [ + "cmake build debug" + ] } ] } \ No newline at end of file From c1ff69f789fea6a0b9e39a5df901cf430716b46e Mon Sep 17 00:00:00 2001 From: xivilay Date: Fri, 10 Feb 2023 15:06:26 +0100 Subject: [PATCH 04/24] feat: lumi colors support --- external/roli_blocks_basics | 1 + src/CustomEditor.h | 15 ++++++++- src/lumi/CustomProgram.h | 66 +++++++++++++++++++++++++++++++++++++ src/lumi/Mediator.h | 52 +++++++++++++++++++++++++++++ ui | 2 +- 5 files changed, 134 insertions(+), 2 deletions(-) create mode 160000 external/roli_blocks_basics create mode 100644 src/lumi/CustomProgram.h create mode 100644 src/lumi/Mediator.h diff --git a/external/roli_blocks_basics b/external/roli_blocks_basics new file mode 160000 index 0000000..9a6df11 --- /dev/null +++ b/external/roli_blocks_basics @@ -0,0 +1 @@ +Subproject commit 9a6df113bf570aec53d33cbf97938d8602e4ac2f diff --git a/src/CustomEditor.h b/src/CustomEditor.h index b236a0b..97c6c2f 100644 --- a/src/CustomEditor.h +++ b/src/CustomEditor.h @@ -2,12 +2,14 @@ #include +#include "lumi/Mediator.h" + using namespace reactjuce; class CustomEditor : public AudioProcessorEditor, public AudioProcessorParameter::Listener, public Timer { public: CustomEditor(AudioProcessor& proc) - : AudioProcessorEditor(proc), engine(std::make_shared()), appRoot(engine), harness(appRoot) { + : AudioProcessorEditor(proc), engine(std::make_shared()), appRoot(engine), harness(appRoot), mediator(appRoot) { auto& params = processor.getParameters(); paramReadouts.resize(static_cast(params.size())); @@ -53,6 +55,7 @@ class CustomEditor : public AudioProcessorEditor, public AudioProcessorParameter for (auto& p : processor.getParameters()) { p->removeListener(this); } + mediator.onQuit(); } void parameterValueChanged(int parameterIndex, float newValue) { @@ -110,6 +113,14 @@ class CustomEditor : public AudioProcessorEditor, public AudioProcessorParameter return var::undefined(); }); + + engine->registerNativeMethod("sendComputedKeysData", [this](const var::NativeFunctionArgs& args) { + int a = args.arguments[0]; + + mediator.sendCommand(a); + + return var::undefined(); + }); } void afterBundleEvaluated() { for (auto& p : processor.getParameters()) parameterValueChanged(p->getParameterIndex(), p->getValue()); @@ -119,6 +130,8 @@ class CustomEditor : public AudioProcessorEditor, public AudioProcessorParameter ReactApplicationRoot appRoot; AppHarness harness; + Mediator mediator; + File bundleFile; std::map parameters; diff --git a/src/lumi/CustomProgram.h b/src/lumi/CustomProgram.h new file mode 100644 index 0000000..9758d64 --- /dev/null +++ b/src/lumi/CustomProgram.h @@ -0,0 +1,66 @@ +#pragma once + +class CustomProgram : public roli::Block::Program { + public: + CustomProgram(roli::Block& b) : Program(b) {} + + String getLittleFootProgram() override { + return R"littlefoot( + const int max = 64; + const int rootId = 27; + const int globalKeyColor = 34; + const int rootKeyColor = 35; + const int octaveId = 4; + int keyColor; + int rootColor; + int root; + int state; + int fullColors[12]; + + void initialise() { + setUseDefaultKeyHandler(true, false); + keyColor = getLocalConfig(globalKeyColor); + rootColor = getLocalConfig(rootKeyColor); + root = getLocalConfig(rootId); + initColors(); + } + void initColors() { + fullColors[0] = 0xcf3550; + fullColors[1] = 0xf55333; + fullColors[2] = 0xfd7033; + fullColors[3] = 0xffa53e; + fullColors[4] = 0xffc255; + fullColors[5] = 0xffff00; + fullColors[6] = 0xd1d545; + fullColors[7] = 0x6da951; + fullColors[8] = 0x2191ce; + fullColors[9] = 0x4d6db5; + fullColors[10] = 0x564a9d; + fullColors[11] = 0x8c55a2; + } + void renderKeys() { + for (int i = 0; i < 12; i++) { + int highlighted = (state >> i) & 1; + int num = 12 - 1 - i; + // int color = num == root ? rootColor : keyColor; + int color = fullColors[num]; + int fill = highlighted == 1 ? color : makeARGB(255, 0, 0, 0); + fillPixel(fill, num, 0); + fillPixel(fill, num + 12, 0); + } + } + void handleMessage(int a, int b, int c) { + if (state == a) return; + state = a; + root = a >> 12; + int octave = getLocalConfig(octaveId); + renderKeys(); + + sendMessageToHost(root, 0, 0); + } + )littlefoot"; + } + + private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CustomProgram) +}; diff --git a/src/lumi/Mediator.h b/src/lumi/Mediator.h new file mode 100644 index 0000000..e4f02de --- /dev/null +++ b/src/lumi/Mediator.h @@ -0,0 +1,52 @@ +#pragma once + +#include "CustomProgram.h" + +using namespace roli; + +class Mediator : private TopologySource::Listener, Block::ProgramEventListener, Block::ProgramLoadedListener { + public: + Mediator(reactjuce::ReactApplicationRoot& root) { + appRoot = &root; + pts.addListener(this); + }; + void onQuit() { + if (b != nullptr) { + b->setProgram(nullptr); + } + }; + void sendCommand(int a) { + if (b != nullptr) { + Block::ProgramEventMessage e; + + e.values[0] = a; + b->sendProgramEvent(e); + } + }; + + private: + void handleProgramEvent(Block& source, const Block::ProgramEventMessage& event){ + // TODO handle responses event.values[0] + }; + void handleProgramLoaded(Block& block) { + appRoot->dispatchEvent("requestComputedKeysData"); + block.removeProgramLoadedListener(this); + }; + void topologyChanged() override { + auto currentTopology = pts.getCurrentTopology(); + for (auto& block : currentTopology.blocks) { + if (block->getType() == Block::lumiKeysBlock) { + b = block; + p = block->getProgram(); + block->setProgram(std::make_unique(*block)); + block->addProgramLoadedListener(this); + block->addProgramEventListener(this); + return; + } + } + }; + PhysicalTopologySource pts; + Block::Program* p; + Block* b = nullptr; + reactjuce::ReactApplicationRoot* appRoot; +}; diff --git a/ui b/ui index 3e3c2eb..18db79f 160000 --- a/ui +++ b/ui @@ -1 +1 @@ -Subproject commit 3e3c2eb2b3040b50fa06592d6b3dcb6393d01cca +Subproject commit 18db79f28813601a79bedcb64f8e35a44de1592e From bdeb4a73b49883a0197689efa088fb2d23c4e285 Mon Sep 17 00:00:00 2001 From: xivilay Date: Fri, 10 Feb 2023 15:45:27 +0100 Subject: [PATCH 05/24] feat: add colorMode in littleFoot --- src/lumi/CustomProgram.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lumi/CustomProgram.h b/src/lumi/CustomProgram.h index 9758d64..98992f2 100644 --- a/src/lumi/CustomProgram.h +++ b/src/lumi/CustomProgram.h @@ -15,6 +15,7 @@ class CustomProgram : public roli::Block::Program { int rootColor; int root; int state; + int colorMode; int fullColors[12]; void initialise() { @@ -42,8 +43,12 @@ class CustomProgram : public roli::Block::Program { for (int i = 0; i < 12; i++) { int highlighted = (state >> i) & 1; int num = 12 - 1 - i; - // int color = num == root ? rootColor : keyColor; - int color = fullColors[num]; + int color; + if (colorMode == 1) { + color = fullColors[num]; + } else { + color = num == root ? rootColor : keyColor; + } int fill = highlighted == 1 ? color : makeARGB(255, 0, 0, 0); fillPixel(fill, num, 0); fillPixel(fill, num + 12, 0); @@ -53,6 +58,7 @@ class CustomProgram : public roli::Block::Program { if (state == a) return; state = a; root = a >> 12; + colorMode = a >> 16; int octave = getLocalConfig(octaveId); renderKeys(); From f67bfd56fdd36300ee6593e4ef0833534ed375c1 Mon Sep 17 00:00:00 2001 From: xivilay Date: Fri, 10 Feb 2023 15:45:45 +0100 Subject: [PATCH 06/24] refactor: cleanup --- src/CustomEditor.h | 14 -------------- src/ScaleRemapper.h | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/CustomEditor.h b/src/CustomEditor.h index 97c6c2f..7fca5af 100644 --- a/src/CustomEditor.h +++ b/src/CustomEditor.h @@ -93,13 +93,6 @@ class CustomEditor : public AudioProcessorEditor, public AudioProcessorParameter private: void beforeBundleEvaluated() { - engine->registerNativeMethod("beginParameterChangeGesture", [this](const var::NativeFunctionArgs& args) { - if (auto it = parameters.find(args.arguments[0].toString()); it != parameters.cend()) - it->second->beginChangeGesture(); - - return var::undefined(); - }); - engine->registerNativeMethod("setParameterValueNotifyingHost", [this](const var::NativeFunctionArgs& args) { if (auto it = parameters.find(args.arguments[0].toString()); it != parameters.cend()) it->second->setValueNotifyingHost(args.arguments[1]); @@ -107,13 +100,6 @@ class CustomEditor : public AudioProcessorEditor, public AudioProcessorParameter return var::undefined(); }); - engine->registerNativeMethod("endParameterChangeGesture", [this](const var::NativeFunctionArgs& args) { - if (auto it = parameters.find(args.arguments[0].toString()); it != parameters.cend()) - it->second->endChangeGesture(); - - return var::undefined(); - }); - engine->registerNativeMethod("sendComputedKeysData", [this](const var::NativeFunctionArgs& args) { int a = args.arguments[0]; diff --git a/src/ScaleRemapper.h b/src/ScaleRemapper.h index 2a9f828..a7ac0cb 100644 --- a/src/ScaleRemapper.h +++ b/src/ScaleRemapper.h @@ -20,7 +20,7 @@ AudioProcessorValueTreeState::ParameterLayout createParameterLayout() { p.add(std::make_unique("baseOctave", "Base Octave", 0, 10, 4)); p.add(std::make_unique("root", "Root Note", 0, 11, 0)); - for (size_t i = 0; i < scaleLength; i++) { + for (int i = 0; i < scaleLength; i++) { auto istr = std::to_string(i); auto defaultInterval = defaultScaleIntervals[i]; p.add(std::make_unique("interval" + istr, "Scale Interval " + istr, 1, scaleLength, defaultInterval)); From 27945ac1b69d854fb08a823c093cf58ecd0980cc Mon Sep 17 00:00:00 2001 From: xivilay Date: Fri, 10 Feb 2023 18:54:04 +0100 Subject: [PATCH 07/24] feat: custom scales support --- src/CustomEditor.h | 9 ++++++++- ui | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/CustomEditor.h b/src/CustomEditor.h index 7fca5af..ba1e8bb 100644 --- a/src/CustomEditor.h +++ b/src/CustomEditor.h @@ -27,8 +27,9 @@ class CustomEditor : public AudioProcessorEditor, public AudioProcessorParameter p->addListener(this); } -#if JUCE_DEBUG File exeDir = File::getSpecialLocation(File::currentExecutableFile).getParentDirectory(); +#if JUCE_DEBUG + File bundle = exeDir.getChildFile("js/bundle.js"); jassert(bundle.existsAsFile()); @@ -45,6 +46,12 @@ class CustomEditor : public AudioProcessorEditor, public AudioProcessorParameter afterBundleEvaluated(); #endif + File localScales = exeDir.getChildFile("scales.txt"); + if (localScales.existsAsFile()) { + auto fileText = localScales.loadFileAsString(); + appRoot.dispatchEvent("getLocalScales", fileText); + } + addAndMakeVisible(appRoot); setSize(400, 200); diff --git a/ui b/ui index 18db79f..60d6cb0 160000 --- a/ui +++ b/ui @@ -1 +1 @@ -Subproject commit 18db79f28813601a79bedcb64f8e35a44de1592e +Subproject commit 60d6cb0b7b8d7a8159b8703c36a5aaefbff9e0da From 458859f1e4fe65eafd1abf3f20abf3ebfe73ce25 Mon Sep 17 00:00:00 2001 From: xivilay Date: Sat, 11 Feb 2023 23:48:25 +0100 Subject: [PATCH 08/24] feat: icon --- CMakeLists.txt | 3 +-- src/ScaleRemapper.h | 2 +- src/icons/small.png | Bin 0 -> 2239 bytes 3 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 src/icons/small.png diff --git a/CMakeLists.txt b/CMakeLists.txt index aab7600..377d085 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ juce_add_plugin(${PROJECT_NAME} NEEDS_MIDI_OUTPUT TRUE PLUGIN_MANUFACTURER_CODE XivY PLUGIN_CODE Xiv8 + ICON_SMALL "${SRC_DIR}/icons/small.png" FORMATS ${FORMATS} ) @@ -70,8 +71,6 @@ target_sources(${PROJECT_NAME} PRIVATE target_compile_definitions(${PROJECT_NAME} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 - P_WIDTH=550 - P_HEIGHT=750 ) if(BUILD_VST2) diff --git a/src/ScaleRemapper.h b/src/ScaleRemapper.h index a7ac0cb..e51cb8c 100644 --- a/src/ScaleRemapper.h +++ b/src/ScaleRemapper.h @@ -49,7 +49,7 @@ class MidiScaleRemapper : public AudioProcessor { AudioProcessorEditor *createEditor() { auto *editor = new CustomEditor(*this); - editor->setSize(P_WIDTH, P_HEIGHT); + editor->setSize(550, 750); return editor; } diff --git a/src/icons/small.png b/src/icons/small.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6ead48072b9d7bfaddf7402d32c1306da6ed22 GIT binary patch literal 2239 zcmV;w2tfCVP)%sx4BbmZhlbL!~Y} zR6s>bQ6KseDT<&fAuKLSDVt*lWRy5Dj^icX@3rssUCuc(^Y`HzV}lb~+CFq%M(3P4 z|NqT5-^~9F@c-6`ND`5}$b0d>O#Ff11Sy@6luihsj~IK2xc|mDmQsf6>Z%Ua*Vo)s zR#v(-w*0iQY1^if z(hUelnjmEi0ANfOh5RVe^ZghZ?tS}Y&*}RorpBIF7N0*300M!*Qtas1_Qc3&x%h#;3IV1_X!u-VM1(1p~4c=fsN2YXKR{Sbgy1h6WI4~c0hJ3)XI_Uzex z_=da3zEZ#L>LBLbB1lOk2okgmJb?(1V5t%%wM-31eb!YP&MM)LG6+Rv|iA2$v&Hz?}z8j3INu1D>zZwMwL}NMJhFJ`g@i1 zJ*6+--2T;UZhok*ukQgOlFV#AO!KPA+15AKcHa31eqL2fX=9vUa^BM=;Z_t{c2dbZnP%1bGuL?#Z_F@U3xA`BIB$oJ-?wVsgD1(=DMp&UuEP}%0e zp`pi!?1#4J3IHS^nPE44(m8PB_p*2A(=aLoaqh`$IN4vN+!%k`|$|9A@9X48zZS3M6@PG7Oyyp`>LRO$WNn z<<5!+OGdX7fHt#g$&G=>+H2`lpN^h zE>UEgm)3*?1OT*d!=6x_9SE4r`3CmpVnQeja8a+(x>;m~tC1dR1Q;M`kv`Xmk!QCS zX;&6H7eRc@v|a!CE)tGM))0h*Tu8D$@Lhf1{@c~htR+JNa)|+6T$k-P$lETv(tcVS z*qOK5X$hm@4|X6*htI|u0ejP63hV-&C|B+)-IAEpIE;q z?BXP~4{Yh=y{wfx@FqW}N^8*M<*=|wiA_}7Cbj@9V0}d@mWK=l5L^Ow9nAKvg-{xG zSG|Mk9cN&CiQGgLW_sI^?5{;h$yVKZ-Ep#(g`ST>Qgtx9K1F z1(l`Fuc>?XeZ$<7U*IeO!i^%X9JtJY4HRtPKtwd;*qwIZSUu+EyM^F5M7V%R)f{3C z(hO_YnC}R|$`}NpDB|+m zNq*T4$=Hqqyq_77#cfigOj@Xz2CTrq)8)uzCPnLkZuprfbT$f|4P#-n2GczoLDEOf zm8URqqJ@k{U@M_>5hT`3+tT%;tQ-=j|1OWe^OAWY@Q~9!3SJgzL4w88zcW91@;CD5 zkvPE`=%OeHBmq-!F>rVvr-v&D?4Y#$JgT?%BUp%lSwJWQHVQf$28clob%&Z1(|5F$16 zn0Vz1Oulgigrh;k(D^VLcE4p4>&D4(Ktnz5>o5M<{E~=Q7?q`y&>9#aSsi~=-x~^* z)HEe_eS3bW+PLw8qQ|pjA-3lj`2MI=y3&REqG8BLW5G+JczHvm?>^voP zo@}^G;Kb3yQD6onNU-5004u6t(aSN1RawhTHy=7H94*)qVX@+~)nK-e$_1FfmKL>Q z0b&^A!Fa?KZE3UiGcO7ffpDVCQ@t(O-`y`&?8}IPj_Im{73v$@#WGy}S zaOpz@KYd}*6Rhxwt64H4B63}~{NTZZebH#N&i8$Go$_GI_8;p=w9cKK?zWlqS@yjY z046t7fkbIL$}2iV$cf2J%k_lX=dGTq6DR)IG5EyczjZKq*+t>;M*&zeB{elQd#~Sj zV;8&Qw0YO9xoY{XSRnwU0E&JQTwERy7_hcTX})crNlx_3^T+lUp8Cr(d*;$J-4}C2 z7xQXNL^7Mro=c^YeJ#zcpECs=wn0@P9Ia*{q*zQ#OWu&c#uzg<*XND(opDG0QJZ_= zg_mxgO-{aivE&zJU>OsVnN3w?^{!9s-0}O$>hjA&;YP&b>%B;{$tYDKL0}zZY(6)t za@hgbD~w@sJk|SV&+FezB~!gbq?lP>G{>a?EC->Kinh0JxNGg&rmrXBkquHw&|;Zm zW*DuJ&gA;eog01Z%-Q~jt+D>4X8tb&SOl@Ob%YSAqO$7B^0M-6;c&PfV9pl`7gDLz z$>i*853{u&{O7;b=u-ZE*`VbYmX8klF@cE1o&bQEd9kyHWS_D=^FQoIa0Mt%SQ N002ovPDHLkV1k%4KzINE literal 0 HcmV?d00001 From 6e52e68a44c2192698a519a6db1286baac60821a Mon Sep 17 00:00:00 2001 From: xivilay Date: Mon, 13 Feb 2023 19:42:59 +0100 Subject: [PATCH 09/24] feat: full lumi colors support in 4 modes --- src/lumi/CustomProgram.h | 85 +++++++++++++++++++++++++++++++++------- ui | 2 +- 2 files changed, 72 insertions(+), 15 deletions(-) diff --git a/src/lumi/CustomProgram.h b/src/lumi/CustomProgram.h index 98992f2..1e3e17d 100644 --- a/src/lumi/CustomProgram.h +++ b/src/lumi/CustomProgram.h @@ -11,12 +11,15 @@ class CustomProgram : public roli::Block::Program { const int globalKeyColor = 34; const int rootKeyColor = 35; const int octaveId = 4; + int dimKeyColor; int keyColor; int rootColor; int root; int state; int colorMode; int fullColors[12]; + int whiteKeys[14]; + int remapIsOn; void initialise() { setUseDefaultKeyHandler(true, false); @@ -24,6 +27,16 @@ class CustomProgram : public roli::Block::Program { rootColor = getLocalConfig(rootKeyColor); root = getLocalConfig(rootId); initColors(); + initWhiteKeys(); + } + void initWhiteKeys() { + int whiteKeyIndex = 0; + for (int i = 0; i < 24; i++) { + if (isWhiteKey(i)) { + whiteKeys[whiteKeyIndex] = i; + whiteKeyIndex++; + } + } } void initColors() { fullColors[0] = 0xcf3550; @@ -38,27 +51,71 @@ class CustomProgram : public roli::Block::Program { fullColors[9] = 0x4d6db5; fullColors[10] = 0x564a9d; fullColors[11] = 0x8c55a2; + dimKeyColor = makeARGB(255, 0, 0, 0); + } + bool isWhiteKey(int noteIndex) { + int i = noteIndex % 12; + if (i == 1 || i == 3 || i == 6 || i == 8 || i == 10) return false; + return true; + } + int getLastBits (int k, int n) { + return k & ((1 << n) - 1); + } + int getMidBits (int k, int m, int n) { + return getLastBits(k >> m, n); } void renderKeys() { - for (int i = 0; i < 12; i++) { - int highlighted = (state >> i) & 1; - int num = 12 - 1 - i; - int color; - if (colorMode == 1) { - color = fullColors[num]; - } else { - color = num == root ? rootColor : keyColor; + if (remapIsOn == 0) { + for (int i = 0; i < 12; i++) { + int highlighted = (state >> i) & 1; + int num = 12 - 1 - i; + int color; + if (colorMode == 1) { + color = fullColors[num]; + } else { + color = num == root ? rootColor : keyColor; + } + int fill = highlighted == 1 ? color : dimKeyColor; + fillPixel(fill, num, 0); + fillPixel(fill, num + 12, 0); + } + } else { + int selectedCount = 0; + for (int i = 0; i < 12; i++) { + selectedCount += ((state >> i) & 1); + } + int scaleIndex = 0; + for (int i = root; i < 12 + root; i++) { + int highlighted = (state >> (11 - i%12)) & 1; + int num = (12+i) % 12; + + if (highlighted == 1) { + int w = scaleIndex; + int color; + while (w <= 13) { + if (colorMode == 1) { + color = fullColors[num]; + } else { + color = num == root ? rootColor : keyColor; + } + fillPixel(color, whiteKeys[w], 0); + w += selectedCount; + } + scaleIndex++; + } + if (!isWhiteKey(i-root)) { + fillPixel(dimKeyColor, i-root, 0); + fillPixel(dimKeyColor, i-root + 12, 0); + } } - int fill = highlighted == 1 ? color : makeARGB(255, 0, 0, 0); - fillPixel(fill, num, 0); - fillPixel(fill, num + 12, 0); } } void handleMessage(int a, int b, int c) { if (state == a) return; - state = a; - root = a >> 12; - colorMode = a >> 16; + state = getMidBits(a, 0, 12); + root = getMidBits(a, 12, 4); + colorMode = getMidBits(a, 12+4, 1); + remapIsOn = getMidBits(a, 12+4+1, 1); int octave = getLocalConfig(octaveId); renderKeys(); diff --git a/ui b/ui index 60d6cb0..1568ceb 160000 --- a/ui +++ b/ui @@ -1 +1 @@ -Subproject commit 60d6cb0b7b8d7a8159b8703c36a5aaefbff9e0da +Subproject commit 1568ceb5c594662713f42ce5dc68ccc3f2bf7876 From 88539634a0b16ea4a6416c1e8c6082be2db9fb22 Mon Sep 17 00:00:00 2001 From: xivilay Date: Mon, 13 Feb 2023 19:43:55 +0100 Subject: [PATCH 10/24] chore: debug config changes --- .vscode/launch.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 07633ab..4876a93 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,7 +4,7 @@ "type": "lldb", "request": "launch", "name": "CMake Standalone", - "program": "${command:cmake.launchTargetPath}", + "program": "${workspaceRoot}/build/ScaleRemapperDev_artefacts/Debug/Standalone/ScaleRemapperDev.exe", "args": [], "cwd": "${workspaceFolder}" }, @@ -12,7 +12,7 @@ "type": "lldb", "request": "attach", "name": "Attach to AudioHost", - "pid": "${command:pickMyProcess}" + "program": "AudioPluginHost.exe" }, { "name": "start debug", @@ -20,6 +20,12 @@ "cwd": "${workspaceRoot}", "request": "launch", "program": "${workspaceRoot}/build/ScaleRemapperDev_artefacts/Debug/Standalone/ScaleRemapperDev.exe" + }, + { + "name": "attach to audiohost", + "type": "cppvsdbg", + "request": "attach", + "processId": "${command:pickProcess}" } ] } \ No newline at end of file From 71b5dbe4873eb0cd6a12855bf130367e4b27ae94 Mon Sep 17 00:00:00 2001 From: xivilay Date: Mon, 13 Feb 2023 19:56:34 +0100 Subject: [PATCH 11/24] feat: updated app screen --- screen.png | Bin 56003 -> 55820 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screen.png b/screen.png index fa146f03221c28fedb68d5ecc9cf00b5dc140fbe..98fca2e1096c29d460eecdf6ee82e77ce6610aa7 100644 GIT binary patch literal 55820 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

&D%< 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 literal 56003 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žw}s2g;0#o$kvszw#* z=I*h!%7YxHqA6m;wdxd?vLHzWJ2LJX8hmUU`^L?AunQv;axM(!?&GdbeSjeYWIPPV z4=%eifrlZ)QXl5Y;N4n`-wx?qKNVcd)dP2K_8aNf7m`v6{^gJo^@mX@p$p;kp9fYB zLuAEYd@4yA{A^=`5W}WYG1MmOP(qU_hFdID^hhiyFr?#eLa+_isUl()lC?EC!PIsw zamK`^kti0+!z6v#5JCPbFFKMO27kez1;NiG1WA_8$jLVS7=!8I*UQzYP)Igkth#e> zkj0eC{Xg~(2~)9`lrS;ylvqC`=PeemYeo@v33?l$YLGta{u$+HylpI0W>7z5djrv;a=Z(fC7ypH?m@}g zb>(tA8N?M9?uJ92O#3_wKh`wR_fNJnDFayXya zs>`z9**@x_EhqER53&a)e%|uV9((i+OkZywbZfsk_u3YE7t?y;&DN|pWFa6*EPyy+ z{1_K=l8;}yJ#y=e7*b(TCSmfQpafoSz&~RG!XErser^N944X^tV_KeC5c(wU3fm&uDRn0Ei_!fR7ji@YqEo>2dRL?%Kl4z}tlw)pRViM1T7O1!H zHFrxhN2_y}y&dA>D?9$mRHDwJ0EerY;d%B#c@*}BAr}I6?m`Q;Bivit);4dPGuTqw zK-UhjsTO^1D-q<#a=X!T%oW?#YJyio3Y^e{DP#!{S1Pqjn?xC(3zZ#27aD0_;=2fu zprGatJ3=F4VL|D3hV2Z9cL>bP-!J`09i;AEh1=F&{ip9%+8eYo5)LaYkv zO0hn$l3T@sz@Iq*Hi04m%nqDX@d)0D7_kAmTxQ<)h*n1 z8|GJ70MiS>%(EhGk6`*33I+)1cY5&?-&p$RIo*TUd0Q3yHVEPslPd6-3uUa|MID(# znh`#Wh=e#)7 z5mEik13X>!DQyXfbhrWk;k8Qfd7B=$N%~i5W`PoiWLohDyjx>J_(gc!5b|0cC|Y4KZ%qo{}0UUe-4MUXj*}GR!M3#AgHz0 zGOqmcjv8gLGHr}9EWf546L_-kn8E zL6V3`T}<=z+r-uh=|&>5|4j4xz{MJ^c%25 z;Jy0OB>%kj6+*q2Y%U|NR9MFD5{nJ$jZJ5cQ?K|}>&Yv<0nF)42e(gj0z!PiA+2m< z4;x!{fc?i0NIBE9TlR`5-`+zI)E>YV^aXJxB|G%0dEhKZ(3mXQ<>o%bFSrdyk1^C!HwwryGk5)f{!24S#*QkcUpj4!0h6qP&5$90$2=foY-xNfFEE$7HFpjW_t$h zIX!sA8i1HEpHzC14rHHUw{eEM8o?JyL~gG(++KY&*kY$}b2{=}_ROzm91mPy`Qg_} zOMpVJ_|>3f^Bo&pjXP7D8$A0!^3K0qOOV-fI0BEtwq2}aO3s4{%_((q3>%RJp81NF zHPPU}fR3K0Ky&_;yStlvz@9jil}(PF&p!YZ62q2R z#oX2ugVEkyD#sFCN&&I^4v3yt|9QRz2fBUFjBRa87u;e?L7PzB!9~b8IXbJTj%6mw z_xy-=p?(H8H?wLpSwVOhb8L$qM5sz4$Ux{G5VjkL(zYtSJvlz=t^<;2)4hDmtR#lc z&zd-M(wTW6UBD4xTsC#~MomT*=VGkg(^j0g%q@wKce_}+T=je8 z-vMF9jvsEEq}*vUB(TQ}pAz~iHa=jFM{G%W8NiWC3U~0ADHIl z*@!;WbFF-DF;(v9?35Kw(uEorvk0I7U}US&32xr4v(>zOt-h>9^f1AH4r4D&wp-MHoshui ziy!xX_nPXGx_00EJe~i#xs~TtIy^>b%DbWs)G-EixiTFy`(>We@nEzRjImq%` zU?CJ=zEC2qboTe4YgQ38Tev7V2Qm5^-#0N(@a_g-ukK};EHlFuM;A0c99oAGeYh3jQLpqFu=Xr$*y5`Jn_ ze)pUMDFNGL`=bMnmzsb?x|sbiLXMpi)5iqxgICh|8GySn7G@Z;?Et!z=%-JO`PsM( zaaypU$=OJ`L{OxUv+qV`hOs(Y^PWFNs*H`|;oyYWIr_H^$dWIe{x|kaZDK~o4tB^gWu@Bxu#~iQOjVNyye~_X}o2$ zA-KM4>zny1Ry0(Gr{7%6734zDzCUHUwO)gwd9YThfz>Lg>xp>V@lk^V;IVp0Jd${~ z=$B=vaA8`~FXVU{BqcG_YDoA89thqN+s%VOV-T#^ySILX|LdqJ{}O;@JHSNW)Y!?Y z6Y-*>k#@eW)sR5^Y5UH`LBAVNCq0+a#t4(c2oK-e#ep7ggV z*Sy*bBEO`AV6|zVFt)6vx)!P+b!35ME%eHHLp`i+0a5C$?+80|-9^P>U0G<+A`D#! zFIzKrv+_46i0TLh*0%JVk@?TLj9e6KOyAbW*sGa}Ux5WVbcTXCYonMaQe795Exw@g zh{mhVVic(V^%U@2-My<7q!GWJN^`So%7`omn$y@GskRd|VATCdsW)s<$gR<|ic(EE z!fVvj;xkP`m1EmVNdZARWMl#jumy}*;h*9)pt=*Y84ZrbRSOiqPu8~%L+cNz)b2rW z=TSi%VBZqaXA!OEP=jaqlBHKM-s>JH+m9Rk0Xm(TwY?r4GsJXZ|y%@ju8?Oe~F7OBFj+cuhQl_d)&t9 z78xl6n(skmq@;nrQyj~LYe24bSI&E?gdWATPr<0Y;flE(kDg^XM!f1|GDfZ}jfcy+ z_8bOwHF!kNo;Vx^?zEDo;Dv}jA6GgLi$mR+w>^WY&oZdsMwUi6&(3{DQ0jnY5kLtuYp3UrHHB z;?OcTi;D~9%4K9NWdyg5Fflj&Y)+PY=`Q~qr0#L9RWrmVG6$R#@+L~SEh>M;`~ zq}V(Z!z?ZW^RfSk;sYW$W@u=o?SHnB(80z(>b) zTgIdAt`$7T^R7F47FnyI<&1&wib`m!VS7vH49zZWMkv?w=ZnpMUIm_^+5v^pqXIo) zX*g7H;UPgwu6S6> z((zShK}4J_ES7Fk)ps*OY$SG0hm!{fy{JIi`wxho!zN&~(5;zT8uOJ$(nl#-Z= z*qkK3v>Pk7@VhQBKh~z#PvjuUDHy@KY{sK{3D1-YR$R$6vU@quh&g zCb-pQ056w@(O!SKJD8C5!Lf{$-|^@e75j$IJFr1u3TgGu*qnp|Stag3!s;JoWVm31NeY`j9S9?AyeQGkbQRDR0<=_vqceWJ{p{Zhfv)g-H83=`XE}(!6y`}9J4KY@ zGmGgr{T?Z-&j$ivD0@AAKrGIVfWXnw`RM2*>jm6JvXg1}%=n$HBU^(-*JohEeatLE z_~~AcL^b>18xH){vOAb^ZZ^KxI7IHo0O9%U`Cx5t%g5b2ioxrhP1>;&e@MAS$)*az zbe=!1(dEcW1s#O-;yrPAcfO z8@2Z z2RNRpK-V*{hleJ!Jy?9SGrlHdw6M$w3->7b-;D^uK0quu!UbKnr(fpBMYv>w8qI@a zPs3yo33J-Gin`{@7xhaKGeuj}i^7&bRW zoW=gzF3#b0RxJv9-TsNxcUYx|SmEe7_>Ue2xGVDZ$W4|5n&h953IPx}p{6717Q&za zX{`6&fkerH;MOE|F9dO{qbFE%UPMCx`rt4wwxGa@BB1EJ_23o&X&OQJ-ud46qo%j( zg^Q~c)oqeE(Xy!4G#H9K*Z>k{@e2@@?ZDH;j zFKam@-9u5Y#gJJZzCDIrdX(GGUDZD!1*IC91 zXdE&?QTT5R(XOvX`d4uZqUQ2mFet?q0jSX!Uv+ro95og7PnJfHP7$(hV8D{}1)}Kc zfF)x}SVn#8a#R+10EikOqTCn{C%%Wl1wN`6jr{n~XapDFNb6bEZ`0a|y?K`lJsmv_ z1%YoTet=`fc*q7UKmVEnb8oP2DO5*sY9#y~5QJ_mKfay;AR^Fn;8@X(3A`f>7#mco zfQ%O$M+aoYzed*%&O90lpKZXB1x|cc;+?>Je=Irht5jOSh?poOs~MQnV^Bnkm$?I3 zRWx<5mVg^~c{J#SGQzPuqQeJBCo`2wLsB|JZf^YpjO>@YZjVw+j@mg;Zu^$kQwb*eWCWsSz+Ey1jTNnTd8rFX8!?arChn5S zfIbUz0Y1s6Xf+hTW~*$h&EOXAXE%+G9dgb7xFh}6(k<_n1Zi(uuDJIv$dtk&3+oi||r(~$F#~6~5bwZDGVbCgGPHN1@1o%Ms zAVTu(zzj_(P12|5fd7`|I~@k-r~h6>VCKlc=O`|OZlcERNbkBKBT50K4g@UWY5CMj z(P{@@Uk}vDg#mS(+kjKX80x?P^v6(s&shEM=sYGK%e&Q#V{TW9gE)(+NMu2`!P3jU zX}CBj0Yq?tyMI`z>(=W6X%uPYTX4eQ_KsV%SWG**SK>aee;SioM}4kPMgVJwp~F(! zipCA~SaP)5y*gJo5L#->Rxtf4jq*1y?T;HU;PirlCZnKc{BDZv)*9+yH>u)Cm(% zbeIPLBTF%Wufls`Q>I%uB5*>(>LLEA6^SpKP0BZFnm0xe3? z)O9_DK%|+I=K0g*$45>;U5A+kz{ZIZ?a|P``2Am1uiIAuE-6^O&x{AQ6+C;NSvy{J zYRqBSn6QEUei!X!nf6S5`3rtF>Q#o{(5G*TAe`07 zM_5h39M{wBg64gd=b&Z6S&@9Oe;gt#yk9U^rG|UDn(%U|FDihmDG9mz-b?%AFwo!s zNDU`(hN-dyk@jD{2a$TnRax$iE14Nc8N=;AEcDsDH-N|dce4L(kpCVb|C{DQ64+|$ z>du<0Tcp)?&FvFVvIR_=;8AmOJWuhlc_V&Kop6Vail0=NIC8 zuG`7ZCCg}IA0aJ00t$NCG~{Lcy-LxHwwmWracDPVwGNH(#3Iv>=b;_cuu!fW-G#m; zC(Pc(^S&r7TfyyOsBNz@jlq21gy?0~?r3bzqvbD=BG=!5AJZrL(y(yDXKT4X)N@|6 zMu*(_t>EsT@`75vR)#I-g?MyZsbQ`7i9Jl4^J!GE9vu~N69(f$)!nr+kw~}x;nk5f z+g_gZAI;VG7Va;)S37IP51WXKxXaRQ)Bi1^o&04;j<9%j6#|VkP#hD2kHT89jBHks z>Aw6$-+x)xn&iDf6yI@_L`ypFIIV-&~)Ve8FMQ=%qxR8HcmgoZe zlZkw*h1H0qAqUfJsIRwu7I##MU0uIMT2^0F`udTW2;?JjkGkewiKw#KcUzzBd}|fg#nndeA3$Ea&;N6)Sr9!a1!Z3j_loqYODhtRzNk%U;@)jYM#w%ZbSz@ zSu0*6omQ14evV3x3i;u%ETUD%-s{EBN*;Z)iwItrQ z@|YT*X!H&|&RYFV{mWUSQShTR+S50>xT>Jt99GnxR|!*nSm{FJr{+`3qk}p8DJBOB z`nGtQQZk6e5MvRl(U|J0{j}d--H#nMj{E=6gbDGp+UJCuT8YwQ&~{>m@_N2|$o_=- z=o`AZ?bJ#8&>KpBRMfQ0^>w?~8+I8DJw?1bxy&)&(k^SgLVZ6rhLLDf>f8@MzrpPl zDc2FforT{WxU50RS=ug(+m*QTUB|P2=FtgN+LxRTCGJo=K?u5%oZ*eWDS{_W zVwPqizQLxaiv%BZ?Z%Lht@S8jbv`YeClo=4=1RLpcuzwg3J#)qTw zqo|jkFjV9rgn1uDm2E7SeT8~7#+xC}G+msQ@1FBo)4_1#xh2MNkDlEBL79HD8t1LO za?8)Msk}rVc=fWBd&T@`PmX+0R=KEvJ|x9>0#B-gPqUoASdQ}Ot7lymf!+GIDhAE? zvYL>rq3`N1gq6^%wM&sbc6bV!#h2j-T{ey<)WkHwHcIv)Bp(8P|1tmwBe@}3zeIPR z(E1wJ?%SUaMEtP*Fe^(C4K&`<$JFWC{yL6y>>vVF@|nN^gnWty_r<{yYI3Aj0a3n4 z%~)sw-ReUB&|FlLPv!?0)vkhRc1qYVHF1(c95spFjQP`#T|LBaG^dA^%I3Ehe9d&` z>{v-+BSUR`?#|O_%2!pY_e|ikDs-!LN5-WJ*`&Xbs!Y~qNAA5_bK9LuxxSpECof{| zZOQ-JT{4|jLI2)ezgYu1lqu`-A|wUe`)TK&X3dJR=c|A79vhm&a3L7QcYU^#`{NCa ze22WF_akuvMi;cdqm)^ceU;V|YQoy`<% z=J60BVb_X<%_)kAN~*GkL`PT@msl%thxkvr(}t;cHI>J-eqa=VVv+P;h7Qv3A1v+O z?fbWJ#2SD$${iM)j+;4(_G$**c~2qTjUlk>2gpToR?zcFVzb&(3H-}-^j5z{DE6}Z z`4}A8OiirDDB@2~@&QAjG+xd{^<=rDKFhFW?p{ghrRT`Khjcw?`?`f>v!bBsp2PH< zEnHXLayIr4*~tY2?0E-)r4bX$(9q`g0=7~-wfr4Q)Vgm4 z^UuIS-_zHcGzUIFR+nTm_nr`IL0r=9rZIp^q#%xcTevu2y#OwB>%A!@8MX;G$ z2%dJkgY3U7gjVTGF^(%~Ao|#n&whfB2Ewu>Ql>PkTqa3_|KJPwRLD&DQp5GZCi8iP z?Ft|Gn83@?sE%sXn$6NU-GLb~v_v`FwCfPN?e>DZq*wH;}dJuhwkGu`_&~%FDmDv6f&fV<+zZ zYrm~u+4E}J6^Xjp(voJQ36`0={g*-9e+R5k{z%HjO_s?Ym(69jixS!sT-EUBV4H2Q z`@2a=o?#dBEo*VIS~zcw>xl>i7w3%?aseNsp4>DLbSAXaU&;iRvbQiC5(LR zM(|uvqP%f-|JdDfxN%P>lyI^wqS{+mV8E`V`FH9Zw77+a>hug4Ex1Hll5Re|_mad& z_621~C963q0W=bo@QWY?X*angKH{a93#D0to#Z!(k&WKzWG5lv(`C87X;3Q58~z1q z$Bo$?$XKZYh+QGvk~F7byK?L1(h2Usa)#vq&vzpJ10gI`mV(l(&q36q8l^GQpVIuj+C%0HGiixjCsIcwqndb`w6GczJHrlcAE(Na)0{NN0`4L{f#zu~ zd8ey82Y@H?Z{}vX+|YKELkgj8{0F_D1SEw})rr`wW1Opl_BfiTin5#+3$s zB`%IxrACZzE;quANjS&rxmG$&G#V-z4H;j{e(HkeZlX^G+HF~vb8*JJA2w|p&KkMgh}1frG&vt$I%|u6 zSv?#1;&L4pGlY*$#e-Zg`_z7rGY|mzTktTMRgX)Kp&1Lyv(d#NwVZ)hdPNt3F@5*l zp)CEEzvufn9D<)WG2D}1m{(!tFC@}s)%uR^jh>WVd$sf9wZ-PB(j$(M-uU81?{M$T z=Z*OcIzkQ=qxYr5;E0k%W6@w)DuQa9PTo6ramo7DxSf*ut76@r56cg8TM4dxm5Y5M$7B}6YxcR$ zb2;H`|9rH%VCO?eaoCD-ur@VT_i28D+OwyP;3nGfZSoucZYzl8?(j9CIj2(X*_ zF(|ww?x_ZsA(k1xzCFk;(tCDZcj7(w=M{sIV!+UTWFA~A{QYB${L=a(j^$tHQJ1ZM zPByROyGU2O{J!rt`*mxa3F&#OSxreHB@uROpZp(~E4|Tb+kEH7Bsk07u`A`X;6kR+ zW)s|u`K$_NanW2`al*HVPWTc;Bkpp*TA}=WrINFVwE8l>&IB5 zTqh)NHDAe5fXBqeTmxGcdwwqDO_ak3%7ox-@(lf9A{dC_H!k@ywME@(QN~ zUULz6`DqGTy>r^4LD%DWdwHKnxT4tbTs7!-WeJ5v=8|x3&naPJ@2d?!2%DQ`o$!ziiACSX1qQ`Tpez# zv}+9-9TU6Bu>C*Evmtczn#Qk1FKVJ}b?P+}!GfQrN`;oZWyJf(ABH7NHEel#JOe8x z8ZN$AQQKgs@YKC%fOyFekG>l|;)*!k)o>I~FneozW36m z>FK}MUhmmr;2gdWv7sf4fwqWA@uGO@Dl6!(aVK?}1FjeOnhekl*;p zj1M#DJ@$@~u$ViQ%$h5ouU)_}H@CJ1{X5m~@k`8pYWl$7od!|sJ*VE|lI|8~=bNnA za9l4&?AST_AD$`jS)x zoh0OSE2u2NNIvPeA%p1b(TtSG@5P!tA^)k8bFJTcN%$nq}2ylW$G~R4iUDZD=Vp`m&mA6m6v` z7p|RptX7p!U9asMFIAhNUMO1C-RT%|7N)jvd4#kl7SLbHA5fL=PuCaf-j&1AlFM@ z#N|J-_g$!N#i$thx{r{=_q|}NeuQo_bgf)gQ;Ni8|gbBU448$np)Q(3*LBYTS zzdxR$$=*Q`1sS8D(1G?qLBVg*&--BVGf*xkO-Ku-WOaB4W&8eiF2cIr@c^OV30>`= z922ZQc@ZCPRd_GRs?NEaT18jcfGGiE-rYjHu@nfV;mG; zK5LBrfvHUYx zo>i^JU21tW8QyC6PR>rUa?{Ymt$%!^P!gi)esOMO?9^uYPD9eF?eJV<-)~cM%g*8C z_ze<%P7zd2&V|h0-VzzFZ7}I96zD{R`VQsU<6Ph#+e}u;S=SaIoI&mq^j?U!0E9^SO9Fz&EkGf0?1BI&Anu|?7i3JP(HfQlvR)H^K9+=Pc^tl&DMKu1af!ao1w)bsU-XLpK5<+ zP6=FbHTNlxTl^D3XfMv|y%x%~I?%lmkzn1Owto=wd(?qO&*M+XQn@Q~GOQntWx|o1 z5KD8$E>IiIMZcFe&8hK(iMgM`m__WxH$yr1;a171lf!(-n1bIjv~qKei&n4Ryi(ib zX7EvdR$AH-HM!}wh@-STyc1#4`z9v&rHqvPmt>wIYRaz%ixCzUyp}NsU%%HLEWcWx z{JAmI4n?tbA$TWCtO8@94`EM!f3iI@^sHZUKRZrVS^nincKOIC>5ujc&%qv9ODo)dbK@k81@BU&)V~Hk|Wh+A`3FBTELY? z#@_F4&be~Y2+Qs1>H&@P8rwC(A=;E=dJ(4g$ld|_C5O=7L!RQD)9$>5iPeEL0T+22 zRFwLIU>`)P;8i%C361>_-9VGCfp3`FQ<0li$%d>C$D2tTd^WjhDK3}Evc&5}^<{Y) zZVpmAx@Hs%4`1O0AmK+2tK9;hlKZ+T9)5MmD~HWarO*efB1My3)<=ZA`Vpb^F?Vu$ za8$nl63ksS9;6j*(F1!1#w!;1-LztsSaKUC%wjMtYh-JN<71e#siRfJ)?l7;hR4k; zl0xbb6?b#wI)jAmz7)G&eLabbHo;5t`f=r&d0tswQu)dv zl5`|nT|=h{vffL&Uh%Cqs%eW&u^BW!AEBQ^-q%gkj&76tsda#Be#Apg820scI2h8Y z1(uJHuTjRYPtQJ*>w*ry=lzjQ$E3SaZAtu0+T^%Za%j(x1(Ce@hS7X@6zWU01}{(> z9Wd#~@zBqv4TwC?&UB0YbvFO=-zGUW8^Wcy$;r9We8w$@i=InO(4-%4FGQA1mfCgk z!Gw0Lb4rCMb5VYDHmPjNO?z|D8^Y%{-pH9zXt%&!zMaj01M`D+E`{Eed5*e`!l@U# z>|#rVJpZwPzvF=61_i!Y!{)|d~iKol-Gu%Mu%kZH-}nw!R$7>G6OG3F|m_9qJ^Bpy{w zeTvg5HJjSnnGYz7JJ)}6b5RQnlXy)|zC7blG{)iN{y)puM|HAlC3c_v*x{<2XQ0iE zlFpmorDbd_3^pAD^ z<61K6)892y9RlK}#YY7$E}PdP3wK1^jD7}2P*z(j>xF$-pD-Eq<&1}Vv#*^OQC>+! zIUgNTx!N}?gto-TP_n(B9IR90g>x>)hrj7|j1NJ4Wx4ORIHC+lg+YRUX4e=h*wJM zIPw6@IuGG%z#>yJy=o8665@I}Z*{B^P2LzL#3*Vy2-br9t2eXY}CDtzVRzxfqL$@7G<;O55wp2(he z;}3RonYWFeI0oh(_T~}?21`8+6^=(g!$X{24`bQi%r&Adus*A>-O6s_F7}ZAOp;1r zvNR|w^X4ZTl}}L9JW(4*$8Jzww9uvf-9kTvHeGH$25UT~Hnw+SD^yUu2hBG>G~F<- z86;w1L;QDw|89qW9uHYs>pti-&Ct8}FqM16vS?2OMcx{)Q1}18KaRd5w(E9YvhkpZ zsYoi8!R8H5+lb{Fke&e0-#`IHHOw4`FP? zHDuSE0SHG&S>)>KySzIX`K-R72vpKG+U(M}Nb9@@girMU^{Nz&>%D({LIed5=D%Lu zlRKRH&qZZJqW)jk<^P`vLX>4AqFDxHj$3Q`j3#DI4?~JQ*jOHkDjwwYQ6|LOXu}O1 z?K|J))dKjSygcJ9*bX`SfNgb8+cCA2~pNXf1r3f?Ymgi-P9XPY~Y^}8>l*hCof`e(i$ zY(#TzOL1(DUr;Z}P(kfkHA&KVJ}Zq6pQLrd-I;6^tGAxp1d?`|5EZFkln+jOpXPMJ z@!r_X;YC2m`$j(Zx0WMbJ8%lSH(6=dlHRAiPK-;&(Q2~fZor@4mCy`bP~*IODunzaT8s~027!QIYP1^ESMh4lk*wa z+iR-ywmNkBGM{1sFv@xL*YomqEG7<}?~CzePXqzTma!q*-{|OkcwJZaoS@NH6WZ86 z9$o5wa}oh?9ZFbI=$j5mClgU`R(ztiu1=lFfDbL11;fK;DE5v1|HMT|W#x+H`qSd$ zg&Bwc;DwZ=_Xz9qyG~5v*kD?1%;u(fI!^m%M(B8301yHE@#%83wWZ)}!vW=U^@7Ql zk2H#kMD*Fh{7cf~<#jmj7U5bsU2HgLrbe5f?_3bnqgTE=(CfDAUdWvhpyI#edT0FD z15G8>ku}?f=Xlh6nY6PU)NlP#lC+a4{u>+r6u^}l(7l)kWYA*cjf{B6djF-sSh7}) z$GWcbQv=?j*V>-vQQ@*#OMJP;%6#i7A+ZVEyuukSxA>T+lvipDZ$lo^tbwIOd6~>* z^DJ^U+Ct-Z-w!`czsTDyv*nhdQ< zI9i##re(@eeQI-bSaVTH)V71!Rzha?7d^By$P2{r)>MpsA`;h^#A$WSf0aoO=G%2v z(~q8{2Ga?Z9InT+e)-Q?N~8`~GM1Y5yw0hf=lW936xK5Rg)li?W-F2=p5AzAo)mlY z2uAN(umsK#2mS{@22dKavs!i`+IZS{YDz}JUswA(>j|&BY!tc5DQ~ewuJ_09k^M=U zgJy*xktgX@Y%da0RcyFDAHK{*4)e+tZ9WIc3+2e<`Q4+6NPafWXlg`aAM=#Ne*Ex$C^28~;oGhBkR{rk!Z1hE=W|r7v%i&g8VN+iM-AFYl}9vW@T_ zJ^=946XK$`ZwjmdHU}^`fc^B>4<`wTU8}qc+7*K*#WoK9ZF1FG7H21KxVvP$d8olYgF1NFgV99~Hb5uCVS*uNx!Qi#I%d)UpeCJ^k-^ zn#$~RYY(Wwc{`P)_+}QtugKsY|{Hs?RAsMNfUXB zv_D>cJ!b6cqb%|VvxoRb;!j9R?0M_HH~s#-7pSOR^?M1+;lJbrkc<)rBz;=lRdf{> zEsRarKFv`zxqeKYJmiy@mCi-}rnSvY)Y1Ff8jsEHM1E2Hmc4{!W3hdKH!%Z-6ACW* zh|WbL-^+~gQ#NkQdn$@)-)}+c!L(-;W8V>E*UX%kp%3|P!5jQ{vOFgq>bfEnKYc^L z#Y{W^i?@NV+x#yD<3@-5FDd<>KH%lk)yeiIvn;^AT;N>|#FZZxCQqP8T}^5b25^eO zb3!s>Mw0|8aH(%1hQo2iRDM|O_HAmM7hKEf=*7F+PaYP@GhzNa^sN?Nv%vRCKY&b& zwS=v~e8MzKzOIF{3zQ13uuc z`?TF?Y0lE4Cu(sveXW;>l+}gzT67Cv2w#a@)q^)p6zV@_RoSp5aQv90Oj(ci}dER(+*%FH&@aA__OU@dI)&Ht40RMXk&Iuom4N{{bp zXe3yvWNB7^{dV-oa9`yMN0V3-&UHWcn%|T)G1+m6fJg5Vj~soucI%C#yP48J*Ar85 z+__!>nD}SX7uAkP+1V)BT~h#!3;s`N{8XFuMWZi8DvB6RcnLr$-4)xGAh`<<@JE_I zh$LVFH12-~f`}S#4**Qxbj>?|F-)}hPz*5~Jh4i&zZfPO8=lOj2Y{mfg-`)**`&|n{SN>WfR>!CY$}R?QQ(H2Ywm9JR>pa_HP$8Y ze+5y#H%I}fWoPyZZxt2S=eG8*`^MPb9{@%>z3_LmEtC_Xpoo4b1;5)l)G<*|7D?IA zP*C=;{?8ywaE1@o`+uH1u9A}X-R(1^Ci$Gb&WF>$85jlMB{);p6$uaQeEm1`4l79> z?szqr;cdc4j*<~8Q-mOu2wCW7byc5R0QD&+k&3$N*@T*2$L;;@_aW<*V|scO?{RL+ zO}3PuTUEtVS;J#DusxiTR#B;YWL5{x6kx;`F~^S3G=>4}{#mz5JZ z^lpn|o3odh3sEcXD=fIZ$5v`DH~0JZ@7;{Xw+*yS)kwtn+Io({H%#rf(yzfh#o}Mmy*Y$G$ z$0IwZHfGjqi;-NV{hWJU-Ib1Cw`*5Z-FF(sYNg?tyT2sxJeMEQk_)>z+S`}E;s8HF zLPGTP3xiU$o~H{zM-U~EA8GP=jU!uDp_pp@9-*l;9=k0!=*@l@{)89(_rNI}<&C8L Kt736|-~R#iZ}Kt# From 53f978bdce0faa90ec9f8f5685e5b896e6076f5b Mon Sep 17 00:00:00 2001 From: xivilay Date: Tue, 14 Feb 2023 18:16:29 +0100 Subject: [PATCH 12/24] fix: names in debug cfg --- .vscode/launch.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 4876a93..704277e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -3,7 +3,7 @@ { "type": "lldb", "request": "launch", - "name": "CMake Standalone", + "name": "LLDB - Launch Debug", "program": "${workspaceRoot}/build/ScaleRemapperDev_artefacts/Debug/Standalone/ScaleRemapperDev.exe", "args": [], "cwd": "${workspaceFolder}" @@ -11,18 +11,18 @@ { "type": "lldb", "request": "attach", - "name": "Attach to AudioHost", + "name": "LLDB - Attach to AudioHost", "program": "AudioPluginHost.exe" }, { - "name": "start debug", + "name": "VSDB - Launch Debug", "type": "cppvsdbg", "cwd": "${workspaceRoot}", "request": "launch", "program": "${workspaceRoot}/build/ScaleRemapperDev_artefacts/Debug/Standalone/ScaleRemapperDev.exe" }, { - "name": "attach to audiohost", + "name": "VSDB - Attach to AudioHost", "type": "cppvsdbg", "request": "attach", "processId": "${command:pickProcess}" From 07a040920b4a8493b57ff24206e4a4781e183080 Mon Sep 17 00:00:00 2001 From: xivilay Date: Tue, 14 Feb 2023 19:58:58 +0100 Subject: [PATCH 13/24] fix: lumi program prev state comparison --- src/lumi/CustomProgram.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/lumi/CustomProgram.h b/src/lumi/CustomProgram.h index 1e3e17d..1b5c278 100644 --- a/src/lumi/CustomProgram.h +++ b/src/lumi/CustomProgram.h @@ -16,6 +16,7 @@ class CustomProgram : public roli::Block::Program { int rootColor; int root; int state; + int keysState; int colorMode; int fullColors[12]; int whiteKeys[14]; @@ -67,7 +68,7 @@ class CustomProgram : public roli::Block::Program { void renderKeys() { if (remapIsOn == 0) { for (int i = 0; i < 12; i++) { - int highlighted = (state >> i) & 1; + int highlighted = (keysState >> i) & 1; int num = 12 - 1 - i; int color; if (colorMode == 1) { @@ -82,11 +83,11 @@ class CustomProgram : public roli::Block::Program { } else { int selectedCount = 0; for (int i = 0; i < 12; i++) { - selectedCount += ((state >> i) & 1); + selectedCount += ((keysState >> i) & 1); } int scaleIndex = 0; for (int i = root; i < 12 + root; i++) { - int highlighted = (state >> (11 - i%12)) & 1; + int highlighted = (keysState >> (11 - i%12)) & 1; int num = (12+i) % 12; if (highlighted == 1) { @@ -112,7 +113,8 @@ class CustomProgram : public roli::Block::Program { } void handleMessage(int a, int b, int c) { if (state == a) return; - state = getMidBits(a, 0, 12); + state = a; + keysState = getMidBits(a, 0, 12); root = getMidBits(a, 12, 4); colorMode = getMidBits(a, 12+4, 1); remapIsOn = getMidBits(a, 12+4+1, 1); From 94e0e27e75691a7555be9e566a4cfa6f7a543d4d Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 14:54:57 +0100 Subject: [PATCH 14/24] feat: lumi buttons support --- src/CustomEditor.h | 2 +- src/lumi/CustomProgram.h | 26 ++++++++++++++++++++++++-- src/lumi/Mediator.h | 20 +++++++++++++++++--- ui | 2 +- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/CustomEditor.h b/src/CustomEditor.h index ba1e8bb..69845ec 100644 --- a/src/CustomEditor.h +++ b/src/CustomEditor.h @@ -9,7 +9,7 @@ using namespace reactjuce; class CustomEditor : public AudioProcessorEditor, public AudioProcessorParameter::Listener, public Timer { public: CustomEditor(AudioProcessor& proc) - : AudioProcessorEditor(proc), engine(std::make_shared()), appRoot(engine), harness(appRoot), mediator(appRoot) { + : AudioProcessorEditor(proc), engine(std::make_shared()), appRoot(engine), harness(appRoot), mediator(appRoot, proc) { auto& params = processor.getParameters(); paramReadouts.resize(static_cast(params.size())); diff --git a/src/lumi/CustomProgram.h b/src/lumi/CustomProgram.h index 1b5c278..267426a 100644 --- a/src/lumi/CustomProgram.h +++ b/src/lumi/CustomProgram.h @@ -11,10 +11,12 @@ class CustomProgram : public roli::Block::Program { const int globalKeyColor = 34; const int rootKeyColor = 35; const int octaveId = 4; + const int colorModeId = 64; int dimKeyColor; int keyColor; int rootColor; int root; + int octave; int state; int keysState; int colorMode; @@ -27,6 +29,8 @@ class CustomProgram : public roli::Block::Program { keyColor = getLocalConfig(globalKeyColor); rootColor = getLocalConfig(rootKeyColor); root = getLocalConfig(rootId); + octave = getLocalConfig(octaveId); + sendMessageToHost(octaveId, octave, 0); initColors(); initWhiteKeys(); } @@ -118,10 +122,28 @@ class CustomProgram : public roli::Block::Program { root = getMidBits(a, 12, 4); colorMode = getMidBits(a, 12+4, 1); remapIsOn = getMidBits(a, 12+4+1, 1); - int octave = getLocalConfig(octaveId); renderKeys(); + } + void handleButtonDown (int index) { + if (index == 1 || index == 2) { + int nextOctave; + if (index == 1) { + nextOctave = --octave; + } + if (index == 2) { + nextOctave = ++octave; + } + if (nextOctave < -4 || nextOctave > 8) return; + setLocalConfig(octaveId, nextOctave); + sendMessageToHost(octaveId, nextOctave, 0); + } + } - sendMessageToHost(root, 0, 0); + void handleButtonUp (int index) { + if (index == 0) { + colorMode = colorMode ^ 1; + sendMessageToHost(colorModeId, colorMode, 0); + } } )littlefoot"; } diff --git a/src/lumi/Mediator.h b/src/lumi/Mediator.h index e4f02de..a191f66 100644 --- a/src/lumi/Mediator.h +++ b/src/lumi/Mediator.h @@ -6,7 +6,7 @@ using namespace roli; class Mediator : private TopologySource::Listener, Block::ProgramEventListener, Block::ProgramLoadedListener { public: - Mediator(reactjuce::ReactApplicationRoot& root) { + Mediator(reactjuce::ReactApplicationRoot& root, AudioProcessor& proc) : processor(proc) { appRoot = &root; pts.addListener(this); }; @@ -25,8 +25,16 @@ class Mediator : private TopologySource::Listener, Block::ProgramEventListener, }; private: - void handleProgramEvent(Block& source, const Block::ProgramEventMessage& event){ - // TODO handle responses event.values[0] + void handleProgramEvent(Block& source, const Block::ProgramEventMessage& event) { + int messageId = event.values[0]; + int messageValue = event.values[1]; + if (messageId == octaveId) { + float value = static_cast(messageValue + octaveShift) / octavesCount; + processor.setParameterNotifyingHost(octaveId, value); + } + if (messageId == colorModeId) { + appRoot->dispatchEvent("uiSettingsChange", colorModeId, messageValue); + } }; void handleProgramLoaded(Block& block) { appRoot->dispatchEvent("requestComputedKeysData"); @@ -49,4 +57,10 @@ class Mediator : private TopologySource::Listener, Block::ProgramEventListener, Block::Program* p; Block* b = nullptr; reactjuce::ReactApplicationRoot* appRoot; + AudioProcessor& processor; + + const int octaveShift = 4; + const int octaveId = 4; + const int octavesCount = 10; + const int colorModeId = 64; }; diff --git a/ui b/ui index 1568ceb..af9fcb3 160000 --- a/ui +++ b/ui @@ -1 +1 @@ -Subproject commit 1568ceb5c594662713f42ce5dc68ccc3f2bf7876 +Subproject commit af9fcb3e0c227466c8c6f5ced8c28cf75053b453 From af3e899dc1d7f375fd604600fc7ba96e078f7875 Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 14:55:36 +0100 Subject: [PATCH 15/24] chore: vst3 categories --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 377d085..d862cf1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ juce_add_plugin(${PROJECT_NAME} NEEDS_MIDI_OUTPUT TRUE PLUGIN_MANUFACTURER_CODE XivY PLUGIN_CODE Xiv8 + VST3_CATEGORIES "Instrument Tools" ICON_SMALL "${SRC_DIR}/icons/small.png" FORMATS ${FORMATS} ) From a525723a4306fe0e42342b181c271bfec478e37b Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 20:33:38 +0100 Subject: [PATCH 16/24] fix: lv2 issue in juce --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d862cf1..430c382 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ juce_add_plugin(${PROJECT_NAME} NEEDS_MIDI_OUTPUT TRUE PLUGIN_MANUFACTURER_CODE XivY PLUGIN_CODE Xiv8 + LV2URI "https://github.com/xivilay/scale-remapper" VST3_CATEGORIES "Instrument Tools" ICON_SMALL "${SRC_DIR}/icons/small.png" FORMATS ${FORMATS} From 656f455308501778a2f438b2b765f3109c41250a Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 20:36:22 +0100 Subject: [PATCH 17/24] chore: update juce to 7.0.5 --- external/juce | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/juce b/external/juce index 2b16c1b..69795dc 160000 --- a/external/juce +++ b/external/juce @@ -1 +1 @@ -Subproject commit 2b16c1b94c90d0db3072f6dc9da481a9484d0435 +Subproject commit 69795dc8e589a9eb5df251b6dd994859bf7b3fab From eb2c0be751c1fad8f69ac8f825df5ec9df87ad66 Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 21:24:26 +0100 Subject: [PATCH 18/24] chore: separated standalone and plugins --- .github/workflows/cmake.yml | 10 ++++++++-- CMakeLists.txt | 23 +++++++++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 6e2a6f5..28d661f 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -44,10 +44,16 @@ jobs: run: | sudo apt-get update && sudo apt install libasound2-dev libcurl4-openssl-dev libx11-dev libxinerama-dev libxext-dev libfreetype6-dev libwebkit2gtk-4.0-dev libglu1-mesa-dev - - name: Configure CMake + - name: Configure CMake for Standalone + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_PLUGIN_IS_STANDALONE=1 + + - name: Build Standalone + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + + - name: Configure CMake for Plugins run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} - - name: Build + - name: Build Plugins run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} - name: Zip diff --git a/CMakeLists.txt b/CMakeLists.txt index 430c382..7d172f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ endif() set(VERSION "0.6.1") -set(FORMATS "Standalone" "LV2" "VST3") +set(FORMATS "") set(SRC_DIR "./src") set(JUCE_DIR "external/juce") @@ -21,6 +21,15 @@ set(JS_BUNDLE_PATH "./ui/build/js/bundle.js") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +if(CMAKE_PLUGIN_IS_STANDALONE) + message(STATUS "Building as STANDALONE") + list(APPEND FORMATS "Standalone") +else() + message(STATUS "Building as Plugin") + list(APPEND FORMATS "LV2") + list(APPEND FORMATS "VST3") +endif() + project(${PROJECT_NAME} VERSION ${VERSION}) add_subdirectory(${JUCE_DIR} "juce") @@ -28,16 +37,16 @@ add_subdirectory(${JUCE_DIR} "juce") juce_add_module(${BLOCKS_DIR}) juce_add_module(${REACT_JUCE_DIR}) -if(WIN32) +if(WIN32 AND CMAKE_PLUGIN_IS_STANDALONE) message(STATUS "Building for Windows...") set(ASIO_DIR "sdk/asio") if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/${ASIO_DIR}) set(BUILD_ASIO 1) endif() -endif(WIN32) +endif() set(VST2_DIR "sdk/vst2") -if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/${VST2_DIR}) +if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/${VST2_DIR} AND NOT CMAKE_PLUGIN_IS_STANDALONE) set(BUILD_VST2 1) juce_set_vst2_sdk_path(${VST2_DIR}) list(APPEND FORMATS "VST") @@ -45,6 +54,8 @@ endif() target_compile_definitions(${REACT_JUCE} INTERFACE REACTJUCE_USE_DUKTAPE=1) +message(STATUS "Formats added: ${FORMATS}") + juce_add_plugin(${PROJECT_NAME} COMPANY_NAME XivilaY PRODUCT_NAME "${PROJECT_NAME}" @@ -75,6 +86,10 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE JUCE_WEB_BROWSER=0 ) +if(WIN32 AND NOT CMAKE_PLUGIN_IS_STANDALONE) + target_compile_definitions(${PROJECT_NAME} PRIVATE JUCE_USE_WINRT_MIDI=1) +endif() + if(BUILD_VST2) message(STATUS "Adding VST2...") target_compile_definitions(${PROJECT_NAME} PUBLIC JUCE_VST3_CAN_REPLACE_VST2=1) From 6f72276da46444328cac6896c2d3e96efcb815dd Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 21:40:09 +0100 Subject: [PATCH 19/24] feat: add patches for quick customization --- .github/workflows/cmake.yml | 8 ++++++++ scripts/patches/react.patch | 12 ++++++++++++ scripts/patches/roli.patch | 22 ++++++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 scripts/patches/react.patch create mode 100644 scripts/patches/roli.patch diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 28d661f..88cb4f1 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -44,6 +44,14 @@ jobs: run: | sudo apt-get update && sudo apt install libasound2-dev libcurl4-openssl-dev libx11-dev libxinerama-dev libxext-dev libfreetype6-dev libwebkit2gtk-4.0-dev libglu1-mesa-dev + - name: Patch Blocks + working-directory: ./external/roli_blocks_basics + run: git apply ../../scripts/patches/roli.patch + + - name: Patch React-Juce + working-directory: ./external/react-juce + run: git apply ../../scripts/patches/react.patch + - name: Configure CMake for Standalone run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_PLUGIN_IS_STANDALONE=1 diff --git a/scripts/patches/react.patch b/scripts/patches/react.patch new file mode 100644 index 0000000..e1b0d40 --- /dev/null +++ b/scripts/patches/react.patch @@ -0,0 +1,12 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 40dd357..4cfa1ca 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -10,7 +10,6 @@ option(JUCE_BUILD_EXTRAS "Build JUCE Extras" OFF) + set(REACTJUCE_JS_LIBRARY DUKTAPE CACHE STRING "The JS Engine to use: either HERMES or DUKTAPE") + + +-add_subdirectory(ext/juce) + + # Adding any custom modules you might have: + juce_add_module(react_juce) diff --git a/scripts/patches/roli.patch b/scripts/patches/roli.patch new file mode 100644 index 0000000..5037dea --- /dev/null +++ b/scripts/patches/roli.patch @@ -0,0 +1,22 @@ +diff --git a/topology/internal/roli_MIDIDeviceDetector.cpp b/topology/internal/roli_MIDIDeviceDetector.cpp +index 4b77ff0..191c7e5 100644 +--- a/topology/internal/roli_MIDIDeviceDetector.cpp ++++ b/topology/internal/roli_MIDIDeviceDetector.cpp +@@ -112,7 +112,7 @@ struct MIDIDeviceDetector : public PhysicalTopologySource::DeviceDetector + { + MidiInputOutputPair pair; + pair.input = input; +- ++ auto inputId = input.identifier; // winRT workaround + juce::String cleanedInputName = cleanBlocksDeviceName (input.name); + + int inputOccurences = 0; +@@ -124,7 +124,7 @@ struct MIDIDeviceDetector : public PhysicalTopologySource::DeviceDetector + + for (const auto& output : midiOutputs) + { +- if (cleanBlocksDeviceName (output.name) == cleanedInputName) ++ if (cleanBlocksDeviceName (output.name) == cleanedInputName || output.identifier == inputId) + { + if (outputOccurences == inputOccurences) + { From 62955b33b924824492d60b607b2563b1f7c0ad2e Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 22:00:42 +0100 Subject: [PATCH 20/24] chore: updated version --- CHANGELOG.md | 20 ++++++++++++++++++++ CMakeLists.txt | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e37780a..384b659 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,26 @@ # Change Log All notable changes to this project will be documented in this file. +## [0.7.0] - 2023-02-15 + +### Fixed + +* LV2 plugins didn't work due to incorrect URL +* [ui] incorrect sizing of list elements + +### Added + +* [ui] colors mode for remapped keyboard +* buttons to cycle through the modes with the same keys selected +* icon for standalone app +* [LUMI keys](https://roli.com/products/blocks/lumi-keys-studio-edition) hardware support (4 modes, if plugin is disabled it will only highlight the key, otherwise it will highlight remapped keys, power button is changing color mode) +* custom scales override is possible if `scales.txt` is placed near the plugin binary file. Text file should list scales in format `intervals scaleName`, ex: + + ``` + 2 1 2 2 2 2 1 Melodic Minor + 2 1 2 2 1 3 1 Harmonic Minor + ``` + ## [0.6.1] - 2023-02-08 ### Changed diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d172f3..c70524b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ if(CMAKE_BUILD_TYPE MATCHES "Debug") set(PROJECT_NAME "${PROJECT_NAME}Dev") endif() -set(VERSION "0.6.1") +set(VERSION "0.7.0") set(FORMATS "") From 1482879afb961e74e6ef7b66b0a63224ed33b77e Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 22:48:12 +0100 Subject: [PATCH 21/24] chore: ui updates --- .github/workflows/cmake.yml | 4 ++-- CHANGELOG.md | 5 +++++ ui | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 88cb4f1..cd6b976 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -46,11 +46,11 @@ jobs: - name: Patch Blocks working-directory: ./external/roli_blocks_basics - run: git apply ../../scripts/patches/roli.patch + run: git apply -v ../../scripts/patches/roli.patch - name: Patch React-Juce working-directory: ./external/react-juce - run: git apply ../../scripts/patches/react.patch + run: git apply -v ../../scripts/patches/react.patch - name: Configure CMake for Standalone run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_PLUGIN_IS_STANDALONE=1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 384b659..ac82fd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,11 @@ All notable changes to this project will be documented in this file. 2 1 2 2 1 3 1 Harmonic Minor ``` +### Changed + +* updated JUCE to 7.0.5 +* [ui] updated minor deps + ## [0.6.1] - 2023-02-08 ### Changed diff --git a/ui b/ui index af9fcb3..1e7d2b0 160000 --- a/ui +++ b/ui @@ -1 +1 @@ -Subproject commit af9fcb3e0c227466c8c6f5ced8c28cf75053b453 +Subproject commit 1e7d2b04585a9d8177f7e876521aaaa24e1f86c7 From 81cd22c1a3d21454f9f3231f32873bfc60747270 Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 22:55:07 +0100 Subject: [PATCH 22/24] fix: patch line endings --- .github/workflows/cmake.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index cd6b976..8ce8bd9 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -46,11 +46,11 @@ jobs: - name: Patch Blocks working-directory: ./external/roli_blocks_basics - run: git apply -v ../../scripts/patches/roli.patch + run: git apply --reject --whitespace=fix -v ../../scripts/patches/roli.patch - name: Patch React-Juce working-directory: ./external/react-juce - run: git apply -v ../../scripts/patches/react.patch + run: git apply --reject --whitespace=fix -v ../../scripts/patches/react.patch - name: Configure CMake for Standalone run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_PLUGIN_IS_STANDALONE=1 From 6e340a4cd1a786c011253d2b12a0eaeacbedf249 Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 23:07:56 +0100 Subject: [PATCH 23/24] fix: set node to prev version --- .github/workflows/cmake.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 8ce8bd9..7c5858e 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -27,6 +27,8 @@ jobs: - name: Set Up Node.js uses: actions/setup-node@v2 + with: + node-version: 16 - name: Set Up Yarn run: npm install -g yarn From 79559d614d07d8b3eebcb76723dbec2aa72868a5 Mon Sep 17 00:00:00 2001 From: xivilay Date: Wed, 15 Feb 2023 23:13:10 +0100 Subject: [PATCH 24/24] fix: explicit type of build --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 7c5858e..0160bcc 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -61,7 +61,7 @@ jobs: run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} - name: Configure CMake for Plugins - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_PLUGIN_IS_STANDALONE=0 - name: Build Plugins run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}