| @@ -1 +1 @@ | |||
| Subproject commit e06cb84757bc45c6e682d4e228c46e3d3d0f432e | |||
| Subproject commit b9dcf5ca9f18801d1411525d3672628c08b84871 | |||
| @@ -0,0 +1,35 @@ | |||
| /* | |||
| * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | |||
| * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU Lesser General Public License for more details. | |||
| * | |||
| * For a full copy of the license see the LICENSE file. | |||
| */ | |||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_NAME "Parameters" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_SYNTH 0 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||
| #define DISTRHO_PLUGIN_WANT_LATENCY 0 | |||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 0 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 0 | |||
| #define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | |||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/examples/Parameters" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -0,0 +1,224 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| * permission notice appear in all copies. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
| * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
| * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| */ | |||
| #include "DistrhoPlugin.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| /** | |||
| Simple plugin to demonstrate parameter usage (including UI). | |||
| The plugin will be treated as an effect, but it will not change the host audio. | |||
| */ | |||
| class ExamplePluginParameters : public Plugin | |||
| { | |||
| public: | |||
| ExamplePluginParameters() | |||
| : Plugin(9, 0, 0) // 9 parameters, 0 programs, 0 states | |||
| { | |||
| /** | |||
| Initialize all our parameters to their defaults. | |||
| In this example all parameters have 0 as default, so we can simply zero them. | |||
| */ | |||
| std::memset(fParamGrid, 0, sizeof(float)*9); | |||
| } | |||
| protected: | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Information */ | |||
| /** | |||
| Get the plugin label. | |||
| A plugin label follows the same rules as Parameter::symbol, with the exception that it can start with numbers. | |||
| */ | |||
| const char* d_getLabel() const override | |||
| { | |||
| return "parameters"; | |||
| } | |||
| /** | |||
| Get the plugin author/maker. | |||
| */ | |||
| const char* d_getMaker() const override | |||
| { | |||
| return "DISTRHO"; | |||
| } | |||
| /** | |||
| Get the plugin license name (a single line of text). | |||
| */ | |||
| const char* d_getLicense() const override | |||
| { | |||
| return "ISC"; | |||
| } | |||
| /** | |||
| Get the plugin version, in hexadecimal. | |||
| TODO format to be defined | |||
| */ | |||
| uint32_t d_getVersion() const override | |||
| { | |||
| return 0x1000; | |||
| } | |||
| /** | |||
| Get the plugin unique Id. | |||
| This value is used by LADSPA, DSSI and VST plugin formats. | |||
| */ | |||
| int64_t d_getUniqueId() const override | |||
| { | |||
| return d_cconst('d', 'P', 'r', 'm'); | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Init */ | |||
| /** | |||
| Initialize the parameter @a index. | |||
| This function will be called once, shortly after the plugin is created. | |||
| */ | |||
| void d_initParameter(uint32_t index, Parameter& parameter) override | |||
| { | |||
| /** | |||
| All parameters in this plugin are similar except for name. | |||
| As such, we initialize the common details first, then set the unique name later. | |||
| */ | |||
| /** | |||
| Changing parameters does not cause any realtime-unsafe operations, so we can mark them as automable. | |||
| Also set as boolean because they work are on/off switches. | |||
| */ | |||
| parameter.hints = kParameterIsAutomable|kParameterIsBoolean; | |||
| /** | |||
| Minimum 0 (off), maximum 1 (on). | |||
| Default is off. | |||
| */ | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| parameter.ranges.def = 0.0f; | |||
| /** | |||
| Set the (unique) parameter name. | |||
| @see fParamGrid | |||
| */ | |||
| switch (index) | |||
| { | |||
| case 0: | |||
| parameter.name = "top-left"; | |||
| break; | |||
| case 1: | |||
| parameter.name = "top-center"; | |||
| break; | |||
| case 2: | |||
| parameter.name = "top-right"; | |||
| break; | |||
| case 3: | |||
| parameter.name = "middle-left"; | |||
| break; | |||
| case 4: | |||
| parameter.name = "middle-center"; | |||
| break; | |||
| case 5: | |||
| parameter.name = "middle-right"; | |||
| break; | |||
| case 6: | |||
| parameter.name = "bottom-left"; | |||
| break; | |||
| case 7: | |||
| parameter.name = "bottom-center"; | |||
| break; | |||
| case 8: | |||
| parameter.name = "bottom-right"; | |||
| break; | |||
| } | |||
| /** | |||
| Our parameter names are unique valid symbols, so we can just re-use them. | |||
| */ | |||
| parameter.symbol = parameter.name; | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Internal data */ | |||
| /** | |||
| Get the current value of a parameter. | |||
| */ | |||
| float d_getParameterValue(uint32_t index) const override | |||
| { | |||
| return fParamGrid[index]; | |||
| } | |||
| /** | |||
| Change a parameter value. | |||
| */ | |||
| void d_setParameterValue(uint32_t index, float value) override | |||
| { | |||
| fParamGrid[index] = value; | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Process */ | |||
| /** | |||
| Run/process function for plugins without MIDI input. | |||
| */ | |||
| void d_run(const float** inputs, float** outputs, uint32_t frames) override | |||
| { | |||
| /** | |||
| This plugin does nothing, it just demonstrates parameter usage. | |||
| So here we directly copy inputs over outputs, leaving the audio untouched. | |||
| We need to be careful in case the host re-uses the same buffer for both ins and outs. | |||
| */ | |||
| if (outputs[0] != inputs[0]) | |||
| std::memcpy(outputs[0], inputs[0], sizeof(float)*frames); | |||
| if (outputs[1] != inputs[1]) | |||
| std::memcpy(outputs[1], inputs[1], sizeof(float)*frames); | |||
| } | |||
| // ------------------------------------------------------------------------------------------------------- | |||
| private: | |||
| /** | |||
| Our parameters are used to display a 3x3 grid like this: | |||
| 0 1 2 | |||
| 3 4 5 | |||
| 6 7 8 | |||
| The index matches its grid position. | |||
| */ | |||
| float fParamGrid[9]; | |||
| /** | |||
| Set our plugin class as non-copyable and add a leak detector just in case. | |||
| */ | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ExamplePluginParameters) | |||
| }; | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * Plugin entry point, called by DPF to create a new plugin instance. */ | |||
| Plugin* createPlugin() | |||
| { | |||
| return new ExamplePluginParameters(); | |||
| } | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -0,0 +1,222 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| * permission notice appear in all copies. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
| * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
| * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| */ | |||
| #include "DistrhoUI.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| /** | |||
| For simplicity this UI will be of constant size. | |||
| */ | |||
| static const int kUIWidth = 512; | |||
| static const int kUIHeight = 512; | |||
| /** | |||
| We need the rectangle class from DGL. | |||
| */ | |||
| using DGL::Rectangle; | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| class ExampleUIParameters : public UI | |||
| { | |||
| public: | |||
| ExampleUIParameters() | |||
| : UI() | |||
| { | |||
| /** | |||
| Initialize all our parameters to their defaults. | |||
| In this example all default values are false, so we can simply zero them. | |||
| */ | |||
| std::memset(fParamGrid, 0, sizeof(bool)*9); | |||
| } | |||
| protected: | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Init */ | |||
| /** | |||
| Set the initial UI size. | |||
| This function will be called once, shortly after the UI is created. | |||
| */ | |||
| void d_initSize(uint& width, uint& height) | |||
| { | |||
| width = kUIWidth; | |||
| height = kUIHeight; | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * DSP/Plugin Callbacks */ | |||
| /** | |||
| A parameter has changed on the plugin side. | |||
| This is called by the host to inform the UI about parameter changes. | |||
| */ | |||
| void d_parameterChanged(uint32_t index, float value) override | |||
| { | |||
| // update our grid state to match the plugin side | |||
| fParamGrid[index] = (value > 0.5f); | |||
| // trigger repaint | |||
| repaint(); | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Widget Callbacks */ | |||
| /** | |||
| The OpenGL drawing function. | |||
| This UI will draw a 3x3 grid, with on/off states according to plugin parameters. | |||
| */ | |||
| void onDisplay() override | |||
| { | |||
| Rectangle<int> r; | |||
| r.setWidth(kUIWidth/3 - 6); | |||
| r.setHeight(kUIHeight/3 - 6); | |||
| // draw left, center and right columns | |||
| for (int i=0; i<3; ++i) | |||
| { | |||
| r.setX(3 + i*kUIWidth/3); | |||
| // top | |||
| r.setY(3); | |||
| if (fParamGrid[0+i]) | |||
| glColor3f(0.8f, 0.5f, 0.3f); | |||
| else | |||
| glColor3f(0.3f, 0.5f, 0.8f); | |||
| r.draw(); | |||
| // middle | |||
| r.setY(3 + kUIHeight/3); | |||
| if (fParamGrid[3+i]) | |||
| glColor3f(0.8f, 0.5f, 0.3f); | |||
| else | |||
| glColor3f(0.3f, 0.5f, 0.8f); | |||
| r.draw(); | |||
| // bottom | |||
| r.setY(3 + kUIHeight*2/3); | |||
| if (fParamGrid[6+i]) | |||
| glColor3f(0.8f, 0.5f, 0.3f); | |||
| else | |||
| glColor3f(0.3f, 0.5f, 0.8f); | |||
| r.draw(); | |||
| } | |||
| } | |||
| /** | |||
| Mouse press event. | |||
| This UI will de/activate blocks when you click them and reports it as a parameter change to the plugin. | |||
| */ | |||
| bool onMouse(const MouseEvent& ev) override | |||
| { | |||
| // Test for left-clicked + pressed first. | |||
| if (ev.button != 1 || ! ev.press) | |||
| return false; | |||
| Rectangle<int> r; | |||
| r.setWidth(kUIWidth/3 - 6); | |||
| r.setHeight(kUIHeight/3 - 6); | |||
| // handle left, center and right columns | |||
| for (int i=0; i<3; ++i) | |||
| { | |||
| r.setX(3 + i*kUIWidth/3); | |||
| // top | |||
| r.setY(3); | |||
| if (r.contains(ev.pos)) | |||
| { | |||
| // parameter index that this block applies to | |||
| const uint32_t index = 0+i; | |||
| // invert block state | |||
| fParamGrid[index] = !fParamGrid[index]; | |||
| // report change to host (and thus plugin) | |||
| d_setParameterValue(index, fParamGrid[index] ? 1.0f : 0.0f); | |||
| // trigger repaint | |||
| repaint(); | |||
| break; | |||
| } | |||
| // middle | |||
| r.setY(3 + kUIHeight/3); | |||
| if (r.contains(ev.pos)) | |||
| { | |||
| // same as before | |||
| const uint32_t index = 3+i; | |||
| fParamGrid[index] = !fParamGrid[index]; | |||
| d_setParameterValue(index, fParamGrid[index] ? 1.0f : 0.0f); | |||
| repaint(); | |||
| break; | |||
| } | |||
| // bottom | |||
| r.setY(3 + kUIHeight*2/3); | |||
| if (r.contains(ev.pos)) | |||
| { | |||
| // same as before | |||
| const uint32_t index = 6+i; | |||
| fParamGrid[index] = !fParamGrid[index]; | |||
| d_setParameterValue(index, fParamGrid[index] ? 1.0f : 0.0f); | |||
| repaint(); | |||
| break; | |||
| } | |||
| } | |||
| return true; | |||
| } | |||
| // ------------------------------------------------------------------------------------------------------- | |||
| private: | |||
| /** | |||
| Our parameters used to display the grid on/off states. | |||
| They match the parameters on the plugin side, but here we define them as booleans. | |||
| */ | |||
| bool fParamGrid[9]; | |||
| /** | |||
| Set our UI class as non-copyable and add a leak detector just in case. | |||
| */ | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ExampleUIParameters) | |||
| }; | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * UI entry point, called by DPF to create a new UI instance. */ | |||
| UI* createUI() | |||
| { | |||
| return new ExampleUIParameters(); | |||
| } | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -0,0 +1,35 @@ | |||
| #!/usr/bin/make -f | |||
| # Makefile for DISTRHO Plugins # | |||
| # ---------------------------- # | |||
| # Created by falkTX | |||
| # | |||
| # -------------------------------------------------------------- | |||
| # Project name, used for binaries | |||
| NAME = d_parameters | |||
| # -------------------------------------------------------------- | |||
| # Files to build | |||
| OBJS_DSP = \ | |||
| ExamplePluginParameters.cpp.o | |||
| OBJS_UI = \ | |||
| ExampleUIParameters.cpp.o | |||
| # -------------------------------------------------------------- | |||
| # Do some magic | |||
| include ../Makefile.mk | |||
| # -------------------------------------------------------------- | |||
| # Enable all possible plugin types | |||
| ifeq ($(LINUX),true) | |||
| all: jack ladspa dssi lv2_sep vst | |||
| else | |||
| all: ladspa dssi lv2_sep vst | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| @@ -0,0 +1,9 @@ | |||
| # Parameters example | |||
| This example will show how parameters work in DPF.<br/> | |||
| The plugin will not do any audio processing.<br/> | |||
| In this example the UI will display a 3x3 grid of colors which can be changed or automated by the host.<br/> | |||
| There are 2 colors: blue and orange. Blue means off, orange means on.<br/> | |||
| When a grid block is clicked its color will change and the host will receive a parameter change.<br/> | |||
| When the host changes a plugin parameter the UI will update accordingly.<br/> | |||