commit 546cf4d7bbf107970861656dc2ae04f930767617
parent 0a31d1d345e092e9cf6c6cbf6efbc77292a6a3e0
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date: Tue, 30 Jul 2024 11:18:48 +0200
add very basic editor
Diffstat:
13 files changed, 217 insertions(+), 8 deletions(-)
diff --git a/source/nord/n2x/n2xJucePlugin/CMakeLists.txt b/source/nord/n2x/n2xJucePlugin/CMakeLists.txt
@@ -4,15 +4,20 @@ project(n2xJucePlugin VERSION ${CMAKE_PROJECT_VERSION})
set(SOURCES
n2xController.cpp n2xController.h
+ n2xEditor.cpp n2xEditor.h
n2xPatchManager.cpp n2xPatchManager.h
+ n2xPluginEditorState.cpp n2xPluginEditorState.h
n2xPluginProcessor.cpp n2xPluginProcessor.h
parameterDescriptions_n2x.json
+ skins/n2xTrancy/n2xTrancy.json
)
# https://forum.juce.com/t/help-needed-using-binarydata-with-cmake-juce-6/40486
# "This might be because the BinaryData files are generated during the build, so the IDE may not be able to find them until the build has been run once (and even then, some IDEs might need a bit of a nudge to re-index the binary directory…)"
SET(ASSETS "parameterDescriptions_n2x.json")
-juce_add_binary_data(n2xJucePlugin_BinaryData SOURCES ${ASSETS})
+include(skins/n2xTrancy/assets.cmake)
+
+juce_add_binary_data(n2xJucePlugin_BinaryData SOURCES ${ASSETS} ${ASSETS_n2xTrancy})
createJucePlugin(n2xJucePlugin "NodalRed" TRUE "Tn2x" n2xJucePlugin_BinaryData n2xLib)
diff --git a/source/nord/n2x/n2xJucePlugin/n2xEditor.cpp b/source/nord/n2x/n2xJucePlugin/n2xEditor.cpp
@@ -0,0 +1,50 @@
+#include "n2xEditor.h"
+
+#include "BinaryData.h"
+#include "n2xPluginProcessor.h"
+
+#include "n2xController.h"
+
+#include "jucePluginLib/parameterbinding.h"
+
+namespace n2xJucePlugin
+{
+ Editor::Editor(jucePluginEditorLib::Processor& _processor, pluginLib::ParameterBinding& _binding, std::string _skinFolder, const std::string& _jsonFilename)
+ : jucePluginEditorLib::Editor(_processor, _binding, std::move(_skinFolder))
+ , m_controller(dynamic_cast<Controller&>(_processor.getController()))
+ , m_parameterBinding(_binding)
+ {
+ create(_jsonFilename);
+
+ addMouseListener(this, true);
+ }
+
+ Editor::~Editor()
+ {
+ }
+
+ const char* Editor::findEmbeddedResource(const std::string& _filename, uint32_t& _size)
+ {
+ for(size_t i=0; i<BinaryData::namedResourceListSize; ++i)
+ {
+ if (BinaryData::originalFilenames[i] != _filename)
+ continue;
+
+ int size = 0;
+ const auto res = BinaryData::getNamedResource(BinaryData::namedResourceList[i], size);
+ _size = static_cast<uint32_t>(size);
+ return res;
+ }
+ return nullptr;
+ }
+
+ const char* Editor::findResourceByFilename(const std::string& _filename, uint32_t& _size)
+ {
+ return findEmbeddedResource(_filename, _size);
+ }
+
+ std::pair<std::string, std::string> Editor::getDemoRestrictionText() const
+ {
+ return {};
+ }
+}
diff --git a/source/nord/n2x/n2xJucePlugin/n2xEditor.h b/source/nord/n2x/n2xJucePlugin/n2xEditor.h
@@ -0,0 +1,43 @@
+#pragma once
+
+#include "jucePluginEditorLib/pluginEditor.h"
+
+class Controller;
+
+namespace jucePluginEditorLib
+{
+ class FocusedParameter;
+ class Processor;
+}
+
+namespace pluginLib
+{
+ class ParameterBinding;
+}
+
+namespace n2xJucePlugin
+{
+ class PatchManager;
+
+ class Editor final : public jucePluginEditorLib::Editor
+ {
+ public:
+ Editor(jucePluginEditorLib::Processor& _processor, pluginLib::ParameterBinding& _binding, std::string _skinFolder, const std::string& _jsonFilename);
+ ~Editor() override;
+
+ Editor(Editor&&) = delete;
+ Editor(const Editor&) = delete;
+ Editor& operator = (Editor&&) = delete;
+ Editor& operator = (const Editor&) = delete;
+
+ static const char* findEmbeddedResource(const std::string& _filename, uint32_t& _size);
+ const char* findResourceByFilename(const std::string& _filename, uint32_t& _size) override;
+ std::pair<std::string, std::string> getDemoRestrictionText() const override;
+
+ Controller& getN2xController() const { return m_controller; }
+
+ private:
+ Controller& m_controller;
+ pluginLib::ParameterBinding& m_parameterBinding;
+ };
+}
diff --git a/source/nord/n2x/n2xJucePlugin/n2xPluginEditorState.cpp b/source/nord/n2x/n2xJucePlugin/n2xPluginEditorState.cpp
@@ -0,0 +1,69 @@
+#include "n2xPluginEditorState.h"
+
+#include "n2xEditor.h"
+#include "n2xPluginProcessor.h"
+
+#include "synthLib/os.h"
+
+const std::vector<PluginEditorState::Skin> g_includedSkins =
+{
+ {"N2x", "n2xTrancy.json", ""},
+};
+
+PluginEditorState::PluginEditorState(AudioPluginAudioProcessor& _processor) : jucePluginEditorLib::PluginEditorState(_processor, _processor.getController(), g_includedSkins)
+{
+ loadDefaultSkin();
+}
+
+void PluginEditorState::initContextMenu(juce::PopupMenu& _menu)
+{
+ jucePluginEditorLib::PluginEditorState::initContextMenu(_menu);
+
+ auto& p = m_processor;
+
+ const auto gain = static_cast<int>(std::roundf(p.getOutputGain()));
+
+ juce::PopupMenu gainMenu;
+
+ gainMenu.addItem("0 dB (default)", true, gain == 1, [&p] { p.setOutputGain(1); });
+ gainMenu.addItem("+6 dB", true, gain == 2, [&p] { p.setOutputGain(2); });
+ gainMenu.addItem("+12 dB", true, gain == 4, [&p] { p.setOutputGain(4); });
+
+ _menu.addSubMenu("Output Gain", gainMenu);
+}
+
+bool PluginEditorState::initAdvancedContextMenu(juce::PopupMenu& _menu, bool _enabled)
+{
+ jucePluginEditorLib::PluginEditorState::initAdvancedContextMenu(_menu, _enabled);
+
+ const auto percent = m_processor.getDspClockPercent();
+ const auto hz = m_processor.getDspClockHz();
+
+ juce::PopupMenu clockMenu;
+
+ auto makeEntry = [&](const int _percent)
+ {
+ const auto mhz = hz * _percent / 100 / 1000000;
+ std::stringstream ss;
+ ss << _percent << "% (" << mhz << " MHz)";
+ if(_percent == 100)
+ ss << " (Default)";
+ clockMenu.addItem(ss.str(), _enabled, percent == _percent, [this, _percent] { m_processor.setDspClockPercent(_percent); });
+ };
+
+ makeEntry(50);
+ makeEntry(75);
+ makeEntry(100);
+ makeEntry(125);
+ makeEntry(150);
+ makeEntry(200);
+
+ _menu.addSubMenu("DSP Clock", clockMenu);
+
+ return true;
+}
+
+jucePluginEditorLib::Editor* PluginEditorState::createEditor(const Skin& _skin)
+{
+ return new n2xJucePlugin::Editor(m_processor, m_parameterBinding, _skin.folder, _skin.jsonFilename);
+}
diff --git a/source/nord/n2x/n2xJucePlugin/n2xPluginEditorState.h b/source/nord/n2x/n2xJucePlugin/n2xPluginEditorState.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "jucePluginEditorLib/pluginEditorState.h"
+
+namespace juce
+{
+ class Component;
+}
+
+class AudioPluginAudioProcessor;
+
+class PluginEditorState : public jucePluginEditorLib::PluginEditorState
+{
+public:
+ explicit PluginEditorState(AudioPluginAudioProcessor& _processor);
+ void initContextMenu(juce::PopupMenu& _menu) override;
+ bool initAdvancedContextMenu(juce::PopupMenu& _menu, bool _enabled) override;
+private:
+ jucePluginEditorLib::Editor* createEditor(const Skin& _skin) override;
+};
diff --git a/source/nord/n2x/n2xJucePlugin/n2xPluginProcessor.cpp b/source/nord/n2x/n2xJucePlugin/n2xPluginProcessor.cpp
@@ -4,6 +4,7 @@
#include <juce_audio_devices/juce_audio_devices.h>
#include "n2xController.h"
+#include "n2xPluginEditorState.h"
#include "jucePluginLib/processor.h"
@@ -43,7 +44,7 @@ AudioPluginAudioProcessor::~AudioPluginAudioProcessor()
jucePluginEditorLib::PluginEditorState* AudioPluginAudioProcessor::createEditorState()
{
- return nullptr;
+ return new PluginEditorState(*this);
}
synthLib::Device* AudioPluginAudioProcessor::createDevice()
diff --git a/source/nord/n2x/n2xJucePlugin/n2xPluginProcessor.h b/source/nord/n2x/n2xJucePlugin/n2xPluginProcessor.h
@@ -11,10 +11,7 @@ public:
jucePluginEditorLib::PluginEditorState* createEditorState() override;
synthLib::Device* createDevice() override;
pluginLib::Controller* createController() override;
- bool hasEditor() const override
- {
- return false;
- }
+
private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AudioPluginAudioProcessor)
};
diff --git a/source/nord/n2x/n2xJucePlugin/skins/n2xTrancy/assets.cmake b/source/nord/n2x/n2xJucePlugin/skins/n2xTrancy/assets.cmake
@@ -0,0 +1,7 @@
+set(ASSETS_n2xTrancy
+ ${CMAKE_CURRENT_LIST_DIR}/background.png
+ ${CMAKE_CURRENT_LIST_DIR}/knob_big.png
+ ${CMAKE_CURRENT_LIST_DIR}/panel_1_easy_edit.png
+
+ ${CMAKE_CURRENT_LIST_DIR}/n2xTrancy.json
+)
diff --git a/source/nord/n2x/n2xJucePlugin/skins/n2xTrancy/background.png b/source/nord/n2x/n2xJucePlugin/skins/n2xTrancy/background.png
Binary files differ.
diff --git a/source/nord/n2x/n2xJucePlugin/skins/n2xTrancy/knob_big.png b/source/nord/n2x/n2xJucePlugin/skins/n2xTrancy/knob_big.png
Binary files differ.
diff --git a/source/nord/n2x/n2xJucePlugin/skins/n2xTrancy/n2xTrancy.json b/source/nord/n2x/n2xJucePlugin/skins/n2xTrancy/n2xTrancy.json
@@ -0,0 +1,19 @@
+{
+ "name" : "Root",
+ "root" : { "x" : "0", "y" : "0", "width" : "2638", "height" : "1301", "scale" : "0.5"},
+ "children" :
+ [
+ {"name":"bg","image":{"x":"0","y":"0","width":"2638","height":"1301","texture":"background"}},
+
+ {
+ "name" : "page_1_main",
+ "image" : { "x" : "571", "y" : "129", "width" : "1971", "height" : "1026", "texture" : "panel_1_easy_edit" },
+ "children" : [
+ { "name" : "OscLevel", "parameterAttachment" : { "parameter" : "Gain" }, "rotary" : { }, "spritesheet" : { "x" : "149", "y" : "244", "width" : "137", "height" : "137", "texture" : "knob_big", "tileSizeX" : "137", "tileSizeY" : "137" } },
+ { "name" : "SubLevel", "parameterAttachment" : { "parameter" : "Mix" }, "rotary" : { }, "spritesheet" : { "x" : "397", "y" : "244", "width" : "137", "height" : "137", "texture" : "knob_big", "tileSizeX" : "137", "tileSizeY" : "137" } },
+ { "name" : "Cutoff", "parameterAttachment" : { "parameter" : "Cutoff" }, "rotary" : { }, "spritesheet" : { "x" : "974", "y" : "244", "width" : "137", "height" : "137", "texture" : "knob_big", "tileSizeX" : "137", "tileSizeY" : "137" } },
+ { "name" : "Resonance", "parameterAttachment" : { "parameter" : "Resonance" }, "rotary" : { }, "spritesheet" : { "x" : "1219", "y" : "244", "width" : "137", "height" : "137", "texture" : "knob_big", "tileSizeX" : "137", "tileSizeY" : "137" } },
+ ]
+ }
+ ]
+}
diff --git a/source/nord/n2x/n2xJucePlugin/skins/n2xTrancy/panel_1_easy_edit.png b/source/nord/n2x/n2xJucePlugin/skins/n2xTrancy/panel_1_easy_edit.png
Binary files differ.
diff --git a/source/xtJucePlugin/PluginEditorState.h b/source/xtJucePlugin/PluginEditorState.h
@@ -1,7 +1,5 @@
#pragma once
-#include <functional>
-
#include "jucePluginEditorLib/pluginEditorState.h"
namespace juce