| @@ -1,40 +0,0 @@ | |||
| /* (Auto-generated binary data file). */ | |||
| #ifndef BINARY_DISTRHOARTWORK3BANDEQ_HPP | |||
| #define BINARY_DISTRHOARTWORK3BANDEQ_HPP | |||
| namespace DistrhoArtwork3BandEQ | |||
| { | |||
| extern const char* aboutData; | |||
| const unsigned int aboutDataSize = 172710; | |||
| const unsigned int aboutWidth = 303; | |||
| const unsigned int aboutHeight = 190; | |||
| extern const char* aboutButtonHoverData; | |||
| const unsigned int aboutButtonHoverDataSize = 5888; | |||
| const unsigned int aboutButtonHoverWidth = 92; | |||
| const unsigned int aboutButtonHoverHeight = 16; | |||
| extern const char* aboutButtonNormalData; | |||
| const unsigned int aboutButtonNormalDataSize = 5888; | |||
| const unsigned int aboutButtonNormalWidth = 92; | |||
| const unsigned int aboutButtonNormalHeight = 16; | |||
| extern const char* backgroundData; | |||
| const unsigned int backgroundDataSize = 437472; | |||
| const unsigned int backgroundWidth = 392; | |||
| const unsigned int backgroundHeight = 372; | |||
| extern const char* knobData; | |||
| const unsigned int knobDataSize = 15376; | |||
| const unsigned int knobWidth = 62; | |||
| const unsigned int knobHeight = 62; | |||
| extern const char* sliderData; | |||
| const unsigned int sliderDataSize = 6000; | |||
| const unsigned int sliderWidth = 50; | |||
| const unsigned int sliderHeight = 30; | |||
| } | |||
| #endif // BINARY_DISTRHOARTWORK3BANDEQ_HPP | |||
| @@ -1,258 +0,0 @@ | |||
| /* | |||
| * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | |||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||
| * 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. | |||
| */ | |||
| #include "DistrhoPlugin3BandEQ.hpp" | |||
| #include <cmath> | |||
| static const float kAMP_DB = 8.656170245f; | |||
| static const float kDC_ADD = 1e-30f; | |||
| static const float kPI = 3.141592654f; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoPlugin3BandEQ::DistrhoPlugin3BandEQ() | |||
| : Plugin(paramCount, 1, 0) // 1 program, 0 states | |||
| { | |||
| // set default values | |||
| d_setProgram(0); | |||
| // reset | |||
| d_deactivate(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Init | |||
| void DistrhoPlugin3BandEQ::d_initParameter(uint32_t index, Parameter& parameter) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramLow: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Low"; | |||
| parameter.symbol = "low"; | |||
| parameter.unit = "dB"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -24.0f; | |||
| parameter.ranges.max = 24.0f; | |||
| break; | |||
| case paramMid: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Mid"; | |||
| parameter.symbol = "mid"; | |||
| parameter.unit = "dB"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -24.0f; | |||
| parameter.ranges.max = 24.0f; | |||
| break; | |||
| case paramHigh: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "High"; | |||
| parameter.symbol = "high"; | |||
| parameter.unit = "dB"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -24.0f; | |||
| parameter.ranges.max = 24.0f; | |||
| break; | |||
| case paramMaster: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Master"; | |||
| parameter.symbol = "master"; | |||
| parameter.unit = "dB"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -24.0f; | |||
| parameter.ranges.max = 24.0f; | |||
| break; | |||
| case paramLowMidFreq: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Low-Mid Freq"; | |||
| parameter.symbol = "low_mid"; | |||
| parameter.unit = "Hz"; | |||
| parameter.ranges.def = 440.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1000.0f; | |||
| break; | |||
| case paramMidHighFreq: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Mid-High Freq"; | |||
| parameter.symbol = "mid_high"; | |||
| parameter.unit = "Hz"; | |||
| parameter.ranges.def = 1000.0f; | |||
| parameter.ranges.min = 1000.0f; | |||
| parameter.ranges.max = 20000.0f; | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoPlugin3BandEQ::d_initProgramName(uint32_t index, d_string& programName) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| programName = "Default"; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Internal data | |||
| float DistrhoPlugin3BandEQ::d_getParameterValue(uint32_t index) const | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramLow: | |||
| return fLow; | |||
| case paramMid: | |||
| return fMid; | |||
| case paramHigh: | |||
| return fHigh; | |||
| case paramMaster: | |||
| return fMaster; | |||
| case paramLowMidFreq: | |||
| return fLowMidFreq; | |||
| case paramMidHighFreq: | |||
| return fMidHighFreq; | |||
| default: | |||
| return 0.0f; | |||
| } | |||
| } | |||
| void DistrhoPlugin3BandEQ::d_setParameterValue(uint32_t index, float value) | |||
| { | |||
| if (d_getSampleRate() <= 0.0) | |||
| return; | |||
| switch (index) | |||
| { | |||
| case paramLow: | |||
| fLow = value; | |||
| lowVol = std::exp( (fLow/48.0f) * 48.0f / kAMP_DB); | |||
| break; | |||
| case paramMid: | |||
| fMid = value; | |||
| midVol = std::exp( (fMid/48.0f) * 48.0f / kAMP_DB); | |||
| break; | |||
| case paramHigh: | |||
| fHigh = value; | |||
| highVol = std::exp( (fHigh/48.0f) * 48.0f / kAMP_DB); | |||
| break; | |||
| case paramMaster: | |||
| fMaster = value; | |||
| outVol = std::exp( (fMaster/48.0f) * 48.0f / kAMP_DB); | |||
| break; | |||
| case paramLowMidFreq: | |||
| fLowMidFreq = std::fmin(value, fMidHighFreq); | |||
| freqLP = fLowMidFreq; | |||
| xLP = std::exp(-2.0f * kPI * freqLP / (float)d_getSampleRate()); | |||
| a0LP = 1.0f - xLP; | |||
| b1LP = -xLP; | |||
| break; | |||
| case paramMidHighFreq: | |||
| fMidHighFreq = std::fmax(value, fLowMidFreq); | |||
| freqHP = fMidHighFreq; | |||
| xHP = std::exp(-2.0f * kPI * freqHP / (float)d_getSampleRate()); | |||
| a0HP = 1.0f - xHP; | |||
| b1HP = -xHP; | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoPlugin3BandEQ::d_setProgram(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| fLow = 0.0f; | |||
| fMid = 0.0f; | |||
| fHigh = 0.0f; | |||
| fMaster = 0.0f; | |||
| fLowMidFreq = 220.0f; | |||
| fMidHighFreq = 2000.0f; | |||
| // Internal stuff | |||
| lowVol = midVol = highVol = outVol = 1.0f; | |||
| freqLP = 200.0f; | |||
| freqHP = 2000.0f; | |||
| // reset filter values | |||
| d_activate(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Process | |||
| void DistrhoPlugin3BandEQ::d_activate() | |||
| { | |||
| const float sr = (float)d_getSampleRate(); | |||
| xLP = std::exp(-2.0f * kPI * freqLP / sr); | |||
| a0LP = 1.0f - xLP; | |||
| b1LP = -xLP; | |||
| xHP = std::exp(-2.0f * kPI * freqHP / sr); | |||
| a0HP = 1.0f - xHP; | |||
| b1HP = -xHP; | |||
| } | |||
| void DistrhoPlugin3BandEQ::d_deactivate() | |||
| { | |||
| out1LP = out2LP = out1HP = out2HP = 0.0f; | |||
| tmp1LP = tmp2LP = tmp1HP = tmp2HP = 0.0f; | |||
| } | |||
| void DistrhoPlugin3BandEQ::d_run(const float** inputs, float** outputs, uint32_t frames) | |||
| { | |||
| const float* in1 = inputs[0]; | |||
| const float* in2 = inputs[1]; | |||
| float* out1 = outputs[0]; | |||
| float* out2 = outputs[1]; | |||
| for (uint32_t i=0; i < frames; ++i) | |||
| { | |||
| tmp1LP = a0LP * in1[i] - b1LP * tmp1LP + kDC_ADD; | |||
| tmp2LP = a0LP * in2[i] - b1LP * tmp2LP + kDC_ADD; | |||
| out1LP = tmp1LP - kDC_ADD; | |||
| out2LP = tmp2LP - kDC_ADD; | |||
| tmp1HP = a0HP * in1[i] - b1HP * tmp1HP + kDC_ADD; | |||
| tmp2HP = a0HP * in2[i] - b1HP * tmp2HP + kDC_ADD; | |||
| out1HP = in1[i] - tmp1HP - kDC_ADD; | |||
| out2HP = in2[i] - tmp2HP - kDC_ADD; | |||
| out1[i] = (out1LP*lowVol + (in1[i] - out1LP - out1HP)*midVol + out1HP*highVol) * outVol; | |||
| out2[i] = (out2LP*lowVol + (in2[i] - out2LP - out2HP)*midVol + out2HP*highVol) * outVol; | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() | |||
| { | |||
| return new DistrhoPlugin3BandEQ(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,113 +0,0 @@ | |||
| /* | |||
| * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | |||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||
| * 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_3BANDEQ_HPP_INCLUDED | |||
| #define DISTRHO_PLUGIN_3BANDEQ_HPP_INCLUDED | |||
| #include "DistrhoPlugin.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoPlugin3BandEQ : public Plugin | |||
| { | |||
| public: | |||
| enum Parameters | |||
| { | |||
| paramLow = 0, | |||
| paramMid, | |||
| paramHigh, | |||
| paramMaster, | |||
| paramLowMidFreq, | |||
| paramMidHighFreq, | |||
| paramCount | |||
| }; | |||
| DistrhoPlugin3BandEQ(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| const char* d_getLabel() const noexcept override | |||
| { | |||
| return "3BandEQ"; | |||
| } | |||
| const char* d_getMaker() const noexcept override | |||
| { | |||
| return "DISTRHO"; | |||
| } | |||
| const char* d_getLicense() const noexcept override | |||
| { | |||
| return "LGPL"; | |||
| } | |||
| uint32_t d_getVersion() const noexcept override | |||
| { | |||
| return 0x1000; | |||
| } | |||
| long d_getUniqueId() const noexcept override | |||
| { | |||
| return d_cconst('D', '3', 'E', 'Q'); | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Init | |||
| void d_initParameter(uint32_t index, Parameter& parameter) override; | |||
| void d_initProgramName(uint32_t index, d_string& programName) override; | |||
| // ------------------------------------------------------------------- | |||
| // Internal data | |||
| float d_getParameterValue(uint32_t index) const override; | |||
| void d_setParameterValue(uint32_t index, float value) override; | |||
| void d_setProgram(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Process | |||
| void d_activate() override; | |||
| void d_deactivate() override; | |||
| void d_run(const float** inputs, float** outputs, uint32_t frames) override; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| float fLow, fMid, fHigh, fMaster, fLowMidFreq, fMidHighFreq; | |||
| float lowVol, midVol, highVol, outVol; | |||
| float freqLP, freqHP; | |||
| float xLP, a0LP, b1LP; | |||
| float xHP, a0HP, b1HP; | |||
| float out1LP, out2LP, out1HP, out2HP; | |||
| float tmp1LP, tmp2LP, tmp1HP, tmp2HP; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoPlugin3BandEQ) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_PLUGIN_3BANDEQ_HPP_INCLUDED | |||
| @@ -1,35 +0,0 @@ | |||
| /* | |||
| * 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 "3 Band EQ" | |||
| #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 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 0 | |||
| #define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | |||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/3BandEQ" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,201 +0,0 @@ | |||
| /* | |||
| * 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. | |||
| */ | |||
| #include "DistrhoPlugin3BandEQ.hpp" | |||
| #include "DistrhoUI3BandEQ.hpp" | |||
| using DGL::Point; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoUI3BandEQ::DistrhoUI3BandEQ() | |||
| : UI(), | |||
| fAboutWindow(this) | |||
| { | |||
| // background | |||
| fImgBackground = Image(DistrhoArtwork3BandEQ::backgroundData, DistrhoArtwork3BandEQ::backgroundWidth, DistrhoArtwork3BandEQ::backgroundHeight, GL_BGR); | |||
| // about | |||
| Image aboutImage(DistrhoArtwork3BandEQ::aboutData, DistrhoArtwork3BandEQ::aboutWidth, DistrhoArtwork3BandEQ::aboutHeight, GL_BGR); | |||
| fAboutWindow.setImage(aboutImage); | |||
| // sliders | |||
| Image sliderImage(DistrhoArtwork3BandEQ::sliderData, DistrhoArtwork3BandEQ::sliderWidth, DistrhoArtwork3BandEQ::sliderHeight); | |||
| Point<int> sliderPosStart(57, 43); | |||
| Point<int> sliderPosEnd(57, 43 + 160); | |||
| // slider Low | |||
| fSliderLow = new ImageSlider(this, sliderImage); | |||
| fSliderLow->setId(DistrhoPlugin3BandEQ::paramLow); | |||
| fSliderLow->setStartPos(sliderPosStart); | |||
| fSliderLow->setEndPos(sliderPosEnd); | |||
| fSliderLow->setRange(-24.0f, 24.0f); | |||
| fSliderLow->setCallback(this); | |||
| // slider Mid | |||
| sliderPosStart.setX(120); | |||
| sliderPosEnd.setX(120); | |||
| fSliderMid = new ImageSlider(*fSliderLow); | |||
| fSliderMid->setId(DistrhoPlugin3BandEQ::paramMid); | |||
| fSliderMid->setStartPos(sliderPosStart); | |||
| fSliderMid->setEndPos(sliderPosEnd); | |||
| // slider High | |||
| sliderPosStart.setX(183); | |||
| sliderPosEnd.setX(183); | |||
| fSliderHigh = new ImageSlider(*fSliderLow); | |||
| fSliderHigh->setId(DistrhoPlugin3BandEQ::paramHigh); | |||
| fSliderHigh->setStartPos(sliderPosStart); | |||
| fSliderHigh->setEndPos(sliderPosEnd); | |||
| // slider Master | |||
| sliderPosStart.setX(287); | |||
| sliderPosEnd.setX(287); | |||
| fSliderMaster = new ImageSlider(*fSliderLow); | |||
| fSliderMaster->setId(DistrhoPlugin3BandEQ::paramMaster); | |||
| fSliderMaster->setStartPos(sliderPosStart); | |||
| fSliderMaster->setEndPos(sliderPosEnd); | |||
| // knobs | |||
| Image knobImage(DistrhoArtwork3BandEQ::knobData, DistrhoArtwork3BandEQ::knobWidth, DistrhoArtwork3BandEQ::knobHeight); | |||
| // knob Low-Mid | |||
| fKnobLowMid = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPlugin3BandEQ::paramLowMidFreq); | |||
| fKnobLowMid->setAbsolutePos(65, 269); | |||
| fKnobLowMid->setRange(0.0f, 1000.0f); | |||
| fKnobLowMid->setDefault(440.0f); | |||
| fKnobLowMid->setRotationAngle(270); | |||
| fKnobLowMid->setCallback(this); | |||
| // knob Mid-High | |||
| fKnobMidHigh = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPlugin3BandEQ::paramMidHighFreq); | |||
| fKnobMidHigh->setAbsolutePos(159, 269); | |||
| fKnobMidHigh->setRange(1000.0f, 20000.0f); | |||
| fKnobMidHigh->setDefault(1000.0f); | |||
| fKnobMidHigh->setRotationAngle(270); | |||
| fKnobMidHigh->setCallback(this); | |||
| // about button | |||
| Image aboutImageNormal(DistrhoArtwork3BandEQ::aboutButtonNormalData, DistrhoArtwork3BandEQ::aboutButtonNormalWidth, DistrhoArtwork3BandEQ::aboutButtonNormalHeight); | |||
| Image aboutImageHover(DistrhoArtwork3BandEQ::aboutButtonHoverData, DistrhoArtwork3BandEQ::aboutButtonHoverWidth, DistrhoArtwork3BandEQ::aboutButtonHoverHeight); | |||
| fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); | |||
| fButtonAbout->setAbsolutePos(264, 300); | |||
| fButtonAbout->setCallback(this); | |||
| // set default values | |||
| d_programChanged(0); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void DistrhoUI3BandEQ::d_parameterChanged(uint32_t index, float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case DistrhoPlugin3BandEQ::paramLow: | |||
| fSliderLow->setValue(value); | |||
| break; | |||
| case DistrhoPlugin3BandEQ::paramMid: | |||
| fSliderMid->setValue(value); | |||
| break; | |||
| case DistrhoPlugin3BandEQ::paramHigh: | |||
| fSliderHigh->setValue(value); | |||
| break; | |||
| case DistrhoPlugin3BandEQ::paramMaster: | |||
| fSliderMaster->setValue(value); | |||
| break; | |||
| case DistrhoPlugin3BandEQ::paramLowMidFreq: | |||
| fKnobLowMid->setValue(value); | |||
| break; | |||
| case DistrhoPlugin3BandEQ::paramMidHighFreq: | |||
| fKnobMidHigh->setValue(value); | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoUI3BandEQ::d_programChanged(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| fSliderLow->setValue(0.0f); | |||
| fSliderMid->setValue(0.0f); | |||
| fSliderHigh->setValue(0.0f); | |||
| fSliderMaster->setValue(0.0f); | |||
| fKnobLowMid->setValue(220.0f); | |||
| fKnobMidHigh->setValue(2000.0f); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void DistrhoUI3BandEQ::imageButtonClicked(ImageButton* button, int) | |||
| { | |||
| if (button != fButtonAbout) | |||
| return; | |||
| fAboutWindow.exec(); | |||
| } | |||
| void DistrhoUI3BandEQ::imageKnobDragStarted(ImageKnob* knob) | |||
| { | |||
| d_editParameter(knob->getId(), true); | |||
| } | |||
| void DistrhoUI3BandEQ::imageKnobDragFinished(ImageKnob* knob) | |||
| { | |||
| d_editParameter(knob->getId(), false); | |||
| } | |||
| void DistrhoUI3BandEQ::imageKnobValueChanged(ImageKnob* knob, float value) | |||
| { | |||
| d_setParameterValue(knob->getId(), value); | |||
| } | |||
| void DistrhoUI3BandEQ::imageSliderDragStarted(ImageSlider* slider) | |||
| { | |||
| d_editParameter(slider->getId(), true); | |||
| } | |||
| void DistrhoUI3BandEQ::imageSliderDragFinished(ImageSlider* slider) | |||
| { | |||
| d_editParameter(slider->getId(), false); | |||
| } | |||
| void DistrhoUI3BandEQ::imageSliderValueChanged(ImageSlider* slider, float value) | |||
| { | |||
| d_setParameterValue(slider->getId(), value); | |||
| } | |||
| void DistrhoUI3BandEQ::onDisplay() | |||
| { | |||
| fImgBackground.draw(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| UI* createUI() | |||
| { | |||
| return new DistrhoUI3BandEQ(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,95 +0,0 @@ | |||
| /* | |||
| * 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_UI_3BANDEQ_HPP_INCLUDED | |||
| #define DISTRHO_UI_3BANDEQ_HPP_INCLUDED | |||
| #include "DistrhoUI.hpp" | |||
| #include "ImageAboutWindow.hpp" | |||
| #include "ImageButton.hpp" | |||
| #include "ImageKnob.hpp" | |||
| #include "ImageSlider.hpp" | |||
| #include "DistrhoArtwork3BandEQ.hpp" | |||
| using DGL::Image; | |||
| using DGL::ImageAboutWindow; | |||
| using DGL::ImageButton; | |||
| using DGL::ImageKnob; | |||
| using DGL::ImageSlider; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoUI3BandEQ : public UI, | |||
| public ImageButton::Callback, | |||
| public ImageKnob::Callback, | |||
| public ImageSlider::Callback | |||
| { | |||
| public: | |||
| DistrhoUI3BandEQ(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| uint d_getWidth() const noexcept override | |||
| { | |||
| return DistrhoArtwork3BandEQ::backgroundWidth; | |||
| } | |||
| uint d_getHeight() const noexcept override | |||
| { | |||
| return DistrhoArtwork3BandEQ::backgroundHeight; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void d_parameterChanged(uint32_t index, float value) override; | |||
| void d_programChanged(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void imageButtonClicked(ImageButton* button, int) override; | |||
| void imageKnobDragStarted(ImageKnob* knob) override; | |||
| void imageKnobDragFinished(ImageKnob* knob) override; | |||
| void imageKnobValueChanged(ImageKnob* knob, float value) override; | |||
| void imageSliderDragStarted(ImageSlider* slider) override; | |||
| void imageSliderDragFinished(ImageSlider* slider) override; | |||
| void imageSliderValueChanged(ImageSlider* slider, float value) override; | |||
| void onDisplay() override; | |||
| private: | |||
| Image fImgBackground; | |||
| ImageAboutWindow fAboutWindow; | |||
| ScopedPointer<ImageButton> fButtonAbout; | |||
| ScopedPointer<ImageKnob> fKnobLowMid, fKnobMidHigh; | |||
| ScopedPointer<ImageSlider> fSliderLow, fSliderMid, fSliderHigh, fSliderMaster; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUI3BandEQ) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_UI_3BANDEQ_HPP_INCLUDED | |||
| @@ -1,40 +0,0 @@ | |||
| /* (Auto-generated binary data file). */ | |||
| #ifndef BINARY_DISTRHOARTWORK3BANDSPLITTER_HPP | |||
| #define BINARY_DISTRHOARTWORK3BANDSPLITTER_HPP | |||
| namespace DistrhoArtwork3BandSplitter | |||
| { | |||
| extern const char* aboutData; | |||
| const unsigned int aboutDataSize = 172710; | |||
| const unsigned int aboutWidth = 303; | |||
| const unsigned int aboutHeight = 190; | |||
| extern const char* aboutButtonHoverData; | |||
| const unsigned int aboutButtonHoverDataSize = 5888; | |||
| const unsigned int aboutButtonHoverWidth = 92; | |||
| const unsigned int aboutButtonHoverHeight = 16; | |||
| extern const char* aboutButtonNormalData; | |||
| const unsigned int aboutButtonNormalDataSize = 5888; | |||
| const unsigned int aboutButtonNormalWidth = 92; | |||
| const unsigned int aboutButtonNormalHeight = 16; | |||
| extern const char* backgroundData; | |||
| const unsigned int backgroundDataSize = 437472; | |||
| const unsigned int backgroundWidth = 392; | |||
| const unsigned int backgroundHeight = 372; | |||
| extern const char* knobData; | |||
| const unsigned int knobDataSize = 15376; | |||
| const unsigned int knobWidth = 62; | |||
| const unsigned int knobHeight = 62; | |||
| extern const char* sliderData; | |||
| const unsigned int sliderDataSize = 6000; | |||
| const unsigned int sliderWidth = 50; | |||
| const unsigned int sliderHeight = 30; | |||
| } | |||
| #endif // BINARY_DISTRHOARTWORK3BANDSPLITTER_HPP | |||
| @@ -1,266 +0,0 @@ | |||
| /* | |||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | |||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||
| * 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. | |||
| */ | |||
| #include "DistrhoPlugin3BandSplitter.hpp" | |||
| #include <cmath> | |||
| static const float kAMP_DB = 8.656170245f; | |||
| static const float kDC_ADD = 1e-30f; | |||
| static const float kPI = 3.141592654f; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoPlugin3BandSplitter::DistrhoPlugin3BandSplitter() | |||
| : Plugin(paramCount, 1, 0) // 1 program, 0 states | |||
| { | |||
| // set default values | |||
| d_setProgram(0); | |||
| // reset | |||
| d_deactivate(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Init | |||
| void DistrhoPlugin3BandSplitter::d_initParameter(uint32_t index, Parameter& parameter) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramLow: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Low"; | |||
| parameter.symbol = "low"; | |||
| parameter.unit = "dB"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -24.0f; | |||
| parameter.ranges.max = 24.0f; | |||
| break; | |||
| case paramMid: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Mid"; | |||
| parameter.symbol = "mid"; | |||
| parameter.unit = "dB"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -24.0f; | |||
| parameter.ranges.max = 24.0f; | |||
| break; | |||
| case paramHigh: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "High"; | |||
| parameter.symbol = "high"; | |||
| parameter.unit = "dB"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -24.0f; | |||
| parameter.ranges.max = 24.0f; | |||
| break; | |||
| case paramMaster: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Master"; | |||
| parameter.symbol = "master"; | |||
| parameter.unit = "dB"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -24.0f; | |||
| parameter.ranges.max = 24.0f; | |||
| break; | |||
| case paramLowMidFreq: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Low-Mid Freq"; | |||
| parameter.symbol = "low_mid"; | |||
| parameter.unit = "Hz"; | |||
| parameter.ranges.def = 440.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1000.0f; | |||
| break; | |||
| case paramMidHighFreq: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Mid-High Freq"; | |||
| parameter.symbol = "mid_high"; | |||
| parameter.unit = "Hz"; | |||
| parameter.ranges.def = 1000.0f; | |||
| parameter.ranges.min = 1000.0f; | |||
| parameter.ranges.max = 20000.0f; | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoPlugin3BandSplitter::d_initProgramName(uint32_t index, d_string& programName) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| programName = "Default"; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Internal data | |||
| float DistrhoPlugin3BandSplitter::d_getParameterValue(uint32_t index) const | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramLow: | |||
| return fLow; | |||
| case paramMid: | |||
| return fMid; | |||
| case paramHigh: | |||
| return fHigh; | |||
| case paramMaster: | |||
| return fMaster; | |||
| case paramLowMidFreq: | |||
| return fLowMidFreq; | |||
| case paramMidHighFreq: | |||
| return fMidHighFreq; | |||
| default: | |||
| return 0.0f; | |||
| } | |||
| } | |||
| void DistrhoPlugin3BandSplitter::d_setParameterValue(uint32_t index, float value) | |||
| { | |||
| if (d_getSampleRate() <= 0.0) | |||
| return; | |||
| switch (index) | |||
| { | |||
| case paramLow: | |||
| fLow = value; | |||
| lowVol = std::exp( (fLow/48.0f) * 48.0f / kAMP_DB); | |||
| break; | |||
| case paramMid: | |||
| fMid = value; | |||
| midVol = std::exp( (fMid/48.0f) * 48.0f / kAMP_DB); | |||
| break; | |||
| case paramHigh: | |||
| fHigh = value; | |||
| highVol = std::exp( (fHigh/48.0f) * 48.0f / kAMP_DB); | |||
| break; | |||
| case paramMaster: | |||
| fMaster = value; | |||
| outVol = std::exp( (fMaster/48.0f) * 48.0f / kAMP_DB); | |||
| break; | |||
| case paramLowMidFreq: | |||
| fLowMidFreq = std::fmin(value, fMidHighFreq); | |||
| freqLP = fLowMidFreq; | |||
| xLP = std::exp(-2.0f * kPI * freqLP / (float)d_getSampleRate()); | |||
| a0LP = 1.0f - xLP; | |||
| b1LP = -xLP; | |||
| break; | |||
| case paramMidHighFreq: | |||
| fMidHighFreq = std::fmax(value, fLowMidFreq); | |||
| freqHP = fMidHighFreq; | |||
| xHP = std::exp(-2.0f * kPI * freqHP / (float)d_getSampleRate()); | |||
| a0HP = 1.0f - xHP; | |||
| b1HP = -xHP; | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoPlugin3BandSplitter::d_setProgram(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| fLow = 0.0f; | |||
| fMid = 0.0f; | |||
| fHigh = 0.0f; | |||
| fMaster = 0.0f; | |||
| fLowMidFreq = 220.0f; | |||
| fMidHighFreq = 2000.0f; | |||
| // Internal stuff | |||
| lowVol = midVol = highVol = outVol = 1.0f; | |||
| freqLP = 200.0f; | |||
| freqHP = 2000.0f; | |||
| // reset filter values | |||
| d_activate(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Process | |||
| void DistrhoPlugin3BandSplitter::d_activate() | |||
| { | |||
| const float sr = (float)d_getSampleRate(); | |||
| xLP = std::exp(-2.0f * kPI * freqLP / sr); | |||
| a0LP = 1.0f - xLP; | |||
| b1LP = -xLP; | |||
| xHP = std::exp(-2.0f * kPI * freqHP / sr); | |||
| a0HP = 1.0f - xHP; | |||
| b1HP = -xHP; | |||
| } | |||
| void DistrhoPlugin3BandSplitter::d_deactivate() | |||
| { | |||
| out1LP = out2LP = out1HP = out2HP = 0.0f; | |||
| tmp1LP = tmp2LP = tmp1HP = tmp2HP = 0.0f; | |||
| } | |||
| void DistrhoPlugin3BandSplitter::d_run(const float** inputs, float** outputs, uint32_t frames) | |||
| { | |||
| const float* in1 = inputs[0]; | |||
| const float* in2 = inputs[1]; | |||
| float* out1 = outputs[0]; | |||
| float* out2 = outputs[1]; | |||
| float* out3 = outputs[2]; | |||
| float* out4 = outputs[3]; | |||
| float* out5 = outputs[4]; | |||
| float* out6 = outputs[5]; | |||
| for (uint32_t i=0; i < frames; ++i) | |||
| { | |||
| tmp1LP = a0LP * in1[i] - b1LP * tmp1LP + kDC_ADD; | |||
| tmp2LP = a0LP * in2[i] - b1LP * tmp2LP + kDC_ADD; | |||
| out1LP = tmp1LP - kDC_ADD; | |||
| out2LP = tmp2LP - kDC_ADD; | |||
| tmp1HP = a0HP * in1[i] - b1HP * tmp1HP + kDC_ADD; | |||
| tmp2HP = a0HP * in2[i] - b1HP * tmp2HP + kDC_ADD; | |||
| out1HP = in1[i] - tmp1HP - kDC_ADD; | |||
| out2HP = in2[i] - tmp2HP - kDC_ADD; | |||
| out1[i] = out1LP*lowVol * outVol; | |||
| out2[i] = out2LP*lowVol * outVol; | |||
| out3[i] = (in1[i] - out1LP - out1HP)*midVol * outVol; | |||
| out4[i] = (in2[i] - out2LP - out2HP)*midVol * outVol; | |||
| out5[i] = out1HP*highVol * outVol; | |||
| out6[i] = out2HP*highVol * outVol; | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() | |||
| { | |||
| return new DistrhoPlugin3BandSplitter(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,113 +0,0 @@ | |||
| /* | |||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | |||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||
| * 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_3BANDSPLITTER_HPP_INCLUDED | |||
| #define DISTRHO_PLUGIN_3BANDSPLITTER_HPP_INCLUDED | |||
| #include "DistrhoPlugin.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoPlugin3BandSplitter : public Plugin | |||
| { | |||
| public: | |||
| enum Parameters | |||
| { | |||
| paramLow = 0, | |||
| paramMid, | |||
| paramHigh, | |||
| paramMaster, | |||
| paramLowMidFreq, | |||
| paramMidHighFreq, | |||
| paramCount | |||
| }; | |||
| DistrhoPlugin3BandSplitter(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| const char* d_getLabel() const noexcept override | |||
| { | |||
| return "3BandSplitter"; | |||
| } | |||
| const char* d_getMaker() const noexcept override | |||
| { | |||
| return "DISTRHO"; | |||
| } | |||
| const char* d_getLicense() const noexcept override | |||
| { | |||
| return "LGPL"; | |||
| } | |||
| uint32_t d_getVersion() const noexcept override | |||
| { | |||
| return 0x1000; | |||
| } | |||
| long d_getUniqueId() const noexcept override | |||
| { | |||
| return d_cconst('D', '3', 'E', 'S'); | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Init | |||
| void d_initParameter(uint32_t index, Parameter& parameter) override; | |||
| void d_initProgramName(uint32_t index, d_string& programName) override; | |||
| // ------------------------------------------------------------------- | |||
| // Internal data | |||
| float d_getParameterValue(uint32_t index) const override; | |||
| void d_setParameterValue(uint32_t index, float value) override; | |||
| void d_setProgram(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Process | |||
| void d_activate() override; | |||
| void d_deactivate() override; | |||
| void d_run(const float** inputs, float** outputs, uint32_t frames) override; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| float fLow, fMid, fHigh, fMaster, fLowMidFreq, fMidHighFreq; | |||
| float lowVol, midVol, highVol, outVol; | |||
| float freqLP, freqHP; | |||
| float xLP, a0LP, b1LP; | |||
| float xHP, a0HP, b1HP; | |||
| float out1LP, out2LP, out1HP, out2HP; | |||
| float tmp1LP, tmp2LP, tmp1HP, tmp2HP; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoPlugin3BandSplitter) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_PLUGIN_3BANDSPLITTER_HPP_INCLUDED | |||
| @@ -1,35 +0,0 @@ | |||
| /* | |||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter 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 "3 Band Splitter" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_SYNTH 0 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 6 | |||
| #define DISTRHO_PLUGIN_WANT_LATENCY 0 | |||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 0 | |||
| #define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | |||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/3BandSplitter" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,201 +0,0 @@ | |||
| /* | |||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter 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. | |||
| */ | |||
| #include "DistrhoPlugin3BandSplitter.hpp" | |||
| #include "DistrhoUI3BandSplitter.hpp" | |||
| using DGL::Point; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoUI3BandSplitter::DistrhoUI3BandSplitter() | |||
| : UI(), | |||
| fAboutWindow(this) | |||
| { | |||
| // background | |||
| fImgBackground = Image(DistrhoArtwork3BandSplitter::backgroundData, DistrhoArtwork3BandSplitter::backgroundWidth, DistrhoArtwork3BandSplitter::backgroundHeight, GL_BGR); | |||
| // about | |||
| Image aboutImage(DistrhoArtwork3BandSplitter::aboutData, DistrhoArtwork3BandSplitter::aboutWidth, DistrhoArtwork3BandSplitter::aboutHeight, GL_BGR); | |||
| fAboutWindow.setImage(aboutImage); | |||
| // sliders | |||
| Image sliderImage(DistrhoArtwork3BandSplitter::sliderData, DistrhoArtwork3BandSplitter::sliderWidth, DistrhoArtwork3BandSplitter::sliderHeight); | |||
| Point<int> sliderPosStart(57, 43); | |||
| Point<int> sliderPosEnd(57, 43 + 160); | |||
| // slider Low | |||
| fSliderLow = new ImageSlider(this, sliderImage); | |||
| fSliderLow->setId(DistrhoPlugin3BandSplitter::paramLow); | |||
| fSliderLow->setStartPos(sliderPosStart); | |||
| fSliderLow->setEndPos(sliderPosEnd); | |||
| fSliderLow->setRange(-24.0f, 24.0f); | |||
| fSliderLow->setCallback(this); | |||
| // slider Mid | |||
| sliderPosStart.setX(120); | |||
| sliderPosEnd.setX(120); | |||
| fSliderMid = new ImageSlider(*fSliderLow); | |||
| fSliderMid->setId(DistrhoPlugin3BandSplitter::paramMid); | |||
| fSliderMid->setStartPos(sliderPosStart); | |||
| fSliderMid->setEndPos(sliderPosEnd); | |||
| // slider High | |||
| sliderPosStart.setX(183); | |||
| sliderPosEnd.setX(183); | |||
| fSliderHigh = new ImageSlider(*fSliderLow); | |||
| fSliderHigh->setId(DistrhoPlugin3BandSplitter::paramHigh); | |||
| fSliderHigh->setStartPos(sliderPosStart); | |||
| fSliderHigh->setEndPos(sliderPosEnd); | |||
| // slider Master | |||
| sliderPosStart.setX(287); | |||
| sliderPosEnd.setX(287); | |||
| fSliderMaster = new ImageSlider(*fSliderLow); | |||
| fSliderMaster->setId(DistrhoPlugin3BandSplitter::paramMaster); | |||
| fSliderMaster->setStartPos(sliderPosStart); | |||
| fSliderMaster->setEndPos(sliderPosEnd); | |||
| // knobs | |||
| Image knobImage(DistrhoArtwork3BandSplitter::knobData, DistrhoArtwork3BandSplitter::knobWidth, DistrhoArtwork3BandSplitter::knobHeight); | |||
| // knob Low-Mid | |||
| fKnobLowMid = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPlugin3BandSplitter::paramLowMidFreq); | |||
| fKnobLowMid->setAbsolutePos(65, 269); | |||
| fKnobLowMid->setRange(0.0f, 1000.0f); | |||
| fKnobLowMid->setDefault(440.0f); | |||
| fKnobLowMid->setRotationAngle(270); | |||
| fKnobLowMid->setCallback(this); | |||
| // knob Mid-High | |||
| fKnobMidHigh = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPlugin3BandSplitter::paramMidHighFreq); | |||
| fKnobMidHigh->setAbsolutePos(159, 269); | |||
| fKnobMidHigh->setRange(1000.0f, 20000.0f); | |||
| fKnobMidHigh->setDefault(1000.0f); | |||
| fKnobMidHigh->setRotationAngle(270); | |||
| fKnobMidHigh->setCallback(this); | |||
| // about button | |||
| Image aboutImageNormal(DistrhoArtwork3BandSplitter::aboutButtonNormalData, DistrhoArtwork3BandSplitter::aboutButtonNormalWidth, DistrhoArtwork3BandSplitter::aboutButtonNormalHeight); | |||
| Image aboutImageHover(DistrhoArtwork3BandSplitter::aboutButtonHoverData, DistrhoArtwork3BandSplitter::aboutButtonHoverWidth, DistrhoArtwork3BandSplitter::aboutButtonHoverHeight); | |||
| fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); | |||
| fButtonAbout->setAbsolutePos(264, 300); | |||
| fButtonAbout->setCallback(this); | |||
| // set default values | |||
| d_programChanged(0); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void DistrhoUI3BandSplitter::d_parameterChanged(uint32_t index, float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case DistrhoPlugin3BandSplitter::paramLow: | |||
| fSliderLow->setValue(value); | |||
| break; | |||
| case DistrhoPlugin3BandSplitter::paramMid: | |||
| fSliderMid->setValue(value); | |||
| break; | |||
| case DistrhoPlugin3BandSplitter::paramHigh: | |||
| fSliderHigh->setValue(value); | |||
| break; | |||
| case DistrhoPlugin3BandSplitter::paramMaster: | |||
| fSliderMaster->setValue(value); | |||
| break; | |||
| case DistrhoPlugin3BandSplitter::paramLowMidFreq: | |||
| fKnobLowMid->setValue(value); | |||
| break; | |||
| case DistrhoPlugin3BandSplitter::paramMidHighFreq: | |||
| fKnobMidHigh->setValue(value); | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoUI3BandSplitter::d_programChanged(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| fSliderLow->setValue(0.0f); | |||
| fSliderMid->setValue(0.0f); | |||
| fSliderHigh->setValue(0.0f); | |||
| fSliderMaster->setValue(0.0f); | |||
| fKnobLowMid->setValue(220.0f); | |||
| fKnobMidHigh->setValue(2000.0f); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void DistrhoUI3BandSplitter::imageButtonClicked(ImageButton* button, int) | |||
| { | |||
| if (button != fButtonAbout) | |||
| return; | |||
| fAboutWindow.exec(); | |||
| } | |||
| void DistrhoUI3BandSplitter::imageKnobDragStarted(ImageKnob* knob) | |||
| { | |||
| d_editParameter(knob->getId(), true); | |||
| } | |||
| void DistrhoUI3BandSplitter::imageKnobDragFinished(ImageKnob* knob) | |||
| { | |||
| d_editParameter(knob->getId(), false); | |||
| } | |||
| void DistrhoUI3BandSplitter::imageKnobValueChanged(ImageKnob* knob, float value) | |||
| { | |||
| d_setParameterValue(knob->getId(), value); | |||
| } | |||
| void DistrhoUI3BandSplitter::imageSliderDragStarted(ImageSlider* slider) | |||
| { | |||
| d_editParameter(slider->getId(), true); | |||
| } | |||
| void DistrhoUI3BandSplitter::imageSliderDragFinished(ImageSlider* slider) | |||
| { | |||
| d_editParameter(slider->getId(), false); | |||
| } | |||
| void DistrhoUI3BandSplitter::imageSliderValueChanged(ImageSlider* slider, float value) | |||
| { | |||
| d_setParameterValue(slider->getId(), value); | |||
| } | |||
| void DistrhoUI3BandSplitter::onDisplay() | |||
| { | |||
| fImgBackground.draw(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| UI* createUI() | |||
| { | |||
| return new DistrhoUI3BandSplitter(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,95 +0,0 @@ | |||
| /* | |||
| * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter 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_UI_3BANDSPLITTER_HPP_INCLUDED | |||
| #define DISTRHO_UI_3BANDSPLITTER_HPP_INCLUDED | |||
| #include "DistrhoUI.hpp" | |||
| #include "ImageAboutWindow.hpp" | |||
| #include "ImageButton.hpp" | |||
| #include "ImageKnob.hpp" | |||
| #include "ImageSlider.hpp" | |||
| #include "DistrhoArtwork3BandSplitter.hpp" | |||
| using DGL::Image; | |||
| using DGL::ImageAboutWindow; | |||
| using DGL::ImageButton; | |||
| using DGL::ImageKnob; | |||
| using DGL::ImageSlider; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoUI3BandSplitter : public UI, | |||
| public ImageButton::Callback, | |||
| public ImageKnob::Callback, | |||
| public ImageSlider::Callback | |||
| { | |||
| public: | |||
| DistrhoUI3BandSplitter(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| uint d_getWidth() const noexcept override | |||
| { | |||
| return DistrhoArtwork3BandSplitter::backgroundWidth; | |||
| } | |||
| uint d_getHeight() const noexcept override | |||
| { | |||
| return DistrhoArtwork3BandSplitter::backgroundHeight; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void d_parameterChanged(uint32_t index, float value) override; | |||
| void d_programChanged(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void imageButtonClicked(ImageButton* button, int) override; | |||
| void imageKnobDragStarted(ImageKnob* knob) override; | |||
| void imageKnobDragFinished(ImageKnob* knob) override; | |||
| void imageKnobValueChanged(ImageKnob* knob, float value) override; | |||
| void imageSliderDragStarted(ImageSlider* slider) override; | |||
| void imageSliderDragFinished(ImageSlider* slider) override; | |||
| void imageSliderValueChanged(ImageSlider* slider, float value) override; | |||
| void onDisplay() override; | |||
| private: | |||
| Image fImgBackground; | |||
| ImageAboutWindow fAboutWindow; | |||
| ScopedPointer<ImageButton> fButtonAbout; | |||
| ScopedPointer<ImageKnob> fKnobLowMid, fKnobMidHigh; | |||
| ScopedPointer<ImageSlider> fSliderLow, fSliderMid, fSliderHigh, fSliderMaster; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUI3BandSplitter) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_UI_3BANDSPLITTER_HPP_INCLUDED | |||
| @@ -1,148 +0,0 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2014 Damien Zammit <damien@zamaudio.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. | |||
| */ | |||
| #ifndef DGL_IMAGE_TOGGLE_HPP_INCLUDED | |||
| #define DGL_IMAGE_TOGGLE_HPP_INCLUDED | |||
| #include "Image.hpp" | |||
| #include "Widget.hpp" | |||
| START_NAMESPACE_DGL | |||
| // ----------------------------------------------------------------------- | |||
| class ImageToggle : public Widget | |||
| { | |||
| public: | |||
| class Callback | |||
| { | |||
| public: | |||
| virtual ~Callback() {} | |||
| virtual void imageToggleClicked(ImageToggle* imageToggle, int button) = 0; | |||
| }; | |||
| ImageToggle(Window& parent, const Image& imageNormal, const Image& imageDown, int id = 0) | |||
| : Widget(parent), | |||
| fImageNormal(imageNormal), | |||
| fImageDown(imageDown), | |||
| fCurImage(&fImageNormal), | |||
| fId(id), | |||
| fCallback(nullptr) | |||
| { | |||
| DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); | |||
| setSize(fImageNormal.getSize()); | |||
| } | |||
| ImageToggle(Widget* widget, const Image& imageNormal, const Image& imageDown, int id = 0) | |||
| : Widget(widget->getParentWindow()), | |||
| fImageNormal(imageNormal), | |||
| fImageDown(imageDown), | |||
| fCurImage(&fImageNormal), | |||
| fId(id), | |||
| fCallback(nullptr) | |||
| { | |||
| DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); | |||
| setSize(fImageNormal.getSize()); | |||
| } | |||
| ImageToggle(const ImageToggle& imageToggle) | |||
| : Widget(imageToggle.getParentWindow()), | |||
| fImageNormal(imageToggle.fImageNormal), | |||
| fImageDown(imageToggle.fImageDown), | |||
| fCurImage(&fImageNormal), | |||
| fId(imageToggle.fId), | |||
| fCallback(imageToggle.fCallback) | |||
| { | |||
| DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); | |||
| setSize(fImageNormal.getSize()); | |||
| } | |||
| int getId() const noexcept | |||
| { | |||
| return fId; | |||
| } | |||
| void setId(int id) noexcept | |||
| { | |||
| fId = id; | |||
| } | |||
| float getValue() const noexcept | |||
| { | |||
| return (fCurImage == &fImageNormal) ? 0.0f : 1.0f; | |||
| } | |||
| void setValue(float value) noexcept | |||
| { | |||
| if (value == 1.0f) | |||
| fCurImage = &fImageDown; | |||
| else if (value == 0.0f) | |||
| fCurImage = &fImageNormal; | |||
| repaint(); | |||
| } | |||
| void setCallback(Callback* callback) noexcept | |||
| { | |||
| fCallback = callback; | |||
| } | |||
| protected: | |||
| void onDisplay() override | |||
| { | |||
| fCurImage->draw(); | |||
| } | |||
| bool onMouse(const MouseEvent& ev) override | |||
| { | |||
| if (! ev.press) | |||
| return false; | |||
| if (! contains(ev.pos)) | |||
| return false; | |||
| if (fCurImage != &fImageDown) | |||
| fCurImage = &fImageDown; | |||
| else if (fCurImage != &fImageNormal) | |||
| fCurImage = &fImageNormal; | |||
| repaint(); | |||
| if (fCallback != nullptr) | |||
| fCallback->imageToggleClicked(this, ev.button); | |||
| return true; | |||
| } | |||
| private: | |||
| Image fImageNormal; | |||
| Image fImageDown; | |||
| Image* fCurImage; | |||
| int fId; | |||
| Callback* fCallback; | |||
| DISTRHO_LEAK_DETECTOR(ImageToggle) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DGL | |||
| #endif // DGL_IMAGE_TOGGLE_HPP_INCLUDED | |||
| @@ -26,11 +26,6 @@ ifeq ($(HAVE_MF_DEPS),true) | |||
| ALL_C_FLAGS += -DWANT_MIDIFILE | |||
| endif | |||
| # ProjectM | |||
| ifeq ($(HAVE_PM_DEPS),true) | |||
| ALL_C_FLAGS += -DWANT_PROJECTM | |||
| endif | |||
| # ZynAddSubFX | |||
| ifeq ($(HAVE_ZYN_DEPS),true) | |||
| ALL_C_FLAGS += -DWANT_ZYNADDSUBFX | |||
| @@ -44,14 +39,6 @@ MF_CXX_FLAGS = $(BUILD_CXX_FLAGS) | |||
| MF_CXX_FLAGS += $(shell pkg-config --cflags smf) | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| # Flags for ProjectM | |||
| ifeq ($(HAVE_PM_DEPS),true) | |||
| PM_CXX_FLAGS = $(BUILD_CXX_FLAGS) | |||
| PM_CXX_FLAGS += $(shell pkg-config --cflags libprojectM) | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| # Flags for ZynAddSubFX | |||
| @@ -98,10 +85,7 @@ ifeq ($(HAVE_JUCE_UI),true) | |||
| # JUCE based plugins | |||
| OBJS += \ | |||
| juce-patchbay.cpp.o \ | |||
| vex-fx.cpp.o \ | |||
| vex-synth.cpp.o \ | |||
| vex-src.cpp.o | |||
| juce-patchbay.cpp.o | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| @@ -207,60 +191,6 @@ audio-file.cpp.o: audio-file.cpp audio-base.hpp $(CXXDEPS) | |||
| bigmeter.cpp.o: bigmeter.cpp $(CXXDEPS) ../CarlaNativeExtUI.hpp | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
| distrho-3bandeq.cpp.o: distrho-3bandeq.cpp 3bandeq/*.cpp 3bandeq/*.h 3bandeq/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -I3bandeq -DDISTRHO_NAMESPACE=DISTRHO_3BandEQ -c -o $@ | |||
| distrho-3bandsplitter.cpp.o: distrho-3bandsplitter.cpp 3bandsplitter/*.cpp 3bandsplitter/*.h 3bandsplitter/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -I3bandsplitter -DDISTRHO_NAMESPACE=DISTRHO_3BandSplitter -c -o $@ | |||
| distrho-nekobi.cpp.o: distrho-nekobi.cpp nekobi/*.cpp nekobi/*.h nekobi/*.hpp nekobi/nekobee-src/*.c nekobi/nekobee-src/*.h ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Inekobi -DDISTRHO_NAMESPACE=DISTRHO_Nekobi -c -o $@ | |||
| distrho-pingpongpan.cpp.o: distrho-pingpongpan.cpp pingpongpan/*.cpp pingpongpan/*.h pingpongpan/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Ipingpongpan -DDISTRHO_NAMESPACE=DISTRHO_PingPongPan -c -o $@ | |||
| distrho-prom.cpp.o: distrho-prom.cpp prom/*.cpp prom/*.h prom/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(PM_CXX_FLAGS) -I../dgl -Iprom -DDISTRHO_NAMESPACE=DISTRHO_ProM -c -o $@ | |||
| distrho-stereoenhancer.cpp.o: distrho-stereoenhancer.cpp stereoenhancer/*.cpp stereoenhancer/*.h stereoenhancer/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Istereoenhancer -DDISTRHO_NAMESPACE=DISTRHO_StereoEnhancer -c -o $@ | |||
| distrho-groovejuice.cpp.o: distrho-groovejuice.cpp groovejuice/*.cpp groovejuice/*.h groovejuice/*.hpp groovejuice/*.hxx ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Igroovejuice -DDISTRHO_NAMESPACE=DISTRHO_GrooveJuice -c -o $@ | |||
| distrho-powerjuice.cpp.o: distrho-powerjuice.cpp powerjuice/*.cpp powerjuice/*.h powerjuice/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Ipowerjuice -DDISTRHO_NAMESPACE=DISTRHO_PowerJuice -c -o $@ | |||
| distrho-segmentjuice.cpp.o: distrho-segmentjuice.cpp segmentjuice/*.cpp segmentjuice/*.h segmentjuice/*.hpp segmentjuice/*.hxx ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Isegmentjuice -DDISTRHO_NAMESPACE=DISTRHO_SegmentJuice -c -o $@ | |||
| distrho-vectorjuice.cpp.o: distrho-vectorjuice.cpp vectorjuice/*.cpp vectorjuice/*.h vectorjuice/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Ivectorjuice -DDISTRHO_NAMESPACE=DISTRHO_VectorJuice -c -o $@ | |||
| distrho-wobblejuice.cpp.o: distrho-wobblejuice.cpp wobblejuice/*.cpp wobblejuice/*.h wobblejuice/*.hpp wobblejuice/*.hxx ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Iwobblejuice -DDISTRHO_NAMESPACE=DISTRHO_WobbleJuice -c -o $@ | |||
| distrho-zamcomp.cpp.o: distrho-zamcomp.cpp zamcomp/*.cpp zamcomp/*.h zamcomp/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Izamcomp -DDISTRHO_NAMESPACE=DISTRHO_ZamComp -c -o $@ | |||
| distrho-zamcompx2.cpp.o: distrho-zamcompx2.cpp zamcompx2/*.cpp zamcompx2/*.h zamcompx2/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Izamcompx2 -DDISTRHO_NAMESPACE=DISTRHO_ZamCompX2 -c -o $@ | |||
| distrho-zameq2.cpp.o: distrho-zameq2.cpp zameq2/*.cpp zameq2/*.h zameq2/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Izameq2 -DDISTRHO_NAMESPACE=DISTRHO_ZamEQ2 -c -o $@ | |||
| distrho-zamsynth.cpp.o: distrho-zamsynth.cpp zamsynth/*.cpp zamsynth/*.h zamsynth/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Izamsynth -DDISTRHO_NAMESPACE=DISTRHO_ZamSynth -c -o $@ | |||
| distrho-zamtube.cpp.o: distrho-zamtube.cpp zamtube/*.cpp zamtube/*.h zamtube/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Izamtube -DDISTRHO_NAMESPACE=DISTRHO_ZamTube -c -o $@ | |||
| distrho-zamulticomp.cpp.o: distrho-zamulticomp.cpp zamulticomp/*.cpp zamulticomp/*.h zamulticomp/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Izamulticomp -DDISTRHO_NAMESPACE=DISTRHO_ZaMultiComp -c -o $@ | |||
| distrho-zamulticompx2.cpp.o: distrho-zamulticompx2.cpp zamulticompx2/*.cpp zamulticompx2/*.h zamulticompx2/*.hpp ../distrho/* $(CXXDEPS) | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -I../dgl -Izamulticompx2 -DDISTRHO_NAMESPACE=DISTRHO_ZaMultiCompX2 -c -o $@ | |||
| juce-patchbay.cpp.o: juce-patchbay.cpp | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
| @@ -273,9 +203,6 @@ midi-sequencer.cpp.o: midi-sequencer.cpp midi-base.hpp $(CXXDEPS) | |||
| notes.cpp.o: notes.cpp $(CXXDEPS) ../CarlaNativeExtUI.hpp | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
| vex-%.cpp.o: vex-%.cpp vex/* | |||
| $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
| zynaddsubfx-%.cpp.o: zynaddsubfx-%.cpp $(CXXDEPS) $(ZYN_UI_FILES_H) | |||
| $(CXX) $< $(ZYN_CXX_FLAGS) -c -o $@ | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "3bandeq/DistrhoArtwork3BandEQ.cpp" | |||
| #include "3bandeq/DistrhoPlugin3BandEQ.cpp" | |||
| #include "3bandeq/DistrhoUI3BandEQ.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor _3bandeqDesc = { | |||
| /* category */ PLUGIN_CATEGORY_EQ, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ DistrhoPlugin3BandEQ::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "3bandeq", | |||
| /* maker */ "falkTX, Michael Gruhn", | |||
| /* copyright */ "LGPL", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_3bandeq() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&_3bandeqDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "3bandsplitter/DistrhoArtwork3BandSplitter.cpp" | |||
| #include "3bandsplitter/DistrhoPlugin3BandSplitter.cpp" | |||
| #include "3bandsplitter/DistrhoUI3BandSplitter.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor _3bandsplitterDesc = { | |||
| /* category */ PLUGIN_CATEGORY_EQ, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ DistrhoPlugin3BandSplitter::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "3bandsplitter", | |||
| /* maker */ "falkTX, Michael Gruhn", | |||
| /* copyright */ "LGPL", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_3bandsplitter() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&_3bandsplitterDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "groovejuice/GrooveJuiceArtwork.cpp" | |||
| #include "groovejuice/GrooveJuicePlugin.cpp" | |||
| #include "groovejuice/GrooveJuiceUI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor groovejuiceDesc = { | |||
| /* category */ PLUGIN_CATEGORY_SYNTH, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_IS_SYNTH|PLUGIN_HAS_UI|PLUGIN_USES_TIME|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ GrooveJuicePlugin::paramCount-12, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "groovejuice", | |||
| /* maker */ "Andre Sklenar", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_groovejuice() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&groovejuiceDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "nekobi/DistrhoArtworkNekobi.cpp" | |||
| #include "nekobi/DistrhoPluginNekobi.cpp" | |||
| #include "nekobi/DistrhoUINekobi.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor nekobiDesc = { | |||
| /* category */ PLUGIN_CATEGORY_SYNTH, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_IS_SYNTH|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(PLUGIN_SUPPORTS_CONTROL_CHANGES|PLUGIN_SUPPORTS_ALL_SOUND_OFF), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 1, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ DistrhoPluginNekobi::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "nekobi", | |||
| /* maker */ "falkTX, Sean Bolton and others", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_nekobi() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&nekobiDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "pingpongpan/DistrhoArtworkPingPongPan.cpp" | |||
| #include "pingpongpan/DistrhoPluginPingPongPan.cpp" | |||
| #include "pingpongpan/DistrhoUIPingPongPan.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor pingpongpanDesc = { | |||
| /* category */ PLUGIN_CATEGORY_UTILITY, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ DistrhoPluginPingPongPan::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "pingpongpan", | |||
| /* maker */ "falkTX, Michael Gruhn", | |||
| /* copyright */ "LGPL", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_pingpongpan() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&pingpongpanDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "powerjuice/PowerJuiceArtwork.cpp" | |||
| #include "powerjuice/PowerJuicePlugin.cpp" | |||
| #include "powerjuice/PowerJuiceUI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor powerjuiceDesc = { | |||
| /* category */ PLUGIN_CATEGORY_UTILITY, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_TIME|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ PowerJuicePlugin::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "powerjuice", | |||
| /* maker */ "Andre Sklenar", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_powerjuice() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&powerjuiceDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,59 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "prom/DistrhoPluginProM.cpp" | |||
| #include "prom/DistrhoUIProM.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor promDesc = { | |||
| /* category */ PLUGIN_CATEGORY_OTHER, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ 0, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "prom", | |||
| /* maker */ "falkTX", | |||
| /* copyright */ "LGPL", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_prom() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&promDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "segmentjuice/SegmentJuiceArtwork.cpp" | |||
| #include "segmentjuice/SegmentJuicePlugin.cpp" | |||
| #include "segmentjuice/SegmentJuiceUI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor segmentjuiceDesc = { | |||
| /* category */ PLUGIN_CATEGORY_SYNTH, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_IS_SYNTH|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 1, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ SegmentJuicePlugin::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "segmentjuice", | |||
| /* maker */ "Andre Sklenar", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_segmentjuice() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&segmentjuiceDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "stereoenhancer/DistrhoArtworkStereoEnhancer.cpp" | |||
| #include "stereoenhancer/DistrhoPluginStereoEnhancer.cpp" | |||
| #include "stereoenhancer/DistrhoUIStereoEnhancer.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor stereoenhancerDesc = { | |||
| /* category */ PLUGIN_CATEGORY_UTILITY, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ DistrhoPluginStereoEnhancer::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "stereoenhancer", | |||
| /* maker */ "falkTX, Michael Gruhn", | |||
| /* copyright */ "LGPL", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_stereoenhancer() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&stereoenhancerDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "vectorjuice/VectorJuiceArtwork.cpp" | |||
| #include "vectorjuice/VectorJuicePlugin.cpp" | |||
| #include "vectorjuice/VectorJuiceUI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor vectorjuiceDesc = { | |||
| /* category */ PLUGIN_CATEGORY_UTILITY, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_TIME|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ VectorJuicePlugin::paramCount-4, | |||
| /* paramOuts */ 4, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "vectorjuice", | |||
| /* maker */ "Andre Sklenar", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_vectorjuice() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&vectorjuiceDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "wobblejuice/WobbleJuiceArtwork.cpp" | |||
| #include "wobblejuice/WobbleJuicePlugin.cpp" | |||
| #include "wobblejuice/WobbleJuiceUI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor wobblejuiceDesc = { | |||
| /* category */ PLUGIN_CATEGORY_MODULATOR, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_TIME|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ WobbleJuicePlugin::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "wobblejuice", | |||
| /* maker */ "Andre Sklenar", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_wobblejuice() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&wobblejuiceDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "zamcomp/ZamCompArtwork.cpp" | |||
| #include "zamcomp/ZamCompPlugin.cpp" | |||
| #include "zamcomp/ZamCompUI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor zamcompDesc = { | |||
| /* category */ PLUGIN_CATEGORY_DYNAMICS, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ ZamCompPlugin::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "zamcomp", | |||
| /* maker */ "Damien Zammit", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_zamcomp() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&zamcompDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "zamcompx2/ZamCompX2Artwork.cpp" | |||
| #include "zamcompx2/ZamCompX2Plugin.cpp" | |||
| #include "zamcompx2/ZamCompX2UI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor zamcompx2Desc = { | |||
| /* category */ PLUGIN_CATEGORY_DYNAMICS, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ ZamCompX2Plugin::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "zamcompx2", | |||
| /* maker */ "Damien Zammit", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_zamcompx2() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&zamcompx2Desc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "zameq2/ZamEQ2Artwork.cpp" | |||
| #include "zameq2/ZamEQ2Plugin.cpp" | |||
| #include "zameq2/ZamEQ2UI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor zameq2Desc = { | |||
| /* category */ PLUGIN_CATEGORY_EQ, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ ZamEQ2Plugin::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "zameq2", | |||
| /* maker */ "Damien Zammit", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_zameq2() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&zameq2Desc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "zamsynth/ZamSynthArtwork.cpp" | |||
| #include "zamsynth/ZamSynthPlugin.cpp" | |||
| #include "zamsynth/ZamSynthUI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor zamsynthDesc = { | |||
| /* category */ PLUGIN_CATEGORY_SYNTH, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_IS_SYNTH|PLUGIN_HAS_UI|PLUGIN_USES_STATE|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 1, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ ZamSynthPlugin::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "zamsynth", | |||
| /* maker */ "Damien Zammit", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_zamsynth() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&zamsynthDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,61 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "zamtube/ZamTubeArtwork.cpp" | |||
| #include "zamtube/ZamTubePlugin.cpp" | |||
| #include "zamtube/ZamTubeUI.cpp" | |||
| #include "zamtube/wdf.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor zamtubeDesc = { | |||
| /* category */ PLUGIN_CATEGORY_DYNAMICS, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ ZamTubePlugin::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "zamtube", | |||
| /* maker */ "Damien Zammit", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_zamtube() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&zamtubeDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "zamulticomp/ZaMultiCompArtwork.cpp" | |||
| #include "zamulticomp/ZaMultiCompPlugin.cpp" | |||
| #include "zamulticomp/ZaMultiCompUI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor zamulticompDesc = { | |||
| /* category */ PLUGIN_CATEGORY_DYNAMICS, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ ZaMultiCompPlugin::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "zamulticomp", | |||
| /* maker */ "Damien Zammit", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_zamulticomp() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&zamulticompDesc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,60 +0,0 @@ | |||
| /* | |||
| * Carla Native Plugins | |||
| * 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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| // Plugin Code | |||
| #include "zamulticompx2/ZaMultiCompX2Artwork.cpp" | |||
| #include "zamulticompx2/ZaMultiCompX2Plugin.cpp" | |||
| #include "zamulticompx2/ZaMultiCompX2UI.cpp" | |||
| // DISTRHO Code | |||
| #define DISTRHO_PLUGIN_TARGET_CARLA | |||
| #include "DistrhoPluginMain.cpp" | |||
| #include "DistrhoUIMain.cpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const NativePluginDescriptor zamulticompx2Desc = { | |||
| /* category */ PLUGIN_CATEGORY_DYNAMICS, | |||
| /* hints */ static_cast<NativePluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_UI|PLUGIN_USES_PARENT_ID), | |||
| /* supports */ static_cast<NativePluginSupports>(0x0), | |||
| /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | |||
| /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | |||
| /* midiIns */ 0, | |||
| /* midiOuts */ 0, | |||
| /* paramIns */ ZaMultiCompX2Plugin::paramCount, | |||
| /* paramOuts */ 0, | |||
| /* name */ DISTRHO_PLUGIN_NAME, | |||
| /* label */ "zamulticompx2", | |||
| /* maker */ "Damien Zammit", | |||
| /* copyright */ "GPL v2+", | |||
| PluginDescriptorFILL(PluginCarla) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_EXPORT | |||
| void carla_register_native_plugin_zamulticompx2() | |||
| { | |||
| USE_NAMESPACE_DISTRHO | |||
| carla_register_native_plugin(&zamulticompx2Desc); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| @@ -1,36 +0,0 @@ | |||
| /* | |||
| * Vector Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_NAME "GrooveJuice" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_SYNTH 1 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 0 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||
| #define DISTRHO_PLUGIN_WANT_LATENCY 0 | |||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 0 | |||
| #define DISTRHO_PLUGIN_WANT_TIMEPOS 1 | |||
| #define DISTRHO_PLUGIN_URI "urn:distrho:GrooveJuice" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,80 +0,0 @@ | |||
| /* (Auto-generated binary data file). */ | |||
| #ifndef BINARY_GROOVEJUICEARTWORK_HPP | |||
| #define BINARY_GROOVEJUICEARTWORK_HPP | |||
| namespace GrooveJuiceArtwork | |||
| { | |||
| extern const char* aboutData; | |||
| const unsigned int aboutDataSize = 180000; | |||
| const unsigned int aboutWidth = 300; | |||
| const unsigned int aboutHeight = 200; | |||
| extern const char* aboutButtonHoverData; | |||
| const unsigned int aboutButtonHoverDataSize = 5888; | |||
| const unsigned int aboutButtonHoverWidth = 92; | |||
| const unsigned int aboutButtonHoverHeight = 16; | |||
| extern const char* aboutButtonNormalData; | |||
| const unsigned int aboutButtonNormalDataSize = 5888; | |||
| const unsigned int aboutButtonNormalWidth = 92; | |||
| const unsigned int aboutButtonNormalHeight = 16; | |||
| extern const char* backgroundData; | |||
| const unsigned int backgroundDataSize = 1328592; | |||
| const unsigned int backgroundWidth = 712; | |||
| const unsigned int backgroundHeight = 622; | |||
| extern const char* knobData; | |||
| const unsigned int knobDataSize = 10404; | |||
| const unsigned int knobWidth = 51; | |||
| const unsigned int knobHeight = 51; | |||
| extern const char* knob2Data; | |||
| const unsigned int knob2DataSize = 14400; | |||
| const unsigned int knob2Width = 60; | |||
| const unsigned int knob2Height = 60; | |||
| extern const char* orbitData; | |||
| const unsigned int orbitDataSize = 4096; | |||
| const unsigned int orbitWidth = 32; | |||
| const unsigned int orbitHeight = 32; | |||
| extern const char* pageButtonHoverData; | |||
| const unsigned int pageButtonHoverDataSize = 5460; | |||
| const unsigned int pageButtonHoverWidth = 65; | |||
| const unsigned int pageButtonHoverHeight = 21; | |||
| extern const char* pageButtonNormalData; | |||
| const unsigned int pageButtonNormalDataSize = 5460; | |||
| const unsigned int pageButtonNormalWidth = 65; | |||
| const unsigned int pageButtonNormalHeight = 21; | |||
| extern const char* randomizeButtonHoverData; | |||
| const unsigned int randomizeButtonHoverDataSize = 7224; | |||
| const unsigned int randomizeButtonHoverWidth = 86; | |||
| const unsigned int randomizeButtonHoverHeight = 21; | |||
| extern const char* randomizeButtonNormalData; | |||
| const unsigned int randomizeButtonNormalDataSize = 7224; | |||
| const unsigned int randomizeButtonNormalWidth = 86; | |||
| const unsigned int randomizeButtonNormalHeight = 21; | |||
| extern const char* roundletData; | |||
| const unsigned int roundletDataSize = 2500; | |||
| const unsigned int roundletWidth = 25; | |||
| const unsigned int roundletHeight = 25; | |||
| extern const char* sliderData; | |||
| const unsigned int sliderDataSize = 2600; | |||
| const unsigned int sliderWidth = 26; | |||
| const unsigned int sliderHeight = 25; | |||
| extern const char* subOrbitData; | |||
| const unsigned int subOrbitDataSize = 3364; | |||
| const unsigned int subOrbitWidth = 29; | |||
| const unsigned int subOrbitHeight = 29; | |||
| } | |||
| #endif // BINARY_GROOVEJUICEARTWORK_HPP | |||
| @@ -1,621 +0,0 @@ | |||
| /* | |||
| * Vector Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #include "GrooveJuicePlugin.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| GrooveJuicePlugin::GrooveJuicePlugin() | |||
| : Plugin(paramCount, 1, 0) // 1 program, 0 states | |||
| { | |||
| // set default values | |||
| d_setProgram(0); | |||
| // reset | |||
| d_deactivate(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Init | |||
| void GrooveJuicePlugin::d_initParameter(uint32_t index, Parameter& parameter) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramX: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "X"; | |||
| parameter.symbol = "x"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramY: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Y"; | |||
| parameter.symbol = "y"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramOrbitSpeedX: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Orbit Speed X"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 4.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 128.0f; | |||
| break; | |||
| case paramOrbitSpeedY: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Orbit Speed Y"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 4.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 128.0f; | |||
| break; | |||
| case paramOrbitSizeX: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Orbit Size X"; | |||
| parameter.symbol = "osl"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramOrbitSizeY: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Orbit Size Y"; | |||
| parameter.symbol = "osr"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramSubOrbitSpeed: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "SubOrbit Speed"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 32.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 128.0f; | |||
| break; | |||
| case paramSubOrbitSize: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "SubOrbit Size"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramSubOrbitSmooth: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "SubOrbit Wave"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramOrbitWaveX: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Orbit Wave X"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 3.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 4.0f; | |||
| break; | |||
| case paramOrbitPhaseX: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Orbit Phase X"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramOrbitPhaseY: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Orbit Phase Y"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramOrbitWaveY: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Orbit Wave Y"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 3.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 4.0f; | |||
| break; | |||
| case paramOrbitOutX: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = "Orbit X"; | |||
| parameter.symbol = "orx"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramOrbitOutY: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = "Orbit Y"; | |||
| parameter.symbol = "ory"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramSubOrbitOutX: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = "SubOrbit X"; | |||
| parameter.symbol = "sorx"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramSubOrbitOutY: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = "SubOrbit Y"; | |||
| parameter.symbol = "sory"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramW1Out: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = ""; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramW2Out: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = ""; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramMOut: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = ""; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramCOut: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = ""; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramROut: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = ""; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramSOut: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = ""; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramReOut: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = ""; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramShOut: | |||
| parameter.hints = PARAMETER_IS_OUTPUT; | |||
| parameter.name = ""; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| } | |||
| if (index>=17 && index<17+64) { | |||
| //int x = (index-17)%8; | |||
| //int y = (x+1)/(index-17) | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "synth"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| } | |||
| } | |||
| void GrooveJuicePlugin::d_initProgramName(uint32_t index, d_string& programName) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| programName = "Default"; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Internal data | |||
| float GrooveJuicePlugin::d_getParameterValue(uint32_t index) const | |||
| { | |||
| if (index<17 || index>=17+64) { | |||
| switch (index) | |||
| { | |||
| case paramX: | |||
| return x; | |||
| case paramY: | |||
| return y; | |||
| case paramOrbitSizeX: | |||
| return orbitSizeX; | |||
| case paramOrbitSizeY: | |||
| return orbitSizeY; | |||
| case paramOrbitSpeedX: | |||
| return orbitSpeedX; | |||
| case paramOrbitSpeedY: | |||
| return orbitSpeedY; | |||
| case paramSubOrbitSpeed: | |||
| return subOrbitSpeed; | |||
| case paramSubOrbitSize: | |||
| return subOrbitSize; | |||
| case paramOrbitOutX: | |||
| return orbitX; | |||
| case paramOrbitOutY: | |||
| return orbitY; | |||
| case paramSubOrbitOutX: | |||
| return subOrbitX; | |||
| case paramSubOrbitOutY: | |||
| return subOrbitY; | |||
| case paramSubOrbitSmooth: | |||
| return subOrbitSmooth; | |||
| case paramOrbitWaveX: | |||
| return orbitWaveX; | |||
| case paramOrbitWaveY: | |||
| return orbitWaveY; | |||
| case paramOrbitPhaseX: | |||
| return orbitPhaseY; | |||
| case paramOrbitPhaseY: | |||
| return orbitPhaseY; | |||
| case paramW1Out: | |||
| return synthSound[0]; | |||
| case paramW2Out: | |||
| return synthSound[1]; | |||
| case paramMOut: | |||
| return synthSound[2]; | |||
| case paramCOut: | |||
| return synthSound[3]; | |||
| case paramROut: | |||
| return synthSound[4]; | |||
| case paramSOut: | |||
| return synthSound[5]; | |||
| case paramReOut: | |||
| return synthSound[6]; | |||
| case paramShOut: | |||
| return synthSound[7]; | |||
| default: | |||
| return 0.0f; | |||
| } | |||
| } else { | |||
| int num = (index-17); //synth params begin on #17 | |||
| int x = num%8; //synth param | |||
| //synth page | |||
| int y = (num-(num%8))/8; | |||
| return synthData[x][y]; | |||
| } | |||
| } | |||
| void GrooveJuicePlugin::d_setParameterValue(uint32_t index, float value) | |||
| { | |||
| if (index<17) { | |||
| switch (index) | |||
| { | |||
| case paramX: | |||
| x = value; | |||
| break; | |||
| case paramY: | |||
| y = value; | |||
| break; | |||
| case paramOrbitSpeedX: | |||
| orbitSpeedX = value; | |||
| resetPhase(); | |||
| break; | |||
| case paramOrbitSpeedY: | |||
| orbitSpeedY = value; | |||
| resetPhase(); | |||
| break; | |||
| case paramOrbitSizeX: | |||
| orbitSizeX = value; | |||
| break; | |||
| case paramOrbitSizeY: | |||
| orbitSizeY = value; | |||
| break; | |||
| case paramSubOrbitSpeed: | |||
| subOrbitSpeed = value; | |||
| resetPhase(); | |||
| break; | |||
| case paramSubOrbitSize: | |||
| subOrbitSize = value; | |||
| break; | |||
| case paramSubOrbitSmooth: | |||
| subOrbitSmooth = value; | |||
| break; | |||
| case paramOrbitWaveX: | |||
| orbitWaveX = value; | |||
| break; | |||
| case paramOrbitWaveY: | |||
| orbitWaveY = value; | |||
| break; | |||
| case paramOrbitPhaseX: | |||
| orbitPhaseX = value; | |||
| resetPhase(); | |||
| break; | |||
| case paramOrbitPhaseY: | |||
| orbitPhaseY = value; | |||
| resetPhase(); | |||
| break; | |||
| } | |||
| } else { | |||
| int num = (index-17); //synth params begin on #17 | |||
| int x = num%8; //synth param | |||
| //synth page | |||
| int y = (num-(num%8))/8; | |||
| synthData[x][y] = value; | |||
| } | |||
| } | |||
| void GrooveJuicePlugin::d_setProgram(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| /* Default parameter values */ | |||
| x = 0.5f; | |||
| y = 0.5f; | |||
| orbitSpeedX = 4.0f; | |||
| orbitSpeedY = 4.0f; | |||
| orbitSizeX = 0.5f; | |||
| orbitSizeY = 0.5f; | |||
| subOrbitSize = 0.5f; | |||
| subOrbitSpeed = 32.0f; | |||
| orbitWaveX = 3.0f; | |||
| orbitWaveY = 3.0f; | |||
| subOrbitSmooth = 0.5f; | |||
| orbitPhaseX = 0.0f; | |||
| orbitPhaseY = 0.0f; | |||
| /* Default variable values */ | |||
| orbitX=orbitY=orbitTX=orbitTY=0.5; | |||
| subOrbitX=subOrbitY=subOrbitTX=subOrbitTY=0; | |||
| interpolationDivider=200; | |||
| bar=tickX=tickY=percentageX=percentageY=tickOffsetX=0; | |||
| tickOffsetY=sinePosX=sinePosY=tick=percentage=tickOffset=sinePos=0; | |||
| waveBlend=0; | |||
| synthL.setSampleRate(d_getSampleRate()); | |||
| synthR.setSampleRate(d_getSampleRate()); | |||
| //parameter smoothing | |||
| for (int i=0; i<2; i++) { | |||
| sA[i] = 0.99f; | |||
| sB[i] = 1.f - sA[i]; | |||
| sZ[i] = 0; | |||
| } | |||
| for (int x=0; x<8; x++) | |||
| for (int y=0; y<8; y++) | |||
| synthData[x][y] = 0.5; | |||
| /* reset filter values */ | |||
| d_activate(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Process | |||
| void GrooveJuicePlugin::d_activate() | |||
| { | |||
| //sinePos = 0; | |||
| } | |||
| void GrooveJuicePlugin::d_deactivate() | |||
| { | |||
| // all values to zero | |||
| } | |||
| void GrooveJuicePlugin::d_run(const float**, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) | |||
| { | |||
| float out1, out2, tX, tY; | |||
| /* | |||
| out1 = inputs[0][i]*tN(1-std::sqrt((tX*tX)+(tY*tY))); | |||
| out2 = inputs[1][i]*tN(1-std::sqrt((tX*tX)+(tY*tY))); | |||
| out1 += inputs[2][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+(tY*tY))); | |||
| out2 += inputs[3][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+(tY*tY))); | |||
| out1 += inputs[4][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+((1-tY)*(1-tY)))); | |||
| out2 += inputs[5][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+((1-tY)*(1-tY)))); | |||
| out1 += inputs[6][i]*tN(1-std::sqrt((tX*tX)+((1-tY)*(1-tY)))); | |||
| out2 += inputs[7][i]*tN(1-std::sqrt((tX*tX)+((1-tY)*(1-tY)))); | |||
| */ | |||
| for (uint32_t i = 0; i<frames; i++) { | |||
| animate(); | |||
| tX = subOrbitX; | |||
| tY = subOrbitY; | |||
| //sum values | |||
| float c = 0.41421f; //mid segment | |||
| float d = c/1.41f; //side segments | |||
| float distances[8]; | |||
| distances[0] = distance(d, 0, tX, tY); | |||
| distances[1] = distance(c+d, 0, tX, tY); | |||
| distances[2] = distance(1, d, tX, tY); | |||
| distances[3] = distance(1, c+d, tX, tY); | |||
| distances[4] = distance(d, 1, tX, tY); | |||
| distances[5] = distance(c+d, 1, tX, tY); | |||
| distances[6] = distance(0, d, tX, tY); | |||
| distances[7] = distance(0, c+d, tX, tY); | |||
| //std::cout << distances[0] << " "; | |||
| //std::cout << tX << std::endl; | |||
| for (int x=0; x<8; x++) { | |||
| float targetValue = 0; | |||
| for (int y=0; y<8; y++) { | |||
| targetValue += synthData[x][y]*(distances[y]); | |||
| } | |||
| synthSound[x] = tN(targetValue); | |||
| } | |||
| //printf("wave1: %f\n", synthSound[0]); | |||
| //std::cout << synthSound[0] << std::endl; | |||
| synthL.setWave(0, synthSound[0]); | |||
| synthR.setWave(0, synthSound[0]); | |||
| synthL.setWave(1, synthSound[1]); | |||
| synthR.setWave(1, synthSound[1]); | |||
| synthL.setMix(synthSound[2]); | |||
| synthR.setMix(synthSound[2]); | |||
| //synthL.setCut(synthSound[3]); | |||
| //synthR.setCut(synthSound[3]); | |||
| //synthL.setReso(synthSound[4]); | |||
| //synthR.setReso(synthSound[4]); | |||
| //synthL.setDecay(synthSound[5]); | |||
| //synthR.setDecay(synthSound[5]); | |||
| synthL.setSustain(synthSound[5]); | |||
| synthR.setSustain(synthSound[5]); | |||
| synthL.setRelease(synthSound[6]); | |||
| synthR.setRelease(synthSound[6]); | |||
| synthL.setStereo(-0.5); | |||
| synthR.setStereo(0.5); | |||
| synthL.setShape(synthSound[7]); | |||
| synthR.setShape(synthSound[7]); | |||
| float cutoff = std::exp((std::log(16000)-std::log(500))*synthSound[3]+std::log(500)); | |||
| filterL.recalc(cutoff, synthSound[4]*0.8, d_getSampleRate(), synthSound[7]); | |||
| filterR.recalc(cutoff, synthSound[4]*0.8, d_getSampleRate(), synthSound[7]); | |||
| outputs[0][i] = filterL.process(synthL.run()); | |||
| outputs[1][i] = filterR.process(synthL.run()); | |||
| } | |||
| //outputs = buffer; | |||
| for (uint32_t i = 0; i<midiEventCount; i++) { | |||
| int mType = midiEvents[i].buf[0] & 0xF0; | |||
| //int mChan = midiEvents[i].buf[0] & 0x0F; | |||
| int mNum = midiEvents[i].buf[1]; | |||
| if (mType == 0x90) { | |||
| //note on | |||
| synthL.play(mNum); | |||
| synthR.play(mNum); | |||
| } else if (mType == 0x80) { | |||
| //note off | |||
| synthL.stop(mNum); | |||
| synthR.stop(mNum); | |||
| } | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() | |||
| { | |||
| return new GrooveJuicePlugin(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,280 +0,0 @@ | |||
| /* | |||
| * Vector Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #ifndef GROOVEJUICEPLUGIN_HPP_INCLUDED | |||
| #define GROOVEJUICEPLUGIN_HPP_INCLUDED | |||
| #include "DistrhoPlugin.hpp" | |||
| #include <iostream> | |||
| #include "Synth.hxx" | |||
| #include "moogVCF.hxx" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class GrooveJuicePlugin : public Plugin | |||
| { | |||
| public: | |||
| enum Parameters | |||
| { | |||
| paramX = 0, | |||
| paramY, | |||
| paramOrbitSizeX, | |||
| paramOrbitSizeY, | |||
| paramOrbitSpeedX, | |||
| paramOrbitSpeedY, | |||
| paramSubOrbitSpeed, | |||
| paramSubOrbitSize, | |||
| paramOrbitWaveX, | |||
| paramOrbitWaveY, | |||
| paramOrbitPhaseX, | |||
| paramOrbitPhaseY, | |||
| paramSubOrbitSmooth, | |||
| paramOrbitOutX, | |||
| paramOrbitOutY, | |||
| paramSubOrbitOutX, | |||
| paramSubOrbitOutY, | |||
| w11, w21, m1, c1, r1, s1, re1, sh1, | |||
| w12, w22, m2, c2, r2, s2, re2, sh2, | |||
| w13, w23, m3, c3, r3, s3, re3, sh3, | |||
| w14, w24, m4, c4, r4, s4, re4, sh4, | |||
| w15, w25, m5, c5, r5, s5, re5, sh5, | |||
| w16, w26, m6, c6, r6, s6, re6, sh6, | |||
| w17, w27, m7, c7, r7, s7, re7, sh7, | |||
| w18, w28, m8, c8, r8, s8, re8, sh8, | |||
| paramW1Out, | |||
| paramW2Out, | |||
| paramMOut, | |||
| paramCOut, | |||
| paramROut, | |||
| paramSOut, | |||
| paramReOut, | |||
| paramShOut, | |||
| paramCount | |||
| }; | |||
| inline float smoothParameter(float in, int axis) { | |||
| sZ[axis] = (in * sB[axis]) + (sZ[axis] * sA[axis]); | |||
| return sZ[axis]; | |||
| } | |||
| float getSinePhase(float x) { | |||
| return (-std::sin(x)); | |||
| } | |||
| float getSawPhase(float x) { | |||
| return (-(2/M_PI *std::atan(1/std::tan(x/2)))); | |||
| } | |||
| float getRevSawPhase(float x) { | |||
| return ((2/M_PI *std::atan(1/std::tan(x/2)))); | |||
| } | |||
| float getSquarePhase(float x) { | |||
| return (std::round((std::sin(x)+1)/2)-0.5)*2; | |||
| } | |||
| //saw, sqr, sin, revSaw | |||
| float getBlendedPhase(float x, float wave) | |||
| { | |||
| //wave = 2; | |||
| if (wave>=1 && wave<2) { | |||
| /* saw vs sqr */ | |||
| waveBlend = wave-1; | |||
| return (getSawPhase(x)*(1-waveBlend) + getSquarePhase(x)*waveBlend); | |||
| } else if (wave>=2 && wave<3) { | |||
| /* sqr vs sin */ | |||
| waveBlend = wave-2; | |||
| return (getSquarePhase(x)*(1-waveBlend) + getSinePhase(x)*waveBlend); | |||
| } else if (wave>=3 && wave<=4) { | |||
| /* sin vs revSaw */ | |||
| waveBlend = wave-3; | |||
| return (getSinePhase(x)*(1-waveBlend) + getRevSawPhase(x)*waveBlend); | |||
| } else { | |||
| return 0.0f; | |||
| } | |||
| } | |||
| void resetPhase() | |||
| { | |||
| const TimePos& time = d_getTimePos(); | |||
| if (!time.playing) | |||
| { | |||
| sinePosX = 0; | |||
| sinePosY = 0; | |||
| sinePos = 0; | |||
| } | |||
| } | |||
| float tN (float x) | |||
| { | |||
| if (x>1) x=1; | |||
| if (x<0) x=0; | |||
| return x; | |||
| } | |||
| float distance(float x, float y, float tX, float tY) { | |||
| float result = pow(tN(1-(sqrt((tX - x)*(tX - x) + (tY - y)*(tY - y)))), 3); | |||
| return result; | |||
| } | |||
| void animate() | |||
| { | |||
| //sync orbit with frame, bpm | |||
| const TimePos& time = d_getTimePos(); | |||
| bar = ((120.0/(time.bbt.valid ? time.bbt.beatsPerMinute : 120.0))*(d_getSampleRate())); | |||
| int multiplier = 16;//2000*4; | |||
| tickX = bar/(std::round(orbitSpeedX))*multiplier; | |||
| tickY = bar/(std::round(orbitSpeedY))*multiplier; | |||
| tick = bar/(std::round(subOrbitSpeed))*multiplier; | |||
| if (time.playing) | |||
| { | |||
| /* if rolling then sync to timepos */ | |||
| tickOffsetX = time.frame-std::floor(time.frame/tickX)*tickX; | |||
| tickOffsetY = time.frame-std::floor(time.frame/tickY)*tickY; | |||
| tickOffset = time.frame-std::floor(time.frame/tick)*tick; | |||
| percentageX = tickOffsetX/tickX; | |||
| percentageY = tickOffsetY/tickY; | |||
| percentage = tickOffset/tick; | |||
| sinePosX = (M_PI*2)*percentageX; | |||
| sinePosY = (M_PI*2)*percentageY; | |||
| sinePos = (M_PI*2)*percentage; | |||
| } else { | |||
| /* else just keep on wobblin' */ | |||
| sinePosX += (2*M_PI)/(tickX); | |||
| sinePosY += (2*M_PI)/(tickY); | |||
| sinePos += (M_PI)/(tick); | |||
| if (sinePosX>2*M_PI) { | |||
| sinePosX = 0; | |||
| } | |||
| if (sinePosY>2*M_PI) { | |||
| sinePosY = 0; | |||
| } | |||
| if (sinePos>2*M_PI) { | |||
| sinePos = 0; | |||
| } | |||
| } | |||
| //0..1 | |||
| //0..3 | |||
| //0, 1, 2, 3 | |||
| //* 0.25 | |||
| //0, 0.25, 0.5, 0.75 | |||
| float tempPhaseX = std::round(orbitPhaseX*3)*0.25; | |||
| float tempPhaseY = std::round(orbitPhaseY*3)*0.25; | |||
| orbitX = x+getBlendedPhase(sinePosX + tempPhaseX*(2*M_PI), std::round(orbitWaveX))*(orbitSizeX/2); | |||
| orbitY = y+getBlendedPhase(sinePosY+M_PI/2 + tempPhaseY*(2*M_PI), std::round(orbitWaveY))*(orbitSizeY/2); | |||
| subOrbitX = smoothParameter(orbitX+getBlendedPhase(sinePos, 3)*(subOrbitSize/3), 0); | |||
| subOrbitY = smoothParameter(orbitY+getBlendedPhase(sinePos+M_PI/2, 3)*(subOrbitSize/3), 1); | |||
| if (orbitX<0) orbitX=0; | |||
| if (orbitX>1) orbitX=1; | |||
| if (orbitY<0) orbitY=0; | |||
| if (orbitY>1) orbitY=1; | |||
| if (subOrbitX<0) subOrbitX=0; | |||
| if (subOrbitX>1) subOrbitX=1; | |||
| if (subOrbitY<0) subOrbitY=0; | |||
| if (subOrbitY>1) subOrbitY=1; | |||
| } | |||
| GrooveJuicePlugin(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| const char* d_getLabel() const noexcept override | |||
| { | |||
| return "GrooveJuice"; | |||
| } | |||
| const char* d_getMaker() const noexcept override | |||
| { | |||
| return "Andre Sklenar"; | |||
| } | |||
| const char* d_getLicense() const noexcept override | |||
| { | |||
| return "GPL v2+"; | |||
| } | |||
| uint32_t d_getVersion() const noexcept override | |||
| { | |||
| return 0x1000; | |||
| } | |||
| long d_getUniqueId() const noexcept override | |||
| { | |||
| return d_cconst('G', 'r', 'v', 'J'); | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Init | |||
| void d_initParameter(uint32_t index, Parameter& parameter) override; | |||
| void d_initProgramName(uint32_t index, d_string& programName) override; | |||
| // ------------------------------------------------------------------- | |||
| // Internal data | |||
| float d_getParameterValue(uint32_t index) const override; | |||
| void d_setParameterValue(uint32_t index, float value) override; | |||
| void d_setProgram(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Process | |||
| void d_activate() override; | |||
| void d_deactivate() override; | |||
| void d_run(const float** inputs, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) override; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| CSynth synthL, synthR; | |||
| MoogVCF filterL, filterR; | |||
| float x, y; | |||
| float orbitX, orbitY; | |||
| float orbitTX, orbitTY; //targetX and targetY for interpolation | |||
| float subOrbitX, subOrbitY; | |||
| float subOrbitTX, subOrbitTY; | |||
| float subOrbitSpeed, subOrbitSize, orbitSpeedX, orbitSpeedY; | |||
| float orbitSizeX, orbitSizeY; | |||
| float interpolationDivider; | |||
| float bar, tickX, tickY, percentageX, percentageY, tickOffsetX, tickOffsetY; | |||
| float sinePosX, sinePosY, tick, percentage, tickOffset, sinePos; | |||
| float orbitWaveX, orbitWaveY, subOrbitSmooth, waveBlend; | |||
| float orbitPhaseX, orbitPhaseY; | |||
| //parameter smoothing, for subOrbitX and subOrbitY | |||
| float sA[2], sB[2], sZ[2]; | |||
| float synthData[8][8]; //as per gui, [param][page] | |||
| float synthSound[8]; | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // GROOVEJUICE_HPP_INCLUDED | |||
| @@ -1,763 +0,0 @@ | |||
| /* | |||
| * Vector Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #include "GrooveJuiceUI.hpp" | |||
| using DGL::Point; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| GrooveJuiceUI::GrooveJuiceUI() | |||
| : UI(), | |||
| fAboutWindow(this) | |||
| { | |||
| // xy params | |||
| paramX = paramY = 0.5f; | |||
| // set the XY canvas area | |||
| fDragging = false; | |||
| fDragValid = false; | |||
| fLastX = fLastY = 0; | |||
| fCanvasArea.setPos(22+12, 49+12); | |||
| fCanvasArea.setSize(368-24, 368-24); | |||
| // background | |||
| fImgBackground = Image(GrooveJuiceArtwork::backgroundData, GrooveJuiceArtwork::backgroundWidth, GrooveJuiceArtwork::backgroundHeight, GL_BGR); | |||
| //roundlet | |||
| fImgRoundlet = Image(GrooveJuiceArtwork::roundletData, GrooveJuiceArtwork::roundletWidth, GrooveJuiceArtwork::roundletHeight); | |||
| //orbit | |||
| fImgOrbit = Image(GrooveJuiceArtwork::orbitData, GrooveJuiceArtwork::orbitWidth, GrooveJuiceArtwork::orbitHeight); | |||
| //subOrbit | |||
| fImgSubOrbit = Image(GrooveJuiceArtwork::subOrbitData, GrooveJuiceArtwork::subOrbitWidth, GrooveJuiceArtwork::subOrbitHeight); | |||
| // about | |||
| Image imageAbout(GrooveJuiceArtwork::aboutData, GrooveJuiceArtwork::aboutWidth, GrooveJuiceArtwork::aboutHeight, GL_BGR); | |||
| fAboutWindow.setImage(imageAbout); | |||
| // about button | |||
| Image aboutImageNormal(GrooveJuiceArtwork::aboutButtonNormalData, GrooveJuiceArtwork::aboutButtonNormalWidth, GrooveJuiceArtwork::aboutButtonNormalHeight); | |||
| Image aboutImageHover(GrooveJuiceArtwork::aboutButtonHoverData, GrooveJuiceArtwork::aboutButtonHoverWidth, GrooveJuiceArtwork::aboutButtonHoverHeight); | |||
| fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); | |||
| fButtonAbout->setAbsolutePos(599, 17); | |||
| fButtonAbout->setCallback(this); | |||
| Image pageImageNormal(GrooveJuiceArtwork::pageButtonNormalData, GrooveJuiceArtwork::pageButtonNormalWidth, GrooveJuiceArtwork::pageButtonNormalHeight); | |||
| Image pageImageHover(GrooveJuiceArtwork::pageButtonHoverData, GrooveJuiceArtwork::pageButtonHoverWidth, GrooveJuiceArtwork::pageButtonHoverHeight); | |||
| Image randomizeImageNormal(GrooveJuiceArtwork::randomizeButtonNormalData, GrooveJuiceArtwork::randomizeButtonNormalWidth, GrooveJuiceArtwork::randomizeButtonNormalHeight); | |||
| Image randomizeImageHover(GrooveJuiceArtwork::randomizeButtonHoverData, GrooveJuiceArtwork::randomizeButtonHoverWidth, GrooveJuiceArtwork::randomizeButtonHoverHeight); | |||
| fButtonRandomize = new ImageButton(this, randomizeImageNormal, randomizeImageHover, randomizeImageHover); | |||
| fButtonRandomize->setAbsolutePos(313, 586); | |||
| fButtonRandomize->setCallback(this); | |||
| int oX = 15; | |||
| int oY = 557; | |||
| int mX = 103-oX; | |||
| int mY = 0; | |||
| for (int i=0; i<8; i++) { | |||
| fButtonsPage[i] = new ImageButton(this, pageImageNormal, pageImageHover, pageImageHover); | |||
| fButtonsPage[i]->setAbsolutePos(oX+mX*i, oY); | |||
| fButtonsPage[i]->setCallback(this); | |||
| } | |||
| // knobs | |||
| Image knobImage(GrooveJuiceArtwork::knobData, GrooveJuiceArtwork::knobWidth, GrooveJuiceArtwork::knobHeight); | |||
| Image knob2Image(GrooveJuiceArtwork::knob2Data, GrooveJuiceArtwork::knob2Width, GrooveJuiceArtwork::knob2Height); | |||
| // knob KnobOrbitSpeedX | |||
| fKnobOrbitSpeedX = new ImageKnob(this, knobImage); | |||
| fKnobOrbitSpeedX->setAbsolutePos(423, 185); | |||
| fKnobOrbitSpeedX->setStep(1.0f); | |||
| fKnobOrbitSpeedX->setRange(1.0f, 128.0f); | |||
| fKnobOrbitSpeedX->setValue(4.0f); | |||
| fKnobOrbitSpeedX->setRotationAngle(270); | |||
| fKnobOrbitSpeedX->setCallback(this); | |||
| // knob KnobOrbitSpeedY | |||
| fKnobOrbitSpeedY = new ImageKnob(this, knobImage); | |||
| fKnobOrbitSpeedY->setAbsolutePos(516, 185); | |||
| fKnobOrbitSpeedY->setStep(1.0f); | |||
| fKnobOrbitSpeedY->setRange(1.0f, 128.0f); | |||
| fKnobOrbitSpeedY->setValue(4.0f); | |||
| fKnobOrbitSpeedY->setRotationAngle(270); | |||
| fKnobOrbitSpeedY->setCallback(this); | |||
| // knob KnobOrbitSizeX | |||
| fKnobOrbitSizeX = new ImageKnob(this, knobImage); | |||
| fKnobOrbitSizeX->setAbsolutePos(423, 73); | |||
| fKnobOrbitSizeX->setRange(0.0f, 1.0f); | |||
| fKnobOrbitSizeX->setValue(0.5f); | |||
| fKnobOrbitSizeX->setRotationAngle(270); | |||
| fKnobOrbitSizeX->setCallback(this); | |||
| // knob KnobOrbitSizeY | |||
| fKnobOrbitSizeY = new ImageKnob(this, knobImage); | |||
| fKnobOrbitSizeY->setAbsolutePos(516, 73); | |||
| fKnobOrbitSizeY->setRange(0.0f, 1.0f); | |||
| fKnobOrbitSizeY->setValue(0.5f); | |||
| fKnobOrbitSizeY->setRotationAngle(270); | |||
| fKnobOrbitSizeY->setCallback(this); | |||
| // knob KnobSubOrbitSpeed | |||
| fKnobSubOrbitSpeed = new ImageKnob(this, knobImage); | |||
| fKnobSubOrbitSpeed->setAbsolutePos(620, 185); | |||
| fKnobSubOrbitSpeed->setStep(1.0f); | |||
| fKnobSubOrbitSpeed->setRange(1.0f, 128.0f); | |||
| fKnobSubOrbitSpeed->setValue(32.0f); | |||
| fKnobSubOrbitSpeed->setRotationAngle(270); | |||
| fKnobSubOrbitSpeed->setCallback(this); | |||
| // knob KnobSubOrbitSize | |||
| fKnobSubOrbitSize = new ImageKnob(this, knobImage); | |||
| fKnobSubOrbitSize->setAbsolutePos(620, 73); | |||
| fKnobSubOrbitSize->setRange(0.0f, 1.0f); | |||
| fKnobSubOrbitSize->setValue(0.5f); | |||
| fKnobSubOrbitSize->setRotationAngle(270); | |||
| fKnobSubOrbitSize->setCallback(this); | |||
| // knob KnobSubOrbitSmooth | |||
| fKnobSubOrbitSmooth = new ImageKnob(this, knobImage); | |||
| fKnobSubOrbitSmooth->setAbsolutePos(620, 297); | |||
| fKnobSubOrbitSmooth->setRange(0.0f, 1.0f); | |||
| fKnobSubOrbitSmooth->setValue(0.5f); | |||
| fKnobSubOrbitSmooth->setRotationAngle(270); | |||
| fKnobSubOrbitSmooth->setCallback(this); | |||
| // sliders | |||
| Image sliderImage(GrooveJuiceArtwork::sliderData, GrooveJuiceArtwork::sliderWidth, GrooveJuiceArtwork::sliderHeight); | |||
| Point<int> sliderPosStart(410, 284); | |||
| Point<int> sliderPosEnd(410+48, 284); | |||
| // slider OrbitWaveX | |||
| fSliderOrbitWaveX = new ImageSlider(this, sliderImage); | |||
| fSliderOrbitWaveX->setStartPos(sliderPosStart); | |||
| fSliderOrbitWaveX->setEndPos(sliderPosEnd); | |||
| fSliderOrbitWaveX->setRange(1.0f, 4.0f); | |||
| fSliderOrbitWaveX->setStep(1.0f); | |||
| fSliderOrbitWaveX->setValue(3.0f); | |||
| fSliderOrbitWaveX->setCallback(this); | |||
| // slider OrbitWaveY | |||
| sliderPosStart.setX(503); | |||
| sliderPosEnd.setX(503+48); | |||
| fSliderOrbitWaveY = new ImageSlider(this, sliderImage); | |||
| fSliderOrbitWaveY->setStartPos(sliderPosStart); | |||
| fSliderOrbitWaveY->setEndPos(sliderPosEnd); | |||
| fSliderOrbitWaveY->setRange(1.0f, 4.0f); | |||
| fSliderOrbitWaveY->setStep(1.0f); | |||
| fSliderOrbitWaveY->setValue(3.0f); | |||
| fSliderOrbitWaveY->setCallback(this); | |||
| // slider OrbitPhaseX | |||
| sliderPosStart.setX(410); | |||
| sliderPosStart.setY(345); | |||
| sliderPosEnd.setX(410+48); | |||
| sliderPosEnd.setY(345); | |||
| fSliderOrbitPhaseX = new ImageSlider(this, sliderImage); | |||
| fSliderOrbitPhaseX->setStartPos(sliderPosStart); | |||
| fSliderOrbitPhaseX->setEndPos(sliderPosEnd); | |||
| fSliderOrbitPhaseX->setRange(0.0f, 1.0f); | |||
| //fSliderOrbitPhaseX->setStep(1.0f); // FIXME? | |||
| fSliderOrbitPhaseX->setValue(0.0f); | |||
| fSliderOrbitPhaseX->setCallback(this); | |||
| // slider OrbitPhaseY | |||
| sliderPosStart.setX(503); | |||
| sliderPosEnd.setX(503+48); | |||
| fSliderOrbitPhaseY = new ImageSlider(this, sliderImage); | |||
| fSliderOrbitPhaseY->setStartPos(sliderPosStart); | |||
| fSliderOrbitPhaseY->setEndPos(sliderPosEnd); | |||
| fSliderOrbitPhaseY->setRange(0.0f, 1.0f); | |||
| //fSliderOrbitPhaseY->setStep(1.0f); // FIXME? | |||
| fSliderOrbitPhaseY->setValue(0.0f); | |||
| fSliderOrbitPhaseY->setCallback(this); | |||
| //knobs graphics | |||
| oX = 25; //offset | |||
| oY = 480; | |||
| mX = 113-oX; //margin | |||
| mY = 545-oY; | |||
| oX-=9; | |||
| oY-=9; | |||
| page = 0; | |||
| //synth Knobs | |||
| for (int x=0; x<8; x++) { | |||
| fKnobsSynth[x] = new ImageKnob(this, knob2Image); | |||
| fKnobsSynth[x]->setAbsolutePos(oX+mX*x, oY); | |||
| //fKnobsSynth[x]->setStep(1.0f); | |||
| fKnobsSynth[x]->setRange(0.0f, 1.0f); | |||
| fKnobsSynth[x]->setValue(0.5f); | |||
| fKnobsSynth[x]->setRotationAngle(270); | |||
| fKnobsSynth[x]->setCallback(this); | |||
| } | |||
| //default synthData | |||
| for (int x=0; x<8; x++) | |||
| for (int y=0; y<8; y++) | |||
| synthData[x][y] = 0.5; | |||
| //default squares | |||
| oX = 20; | |||
| oY = 47; | |||
| mX = 372/8; | |||
| for (int x=0; x<8; x++) { | |||
| for (int y=0; y<8; y++) { | |||
| squares[x][y].timer = 0; | |||
| squares[x][y].maxTimer = d_getSampleRate()/8000; | |||
| squares[x][y].x=oX+mX*x; | |||
| squares[x][y].y=oY+mX*y; | |||
| squares[x][y].size = mX; | |||
| } | |||
| } | |||
| tabOX = 15; | |||
| tabOY = 552; | |||
| tabW = 64; | |||
| tabH = 5; | |||
| tabPosX = tabOX; | |||
| tabTargetPosX = tabPosX; | |||
| tabMarginX = 103-tabOX; | |||
| // set default values | |||
| d_programChanged(0); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void GrooveJuiceUI::d_parameterChanged(uint32_t index, float value) | |||
| { | |||
| if (index<17 || index>=17+64) { | |||
| switch (index) | |||
| { | |||
| case GrooveJuicePlugin::paramX: | |||
| if (paramX != value) | |||
| { | |||
| paramX = value; | |||
| fDragValid = false; | |||
| repaint(); | |||
| } | |||
| break; | |||
| case GrooveJuicePlugin::paramY: | |||
| if (paramY != value) | |||
| { | |||
| paramY = value; | |||
| fDragValid = false; | |||
| repaint(); | |||
| } | |||
| break; | |||
| case GrooveJuicePlugin::paramOrbitSizeX: | |||
| fKnobOrbitSizeX->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramOrbitSizeY: | |||
| fKnobOrbitSizeY->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramOrbitSpeedX: | |||
| fKnobOrbitSpeedX->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramOrbitSpeedY: | |||
| fKnobOrbitSpeedY->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramSubOrbitSize: | |||
| fKnobSubOrbitSize->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramSubOrbitSpeed: | |||
| fKnobSubOrbitSpeed->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramSubOrbitSmooth: | |||
| fKnobSubOrbitSmooth->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramOrbitWaveX: | |||
| fSliderOrbitWaveX->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramOrbitWaveY: | |||
| fSliderOrbitWaveY->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramOrbitPhaseX: | |||
| fSliderOrbitPhaseX->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramOrbitPhaseY: | |||
| fSliderOrbitPhaseY->setValue(value); | |||
| break; | |||
| case GrooveJuicePlugin::paramOrbitOutX: | |||
| if (orbitX != value) | |||
| { | |||
| orbitX = value; | |||
| repaint(); | |||
| } | |||
| break; | |||
| case GrooveJuicePlugin::paramOrbitOutY: | |||
| if (orbitY != value) | |||
| { | |||
| orbitY = value; | |||
| repaint(); | |||
| } | |||
| break; | |||
| case GrooveJuicePlugin::paramSubOrbitOutX: | |||
| if (subOrbitX != value) | |||
| { | |||
| subOrbitX = value; | |||
| repaint(); | |||
| } | |||
| break; | |||
| case GrooveJuicePlugin::paramSubOrbitOutY: | |||
| if (subOrbitY != value) | |||
| { | |||
| subOrbitY = value; | |||
| repaint(); | |||
| } | |||
| break; | |||
| case GrooveJuicePlugin::paramW1Out: | |||
| synthSound[0] = value; | |||
| repaint(); | |||
| break; | |||
| case GrooveJuicePlugin::paramW2Out: | |||
| synthSound[1] = value; | |||
| repaint(); | |||
| break; | |||
| case GrooveJuicePlugin::paramMOut: | |||
| synthSound[2] = value; | |||
| repaint(); | |||
| break; | |||
| case GrooveJuicePlugin::paramCOut: | |||
| synthSound[3] = value; | |||
| repaint(); | |||
| break; | |||
| case GrooveJuicePlugin::paramROut: | |||
| synthSound[4] = value; | |||
| repaint(); | |||
| break; | |||
| case GrooveJuicePlugin::paramSOut: | |||
| synthSound[5] = value; | |||
| repaint(); | |||
| break; | |||
| case GrooveJuicePlugin::paramReOut: | |||
| synthSound[6] = value; | |||
| repaint(); | |||
| break; | |||
| case GrooveJuicePlugin::paramShOut: | |||
| synthSound[7] = value; | |||
| repaint(); | |||
| break; | |||
| } | |||
| } else { | |||
| //synth param changed | |||
| int num = (index-17); //synth params begin on #17 | |||
| int x = num%8; //synth param | |||
| //synth page | |||
| int y = (num-(num%8))/8; | |||
| synthData[x][y] = value; | |||
| } | |||
| } | |||
| void GrooveJuiceUI::d_programChanged(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| paramX = paramY = 0.5f; | |||
| fKnobOrbitSpeedX->setValue(4.0f); | |||
| fKnobOrbitSpeedY->setValue(4.0f); | |||
| fKnobOrbitSizeX->setValue(1.0f); | |||
| fKnobOrbitSizeY->setValue(1.0f); | |||
| fKnobSubOrbitSize->setValue(1.0f); | |||
| fKnobSubOrbitSpeed->setValue(32.0f); | |||
| fKnobSubOrbitSmooth->setValue(0.5f); | |||
| fSliderOrbitWaveX->setValue(3.0f); | |||
| fSliderOrbitWaveY->setValue(3.0f); | |||
| fSliderOrbitPhaseX->setValue(0.0f); | |||
| fSliderOrbitPhaseY->setValue(0.0f); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void GrooveJuiceUI::imageButtonClicked(ImageButton* button, int) | |||
| { | |||
| if (button == fButtonAbout) | |||
| fAboutWindow.exec(); | |||
| if (button == fButtonRandomize) { | |||
| for (int y=0; y<8; y++) { | |||
| for (int x=0; x<8; x++) { | |||
| synthData[x][y] = getRandom(); | |||
| d_setParameterValue(17+y*8+x, synthData[x][y]); | |||
| } | |||
| } | |||
| for (int x=0; x<8; x++) { | |||
| fKnobsSynth[x]->setValue(synthData[x][page]); | |||
| } | |||
| } | |||
| for (int i=0; i<8; i++) { | |||
| if (button == fButtonsPage[i]) { | |||
| page = i; | |||
| tabTargetPosX = tabOX+page*tabMarginX; | |||
| for (int x=0; x<8; x++) { | |||
| fKnobsSynth[x]->setValue(synthData[x][page]); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| void GrooveJuiceUI::imageKnobDragStarted(ImageKnob* knob) | |||
| { | |||
| if (knob == fKnobOrbitSpeedX) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitSpeedX, true); | |||
| else if (knob == fKnobOrbitSpeedY) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitSpeedY, true); | |||
| else if (knob == fKnobOrbitSizeX) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitSizeX, true); | |||
| else if (knob == fKnobOrbitSizeY) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitSizeY, true); | |||
| else if (knob == fKnobSubOrbitSize) | |||
| d_editParameter(GrooveJuicePlugin::paramSubOrbitSize, true); | |||
| else if (knob == fKnobSubOrbitSpeed) | |||
| d_editParameter(GrooveJuicePlugin::paramSubOrbitSpeed, true); | |||
| else if (knob == fKnobSubOrbitSmooth) | |||
| d_editParameter(GrooveJuicePlugin::paramSubOrbitSmooth, true); | |||
| for (int i=0; i<8; i++) { | |||
| if (knob== fKnobsSynth[i]) { | |||
| d_editParameter(i+17+(page*8), true); | |||
| } | |||
| } | |||
| } | |||
| void GrooveJuiceUI::imageKnobDragFinished(ImageKnob* knob) | |||
| { | |||
| if (knob == fKnobOrbitSpeedX) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitSpeedX, false); | |||
| else if (knob == fKnobOrbitSpeedY) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitSpeedY, false); | |||
| else if (knob == fKnobOrbitSizeX) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitSizeX, false); | |||
| else if (knob == fKnobOrbitSizeY) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitSizeY, false); | |||
| else if (knob == fKnobSubOrbitSize) | |||
| d_editParameter(GrooveJuicePlugin::paramSubOrbitSize, false); | |||
| else if (knob == fKnobSubOrbitSpeed) | |||
| d_editParameter(GrooveJuicePlugin::paramSubOrbitSpeed, false); | |||
| else if (knob == fKnobSubOrbitSmooth) | |||
| d_editParameter(GrooveJuicePlugin::paramSubOrbitSmooth, false); | |||
| for (int i=0; i<8; i++) { | |||
| if (knob== fKnobsSynth[i]) { | |||
| d_editParameter(i+17+page*8, false); | |||
| } | |||
| } | |||
| } | |||
| void GrooveJuiceUI::imageKnobValueChanged(ImageKnob* knob, float value) | |||
| { | |||
| if (knob == fKnobOrbitSpeedX) | |||
| d_setParameterValue(GrooveJuicePlugin::paramOrbitSpeedX, value); | |||
| else if (knob == fKnobOrbitSpeedY) | |||
| d_setParameterValue(GrooveJuicePlugin::paramOrbitSpeedY, value); | |||
| else if (knob == fKnobOrbitSizeX) | |||
| d_setParameterValue(GrooveJuicePlugin::paramOrbitSizeX, value); | |||
| else if (knob == fKnobOrbitSizeY) | |||
| d_setParameterValue(GrooveJuicePlugin::paramOrbitSizeY, value); | |||
| else if (knob == fKnobSubOrbitSize) | |||
| d_setParameterValue(GrooveJuicePlugin::paramSubOrbitSize, value); | |||
| else if (knob == fKnobSubOrbitSpeed) | |||
| d_setParameterValue(GrooveJuicePlugin::paramSubOrbitSpeed, value); | |||
| else if (knob == fKnobSubOrbitSmooth) | |||
| d_setParameterValue(GrooveJuicePlugin::paramSubOrbitSmooth, value); | |||
| for (int i=0; i<8; i++) { | |||
| if (knob== fKnobsSynth[i]) { | |||
| synthData[i][page] = value; | |||
| d_setParameterValue(i+17+page*8, value); | |||
| } | |||
| } | |||
| } | |||
| void GrooveJuiceUI::imageSliderDragStarted(ImageSlider* slider) | |||
| { | |||
| if (slider == fSliderOrbitWaveX) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitWaveX, true); | |||
| else if (slider == fSliderOrbitWaveY) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitWaveY, true); | |||
| else if (slider == fSliderOrbitPhaseX) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitPhaseX, true); | |||
| else if (slider == fSliderOrbitPhaseY) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitPhaseY, true); | |||
| } | |||
| void GrooveJuiceUI::imageSliderDragFinished(ImageSlider* slider) | |||
| { | |||
| if (slider == fSliderOrbitWaveX) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitWaveX, false); | |||
| else if (slider == fSliderOrbitWaveY) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitWaveY, false); | |||
| else if (slider == fSliderOrbitPhaseX) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitPhaseX, false); | |||
| else if (slider == fSliderOrbitPhaseY) | |||
| d_editParameter(GrooveJuicePlugin::paramOrbitPhaseY, false); | |||
| } | |||
| void GrooveJuiceUI::imageSliderValueChanged(ImageSlider* slider, float value) | |||
| { | |||
| if (slider == fSliderOrbitWaveX) | |||
| d_setParameterValue(GrooveJuicePlugin::paramOrbitWaveX, value); | |||
| else if (slider == fSliderOrbitWaveY) | |||
| d_setParameterValue(GrooveJuicePlugin::paramOrbitWaveY, value); | |||
| else if (slider == fSliderOrbitPhaseX) | |||
| d_setParameterValue(GrooveJuicePlugin::paramOrbitPhaseX, value); | |||
| else if (slider == fSliderOrbitPhaseY) | |||
| d_setParameterValue(GrooveJuicePlugin::paramOrbitPhaseY, value); | |||
| } | |||
| void GrooveJuiceUI::onDisplay() | |||
| { | |||
| fImgBackground.draw(); | |||
| /* | |||
| // TESTING - remove later | |||
| // this paints the 'fCanvasArea' so we can clearly see its bounds | |||
| { | |||
| const int x = fCanvasArea.getX(); | |||
| const int y = fCanvasArea.getY(); | |||
| const int w = fCanvasArea.getWidth(); | |||
| const int h = fCanvasArea.getHeight(); | |||
| glColor4f(0.0f, 1.0f, 0.0f, 0.1f); | |||
| glBegin(GL_QUADS); | |||
| glTexCoord2f(0.0f, 0.0f); | |||
| glVertex2i(x, y); | |||
| glTexCoord2f(1.0f, 0.0f); | |||
| glVertex2i(x+w, y); | |||
| glTexCoord2f(1.0f, 1.0f); | |||
| glVertex2i(x+w, y+h); | |||
| glTexCoord2f(0.0f, 1.0f); | |||
| glVertex2i(x, y+h); | |||
| glEnd(); | |||
| // reset color | |||
| glColor4f(1.0f, 1.0f, 1.0f, 1.0f); | |||
| } | |||
| */ | |||
| // get x, y mapped to XY area | |||
| int x = fCanvasArea.getX() + paramX*fCanvasArea.getWidth() - fImgRoundlet.getWidth()/2; | |||
| int y = fCanvasArea.getY() + paramY*fCanvasArea.getHeight() - fImgRoundlet.getHeight()/2; | |||
| int nOrbitX = fCanvasArea.getX()+((orbitX)*fCanvasArea.getWidth())-15; | |||
| int nOrbitY = fCanvasArea.getY()+((orbitY)*fCanvasArea.getWidth())-15; | |||
| int nSubOrbitX = fCanvasArea.getX()+(subOrbitX*fCanvasArea.getWidth())-15; | |||
| int nSubOrbitY = fCanvasArea.getY()+(subOrbitY*fCanvasArea.getWidth())-14; | |||
| //draw lines, just for fun | |||
| glEnable(GL_BLEND); | |||
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |||
| glColor4f(0.0f, 1.0f, 0.0f, 0.05f); | |||
| glLineWidth(4); | |||
| glBegin(GL_LINES); | |||
| glVertex2i(x+ fImgRoundlet.getWidth()/2, y+ fImgRoundlet.getHeight()/2); | |||
| glVertex2i(nOrbitX+15, nOrbitY+15); | |||
| glEnd(); | |||
| glBegin(GL_LINES); | |||
| glVertex2i(nOrbitX+15, nOrbitY+15); | |||
| glVertex2i(nSubOrbitX+15, nSubOrbitY+14); | |||
| glEnd(); | |||
| //draw tab highlight | |||
| tabPosX -= (tabPosX-tabTargetPosX)/3; | |||
| glColor4f(0.5f, 0.5f, 1.0f, 1.0f); | |||
| glBegin(GL_POLYGON); | |||
| glVertex2i(tabPosX, tabOY); | |||
| glVertex2i(tabPosX+tabW, tabOY); | |||
| glVertex2i(tabPosX+tabW, tabOY+tabH); | |||
| glVertex2i(tabPosX, tabOY+tabH); | |||
| glEnd(); | |||
| //draw real knob values | |||
| int kPosX = 6; | |||
| int kPosY = 550; | |||
| int kH = 112; | |||
| int kW = 83; | |||
| int kM = 94-kPosX; | |||
| glColor4f(1.0f, 1.0f, 1.0f, 0.1f); | |||
| for (int i=0; i<8; i++) { | |||
| glBegin(GL_POLYGON); | |||
| glVertex2i(kPosX+kM*i, kPosY); | |||
| glVertex2i(kPosX+kM*i+kW, kPosY); | |||
| glVertex2i(kPosX+kM*i+kW, kPosY-synthSound[i]*kH); | |||
| glVertex2i(kPosX+kM*i, kPosY-synthSound[i]*kH); | |||
| glEnd(); | |||
| } | |||
| /*for (int x=0; x<8; x++) { | |||
| for (int y=0; y<8; y++) { | |||
| if (isWithinSquare(orbitX, orbitY, x/8.0, y/8.0)) { | |||
| if (squares[x][y].timer<squares[x][y].maxTimer) { | |||
| squares[x][y].timer++; | |||
| } | |||
| } else { | |||
| if (squares[x][y].timer>0) { | |||
| squares[x][y].timer--; | |||
| } | |||
| } | |||
| if (squares[x][y].timer>0) { | |||
| //draw this square | |||
| glColor4f(0.0f, 1.0f, 0.0f, squares[x][y].timer/squares[x][y].maxTimer/8); | |||
| //printf("blend: %f\n", squares[x][y].timer/squares[x][y].maxTimer); | |||
| glBegin(GL_POLYGON); | |||
| glVertex2i(squares[x][y].x, squares[x][y].y); | |||
| glVertex2i(squares[x][y].x+squares[x][y].size, squares[x][y].y); | |||
| glVertex2i(squares[x][y].x+squares[x][y].size, squares[x][y].y+squares[x][y].size); | |||
| glVertex2i(squares[x][y].x, squares[x][y].y+squares[x][y].size); | |||
| glEnd(); | |||
| } | |||
| } | |||
| }*/ | |||
| // reset color | |||
| glColor4f(1.0f, 1.0f, 1.0f, 1.0f); | |||
| // draw roundlet and orbits | |||
| fImgRoundlet.drawAt(x, y); | |||
| fImgOrbit.drawAt(nOrbitX, nOrbitY); | |||
| fImgSubOrbit.drawAt(nSubOrbitX, nSubOrbitY); | |||
| } | |||
| bool GrooveJuiceUI::onMouse(const MouseEvent& ev) | |||
| { | |||
| if (ev.button != 1) | |||
| return false; | |||
| if (ev.press) | |||
| { | |||
| if (! fCanvasArea.contains(ev.pos)) | |||
| return false; | |||
| fDragging = true; | |||
| fDragValid = true; | |||
| fLastX = ev.pos.getX(); | |||
| fLastY = ev.pos.getY(); | |||
| return true; | |||
| } | |||
| else if (fDragging) | |||
| { | |||
| fDragging = false; | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| bool GrooveJuiceUI::onMotion(const MotionEvent& ev) | |||
| { | |||
| if (! fDragging) | |||
| return false; | |||
| const int x = ev.pos.getX(); | |||
| const int y = ev.pos.getY(); | |||
| if (! fDragValid) | |||
| { | |||
| fDragValid = true; | |||
| fLastX = x; | |||
| fLastY = y; | |||
| } | |||
| const int movedX = fLastX - x; | |||
| const int movedY = fLastY - y; | |||
| fLastX = x; | |||
| fLastY = y; | |||
| float newX = paramX; | |||
| float newY = paramY; | |||
| newX -= float(movedX)/fCanvasArea.getWidth(); | |||
| newY -= float(movedY)/fCanvasArea.getHeight(); | |||
| if (newX < 0.0f) | |||
| newX = 0.0f; | |||
| else if (newX > 1.0f) | |||
| newX = 1.0f; | |||
| if (newY < 0.0f) | |||
| newY = 0.0f; | |||
| else if (newY > 1.0f) | |||
| newY = 1.0f; | |||
| if (newX != paramX) | |||
| { | |||
| paramX = newX; | |||
| d_setParameterValue(GrooveJuicePlugin::paramX, paramX); | |||
| repaint(); | |||
| } | |||
| if (newY != paramY) | |||
| { | |||
| paramY = newY; | |||
| d_setParameterValue(GrooveJuicePlugin::paramY, paramY); | |||
| repaint(); | |||
| } | |||
| return true; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| UI* createUI() | |||
| { | |||
| return new GrooveJuiceUI(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,155 +0,0 @@ | |||
| /* | |||
| * Vector Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #ifndef GROOVEJUICEUI_HPP_INCLUDED | |||
| #define GROOVEJUICEUI_HPP_INCLUDED | |||
| #include "DistrhoUI.hpp" | |||
| #include "Geometry.hpp" | |||
| #include "ImageAboutWindow.hpp" | |||
| #include "ImageButton.hpp" | |||
| #include "ImageKnob.hpp" | |||
| #include "ImageSlider.hpp" | |||
| #include "GrooveJuiceArtwork.hpp" | |||
| #include "GrooveJuicePlugin.hpp" | |||
| using DGL::Image; | |||
| using DGL::ImageAboutWindow; | |||
| using DGL::ImageButton; | |||
| using DGL::ImageKnob; | |||
| using DGL::ImageSlider; | |||
| using DGL::Rectangle; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class GrooveJuiceUI : public UI, | |||
| public ImageButton::Callback, | |||
| public ImageKnob::Callback, | |||
| public ImageSlider::Callback | |||
| { | |||
| public: | |||
| GrooveJuiceUI(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| uint d_getWidth() const noexcept override | |||
| { | |||
| return GrooveJuiceArtwork::backgroundWidth; | |||
| } | |||
| uint d_getHeight() const noexcept override | |||
| { | |||
| return GrooveJuiceArtwork::backgroundHeight; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void d_parameterChanged(uint32_t index, float value) override; | |||
| void d_programChanged(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void imageButtonClicked(ImageButton* button, int) override; | |||
| void imageKnobDragStarted(ImageKnob* knob) override; | |||
| void imageKnobDragFinished(ImageKnob* knob) override; | |||
| void imageKnobValueChanged(ImageKnob* knob, float value) override; | |||
| void imageSliderDragStarted(ImageSlider* slider) override; | |||
| void imageSliderDragFinished(ImageSlider* slider) override; | |||
| void imageSliderValueChanged(ImageSlider* slider, float value) override; | |||
| void onDisplay() override; | |||
| bool onMouse(const MouseEvent&) override; | |||
| bool onMotion(const MotionEvent&) override; | |||
| private: | |||
| float paramX, paramY; | |||
| Image fImgBackground; | |||
| Image fImgRoundlet; | |||
| Image fImgOrbit; | |||
| Image fImgSubOrbit; | |||
| ImageAboutWindow fAboutWindow; | |||
| //knobs | |||
| ScopedPointer<ImageKnob> fKnobOrbitSpeedX, fKnobOrbitSpeedY; | |||
| ScopedPointer<ImageKnob> fKnobOrbitSizeX, fKnobOrbitSizeY; | |||
| ScopedPointer<ImageKnob> fKnobSubOrbitSpeed, fKnobSubOrbitSize, fKnobSubOrbitSmooth; | |||
| ScopedPointer<ImageKnob> fKnobsSynth[8]; | |||
| int page; | |||
| struct square { | |||
| float timer; | |||
| float maxTimer; | |||
| int x; | |||
| int y; | |||
| int size; | |||
| } squares[8][8]; | |||
| //sliders | |||
| ScopedPointer<ImageSlider> fSliderOrbitWaveX, fSliderOrbitWaveY; | |||
| ScopedPointer<ImageSlider> fSliderOrbitPhaseX, fSliderOrbitPhaseY; | |||
| ScopedPointer<ImageButton> fButtonAbout; | |||
| ScopedPointer<ImageButton> fButtonRandomize; | |||
| ScopedPointer<ImageButton> fButtonsPage[8]; | |||
| int tabOX; | |||
| int tabOY; | |||
| int tabW; | |||
| int tabH; | |||
| float tabPosX; | |||
| float tabTargetPosX; | |||
| int tabMarginX; | |||
| float getRandom() { | |||
| return static_cast <float> (rand()) / static_cast <float> (RAND_MAX); | |||
| } | |||
| // needed for XY canvas handling | |||
| bool fDragging; | |||
| bool fDragValid; | |||
| int fLastX; | |||
| int fLastY; | |||
| Rectangle<int> fCanvasArea; | |||
| float orbitX, orbitY, subOrbitX, subOrbitY; | |||
| float synthData[8][8]; //as per gui, [param][page] | |||
| float synthSound[8]; | |||
| bool isWithinSquare(float x, float y, float sX, float sY) { | |||
| if (x>=sX && x<sX+0.125) | |||
| if (y>=sY && y<sY+0.125) | |||
| return true; | |||
| return false; | |||
| }; | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // GROOVEJUICEUI_HPP_INCLUDED | |||
| @@ -1,243 +0,0 @@ | |||
| /* | |||
| * Segment Synthesizer Design | |||
| * Implemented by Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz . | |||
| * | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| */ | |||
| #ifndef SYNTH_HXX_INCLUDED | |||
| #define SYNTH_HXX_INCLUDED | |||
| #include <cmath> | |||
| #include <cstdlib> | |||
| class CSynth | |||
| { | |||
| public: | |||
| CSynth() | |||
| { | |||
| waveBlend = 0; | |||
| freq = 0; | |||
| phaseAccum = 0; | |||
| playing = false; | |||
| cycleSize = 0; | |||
| sampleRate = 0; | |||
| notePlaying = 0; | |||
| env = 0; | |||
| envPhase = 0; | |||
| aCoeff=dCoeff=rCoeff=0; | |||
| stereo = 0; | |||
| shape = 0.5; | |||
| sustain=release=0.5f; | |||
| attack=0.1f; | |||
| sustain=0.0f; | |||
| mAmp = 0.5; | |||
| freqOffset = 0; | |||
| waves[0] = 0; | |||
| waves[1] = 0; | |||
| srand (static_cast <unsigned> (time(0))); | |||
| } | |||
| float getSinePhase(float x) { | |||
| return -(std::sin(x)); | |||
| } | |||
| float getSawPhase(float x) { | |||
| return (-(2/M_PI *std::atan(1/std::tan(x/2)))); | |||
| } | |||
| float getRevSawPhase(float x) { | |||
| return ((2/M_PI *std::atan(1/std::tan(x/2)))); | |||
| } | |||
| float getSquarePhase(float x) { | |||
| return (std::round((std::sin(x)+1)/2)-0.5)*2; | |||
| } | |||
| //saw, sqr, sin, revSaw | |||
| float getBlendedPhase(float x, float wave) | |||
| { | |||
| //wave = 2; | |||
| if (wave>=1 && wave<2) { | |||
| /* saw vs sqr */ | |||
| waveBlend = wave-1; | |||
| return (getSawPhase(x)*(1-waveBlend) + getSquarePhase(x)*waveBlend); | |||
| } else if (wave>=2 && wave<3) { | |||
| /* sqr vs sin */ | |||
| waveBlend = wave-2; | |||
| return (getSquarePhase(x)*(1-waveBlend) + getSinePhase(x)*waveBlend); | |||
| } else if (wave>=3 && wave<=4) { | |||
| /* sin vs revSaw */ | |||
| waveBlend = wave-3; | |||
| return (getSinePhase(x)*(1-waveBlend) + getRevSawPhase(x)*waveBlend); | |||
| } else { | |||
| return 0.0f; | |||
| } | |||
| } | |||
| void setWave(int n, float nWave) { | |||
| waves[n] = nWave; | |||
| } | |||
| void setStereo(float nStereo) { | |||
| stereo = nStereo; | |||
| if (playing) { | |||
| freq = 440.0 * pow(2.0, (notePlaying - 69)/12); | |||
| freq += freq*(stereo/12); | |||
| } | |||
| } | |||
| float getRandom() { | |||
| return static_cast <float> (rand()) / static_cast <float> (RAND_MAX); | |||
| } | |||
| void setSustain(float nSustain) { | |||
| sustain = nSustain*4; | |||
| } | |||
| void setDecay(float nDecay) { | |||
| decay = nDecay*sampleRate; | |||
| } | |||
| void setRelease(float nRelease) { | |||
| release = nRelease*sampleRate/4; | |||
| } | |||
| void setShape(float nShape) { | |||
| shape = nShape; | |||
| } | |||
| void setMix(float nMix) { | |||
| mix = nMix; | |||
| } | |||
| void setCut(float nCut) { | |||
| cut = nCut; | |||
| } | |||
| void setReso(float nReso) { | |||
| reso = nReso; | |||
| } | |||
| float getWave(int i) { | |||
| return waves[i]; | |||
| } | |||
| void stop(int note) { | |||
| if (note==notePlaying) { | |||
| envPhase = 2; //release | |||
| } | |||
| } | |||
| void play(float note) { | |||
| notePlaying = note; | |||
| freq = 440.0 * pow(2.0, (notePlaying - 69)/12); | |||
| freq += freq*(freqOffset); | |||
| freq += freq*(stereo/12); | |||
| cycleSize = sampleRate/(freq/4); | |||
| playing = true; | |||
| phaseAccum = getRandom()*cycleSize; | |||
| //phaseAccum = 0; | |||
| env = 0.0f; | |||
| envPhase = 0; | |||
| //env init | |||
| decay = 1*sampleRate; | |||
| aCoeff = 1.0f - expf(-1/attack*16); | |||
| dCoeff = 1.0f - expf(-1/(decay/8)); | |||
| rCoeff = 1.0f - expf(-1/(release)); | |||
| } | |||
| float run() { | |||
| float out = 0; | |||
| if (playing) { | |||
| out = getSinePhase((phaseAccum/cycleSize)*(2*M_PI))*0.5; | |||
| //out += getSinePhase((phaseAccum/cycleSize)*2*(2*M_PI))*amps[0]*0.5; | |||
| //out = getSinePhase((phaseAccum/cycleSize)*2*M_PI); | |||
| //printf("out: %f\n", (waves[0]*3)); | |||
| //printf("out: %f\n", phaseAccum); | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*2*M_PI, (waves[0]*3)+1); | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*4*M_PI, (waves[0]*3)+1)*(sustain/4); | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*8*M_PI, (waves[0]*3)+1)*(sustain/4); | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*16*M_PI, (waves[0]*3)+1)*(sustain/4)/2; | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*6*M_PI, (waves[0]*3)+1)*shape; | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*12*M_PI, (waves[0]*3)+1)*(1-shape)/2; | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*3*M_PI, (waves[0]*3)+1)*(1-mix); | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*4*M_PI, (waves[1]*3)+1); | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*2*M_PI*(getBlendedPhase((phaseAccum/cycleSize)*M_PI, (waves[1]*3)+1)), (waves[1]*3)+1)*mix; | |||
| //printf("out: %f\n", waves[0]*4); | |||
| //std::cout << (waves[0]*3)+1 << std::endl; | |||
| phaseAccum++; | |||
| if (phaseAccum>cycleSize) { | |||
| phaseAccum = 0; | |||
| } | |||
| //calculate amplitude envelope | |||
| if (envPhase==0) { | |||
| //attack phase | |||
| env+=aCoeff * ((1.0/0.63) - env); | |||
| if (env>1.0) envPhase+=2; | |||
| } else if (envPhase==1) { | |||
| //decay and sustain phase | |||
| env+=dCoeff * (sustain/4 - env); | |||
| } else { | |||
| //release phase | |||
| env += rCoeff * (1.0-(1.0/0.63) - env); | |||
| if (env<0.0) { playing = false; env = 0.0; } | |||
| } | |||
| //apply amplitude envelope | |||
| out*=env; | |||
| //apply master volume | |||
| //out*=mAmp*0.5; | |||
| //apply hard clipping | |||
| //if (out>1) out=1; | |||
| //if (out<-1) out=-1; | |||
| if (out!=0) { | |||
| //printf("out: %f\n", out); | |||
| } | |||
| } | |||
| return out; | |||
| } | |||
| void setSampleRate(float sr) { | |||
| sampleRate = sr; | |||
| attack = sampleRate/2; | |||
| decay = sampleRate/2; | |||
| release = sampleRate/2; | |||
| } | |||
| private: | |||
| /* vcf filter */ | |||
| float waves[2]; | |||
| float waveBlend; | |||
| float freq; | |||
| float freqOffset; | |||
| float stereo; | |||
| float mAmp; | |||
| float phaseAccum; | |||
| float cycleSize; | |||
| float sampleRate; | |||
| float notePlaying; | |||
| bool playing; | |||
| float mix; | |||
| float reso; | |||
| float cut; | |||
| float shape; | |||
| float attack, decay, sustain, release; | |||
| float env; | |||
| float envPhase; //0, 1(d+s), 2 | |||
| float aCoeff, dCoeff, rCoeff, gCoeff; | |||
| }; | |||
| #endif // SYNTH_HXX_INCLUDED | |||
| @@ -1,76 +0,0 @@ | |||
| /* | |||
| * Moog-like resonant LPF | |||
| * Implemented by Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz . | |||
| * | |||
| * Filter design from http://www.musicdsp.com . | |||
| */ | |||
| #ifndef MOOG_VCF_HXX_INCLUDED | |||
| #define MOOG_VCF_HXX_INCLUDED | |||
| #include <cmath> | |||
| #include <cstdlib> | |||
| class MoogVCF | |||
| { | |||
| public: | |||
| MoogVCF() | |||
| { | |||
| cutoff = 16000; | |||
| res = 0.5; | |||
| f=k=p=scale=r=0; | |||
| y1=y2=y3=y4=oldIn=oldY1=oldY2=oldY3=0; | |||
| in=oldIn=0; | |||
| pureInput=drivenInput=processedInput=0; | |||
| } | |||
| void recalc(float cutoff, float reso, int sr, float nDrive) | |||
| { | |||
| f = 2*cutoff/sr; | |||
| k=2*std::sin(f*M_PI/2)-1; | |||
| p = (k+1)*0.5; | |||
| scale = std::pow(2.71828, (1-p)*1.386249); | |||
| r = reso*scale; | |||
| drive = nDrive; | |||
| } | |||
| float process (float input) | |||
| { | |||
| //run the shit | |||
| //for (long i=0; i<frames; i++) | |||
| //{ | |||
| pureInput = input; //clean signal | |||
| drivenInput = std::tanh(pureInput*(drive*15+1)) * (drive); //a touch of waveshaping | |||
| processedInput = pureInput*(1-drive) + drivenInput; // combine | |||
| processedInput*=1-drive/3; //reduce gain a little | |||
| /* filter */ | |||
| in = processedInput-r*y4; | |||
| y1 = in*p + oldIn*p - k*y1; | |||
| y2 = y1*p + oldY1*p - k*y2; | |||
| y3 = y2*p + oldY2*p - k*y3; | |||
| y4 = y3*p + oldY3*p - k*y4; | |||
| oldIn = in; | |||
| oldY1 = y1; | |||
| oldY2 = y2; | |||
| oldY3 = y3; | |||
| /* output */ | |||
| return y4; | |||
| //} | |||
| } | |||
| private: | |||
| /* vcf filter */ | |||
| float cutoff; //freq in Hz | |||
| float res; //resonance 0..1 | |||
| float drive; //drive 1...2; | |||
| float f, k, p, scale, r; | |||
| float y1, y2, y3, y4, oldY1, oldY2, oldY3; | |||
| float in, oldIn; | |||
| /* waveshaping vars */ | |||
| float pureInput, drivenInput, processedInput; | |||
| }; | |||
| #endif // MOOG_VCF_HXX_INCLUDED | |||
| @@ -1,90 +0,0 @@ | |||
| /* (Auto-generated binary data file). */ | |||
| #ifndef BINARY_DISTRHOARTWORKNEKOBI_HPP | |||
| #define BINARY_DISTRHOARTWORKNEKOBI_HPP | |||
| namespace DistrhoArtworkNekobi | |||
| { | |||
| extern const char* aboutData; | |||
| const unsigned int aboutDataSize = 172710; | |||
| const unsigned int aboutWidth = 303; | |||
| const unsigned int aboutHeight = 190; | |||
| extern const char* aboutButtonHoverData; | |||
| const unsigned int aboutButtonHoverDataSize = 5888; | |||
| const unsigned int aboutButtonHoverWidth = 92; | |||
| const unsigned int aboutButtonHoverHeight = 16; | |||
| extern const char* aboutButtonNormalData; | |||
| const unsigned int aboutButtonNormalDataSize = 5888; | |||
| const unsigned int aboutButtonNormalWidth = 92; | |||
| const unsigned int aboutButtonNormalHeight = 16; | |||
| extern const char* backgroundData; | |||
| const unsigned int backgroundDataSize = 206064; | |||
| const unsigned int backgroundWidth = 636; | |||
| const unsigned int backgroundHeight = 108; | |||
| extern const char* claw1Data; | |||
| const unsigned int claw1DataSize = 4096; | |||
| const unsigned int claw1Width = 32; | |||
| const unsigned int claw1Height = 32; | |||
| extern const char* claw2Data; | |||
| const unsigned int claw2DataSize = 4096; | |||
| const unsigned int claw2Width = 32; | |||
| const unsigned int claw2Height = 32; | |||
| extern const char* knobData; | |||
| const unsigned int knobDataSize = 10000; | |||
| const unsigned int knobWidth = 50; | |||
| const unsigned int knobHeight = 50; | |||
| extern const char* run1Data; | |||
| const unsigned int run1DataSize = 4096; | |||
| const unsigned int run1Width = 32; | |||
| const unsigned int run1Height = 32; | |||
| extern const char* run2Data; | |||
| const unsigned int run2DataSize = 4096; | |||
| const unsigned int run2Width = 32; | |||
| const unsigned int run2Height = 32; | |||
| extern const char* run3Data; | |||
| const unsigned int run3DataSize = 4096; | |||
| const unsigned int run3Width = 32; | |||
| const unsigned int run3Height = 32; | |||
| extern const char* run4Data; | |||
| const unsigned int run4DataSize = 4096; | |||
| const unsigned int run4Width = 32; | |||
| const unsigned int run4Height = 32; | |||
| extern const char* scratch1Data; | |||
| const unsigned int scratch1DataSize = 4096; | |||
| const unsigned int scratch1Width = 32; | |||
| const unsigned int scratch1Height = 32; | |||
| extern const char* scratch2Data; | |||
| const unsigned int scratch2DataSize = 4096; | |||
| const unsigned int scratch2Width = 32; | |||
| const unsigned int scratch2Height = 32; | |||
| extern const char* sitData; | |||
| const unsigned int sitDataSize = 4096; | |||
| const unsigned int sitWidth = 32; | |||
| const unsigned int sitHeight = 32; | |||
| extern const char* sliderData; | |||
| const unsigned int sliderDataSize = 6084; | |||
| const unsigned int sliderWidth = 39; | |||
| const unsigned int sliderHeight = 39; | |||
| extern const char* tailData; | |||
| const unsigned int tailDataSize = 4096; | |||
| const unsigned int tailWidth = 32; | |||
| const unsigned int tailHeight = 32; | |||
| } | |||
| #endif // BINARY_DISTRHOARTWORKNEKOBI_HPP | |||
| @@ -1,36 +0,0 @@ | |||
| /* | |||
| * DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others. | |||
| * Copyright (C) 2013-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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_NAME "Nekobi" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_SYNTH 1 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 0 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 1 | |||
| #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/plugins/Nekobi" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,401 +0,0 @@ | |||
| /* | |||
| * DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others. | |||
| * Copyright (C) 2004 Sean Bolton and others | |||
| * Copyright (C) 2013-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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #include "DistrhoPluginNekobi.hpp" | |||
| extern "C" { | |||
| #include "nekobee-src/nekobee_synth.c" | |||
| #include "nekobee-src/nekobee_voice.c" | |||
| #include "nekobee-src/nekobee_voice_render.c" | |||
| #include "nekobee-src/minblep_tables.c" | |||
| // ----------------------------------------------------------------------- | |||
| // mutual exclusion | |||
| bool dssp_voicelist_mutex_trylock(nekobee_synth_t* const synth) | |||
| { | |||
| /* Attempt the mutex lock */ | |||
| if (pthread_mutex_trylock(&synth->voicelist_mutex) != 0) | |||
| { | |||
| synth->voicelist_mutex_grab_failed = 1; | |||
| return false; | |||
| } | |||
| /* Clean up if a previous mutex grab failed */ | |||
| if (synth->voicelist_mutex_grab_failed) | |||
| { | |||
| nekobee_synth_all_voices_off(synth); | |||
| synth->voicelist_mutex_grab_failed = 0; | |||
| } | |||
| return true; | |||
| } | |||
| bool dssp_voicelist_mutex_lock(nekobee_synth_t* const synth) | |||
| { | |||
| return (pthread_mutex_lock(&synth->voicelist_mutex) == 0); | |||
| } | |||
| bool dssp_voicelist_mutex_unlock(nekobee_synth_t* const synth) | |||
| { | |||
| return (pthread_mutex_unlock(&synth->voicelist_mutex) == 0); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // nekobee_handle_raw_event | |||
| void nekobee_handle_raw_event(nekobee_synth_t* const synth, const uint8_t size, const uint8_t* const data) | |||
| { | |||
| if (size != 3) | |||
| return; | |||
| switch (data[0] & 0xf0) | |||
| { | |||
| case 0x80: | |||
| nekobee_synth_note_off(synth, data[1], data[2]); | |||
| break; | |||
| case 0x90: | |||
| if (data[2] > 0) | |||
| nekobee_synth_note_on(synth, data[1], data[2]); | |||
| else | |||
| nekobee_synth_note_off(synth, data[1], 64); /* shouldn't happen, but... */ | |||
| break; | |||
| case 0xB0: | |||
| nekobee_synth_control_change(synth, data[1], data[2]); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| } | |||
| } /* extern "C" */ | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoPluginNekobi::DistrhoPluginNekobi() | |||
| : Plugin(paramCount, 0, 0) // 0 programs, 0 states | |||
| { | |||
| nekobee_init_tables(); | |||
| // init synth | |||
| fSynth.sample_rate = d_getSampleRate(); | |||
| fSynth.deltat = 1.0f / (float)d_getSampleRate(); | |||
| fSynth.nugget_remains = 0; | |||
| fSynth.note_id = 0; | |||
| fSynth.polyphony = XSYNTH_DEFAULT_POLYPHONY; | |||
| fSynth.voices = XSYNTH_DEFAULT_POLYPHONY; | |||
| fSynth.monophonic = XSYNTH_MONO_MODE_ONCE; | |||
| fSynth.glide = 0; | |||
| fSynth.last_noteon_pitch = 0.0f; | |||
| fSynth.vcf_accent = 0.0f; | |||
| fSynth.vca_accent = 0.0f; | |||
| for (int i=0; i<8; ++i) | |||
| fSynth.held_keys[i] = -1; | |||
| fSynth.voice = nekobee_voice_new(); | |||
| fSynth.voicelist_mutex_grab_failed = 0; | |||
| pthread_mutex_init(&fSynth.voicelist_mutex, nullptr); | |||
| fSynth.channel_pressure = 0; | |||
| fSynth.pitch_wheel_sensitivity = 0; | |||
| fSynth.pitch_wheel = 0; | |||
| for (int i=0; i<128; ++i) | |||
| { | |||
| fSynth.key_pressure[i] = 0; | |||
| fSynth.cc[i] = 0; | |||
| } | |||
| fSynth.cc[7] = 127; // full volume | |||
| fSynth.mod_wheel = 1.0f; | |||
| fSynth.pitch_bend = 1.0f; | |||
| fSynth.cc_volume = 1.0f; | |||
| // Default values | |||
| fParams.waveform = 0.0f; | |||
| fParams.tuning = 0.0f; | |||
| fParams.cutoff = 25.0f; | |||
| fParams.resonance = 25.0f; | |||
| fParams.envMod = 50.0f; | |||
| fParams.decay = 75.0f; | |||
| fParams.accent = 25.0f; | |||
| fParams.volume = 75.0f; | |||
| // Internal stuff | |||
| fSynth.waveform = 0.0f; | |||
| fSynth.tuning = 1.0f; | |||
| fSynth.cutoff = 5.0f; | |||
| fSynth.resonance = 0.8f; | |||
| fSynth.envmod = 0.3f; | |||
| fSynth.decay = 0.0002f; | |||
| fSynth.accent = 0.3f; | |||
| fSynth.volume = 0.75f; | |||
| // reset | |||
| d_deactivate(); | |||
| } | |||
| DistrhoPluginNekobi::~DistrhoPluginNekobi() | |||
| { | |||
| std::free(fSynth.voice); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Init | |||
| void DistrhoPluginNekobi::d_initParameter(uint32_t index, Parameter& parameter) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramWaveform: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE|PARAMETER_IS_BOOLEAN; | |||
| parameter.name = "Waveform"; | |||
| parameter.symbol = "waveform"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramTuning: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; // was 0.5 <-> 2.0, log | |||
| parameter.name = "Tuning"; | |||
| parameter.symbol = "tuning"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -12.0f; | |||
| parameter.ranges.max = 12.0f; | |||
| break; | |||
| case paramCutoff: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; // modified x2.5 | |||
| parameter.name = "Cutoff"; | |||
| parameter.symbol = "cutoff"; | |||
| parameter.unit = "%"; | |||
| parameter.ranges.def = 25.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 100.0f; | |||
| break; | |||
| case paramResonance: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; // modified x100 | |||
| parameter.name = "VCF Resonance"; | |||
| parameter.symbol = "resonance"; | |||
| parameter.unit = "%"; | |||
| parameter.ranges.def = 25.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 95.0f; | |||
| break; | |||
| case paramEnvMod: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; // modified x100 | |||
| parameter.name = "Env Mod"; | |||
| parameter.symbol = "env_mod"; | |||
| parameter.unit = "%"; | |||
| parameter.ranges.def = 50.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 100.0f; | |||
| break; | |||
| case paramDecay: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; // was 0.000009 <-> 0.0005, log | |||
| parameter.name = "Decay"; | |||
| parameter.symbol = "decay"; | |||
| parameter.unit = "%"; | |||
| parameter.ranges.def = 75.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 100.0f; | |||
| break; | |||
| case paramAccent: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; // modified x100 | |||
| parameter.name = "Accent"; | |||
| parameter.symbol = "accent"; | |||
| parameter.unit = "%"; | |||
| parameter.ranges.def = 25.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 100.0f; | |||
| break; | |||
| case paramVolume: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; // modified x100 | |||
| parameter.name = "Volume"; | |||
| parameter.symbol = "volume"; | |||
| parameter.unit = "%"; | |||
| parameter.ranges.def = 75.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 100.0f; | |||
| break; | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Internal data | |||
| float DistrhoPluginNekobi::d_getParameterValue(uint32_t index) const | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramWaveform: | |||
| return fParams.waveform; | |||
| case paramTuning: | |||
| return fParams.tuning; | |||
| case paramCutoff: | |||
| return fParams.cutoff; | |||
| case paramResonance: | |||
| return fParams.resonance; | |||
| case paramEnvMod: | |||
| return fParams.envMod; | |||
| case paramDecay: | |||
| return fParams.decay; | |||
| case paramAccent: | |||
| return fParams.accent; | |||
| case paramVolume: | |||
| return fParams.volume; | |||
| } | |||
| return 0.0f; | |||
| } | |||
| void DistrhoPluginNekobi::d_setParameterValue(uint32_t index, float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramWaveform: | |||
| fParams.waveform = value; | |||
| fSynth.waveform = value; | |||
| DISTRHO_SAFE_ASSERT(fSynth.waveform == 0.0f || fSynth.waveform == 1.0f); | |||
| break; | |||
| case paramTuning: | |||
| fParams.tuning = value; | |||
| fSynth.tuning = (value+12.0f)/24.0f * 1.5 + 0.5f; // FIXME: log? | |||
| DISTRHO_SAFE_ASSERT(fSynth.tuning >= 0.5f && fSynth.tuning <= 2.0f); | |||
| break; | |||
| case paramCutoff: | |||
| fParams.cutoff = value; | |||
| fSynth.cutoff = value/2.5f; | |||
| DISTRHO_SAFE_ASSERT(fSynth.cutoff >= 0.0f && fSynth.cutoff <= 40.0f); | |||
| break; | |||
| case paramResonance: | |||
| fParams.resonance = value; | |||
| fSynth.resonance = value/100.0f; | |||
| DISTRHO_SAFE_ASSERT(fSynth.resonance >= 0.0f && fSynth.resonance <= 0.95f); | |||
| break; | |||
| case paramEnvMod: | |||
| fParams.envMod = value; | |||
| fSynth.envmod = value/100.0f; | |||
| DISTRHO_SAFE_ASSERT(fSynth.envmod >= 0.0f && fSynth.envmod <= 1.0f); | |||
| break; | |||
| case paramDecay: | |||
| fParams.decay = value; | |||
| fSynth.decay = value/100.0f * 0.000491f + 0.000009f; // FIXME: log? | |||
| DISTRHO_SAFE_ASSERT(fSynth.decay >= 0.000009f && fSynth.decay <= 0.0005f); | |||
| break; | |||
| case paramAccent: | |||
| fParams.accent = value; | |||
| fSynth.accent = value/100.0f; | |||
| DISTRHO_SAFE_ASSERT(fSynth.accent >= 0.0f && fSynth.accent <= 1.0f); | |||
| break; | |||
| case paramVolume: | |||
| fParams.volume = value; | |||
| fSynth.volume = value/100.0f; | |||
| DISTRHO_SAFE_ASSERT(fSynth.volume >= 0.0f && fSynth.volume <= 1.0f); | |||
| break; | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Process | |||
| void DistrhoPluginNekobi::d_activate() | |||
| { | |||
| fSynth.nugget_remains = 0; | |||
| fSynth.note_id = 0; | |||
| if (fSynth.voice != nullptr) | |||
| nekobee_synth_all_voices_off(&fSynth); | |||
| } | |||
| void DistrhoPluginNekobi::d_deactivate() | |||
| { | |||
| if (fSynth.voice != nullptr) | |||
| nekobee_synth_all_voices_off(&fSynth); | |||
| } | |||
| void DistrhoPluginNekobi::d_run(const float**, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) | |||
| { | |||
| uint32_t framesDone = 0; | |||
| uint32_t curEventIndex = 0; | |||
| uint32_t burstSize; | |||
| float* out = outputs[0]; | |||
| if (fSynth.voice == nullptr || ! dssp_voicelist_mutex_trylock(&fSynth)) | |||
| { | |||
| std::memset(out, 0, sizeof(float)*frames); | |||
| return; | |||
| } | |||
| while (framesDone < frames) | |||
| { | |||
| if (fSynth.nugget_remains == 0) | |||
| fSynth.nugget_remains = XSYNTH_NUGGET_SIZE; | |||
| /* process any ready events */ | |||
| while (curEventIndex < midiEventCount && framesDone == midiEvents[curEventIndex].frame) | |||
| { | |||
| nekobee_handle_raw_event(&fSynth, midiEvents[curEventIndex].size, midiEvents[curEventIndex].buf); | |||
| curEventIndex++; | |||
| } | |||
| /* calculate the sample count (burstSize) for the next nekobee_voice_render() call to be the smallest of: | |||
| * - control calculation quantization size (XSYNTH_NUGGET_SIZE, in samples) | |||
| * - the number of samples remaining in an already-begun nugget (synth->nugget_remains) | |||
| * - the number of samples until the next event is ready | |||
| * - the number of samples left in this run | |||
| */ | |||
| burstSize = XSYNTH_NUGGET_SIZE; | |||
| /* we're still in the middle of a nugget, so reduce the burst size | |||
| * to end when the nugget ends */ | |||
| if (fSynth.nugget_remains < burstSize) | |||
| burstSize = fSynth.nugget_remains; | |||
| /* reduce burst size to end when next event is ready */ | |||
| if (curEventIndex < midiEventCount && midiEvents[curEventIndex].frame - framesDone < burstSize) | |||
| burstSize = midiEvents[curEventIndex].frame - framesDone; | |||
| /* reduce burst size to end at end of this run */ | |||
| if (frames - framesDone < burstSize) | |||
| burstSize = frames - framesDone; | |||
| /* render the burst */ | |||
| nekobee_synth_render_voices(&fSynth, out + framesDone, burstSize, (burstSize == fSynth.nugget_remains)); | |||
| framesDone += burstSize; | |||
| fSynth.nugget_remains -= burstSize; | |||
| } | |||
| dssp_voicelist_mutex_unlock(&fSynth); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() | |||
| { | |||
| return new DistrhoPluginNekobi(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,121 +0,0 @@ | |||
| /* | |||
| * DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others. | |||
| * Copyright (C) 2004 Sean Bolton and others | |||
| * Copyright (C) 2013-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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #ifndef DISTRHO_PLUGIN_NEKOBI_HPP_INCLUDED | |||
| #define DISTRHO_PLUGIN_NEKOBI_HPP_INCLUDED | |||
| #include "DistrhoPlugin.hpp" | |||
| extern "C" { | |||
| #include "nekobee-src/nekobee_synth.h" | |||
| } | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoPluginNekobi : public Plugin | |||
| { | |||
| public: | |||
| enum Parameters | |||
| { | |||
| paramWaveform = 0, | |||
| paramTuning, | |||
| paramCutoff, | |||
| paramResonance, | |||
| paramEnvMod, | |||
| paramDecay, | |||
| paramAccent, | |||
| paramVolume, | |||
| paramCount | |||
| }; | |||
| DistrhoPluginNekobi(); | |||
| ~DistrhoPluginNekobi() override; | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| const char* d_getLabel() const noexcept override | |||
| { | |||
| return "Nekobi"; | |||
| } | |||
| const char* d_getMaker() const noexcept override | |||
| { | |||
| return "DISTRHO"; | |||
| } | |||
| const char* d_getLicense() const noexcept override | |||
| { | |||
| return "GPL v2+"; | |||
| } | |||
| uint32_t d_getVersion() const noexcept override | |||
| { | |||
| return 0x1000; | |||
| } | |||
| long d_getUniqueId() const noexcept override | |||
| { | |||
| return d_cconst('D', 'N', 'e', 'k'); | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Init | |||
| void d_initParameter(uint32_t index, Parameter& parameter) override; | |||
| // ------------------------------------------------------------------- | |||
| // Internal data | |||
| float d_getParameterValue(uint32_t index) const override; | |||
| void d_setParameterValue(uint32_t index, float value) override; | |||
| // ------------------------------------------------------------------- | |||
| // Process | |||
| void d_activate() override; | |||
| void d_deactivate() override; | |||
| void d_run(const float**, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) override; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| struct ParamValues { | |||
| float waveform; | |||
| float tuning; | |||
| float cutoff; | |||
| float resonance; | |||
| float envMod; | |||
| float decay; | |||
| float accent; | |||
| float volume; | |||
| } fParams; | |||
| nekobee_synth_t fSynth; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoPluginNekobi) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_PLUGIN_NEKOBI_HPP_INCLUDED | |||
| @@ -1,222 +0,0 @@ | |||
| /* | |||
| * DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others. | |||
| * Copyright (C) 2013-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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #include "DistrhoPluginNekobi.hpp" | |||
| #include "DistrhoUINekobi.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoUINekobi::DistrhoUINekobi() | |||
| : UI(), | |||
| fAboutWindow(this) | |||
| { | |||
| // FIXME | |||
| fNeko.setTimerSpeed(5); | |||
| // background | |||
| fImgBackground = Image(DistrhoArtworkNekobi::backgroundData, DistrhoArtworkNekobi::backgroundWidth, DistrhoArtworkNekobi::backgroundHeight, GL_BGR); | |||
| Image aboutImage(DistrhoArtworkNekobi::aboutData, DistrhoArtworkNekobi::aboutWidth, DistrhoArtworkNekobi::aboutHeight, GL_BGR); | |||
| fAboutWindow.setImage(aboutImage); | |||
| // slider | |||
| Image sliderImage(DistrhoArtworkNekobi::sliderData, DistrhoArtworkNekobi::sliderWidth, DistrhoArtworkNekobi::sliderHeight); | |||
| fSliderWaveform = new ImageSlider(this, sliderImage, DistrhoPluginNekobi::paramWaveform); | |||
| fSliderWaveform->setStartPos(133, 40); | |||
| fSliderWaveform->setEndPos(133, 60); | |||
| fSliderWaveform->setRange(0.0f, 1.0f); | |||
| fSliderWaveform->setStep(1.0f); | |||
| fSliderWaveform->setValue(0.0f); | |||
| fSliderWaveform->setCallback(this); | |||
| // knobs | |||
| Image knobImage(DistrhoArtworkNekobi::knobData, DistrhoArtworkNekobi::knobWidth, DistrhoArtworkNekobi::knobHeight); | |||
| // knob Tuning | |||
| fKnobTuning = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPluginNekobi::paramTuning); | |||
| fKnobTuning->setAbsolutePos(41, 43); | |||
| fKnobTuning->setRange(-12.0f, 12.0f); | |||
| fKnobTuning->setDefault(0.0f); | |||
| fKnobTuning->setValue(0.0f); | |||
| fKnobTuning->setRotationAngle(305); | |||
| fKnobTuning->setCallback(this); | |||
| // knob Cutoff | |||
| fKnobCutoff = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPluginNekobi::paramCutoff); | |||
| fKnobCutoff->setAbsolutePos(185, 43); | |||
| fKnobCutoff->setRange(0.0f, 100.0f); | |||
| fKnobCutoff->setDefault(25.0f); | |||
| fKnobCutoff->setValue(25.0f); | |||
| fKnobCutoff->setRotationAngle(305); | |||
| fKnobCutoff->setCallback(this); | |||
| // knob Resonance | |||
| fKnobResonance = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPluginNekobi::paramResonance); | |||
| fKnobResonance->setAbsolutePos(257, 43); | |||
| fKnobResonance->setRange(0.0f, 95.0f); | |||
| fKnobResonance->setDefault(25.0f); | |||
| fKnobResonance->setValue(25.0f); | |||
| fKnobResonance->setRotationAngle(305); | |||
| fKnobResonance->setCallback(this); | |||
| // knob Env Mod | |||
| fKnobEnvMod = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPluginNekobi::paramEnvMod); | |||
| fKnobEnvMod->setAbsolutePos(329, 43); | |||
| fKnobEnvMod->setRange(0.0f, 100.0f); | |||
| fKnobEnvMod->setDefault(50.0f); | |||
| fKnobEnvMod->setValue(50.0f); | |||
| fKnobEnvMod->setRotationAngle(305); | |||
| fKnobEnvMod->setCallback(this); | |||
| // knob Decay | |||
| fKnobDecay = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPluginNekobi::paramDecay); | |||
| fKnobDecay->setAbsolutePos(400, 43); | |||
| fKnobDecay->setRange(0.0f, 100.0f); | |||
| fKnobDecay->setDefault(75.0f); | |||
| fKnobDecay->setValue(75.0f); | |||
| fKnobDecay->setRotationAngle(305); | |||
| fKnobDecay->setCallback(this); | |||
| // knob Accent | |||
| fKnobAccent = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPluginNekobi::paramAccent); | |||
| fKnobAccent->setAbsolutePos(473, 43); | |||
| fKnobAccent->setRange(0.0f, 100.0f); | |||
| fKnobAccent->setDefault(25.0f); | |||
| fKnobAccent->setValue(25.0f); | |||
| fKnobAccent->setRotationAngle(305); | |||
| fKnobAccent->setCallback(this); | |||
| // knob Volume | |||
| fKnobVolume = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPluginNekobi::paramVolume); | |||
| fKnobVolume->setAbsolutePos(545, 43); | |||
| fKnobVolume->setRange(0.0f, 100.0f); | |||
| fKnobVolume->setDefault(75.0f); | |||
| fKnobVolume->setValue(75.0f); | |||
| fKnobVolume->setRotationAngle(305); | |||
| fKnobVolume->setCallback(this); | |||
| // about button | |||
| Image aboutImageNormal(DistrhoArtworkNekobi::aboutButtonNormalData, DistrhoArtworkNekobi::aboutButtonNormalWidth, DistrhoArtworkNekobi::aboutButtonNormalHeight); | |||
| Image aboutImageHover(DistrhoArtworkNekobi::aboutButtonHoverData, DistrhoArtworkNekobi::aboutButtonHoverWidth, DistrhoArtworkNekobi::aboutButtonHoverHeight); | |||
| fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); | |||
| fButtonAbout->setAbsolutePos(505, 5); | |||
| fButtonAbout->setCallback(this); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void DistrhoUINekobi::d_parameterChanged(uint32_t index, float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case DistrhoPluginNekobi::paramTuning: | |||
| fKnobTuning->setValue(value); | |||
| break; | |||
| case DistrhoPluginNekobi::paramWaveform: | |||
| fSliderWaveform->setValue(value); | |||
| break; | |||
| case DistrhoPluginNekobi::paramCutoff: | |||
| fKnobCutoff->setValue(value); | |||
| break; | |||
| case DistrhoPluginNekobi::paramResonance: | |||
| fKnobResonance->setValue(value); | |||
| break; | |||
| case DistrhoPluginNekobi::paramEnvMod: | |||
| fKnobEnvMod->setValue(value); | |||
| break; | |||
| case DistrhoPluginNekobi::paramDecay: | |||
| fKnobDecay->setValue(value); | |||
| break; | |||
| case DistrhoPluginNekobi::paramAccent: | |||
| fKnobAccent->setValue(value); | |||
| break; | |||
| case DistrhoPluginNekobi::paramVolume: | |||
| fKnobVolume->setValue(value); | |||
| break; | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // UI Callbacks | |||
| void DistrhoUINekobi::d_uiIdle() | |||
| { | |||
| if (fNeko.idle()) | |||
| repaint(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void DistrhoUINekobi::imageButtonClicked(ImageButton* button, int) | |||
| { | |||
| if (button != fButtonAbout) | |||
| return; | |||
| fAboutWindow.exec(); | |||
| } | |||
| void DistrhoUINekobi::imageKnobDragStarted(ImageKnob* knob) | |||
| { | |||
| d_editParameter(knob->getId(), true); | |||
| } | |||
| void DistrhoUINekobi::imageKnobDragFinished(ImageKnob* knob) | |||
| { | |||
| d_editParameter(knob->getId(), false); | |||
| } | |||
| void DistrhoUINekobi::imageKnobValueChanged(ImageKnob* knob, float value) | |||
| { | |||
| d_setParameterValue(knob->getId(), value); | |||
| } | |||
| void DistrhoUINekobi::imageSliderDragStarted(ImageSlider* slider) | |||
| { | |||
| d_editParameter(slider->getId(), true); | |||
| } | |||
| void DistrhoUINekobi::imageSliderDragFinished(ImageSlider* slider) | |||
| { | |||
| d_editParameter(slider->getId(), false); | |||
| } | |||
| void DistrhoUINekobi::imageSliderValueChanged(ImageSlider* slider, float value) | |||
| { | |||
| d_setParameterValue(slider->getId(), value); | |||
| } | |||
| void DistrhoUINekobi::onDisplay() | |||
| { | |||
| fImgBackground.draw(); | |||
| fNeko.draw(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| UI* createUI() | |||
| { | |||
| return new DistrhoUINekobi(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,102 +0,0 @@ | |||
| /* | |||
| * DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others. | |||
| * Copyright (C) 2013-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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #ifndef DISTRHO_UI_NEKOBI_HPP_INCLUDED | |||
| #define DISTRHO_UI_NEKOBI_HPP_INCLUDED | |||
| #include "DistrhoUI.hpp" | |||
| #include "ImageAboutWindow.hpp" | |||
| #include "ImageButton.hpp" | |||
| #include "ImageKnob.hpp" | |||
| #include "ImageSlider.hpp" | |||
| #include "DistrhoArtworkNekobi.hpp" | |||
| #include "NekoWidget.hpp" | |||
| using DGL::ImageAboutWindow; | |||
| using DGL::ImageButton; | |||
| using DGL::ImageKnob; | |||
| using DGL::ImageSlider; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoUINekobi : public UI, | |||
| public ImageButton::Callback, | |||
| public ImageKnob::Callback, | |||
| public ImageSlider::Callback | |||
| { | |||
| public: | |||
| DistrhoUINekobi(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| uint d_getWidth() const noexcept override | |||
| { | |||
| return DistrhoArtworkNekobi::backgroundWidth; | |||
| } | |||
| uint d_getHeight() const noexcept override | |||
| { | |||
| return DistrhoArtworkNekobi::backgroundHeight; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void d_parameterChanged(uint32_t index, float value) override; | |||
| // ------------------------------------------------------------------- | |||
| // UI Callbacks | |||
| void d_uiIdle() override; | |||
| // ------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void imageButtonClicked(ImageButton* button, int) override; | |||
| void imageKnobDragStarted(ImageKnob* knob) override; | |||
| void imageKnobDragFinished(ImageKnob* knob) override; | |||
| void imageKnobValueChanged(ImageKnob* knob, float value) override; | |||
| void imageSliderDragStarted(ImageSlider* slider) override; | |||
| void imageSliderDragFinished(ImageSlider* slider) override; | |||
| void imageSliderValueChanged(ImageSlider* slider, float value) override; | |||
| void onDisplay() override; | |||
| private: | |||
| Image fImgBackground; | |||
| ImageAboutWindow fAboutWindow; | |||
| NekoWidget fNeko; | |||
| ScopedPointer<ImageButton> fButtonAbout; | |||
| ScopedPointer<ImageSlider> fSliderWaveform; | |||
| ScopedPointer<ImageKnob> fKnobTuning, fKnobCutoff, fKnobResonance; | |||
| ScopedPointer<ImageKnob> fKnobEnvMod, fKnobDecay, fKnobAccent, fKnobVolume; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUINekobi) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_UI_NEKOBI_HPP_INCLUDED | |||
| @@ -1,202 +0,0 @@ | |||
| /* | |||
| * Neko widget animation | |||
| * Copyright (C) 2013-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 General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #ifndef NEKO_WIDGET_HPP_INCLUDED | |||
| #define NEKO_WIDGET_HPP_INCLUDED | |||
| #include "DistrhoArtworkNekobi.hpp" | |||
| #include "Image.hpp" | |||
| #include "Widget.hpp" | |||
| #include <cstdlib> // rand | |||
| using DGL::Image; | |||
| // ----------------------------------------------------------------------- | |||
| class NekoWidget | |||
| { | |||
| public: | |||
| NekoWidget() | |||
| : fPos(0), | |||
| fTimer(0), | |||
| fTimerSpeed(20), | |||
| fCurAction(kActionNone), | |||
| fCurImage(&fImages.sit) | |||
| { | |||
| // load images | |||
| { | |||
| using namespace DistrhoArtworkNekobi; | |||
| #define JOIN(a, b) a ## b | |||
| #define LOAD_IMAGE(NAME) fImages.NAME.loadFromMemory(JOIN(NAME, Data), JOIN(NAME, Width), JOIN(NAME, Height)); | |||
| LOAD_IMAGE(sit) | |||
| LOAD_IMAGE(tail) | |||
| LOAD_IMAGE(claw1) | |||
| LOAD_IMAGE(claw2) | |||
| LOAD_IMAGE(scratch1) | |||
| LOAD_IMAGE(scratch2) | |||
| LOAD_IMAGE(run1) | |||
| LOAD_IMAGE(run2) | |||
| LOAD_IMAGE(run3) | |||
| LOAD_IMAGE(run4) | |||
| #undef JOIN | |||
| #undef LOAD_IMAGE | |||
| } | |||
| } | |||
| void draw() | |||
| { | |||
| int x = fPos+108; | |||
| int y = -2; | |||
| if (fCurImage == &fImages.claw1 || fCurImage == &fImages.claw2) | |||
| { | |||
| x += 2; | |||
| y += 12; | |||
| } | |||
| fCurImage->drawAt(x, y); | |||
| } | |||
| // returns true if needs repaint | |||
| bool idle() | |||
| { | |||
| if (++fTimer % fTimerSpeed != 0) // target is 20ms | |||
| return false; | |||
| if (fTimer == fTimerSpeed*9) | |||
| { | |||
| if (fCurAction == kActionNone) | |||
| fCurAction = static_cast<Action>(std::rand() % kActionCount); | |||
| else | |||
| fCurAction = kActionNone; | |||
| fTimer = 0; | |||
| } | |||
| switch (fCurAction) | |||
| { | |||
| case kActionNone: | |||
| if (fCurImage == &fImages.sit) | |||
| fCurImage = &fImages.tail; | |||
| else | |||
| fCurImage = &fImages.sit; | |||
| break; | |||
| case kActionClaw: | |||
| if (fCurImage == &fImages.claw1) | |||
| fCurImage = &fImages.claw2; | |||
| else | |||
| fCurImage = &fImages.claw1; | |||
| break; | |||
| case kActionScratch: | |||
| if (fCurImage == &fImages.scratch1) | |||
| fCurImage = &fImages.scratch2; | |||
| else | |||
| fCurImage = &fImages.scratch1; | |||
| break; | |||
| case kActionRunRight: | |||
| if (fTimer == 0 && fPos > 20*9) | |||
| { | |||
| // run the other way | |||
| --fTimer; | |||
| fCurAction = kActionRunLeft; | |||
| idle(); | |||
| break; | |||
| } | |||
| fPos += 20; | |||
| if (fCurImage == &fImages.run1) | |||
| fCurImage = &fImages.run2; | |||
| else | |||
| fCurImage = &fImages.run1; | |||
| break; | |||
| case kActionRunLeft: | |||
| if (fTimer == 0 && fPos < 20*9) | |||
| { | |||
| // run the other way | |||
| --fTimer; | |||
| fCurAction = kActionRunRight; | |||
| idle(); | |||
| break; | |||
| } | |||
| fPos -= 20; | |||
| if (fCurImage == &fImages.run3) | |||
| fCurImage = &fImages.run4; | |||
| else | |||
| fCurImage = &fImages.run3; | |||
| break; | |||
| case kActionCount: | |||
| break; | |||
| } | |||
| return true; | |||
| } | |||
| void setTimerSpeed(int speed) | |||
| { | |||
| fTimer = 0; | |||
| fTimerSpeed = speed; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| enum Action { | |||
| kActionNone, // bounce tail | |||
| kActionClaw, | |||
| kActionScratch, | |||
| kActionRunRight, | |||
| kActionRunLeft, | |||
| kActionCount | |||
| }; | |||
| struct Images { | |||
| Image sit; | |||
| Image tail; | |||
| Image claw1; | |||
| Image claw2; | |||
| Image scratch1; | |||
| Image scratch2; | |||
| Image run1; | |||
| Image run2; | |||
| Image run3; | |||
| Image run4; | |||
| } fImages; | |||
| int fPos; | |||
| int fTimer; | |||
| int fTimerSpeed; | |||
| Action fCurAction; | |||
| Image* fCurImage; | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| #endif // NEKO_WIDGET_HPP_INCLUDED | |||
| @@ -1,77 +0,0 @@ | |||
| /* nekobee DSSI software synthesizer plugin | |||
| * | |||
| * Copyright (C) 2004 Sean Bolton and others. | |||
| * | |||
| * Portions of this file may have come from Chris Cannam and Steve | |||
| * Harris's public domain DSSI example code. | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or (at your option) any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public | |||
| * License along with this program; if not, write to the Free | |||
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |||
| * MA 02111-1307, USA. | |||
| */ | |||
| #ifndef _XSYNTH_H | |||
| #define _XSYNTH_H | |||
| /* ==== debugging ==== */ | |||
| /* XSYNTH_DEBUG bits */ | |||
| #define XDB_DSSI 1 /* DSSI interface */ | |||
| #define XDB_AUDIO 2 /* audio output */ | |||
| #define XDB_NOTE 4 /* note on/off, voice allocation */ | |||
| #define XDB_DATA 8 /* plugin patchbank handling */ | |||
| #define GDB_MAIN 16 /* GUI main program flow */ | |||
| #define GDB_OSC 32 /* GUI OSC handling */ | |||
| #define GDB_IO 64 /* GUI patch file input/output */ | |||
| #define GDB_GUI 128 /* GUI GUI callbacks, updating, etc. */ | |||
| /* If you want debug information, define XSYNTH_DEBUG to the XDB_* bits you're | |||
| * interested in getting debug information about, bitwise-ORed together. | |||
| * Otherwise, leave it undefined. */ | |||
| // #define XSYNTH_DEBUG (1+8+16+32+64) | |||
| //#define XSYNTH_DEBUG GDB_GUI + GDB_OSC | |||
| // #define XSYNTH_DEBUG XDB_DSSI | |||
| #ifdef XSYNTH_DEBUG | |||
| #include <stdio.h> | |||
| #define XSYNTH_DEBUG_INIT(x) | |||
| #define XDB_MESSAGE(type, fmt...) { if (XSYNTH_DEBUG & type) fprintf(stderr, "nekobee-dssi.so" fmt); } | |||
| #define GDB_MESSAGE(type, fmt...) { if (XSYNTH_DEBUG & type) fprintf(stderr, "nekobee_gtk" fmt); } | |||
| // -FIX-: | |||
| // #include "message_buffer.h" | |||
| // #define XSYNTH_DEBUG_INIT(x) mb_init(x) | |||
| // #define XDB_MESSAGE(type, fmt...) { \- | |||
| // if (XSYNTH_DEBUG & type) { \- | |||
| // char _m[256]; \- | |||
| // snprintf(_m, 255, fmt); \- | |||
| // add_message(_m); \- | |||
| // } \- | |||
| // } | |||
| #else /* !XSYNTH_DEBUG */ | |||
| #define XDB_MESSAGE(type, fmt...) | |||
| #define GDB_MESSAGE(type, fmt...) | |||
| #define XSYNTH_DEBUG_INIT(x) | |||
| #endif /* XSYNTH_DEBUG */ | |||
| /* ==== end of debugging ==== */ | |||
| #define XSYNTH_MAX_POLYPHONY 1 | |||
| #define XSYNTH_DEFAULT_POLYPHONY 1 | |||
| #endif /* _XSYNTH_H */ | |||
| @@ -1,237 +0,0 @@ | |||
| /* nekobee DSSI software synthesizer plugin | |||
| * | |||
| * Copyright (C) 2004 Sean Bolton and others. | |||
| * | |||
| * Portions of this file may have come from Steve Brookes' | |||
| * nekobee, copyright (C) 1999 S. J. Brookes. | |||
| * Portions of this file may have come from Peter Hanappe's | |||
| * Fluidsynth, copyright (C) 2003 Peter Hanappe and others. | |||
| * Portions of this file may have come from Chris Cannam and Steve | |||
| * Harris's public domain DSSI example code. | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or (at your option) any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public | |||
| * License along with this program; if not, write to the Free | |||
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |||
| * MA 02111-1307, USA. | |||
| */ | |||
| #include <stdlib.h> | |||
| #include <stdio.h> | |||
| #include <string.h> | |||
| #include <math.h> | |||
| #include <pthread.h> | |||
| #include "nekobee.h" | |||
| #include "nekobee_synth.h" | |||
| #include "nekobee_voice.h" | |||
| /* | |||
| * nekobee_synth_all_voices_off | |||
| * | |||
| * stop processing all notes immediately | |||
| */ | |||
| void | |||
| nekobee_synth_all_voices_off(nekobee_synth_t *synth) | |||
| { | |||
| int i; | |||
| nekobee_voice_t *voice; | |||
| for (i = 0; i < synth->voices; i++) { | |||
| //voice = synth->voice[i]; | |||
| voice = synth->voice; | |||
| if (_PLAYING(voice)) { | |||
| nekobee_voice_off(voice); | |||
| } | |||
| } | |||
| for (i = 0; i < 8; i++) synth->held_keys[i] = -1; | |||
| } | |||
| /* | |||
| * nekobee_synth_note_off | |||
| * | |||
| * handle a note off message | |||
| */ | |||
| void | |||
| nekobee_synth_note_off(nekobee_synth_t *synth, unsigned char key, unsigned char rvelocity) | |||
| { | |||
| int i, count = 0; | |||
| nekobee_voice_t *voice; | |||
| for (i = 0; i < synth->voices; i++) { | |||
| voice = synth->voice; | |||
| if (_PLAYING(voice)) { | |||
| XDB_MESSAGE(XDB_NOTE, " nekobee_synth_note_off: key %d rvel %d voice %d note id %d\n", key, rvelocity, i, voice->note_id); | |||
| nekobee_voice_note_off(synth, voice, key, 64); | |||
| count++; | |||
| } | |||
| } | |||
| if (!count) | |||
| nekobee_voice_remove_held_key(synth, key); | |||
| return; | |||
| (void)rvelocity; | |||
| } | |||
| /* | |||
| * nekobee_synth_all_notes_off | |||
| * | |||
| * put all notes into the released state | |||
| */ | |||
| void | |||
| nekobee_synth_all_notes_off(nekobee_synth_t* synth) | |||
| { | |||
| int i; | |||
| nekobee_voice_t *voice; | |||
| /* reset the sustain controller */ | |||
| synth->cc[MIDI_CTL_SUSTAIN] = 0; | |||
| for (i = 0; i < synth->voices; i++) { | |||
| //voice = synth->voice[i]; | |||
| voice = synth->voice; | |||
| if (_ON(voice) || _SUSTAINED(voice)) { | |||
| nekobee_voice_release_note(synth, voice); | |||
| } | |||
| } | |||
| } | |||
| /* | |||
| * nekobee_synth_note_on | |||
| */ | |||
| void | |||
| nekobee_synth_note_on(nekobee_synth_t *synth, unsigned char key, unsigned char velocity) | |||
| { | |||
| nekobee_voice_t* voice; | |||
| voice = synth->voice; | |||
| if (_PLAYING(synth->voice)) { | |||
| XDB_MESSAGE(XDB_NOTE, " nekobee_synth_note_on: retriggering mono voice on new key %d\n", key); | |||
| } | |||
| voice->note_id = synth->note_id++; | |||
| nekobee_voice_note_on(synth, voice, key, velocity); | |||
| } | |||
| /* | |||
| * nekobee_synth_update_volume | |||
| */ | |||
| void | |||
| nekobee_synth_update_volume(nekobee_synth_t* synth) | |||
| { | |||
| synth->cc_volume = (float)(synth->cc[MIDI_CTL_MSB_MAIN_VOLUME] * 128 + | |||
| synth->cc[MIDI_CTL_LSB_MAIN_VOLUME]) / 16256.0f; | |||
| if (synth->cc_volume > 1.0f) | |||
| synth->cc_volume = 1.0f; | |||
| /* don't need to check if any playing voices need updating, because it's global */ | |||
| } | |||
| /* | |||
| * nekobee_synth_control_change | |||
| */ | |||
| void | |||
| nekobee_synth_control_change(nekobee_synth_t *synth, unsigned int param, signed int value) | |||
| { | |||
| synth->cc[param] = value; | |||
| switch (param) { | |||
| case MIDI_CTL_MSB_MAIN_VOLUME: | |||
| case MIDI_CTL_LSB_MAIN_VOLUME: | |||
| nekobee_synth_update_volume(synth); | |||
| break; | |||
| case MIDI_CTL_ALL_SOUNDS_OFF: | |||
| nekobee_synth_all_voices_off(synth); | |||
| break; | |||
| case MIDI_CTL_RESET_CONTROLLERS: | |||
| nekobee_synth_init_controls(synth); | |||
| break; | |||
| case MIDI_CTL_ALL_NOTES_OFF: | |||
| nekobee_synth_all_notes_off(synth); | |||
| break; | |||
| /* what others should we respond to? */ | |||
| /* these we ignore (let the host handle): | |||
| * BANK_SELECT_MSB | |||
| * BANK_SELECT_LSB | |||
| * DATA_ENTRY_MSB | |||
| * NRPN_MSB | |||
| * NRPN_LSB | |||
| * RPN_MSB | |||
| * RPN_LSB | |||
| * -FIX- no! we need RPN (0, 0) Pitch Bend Sensitivity! | |||
| */ | |||
| } | |||
| } | |||
| /* | |||
| * nekobee_synth_init_controls | |||
| */ | |||
| void | |||
| nekobee_synth_init_controls(nekobee_synth_t *synth) | |||
| { | |||
| int i; | |||
| for (i = 0; i < 128; i++) { | |||
| synth->cc[i] = 0; | |||
| } | |||
| synth->cc[7] = 127; /* full volume */ | |||
| nekobee_synth_update_volume(synth); | |||
| } | |||
| /* | |||
| * nekobee_synth_render_voices | |||
| */ | |||
| void | |||
| nekobee_synth_render_voices(nekobee_synth_t *synth, float *out, unsigned long sample_count, | |||
| int do_control_update) | |||
| { | |||
| unsigned long i; | |||
| float res, wow; | |||
| /* clear the buffer */ | |||
| for (i = 0; i < sample_count; i++) | |||
| out[i] = 0.0f; | |||
| // we can do anything that must be updated all the time here | |||
| // this is called even when a voice isn't playing | |||
| // approximate a log scale | |||
| res = 1-synth->resonance; | |||
| wow = res*res; | |||
| wow = wow/10.0f; | |||
| // as the resonance is increased, "wow" slows down the accent attack | |||
| if ((synth->voice->velocity>90) && (synth->vcf_accent < synth->voice->vcf_eg)) { | |||
| synth->vcf_accent=(0.985-wow)*synth->vcf_accent+(0.015+wow)*synth->voice->vcf_eg; | |||
| } else { | |||
| synth->vcf_accent=(0.985-wow)*synth->vcf_accent; // or just decay | |||
| } | |||
| if (synth->voice->velocity>90) { | |||
| synth->vca_accent=0.95*synth->vca_accent+0.05; // ramp up accent on with a time constant | |||
| } else { | |||
| synth->vca_accent=0.95*synth->vca_accent; // accent off with time constant | |||
| } | |||
| #if defined(XSYNTH_DEBUG) && (XSYNTH_DEBUG & XDB_AUDIO) | |||
| out[0] += 0.10f; /* add a 'buzz' to output so there's something audible even when quiescent */ | |||
| #endif /* defined(XSYNTH_DEBUG) && (XSYNTH_DEBUG & XDB_AUDIO) */ | |||
| if (_PLAYING(synth->voice)) { | |||
| nekobee_voice_render(synth, synth->voice, out, sample_count, do_control_update); | |||
| } | |||
| } | |||
| @@ -1,132 +0,0 @@ | |||
| /* nekobee DSSI software synthesizer plugin | |||
| * | |||
| * Copyright (C) 2004 Sean Bolton and others. | |||
| * | |||
| * Portions of this file may have come from Peter Hanappe's | |||
| * Fluidsynth, copyright (C) 2003 Peter Hanappe and others. | |||
| * Portions of this file may have come from alsa-lib, copyright | |||
| * and licensed under the LGPL v2.1. | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or (at your option) any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public | |||
| * License along with this program; if not, write to the Free | |||
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |||
| * MA 02111-1307, USA. | |||
| */ | |||
| #ifndef _XSYNTH_SYNTH_H | |||
| #define _XSYNTH_SYNTH_H | |||
| #include <pthread.h> | |||
| #include "nekobee.h" | |||
| #include "nekobee_types.h" | |||
| #define XSYNTH_MONO_MODE_OFF 0 | |||
| #define XSYNTH_MONO_MODE_ON 1 | |||
| #define XSYNTH_MONO_MODE_ONCE 2 | |||
| #define XSYNTH_MONO_MODE_BOTH 3 | |||
| #define XSYNTH_GLIDE_MODE_LEGATO 0 | |||
| #define XSYNTH_GLIDE_MODE_INITIAL 1 | |||
| #define XSYNTH_GLIDE_MODE_ALWAYS 2 | |||
| #define XSYNTH_GLIDE_MODE_LEFTOVER 3 | |||
| #define XSYNTH_GLIDE_MODE_OFF 4 | |||
| /* | |||
| * nekobee_synth_t | |||
| */ | |||
| struct _nekobee_synth_t { | |||
| /* output */ | |||
| unsigned long sample_rate; | |||
| float deltat; /* 1 / sample_rate */ | |||
| unsigned long nugget_remains; | |||
| /* voice tracking and data */ | |||
| unsigned int note_id; /* incremented for every new note, used for voice-stealing prioritization */ | |||
| int polyphony; /* requested polyphony, must be <= XSYNTH_MAX_POLYPHONY */ | |||
| int voices; /* current polyphony, either requested polyphony above or 1 while in monophonic mode */ | |||
| int monophonic; /* true if operating in monophonic mode */ | |||
| int glide; /* current glide mode */ | |||
| float last_noteon_pitch; /* glide start pitch for non-legato modes */ | |||
| signed char held_keys[8]; /* for monophonic key tracking, an array of note-ons, most recently received first */ | |||
| float vcf_accent; /* used to emulate the circuit that sweeps the vcf at full resonance */ | |||
| float vca_accent; /* used to smooth the accent pulse, removing the click */ | |||
| //nekobee_voice_t *voice[XSYNTH_MAX_POLYPHONY]; | |||
| nekobee_voice_t *voice; | |||
| pthread_mutex_t voicelist_mutex; | |||
| int voicelist_mutex_grab_failed; | |||
| /* current non-paramter-mapped controller values */ | |||
| unsigned char key_pressure[128]; | |||
| unsigned char cc[128]; /* controller values */ | |||
| unsigned char channel_pressure; | |||
| unsigned char pitch_wheel_sensitivity; /* in semitones */ | |||
| int pitch_wheel; /* range is -8192 - 8191 */ | |||
| /* translated controller values */ | |||
| float mod_wheel; /* filter cutoff multiplier, off = 1.0, full on = 0.0 */ | |||
| float pitch_bend; /* frequency multiplier, product of wheel setting and sensitivity, center = 1.0 */ | |||
| float cc_volume; /* volume multiplier, 0.0 to 1.0 */ | |||
| /* patch parameters */ | |||
| float tuning; | |||
| float waveform; | |||
| float cutoff; | |||
| float resonance; | |||
| float envmod; | |||
| float decay; | |||
| float accent; | |||
| float volume; | |||
| }; | |||
| void nekobee_synth_all_voices_off(nekobee_synth_t *synth); | |||
| void nekobee_synth_note_off(nekobee_synth_t *synth, unsigned char key, | |||
| unsigned char rvelocity); | |||
| void nekobee_synth_all_notes_off(nekobee_synth_t *synth); | |||
| void nekobee_synth_note_on(nekobee_synth_t *synth, unsigned char key, | |||
| unsigned char velocity); | |||
| void nekobee_synth_control_change(nekobee_synth_t *synth, unsigned int param, | |||
| signed int value); | |||
| void nekobee_synth_init_controls(nekobee_synth_t *synth); | |||
| void nekobee_synth_render_voices(nekobee_synth_t *synth, float *out, | |||
| unsigned long sample_count, | |||
| int do_control_update); | |||
| /* these come right out of alsa/asoundef.h */ | |||
| #define MIDI_CTL_MSB_MODWHEEL 0x01 /**< Modulation */ | |||
| #define MIDI_CTL_MSB_PORTAMENTO_TIME 0x05 /**< Portamento time */ | |||
| #define MIDI_CTL_MSB_MAIN_VOLUME 0x07 /**< Main volume */ | |||
| #define MIDI_CTL_MSB_BALANCE 0x08 /**< Balance */ | |||
| #define MIDI_CTL_LSB_MODWHEEL 0x21 /**< Modulation */ | |||
| #define MIDI_CTL_LSB_PORTAMENTO_TIME 0x25 /**< Portamento time */ | |||
| #define MIDI_CTL_LSB_MAIN_VOLUME 0x27 /**< Main volume */ | |||
| #define MIDI_CTL_LSB_BALANCE 0x28 /**< Balance */ | |||
| #define MIDI_CTL_SUSTAIN 0x40 /**< Sustain pedal */ | |||
| // nekobee defines | |||
| #define MIDI_CTL_TUNING 0x4b // impossible | |||
| #define MIDI_CTL_WAVEFORM 0x46 // select waveform | |||
| #define MIDI_CTL_CUTOFF 0x4a // VCF Cutoff | |||
| #define MIDI_CTL_RESONANCE 0x47 // VCF Resonance | |||
| #define MIDI_CTL_ENVMOD 0x01 // cheat and use modwheel | |||
| #define MIDI_CTL_DECAY 0x48 // Decay time (well release really) | |||
| #define MIDI_CTL_ACCENT 0x4c // impossible | |||
| #define MIDI_CTL_ALL_SOUNDS_OFF 0x78 /**< All sounds off */ | |||
| #define MIDI_CTL_RESET_CONTROLLERS 0x79 /**< Reset Controllers */ | |||
| #define MIDI_CTL_ALL_NOTES_OFF 0x7b /**< All notes off */ | |||
| #define XSYNTH_SYNTH_SUSTAINED(_s) ((_s)->cc[MIDI_CTL_SUSTAIN] >= 64) | |||
| #endif /* _XSYNTH_SYNTH_H */ | |||
| @@ -1,30 +0,0 @@ | |||
| /* nekobee DSSI software synthesizer plugin | |||
| * | |||
| * Copyright (C) 2004 Sean Bolton and others. | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or (at your option) any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public | |||
| * License along with this library; if not, write to the Free | |||
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |||
| * MA 02111-1307, USA. | |||
| */ | |||
| #ifndef _XSYNTH_TYPES_H | |||
| #define _XSYNTH_TYPES_H | |||
| #include <stddef.h> | |||
| typedef struct _nekobee_synth_t nekobee_synth_t; | |||
| typedef struct _nekobee_voice_t nekobee_voice_t; | |||
| typedef struct _nekobee_patch_t nekobee_patch_t; | |||
| #endif /* _XSYNTH_TYPES_H */ | |||
| @@ -1,256 +0,0 @@ | |||
| /* nekobee DSSI software synthesizer plugin | |||
| * | |||
| * Copyright (C) 2004 Sean Bolton and others. | |||
| * | |||
| * Portions of this file may have come from Steve Brookes' | |||
| * nekobee, copyright (C) 1999 S. J. Brookes. | |||
| * Portions of this file may have come from Peter Hanappe's | |||
| * Fluidsynth, copyright (C) 2003 Peter Hanappe and others. | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or (at your option) any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public | |||
| * License along with this program; if not, write to the Free | |||
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |||
| * MA 02111-1307, USA. | |||
| */ | |||
| #define _BSD_SOURCE 1 | |||
| #define _SVID_SOURCE 1 | |||
| #define _ISOC99_SOURCE 1 | |||
| #include <stdlib.h> | |||
| #include "nekobee_types.h" | |||
| #include "nekobee.h" | |||
| #include "nekobee_synth.h" | |||
| #include "nekobee_voice.h" | |||
| /* | |||
| * nekobee_voice_new | |||
| */ | |||
| nekobee_voice_t * | |||
| nekobee_voice_new() | |||
| { | |||
| nekobee_voice_t *voice; | |||
| voice = (nekobee_voice_t *)calloc(sizeof(nekobee_voice_t), 1); | |||
| if (voice) { | |||
| voice->status = XSYNTH_VOICE_OFF; | |||
| } | |||
| return voice; | |||
| } | |||
| /* | |||
| * nekobee_voice_note_on | |||
| */ | |||
| void | |||
| nekobee_voice_note_on(nekobee_synth_t *synth, nekobee_voice_t *voice, | |||
| unsigned char key, unsigned char velocity) | |||
| { | |||
| int i; | |||
| voice->key = key; | |||
| voice->velocity = velocity; | |||
| if (!synth->monophonic || !(_ON(voice) || _SUSTAINED(voice))) { | |||
| // brand-new voice, or monophonic voice in release phase; set everything up | |||
| XDB_MESSAGE(XDB_NOTE, " nekobee_voice_note_on in polyphonic/new section: key %d, mono %d, old status %d\n", key, synth->monophonic, voice->status); | |||
| voice->target_pitch = nekobee_pitch[key]; | |||
| if (synth->held_keys[0] >= 0) { | |||
| voice->prev_pitch = nekobee_pitch[synth->held_keys[0]]; | |||
| } else { | |||
| voice->prev_pitch = voice->target_pitch; | |||
| } | |||
| if (!_PLAYING(voice)) { | |||
| voice->lfo_pos = 0.0f; | |||
| voice->vca_eg = 0.0f; | |||
| voice->vcf_eg = 0.0f; | |||
| voice->delay1 = 0.0f; | |||
| voice->delay2 = 0.0f; | |||
| voice->delay3 = 0.0f; | |||
| voice->delay4 = 0.0f; | |||
| voice->c5 = 0.0f; | |||
| voice->osc_index = 0; | |||
| voice->osc1.last_waveform = -1; | |||
| voice->osc1.pos = 0.0f; | |||
| } | |||
| voice->vca_eg_phase = 0; | |||
| voice->vcf_eg_phase = 0; | |||
| // nekobee_voice_update_pressure_mod(synth, voice); | |||
| } else { | |||
| /* synth is monophonic, and we're modifying a playing voice */ | |||
| XDB_MESSAGE(XDB_NOTE, " nekobee_voice_note_on in monophonic section: old key %d => new key %d\n", synth->held_keys[0], key); | |||
| /* set new pitch */ | |||
| voice->target_pitch = nekobee_pitch[key]; | |||
| if (synth->glide == XSYNTH_GLIDE_MODE_INITIAL || | |||
| synth->glide == XSYNTH_GLIDE_MODE_OFF) | |||
| voice->prev_pitch = voice->target_pitch; | |||
| /* if in 'on' or 'both' modes, and key has changed, then re-trigger EGs */ | |||
| if ((synth->monophonic == XSYNTH_MONO_MODE_ON || | |||
| synth->monophonic == XSYNTH_MONO_MODE_BOTH) && | |||
| (synth->held_keys[0] < 0 || synth->held_keys[0] != key)) { | |||
| voice->vca_eg_phase = 0; | |||
| voice->vcf_eg_phase = 0; | |||
| } | |||
| /* all other variables stay what they are */ | |||
| } | |||
| synth->last_noteon_pitch = voice->target_pitch; | |||
| /* add new key to the list of held keys */ | |||
| /* check if new key is already in the list; if so, move it to the | |||
| * top of the list, otherwise shift the other keys down and add it | |||
| * to the top of the list. */ | |||
| for (i = 0; i < 7; i++) { | |||
| if (synth->held_keys[i] == key) | |||
| break; | |||
| } | |||
| for (; i > 0; i--) { | |||
| synth->held_keys[i] = synth->held_keys[i - 1]; | |||
| } | |||
| synth->held_keys[0] = key; | |||
| if (!_PLAYING(voice)) { | |||
| nekobee_voice_start_voice(voice); | |||
| } else if (!_ON(voice)) { /* must be XSYNTH_VOICE_SUSTAINED or XSYNTH_VOICE_RELEASED */ | |||
| voice->status = XSYNTH_VOICE_ON; | |||
| } | |||
| } | |||
| /* | |||
| * nekobee_voice_set_release_phase | |||
| */ | |||
| static inline void | |||
| nekobee_voice_set_release_phase(nekobee_voice_t *voice) | |||
| { | |||
| voice->vca_eg_phase = 2; | |||
| voice->vcf_eg_phase = 2; | |||
| } | |||
| /* | |||
| * nekobee_voice_remove_held_key | |||
| */ | |||
| inline void | |||
| nekobee_voice_remove_held_key(nekobee_synth_t *synth, unsigned char key) | |||
| { | |||
| int i; | |||
| /* check if this key is in list of held keys; if so, remove it and | |||
| * shift the other keys up */ | |||
| for (i = 7; i >= 0; i--) { | |||
| if (synth->held_keys[i] == key) | |||
| break; | |||
| } | |||
| if (i >= 0) { | |||
| for (; i < 7; i++) { | |||
| synth->held_keys[i] = synth->held_keys[i + 1]; | |||
| } | |||
| synth->held_keys[7] = -1; | |||
| } | |||
| } | |||
| /* | |||
| * nekobee_voice_note_off | |||
| */ | |||
| void | |||
| nekobee_voice_note_off(nekobee_synth_t *synth, nekobee_voice_t *voice, | |||
| unsigned char key, unsigned char rvelocity) | |||
| { | |||
| unsigned char previous_top_key; | |||
| XDB_MESSAGE(XDB_NOTE, " nekobee_set_note_off: called for voice %p, key %d\n", voice, key); | |||
| /* save release velocity */ | |||
| voice->velocity = rvelocity; | |||
| previous_top_key = synth->held_keys[0]; | |||
| /* remove this key from list of held keys */ | |||
| nekobee_voice_remove_held_key(synth, key); | |||
| if (synth->held_keys[0] >= 0) { | |||
| /* still some keys held */ | |||
| if (synth->held_keys[0] != previous_top_key) { | |||
| /* most-recently-played key has changed */ | |||
| voice->key = synth->held_keys[0]; | |||
| XDB_MESSAGE(XDB_NOTE, " note-off in monophonic section: changing pitch to %d\n", voice->key); | |||
| voice->target_pitch = nekobee_pitch[voice->key]; | |||
| if (synth->glide == XSYNTH_GLIDE_MODE_INITIAL || | |||
| synth->glide == XSYNTH_GLIDE_MODE_OFF) | |||
| voice->prev_pitch = voice->target_pitch; | |||
| /* if mono mode is 'both', re-trigger EGs */ | |||
| if (synth->monophonic == XSYNTH_MONO_MODE_BOTH && !_RELEASED(voice)) { | |||
| voice->vca_eg_phase = 0; | |||
| voice->vcf_eg_phase = 0; | |||
| } | |||
| } | |||
| } else { /* no keys still held */ | |||
| if (XSYNTH_SYNTH_SUSTAINED(synth)) { | |||
| /* no more keys in list, but we're sustained */ | |||
| XDB_MESSAGE(XDB_NOTE, " note-off in monophonic section: sustained with no held keys\n"); | |||
| if (!_RELEASED(voice)) | |||
| voice->status = XSYNTH_VOICE_SUSTAINED; | |||
| } else { /* not sustained */ | |||
| /* no more keys in list, so turn off note */ | |||
| XDB_MESSAGE(XDB_NOTE, " note-off in monophonic section: turning off voice %p\n", voice); | |||
| nekobee_voice_set_release_phase(voice); | |||
| voice->status = XSYNTH_VOICE_RELEASED; | |||
| } | |||
| } | |||
| } | |||
| /* | |||
| * nekobee_voice_release_note | |||
| */ | |||
| void | |||
| nekobee_voice_release_note(nekobee_synth_t *synth, nekobee_voice_t *voice) | |||
| { | |||
| XDB_MESSAGE(XDB_NOTE, " nekobee_voice_release_note: turning off voice %p\n", voice); | |||
| if (_ON(voice)) { | |||
| /* dummy up a release velocity */ | |||
| voice->rvelocity = 64; | |||
| } | |||
| nekobee_voice_set_release_phase(voice); | |||
| voice->status = XSYNTH_VOICE_RELEASED; | |||
| return; | |||
| (void)synth; | |||
| } | |||
| @@ -1,183 +0,0 @@ | |||
| /* nekobee DSSI software synthesizer plugin | |||
| * | |||
| * Copyright (C) 2004 Sean Bolton and others. | |||
| * | |||
| * Portions of this file may have come from Steve Brookes' | |||
| * nekobee, copyright (C) 1999 S. J. Brookes. | |||
| * Portions of this file may have come from Peter Hanappe's | |||
| * Fluidsynth, copyright (C) 2003 Peter Hanappe and others. | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or (at your option) any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public | |||
| * License along with this program; if not, write to the Free | |||
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |||
| * MA 02111-1307, USA. | |||
| */ | |||
| #ifndef _XSYNTH_VOICE_H | |||
| #define _XSYNTH_VOICE_H | |||
| #include <string.h> | |||
| #include "nekobee_types.h" | |||
| /* maximum size of a rendering burst */ | |||
| #define XSYNTH_NUGGET_SIZE 64 | |||
| /* minBLEP constants */ | |||
| /* minBLEP table oversampling factor (must be a power of two): */ | |||
| #define MINBLEP_PHASES 64 | |||
| /* MINBLEP_PHASES minus one: */ | |||
| #define MINBLEP_PHASE_MASK 63 | |||
| /* length in samples of (truncated) step discontinuity delta: */ | |||
| #define STEP_DD_PULSE_LENGTH 72 | |||
| /* length in samples of (truncated) slope discontinuity delta: */ | |||
| #define SLOPE_DD_PULSE_LENGTH 71 | |||
| /* the longer of the two above: */ | |||
| #define LONGEST_DD_PULSE_LENGTH STEP_DD_PULSE_LENGTH | |||
| /* MINBLEP_BUFFER_LENGTH must be at least XSYNTH_NUGGET_SIZE plus | |||
| * LONGEST_DD_PULSE_LENGTH, and not less than twice LONGEST_DD_PULSE_LENGTH: */ | |||
| #define MINBLEP_BUFFER_LENGTH 512 | |||
| /* delay between start of DD pulse and the discontinuity, in samples: */ | |||
| #define DD_SAMPLE_DELAY 4 | |||
| struct _nekobee_patch_t | |||
| { | |||
| float tuning; | |||
| unsigned char waveform; | |||
| float cutoff; | |||
| float resonance; | |||
| float envmod; | |||
| float decay; | |||
| float accent; | |||
| float volume; | |||
| }; | |||
| enum nekobee_voice_status | |||
| { | |||
| XSYNTH_VOICE_OFF, /* silent: is not processed by render loop */ | |||
| XSYNTH_VOICE_ON, /* has not received a note off event */ | |||
| XSYNTH_VOICE_SUSTAINED, /* has received note off, but sustain controller is on */ | |||
| XSYNTH_VOICE_RELEASED /* had note off, not sustained, in final decay phase of envelopes */ | |||
| }; | |||
| struct blosc | |||
| { | |||
| int last_waveform, /* persistent */ | |||
| waveform, /* comes from LADSPA port each cycle */ | |||
| bp_high; /* persistent */ | |||
| float pos, /* persistent */ | |||
| pw; /* comes from LADSPA port each cycle */ | |||
| }; | |||
| /* | |||
| * nekobee_voice_t | |||
| */ | |||
| struct _nekobee_voice_t | |||
| { | |||
| unsigned int note_id; | |||
| unsigned char status; | |||
| unsigned char key; | |||
| unsigned char velocity; | |||
| unsigned char rvelocity; /* the note-off velocity */ | |||
| /* translated controller values */ | |||
| float pressure; /* filter resonance multiplier, off = 1.0, full on = 0.0 */ | |||
| /* persistent voice state */ | |||
| float prev_pitch, | |||
| target_pitch, | |||
| lfo_pos; | |||
| struct blosc osc1; | |||
| float vca_eg, | |||
| vcf_eg, | |||
| accent_slug, | |||
| delay1, | |||
| delay2, | |||
| delay3, | |||
| delay4, | |||
| c5; | |||
| unsigned char vca_eg_phase, | |||
| vcf_eg_phase; | |||
| int osc_index; /* shared index into osc_audio */ | |||
| float osc_audio[MINBLEP_BUFFER_LENGTH]; | |||
| float freqcut_buf[XSYNTH_NUGGET_SIZE]; | |||
| float vca_buf[XSYNTH_NUGGET_SIZE]; | |||
| }; | |||
| #define _PLAYING(voice) ((voice)->status != XSYNTH_VOICE_OFF) | |||
| #define _ON(voice) ((voice)->status == XSYNTH_VOICE_ON) | |||
| #define _SUSTAINED(voice) ((voice)->status == XSYNTH_VOICE_SUSTAINED) | |||
| #define _RELEASED(voice) ((voice)->status == XSYNTH_VOICE_RELEASED) | |||
| #define _AVAILABLE(voice) ((voice)->status == XSYNTH_VOICE_OFF) | |||
| extern float nekobee_pitch[128]; | |||
| typedef struct { float value, delta; } float_value_delta; | |||
| extern float_value_delta step_dd_table[]; | |||
| extern float slope_dd_table[]; | |||
| /* nekobee_voice.c */ | |||
| nekobee_voice_t *nekobee_voice_new(); | |||
| void nekobee_voice_note_on(nekobee_synth_t *synth, | |||
| nekobee_voice_t *voice, | |||
| unsigned char key, | |||
| unsigned char velocity); | |||
| void nekobee_voice_remove_held_key(nekobee_synth_t *synth, | |||
| unsigned char key); | |||
| void nekobee_voice_note_off(nekobee_synth_t *synth, | |||
| nekobee_voice_t *voice, | |||
| unsigned char key, | |||
| unsigned char rvelocity); | |||
| void nekobee_voice_release_note(nekobee_synth_t *synth, | |||
| nekobee_voice_t *voice); | |||
| void nekobee_voice_set_ports(nekobee_synth_t *synth, | |||
| nekobee_patch_t *patch); | |||
| void nekobee_voice_update_pressure_mod(nekobee_synth_t *synth, | |||
| nekobee_voice_t *voice); | |||
| /* nekobee_voice_render.c */ | |||
| void nekobee_init_tables(void); | |||
| void nekobee_voice_render(nekobee_synth_t *synth, nekobee_voice_t *voice, | |||
| float *out, unsigned long sample_count, | |||
| int do_control_update); | |||
| /* inline functions */ | |||
| /* | |||
| * nekobee_voice_off | |||
| * | |||
| * Purpose: Turns off a voice immediately, meaning that it is not processed | |||
| * anymore by the render loop. | |||
| */ | |||
| static inline void | |||
| nekobee_voice_off(nekobee_voice_t* voice) | |||
| { | |||
| voice->status = XSYNTH_VOICE_OFF; | |||
| /* silence the oscillator buffer for the next use */ | |||
| memset(voice->osc_audio, 0, MINBLEP_BUFFER_LENGTH * sizeof(float)); | |||
| /* -FIX- decrement active voice count? */ | |||
| } | |||
| /* | |||
| * nekobee_voice_start_voice | |||
| */ | |||
| static inline void | |||
| nekobee_voice_start_voice(nekobee_voice_t *voice) | |||
| { | |||
| voice->status = XSYNTH_VOICE_ON; | |||
| /* -FIX- increment active voice count? */ | |||
| } | |||
| #endif /* _XSYNTH_VOICE_H */ | |||
| @@ -1,414 +0,0 @@ | |||
| /* nekobee DSSI software synthesizer plugin | |||
| */ | |||
| #define _BSD_SOURCE 1 | |||
| #define _SVID_SOURCE 1 | |||
| #define _ISOC99_SOURCE 1 | |||
| #include <math.h> | |||
| #include "nekobee.h" | |||
| #include "nekobee_synth.h" | |||
| #include "nekobee_voice.h" | |||
| #ifndef M_PI | |||
| #define M_PI 3.14159265358979323846 | |||
| #endif | |||
| #define M_2PI_F (2.0f * (float)M_PI) | |||
| #define M_PI_F (float)M_PI | |||
| #define VCF_FREQ_MAX (0.825f) /* original filters only stable to this frequency */ | |||
| static int tables_initialized = 0; | |||
| float nekobee_pitch[128]; | |||
| #define pitch_ref_note 69 | |||
| #define volume_to_amplitude_scale 128 | |||
| static float volume_to_amplitude_table[4 + volume_to_amplitude_scale + 2]; | |||
| static float velocity_to_attenuation[128]; | |||
| static float qdB_to_amplitude_table[4 + 256 + 0]; | |||
| void | |||
| nekobee_init_tables(void) | |||
| { | |||
| int i; | |||
| float pexp; | |||
| float volume, volume_exponent; | |||
| float ol, amp; | |||
| if (tables_initialized) | |||
| return; | |||
| /* MIDI note to pitch */ | |||
| for (i = 0; i < 128; ++i) { | |||
| pexp = (float)(i - pitch_ref_note) / 12.0f; | |||
| nekobee_pitch[i] = powf(2.0f, pexp); | |||
| } | |||
| /* volume to amplitude | |||
| * | |||
| * This generates a curve which is: | |||
| * volume_to_amplitude_table[128 + 4] = 0.25 * 3.16... ~= -2dB | |||
| * volume_to_amplitude_table[64 + 4] = 0.25 * 1.0 ~= -12dB | |||
| * volume_to_amplitude_table[32 + 4] = 0.25 * 0.316... ~= -22dB | |||
| * volume_to_amplitude_table[16 + 4] = 0.25 * 0.1 ~= -32dB | |||
| * etc. | |||
| */ | |||
| volume_exponent = 1.0f / (2.0f * log10f(2.0f)); | |||
| for (i = 0; i <= volume_to_amplitude_scale; i++) { | |||
| volume = (float)i / (float)volume_to_amplitude_scale; | |||
| volume_to_amplitude_table[i + 4] = powf(2.0f * volume, volume_exponent) / 4.0f; | |||
| } | |||
| volume_to_amplitude_table[ -1 + 4] = 0.0f; | |||
| volume_to_amplitude_table[129 + 4] = volume_to_amplitude_table[128 + 4]; | |||
| /* velocity to attenuation | |||
| * | |||
| * Creates the velocity to attenuation lookup table, for converting | |||
| * velocities [1, 127] to full-velocity-sensitivity attenuation in | |||
| * quarter decibels. Modeled after my TX-7's velocity response.*/ | |||
| velocity_to_attenuation[0] = 253.9999f; | |||
| for (i = 1; i < 127; i++) { | |||
| if (i >= 10) { | |||
| ol = (powf(((float)i / 127.0f), 0.32f) - 1.0f) * 100.0f; | |||
| amp = powf(2.0f, ol / 8.0f); | |||
| } else { | |||
| ol = (powf(((float)10 / 127.0f), 0.32f) - 1.0f) * 100.0f; | |||
| amp = powf(2.0f, ol / 8.0f) * (float)i / 10.0f; | |||
| } | |||
| velocity_to_attenuation[i] = log10f(amp) * -80.0f; | |||
| } | |||
| velocity_to_attenuation[127] = 0.0f; | |||
| /* quarter-decibel attenuation to amplitude */ | |||
| qdB_to_amplitude_table[-1 + 4] = 1.0f; | |||
| for (i = 0; i <= 255; i++) { | |||
| qdB_to_amplitude_table[i + 4] = powf(10.0f, (float)i / -80.0f); | |||
| } | |||
| tables_initialized = 1; | |||
| } | |||
| static inline float | |||
| volume(float level) | |||
| { | |||
| unsigned char segment; | |||
| float fract; | |||
| level *= (float)volume_to_amplitude_scale; | |||
| segment = lrintf(level - 0.5f); | |||
| fract = level - (float)segment; | |||
| return volume_to_amplitude_table[segment + 4] + fract * | |||
| (volume_to_amplitude_table[segment + 5] - | |||
| volume_to_amplitude_table[segment + 4]); | |||
| } | |||
| static inline float | |||
| qdB_to_amplitude(float qdB) | |||
| { | |||
| int i = lrintf(qdB - 0.5f); | |||
| float f = qdB - (float)i; | |||
| return qdB_to_amplitude_table[i + 4] + f * | |||
| (qdB_to_amplitude_table[i + 5] - | |||
| qdB_to_amplitude_table[i + 4]); | |||
| } | |||
| void blosc_place_step_dd(float *buffer, int index, float phase, float w, float scale){ | |||
| float r; | |||
| int i; | |||
| r = MINBLEP_PHASES * phase / w; | |||
| i = lrintf(r - 0.5f); | |||
| r -= (float)i; | |||
| i &= MINBLEP_PHASE_MASK; /* port changes can cause i to be out-of-range */ | |||
| /* This would be better than the above, but more expensive: | |||
| * while (i < 0) { | |||
| * i += MINBLEP_PHASES; | |||
| * index++; | |||
| * } | |||
| */ | |||
| while (i < MINBLEP_PHASES * STEP_DD_PULSE_LENGTH) { | |||
| buffer[index] += scale * (step_dd_table[i].value + r * step_dd_table[i].delta); | |||
| i += MINBLEP_PHASES; | |||
| index++; | |||
| } | |||
| } | |||
| void vco(unsigned long sample_count, nekobee_voice_t *voice, struct blosc *osc, | |||
| int index, float w) | |||
| { | |||
| unsigned long sample; | |||
| float pos = osc->pos; | |||
| float pw, gain, halfgain, out; | |||
| pw=0.46f; | |||
| gain=1.0f; | |||
| halfgain=gain*0.5f; | |||
| int bp_high = osc->bp_high; | |||
| out=(bp_high ? halfgain : -halfgain); | |||
| switch (osc->waveform) | |||
| { | |||
| default: | |||
| case 0: { | |||
| for (sample = 0; sample < sample_count; sample++) { | |||
| pos += w; | |||
| if (bp_high) { | |||
| if (pos >= pw) { | |||
| blosc_place_step_dd(voice->osc_audio, index, pos - pw, w, -gain); | |||
| bp_high = 0; | |||
| out = -halfgain; | |||
| } | |||
| if (pos >= 1.0f) { | |||
| pos -= 1.0f; | |||
| blosc_place_step_dd(voice->osc_audio, index, pos, w, gain); | |||
| bp_high = 1; | |||
| out = halfgain; | |||
| } | |||
| } else { | |||
| if (pos >= 1.0f) { | |||
| pos -= 1.0f; | |||
| blosc_place_step_dd(voice->osc_audio, index, pos, w, gain); | |||
| bp_high = 1; | |||
| out = halfgain; | |||
| } | |||
| if (bp_high && pos >= pw) { | |||
| blosc_place_step_dd(voice->osc_audio, index, pos - pw, w, -gain); | |||
| bp_high = 0; | |||
| out = -halfgain; | |||
| } | |||
| } | |||
| voice->osc_audio[index + DD_SAMPLE_DELAY] += out; | |||
| index++; | |||
| } | |||
| osc->pos = pos; | |||
| osc->bp_high = bp_high; | |||
| break; | |||
| } | |||
| case 1: // sawtooth wave | |||
| { | |||
| for (sample=0; sample < sample_count; sample++) { | |||
| pos += w; | |||
| if (pos >= 1.0f) { | |||
| pos -= 1.0f; | |||
| blosc_place_step_dd(voice->osc_audio, index, pos, w, gain); | |||
| } | |||
| voice->osc_audio[index + DD_SAMPLE_DELAY] += gain * (0.5f - pos); | |||
| index++; | |||
| } | |||
| break; | |||
| } | |||
| } | |||
| osc->pos=pos; | |||
| } | |||
| static inline void | |||
| vcf_4pole(nekobee_voice_t *voice, unsigned long sample_count, | |||
| float *in, float *out, float *cutoff, float qres, float *amp) | |||
| { | |||
| unsigned long sample; | |||
| float freqcut, freqcut2, highpass, | |||
| delay1 = voice->delay1, | |||
| delay2 = voice->delay2, | |||
| delay3 = voice->delay3, | |||
| delay4 = voice->delay4; | |||
| qres = 2.0f - qres * 1.995f; | |||
| for (sample = 0; sample < sample_count; sample++) { | |||
| /* Hal Chamberlin's state variable filter */ | |||
| freqcut = cutoff[sample] * 2.0f; | |||
| freqcut2 = cutoff[sample] * 4.0f; | |||
| if (freqcut > VCF_FREQ_MAX) freqcut = VCF_FREQ_MAX; | |||
| if (freqcut2 > VCF_FREQ_MAX) freqcut2 = VCF_FREQ_MAX; | |||
| delay2 = delay2 + freqcut * delay1; /* delay2/4 = lowpass output */ | |||
| highpass = in[sample] - delay2 - qres * delay1; | |||
| delay1 = freqcut * highpass + delay1; /* delay1/3 = bandpass output */ | |||
| delay4 = delay4 + freqcut2 * delay3; | |||
| highpass = delay2 - delay4 - qres * delay3; | |||
| delay3 = freqcut2 * highpass + delay3; | |||
| /* mix filter output into output buffer */ | |||
| out[sample] += 0.1*atan(3*delay4 * amp[sample]); | |||
| } | |||
| voice->delay1 = delay1; | |||
| voice->delay2 = delay2; | |||
| voice->delay3 = delay3; | |||
| voice->delay4 = delay4; | |||
| voice->c5 = 0.0f; | |||
| } | |||
| /* | |||
| * nekobee_voice_render | |||
| * | |||
| * generate the actual sound data for this voice | |||
| */ | |||
| void | |||
| nekobee_voice_render(nekobee_synth_t *synth, nekobee_voice_t *voice, | |||
| float *out, unsigned long sample_count, | |||
| int do_control_update) | |||
| { | |||
| unsigned long sample; | |||
| /* state variables saved in voice */ | |||
| float lfo_pos = voice->lfo_pos, | |||
| vca_eg = voice->vca_eg, | |||
| vcf_eg = voice->vcf_eg; | |||
| unsigned char vca_eg_phase = voice->vca_eg_phase, | |||
| vcf_eg_phase = voice->vcf_eg_phase; | |||
| int osc_index = voice->osc_index; | |||
| /* temporary variables used in calculating voice */ | |||
| float fund_pitch; | |||
| float deltat = synth->deltat; | |||
| float freq, cutoff, vcf_amt; | |||
| float vcf_acc_amt; | |||
| /* set up synthesis variables from patch */ | |||
| float omega; | |||
| float vca_eg_amp = qdB_to_amplitude(velocity_to_attenuation[voice->velocity] * 0); | |||
| float vca_eg_rate_level[3], vca_eg_one_rate[3]; | |||
| float vcf_eg_amp = qdB_to_amplitude(velocity_to_attenuation[voice->velocity] * 0); | |||
| float vcf_eg_rate_level[3], vcf_eg_one_rate[3]; | |||
| float qres = synth->resonance; | |||
| float vol_out = volume(synth->volume); | |||
| float velocity = (voice->velocity); | |||
| float vcf_egdecay = synth->decay; | |||
| fund_pitch = 0.1f*voice->target_pitch +0.9 * voice->prev_pitch; /* glide */ | |||
| if (do_control_update) { | |||
| voice->prev_pitch = fund_pitch; /* save pitch for next time */ | |||
| } | |||
| fund_pitch *= 440.0f; | |||
| omega = synth->tuning * fund_pitch; | |||
| // if we have triggered ACCENT | |||
| // we need a shorter decay | |||
| // we should probably have something like this in the note on code | |||
| // that could trigger an ACCENT light | |||
| if (velocity>90) { | |||
| vcf_egdecay=.0005; | |||
| } | |||
| // VCA - In a real 303, it is set for around 2 seconds | |||
| vca_eg_rate_level[0] = 0.1f * vca_eg_amp; // instant on attack | |||
| vca_eg_one_rate[0] = 0.9f; // very fast | |||
| vca_eg_rate_level[1] = 0.0f; // sustain is zero | |||
| vca_eg_one_rate[1] = 1.0f - 0.00001f; // decay time is very slow | |||
| vca_eg_rate_level[2] = 0.0f; // decays to zero | |||
| vca_eg_one_rate[2] = 0.975f; // very fast release | |||
| // VCF - funny things go on with the accent | |||
| vcf_eg_rate_level[0] = 0.1f * vcf_eg_amp; | |||
| vcf_eg_one_rate[0] = 1-0.1f; //0.9f; | |||
| vcf_eg_rate_level[1] = 0.0f; // vcf_egdecay * *(synth->vcf_eg_sustain_level) * vcf_eg_amp; | |||
| vcf_eg_one_rate[1] = 1.0f - vcf_egdecay; | |||
| vcf_eg_rate_level[2] = 0.0f; | |||
| vcf_eg_one_rate[2] = 0.9995f; // 1.0f - *(synth->vcf_eg_release_time); | |||
| vca_eg_amp *= 0.99f; | |||
| vcf_eg_amp *= 0.99f; | |||
| freq = M_PI_F * deltat * fund_pitch * synth->mod_wheel; /* now (0 to 1) * pi */ | |||
| cutoff = 0.008f * synth->cutoff; | |||
| // 303 always has slight VCF mod | |||
| vcf_amt = 0.05f+(synth->envmod*0.75); | |||
| /* copy some things so oscillator functions can see them */ | |||
| voice->osc1.waveform = lrintf(synth->waveform); | |||
| // work out how much the accent will affect the filter | |||
| vcf_acc_amt=.333f+ (synth->resonance/1.5f); | |||
| for (sample = 0; sample < sample_count; sample++) { | |||
| vca_eg = vca_eg_rate_level[vca_eg_phase] + vca_eg_one_rate[vca_eg_phase] * vca_eg; | |||
| vcf_eg = vcf_eg_rate_level[vcf_eg_phase] + vcf_eg_one_rate[vcf_eg_phase] * vcf_eg; | |||
| voice->freqcut_buf[sample] = (cutoff + (vcf_amt * vcf_eg/2.0f) + (synth->vcf_accent * synth->accent*0.5f)); | |||
| voice->vca_buf[sample] = vca_eg * vol_out*(1.0f + synth->accent*synth->vca_accent); | |||
| if (!vca_eg_phase && vca_eg > vca_eg_amp) vca_eg_phase = 1; /* flip from attack to decay */ | |||
| if (!vcf_eg_phase && vcf_eg > vcf_eg_amp) vcf_eg_phase = 1; /* flip from attack to decay */ | |||
| } | |||
| // oscillator | |||
| vco(sample_count, voice, &voice->osc1, osc_index, deltat * omega); | |||
| // VCF and VCA | |||
| vcf_4pole(voice, sample_count, voice->osc_audio + osc_index, out, voice->freqcut_buf, qres, voice->vca_buf); | |||
| osc_index += sample_count; | |||
| if (do_control_update) { | |||
| /* do those things should be done only once per control-calculation | |||
| * interval ("nugget"), such as voice check-for-dead, pitch envelope | |||
| * calculations, volume envelope phase transition checks, etc. */ | |||
| /* check if we've decayed to nothing, turn off voice if so */ | |||
| if (vca_eg_phase == 2 && voice->vca_buf[sample_count - 1] < 6.26e-6f) { | |||
| // sound has completed its release phase (>96dB below volume '5' max) | |||
| XDB_MESSAGE(XDB_NOTE, " nekobee_voice_render check for dead: killing note id %d\n", voice->note_id); | |||
| nekobee_voice_off(voice); | |||
| return; // we're dead now, so return | |||
| } | |||
| /* already saved prev_pitch above */ | |||
| /* check oscillator audio buffer index, shift buffer if necessary */ | |||
| if (osc_index > MINBLEP_BUFFER_LENGTH - (XSYNTH_NUGGET_SIZE + LONGEST_DD_PULSE_LENGTH)) { | |||
| memcpy(voice->osc_audio, voice->osc_audio + osc_index, | |||
| LONGEST_DD_PULSE_LENGTH * sizeof (float)); | |||
| memset(voice->osc_audio + LONGEST_DD_PULSE_LENGTH, 0, | |||
| (MINBLEP_BUFFER_LENGTH - LONGEST_DD_PULSE_LENGTH) * sizeof (float)); | |||
| osc_index = 0; | |||
| } | |||
| } | |||
| /* save things for next time around */ | |||
| voice->lfo_pos = lfo_pos; | |||
| voice->vca_eg = vca_eg; | |||
| voice->vca_eg_phase = vca_eg_phase; | |||
| voice->vcf_eg = vcf_eg; | |||
| voice->vcf_eg_phase = vcf_eg_phase; | |||
| voice->osc_index = osc_index; | |||
| return; | |||
| (void)freq; | |||
| (void)vcf_acc_amt; | |||
| } | |||
| @@ -1,35 +0,0 @@ | |||
| /* (Auto-generated binary data file). */ | |||
| #ifndef BINARY_DISTRHOARTWORKPINGPONGPAN_HPP | |||
| #define BINARY_DISTRHOARTWORKPINGPONGPAN_HPP | |||
| namespace DistrhoArtworkPingPongPan | |||
| { | |||
| extern const char* aboutData; | |||
| const unsigned int aboutDataSize = 172710; | |||
| const unsigned int aboutWidth = 303; | |||
| const unsigned int aboutHeight = 190; | |||
| extern const char* aboutButtonHoverData; | |||
| const unsigned int aboutButtonHoverDataSize = 7600; | |||
| const unsigned int aboutButtonHoverWidth = 95; | |||
| const unsigned int aboutButtonHoverHeight = 20; | |||
| extern const char* aboutButtonNormalData; | |||
| const unsigned int aboutButtonNormalDataSize = 7600; | |||
| const unsigned int aboutButtonNormalWidth = 95; | |||
| const unsigned int aboutButtonNormalHeight = 20; | |||
| extern const char* backgroundData; | |||
| const unsigned int backgroundDataSize = 157080; | |||
| const unsigned int backgroundWidth = 308; | |||
| const unsigned int backgroundHeight = 170; | |||
| extern const char* knobData; | |||
| const unsigned int knobDataSize = 17956; | |||
| const unsigned int knobWidth = 67; | |||
| const unsigned int knobHeight = 67; | |||
| } | |||
| #endif // BINARY_DISTRHOARTWORKPINGPONGPAN_HPP | |||
| @@ -1,35 +0,0 @@ | |||
| /* | |||
| * DISTRHO PingPongPan Plugin, based on PingPongPan 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 "Ping Pong Pan" | |||
| #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 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 0 | |||
| #define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | |||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/PingPongPan" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,161 +0,0 @@ | |||
| /* | |||
| * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | |||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||
| * 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. | |||
| */ | |||
| #include "DistrhoPluginPingPongPan.hpp" | |||
| #include <cmath> | |||
| static const float k2PI = 6.283185307f; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoPluginPingPongPan::DistrhoPluginPingPongPan() | |||
| : Plugin(paramCount, 1, 0) // 1 program, 0 states | |||
| { | |||
| // set default values | |||
| d_setProgram(0); | |||
| // reset | |||
| d_deactivate(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Init | |||
| void DistrhoPluginPingPongPan::d_initParameter(uint32_t index, Parameter& parameter) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramFreq: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Frequency"; | |||
| parameter.symbol = "freq"; | |||
| parameter.ranges.def = 50.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 100.0f; | |||
| break; | |||
| case paramWidth: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Width"; | |||
| parameter.symbol = "with"; | |||
| parameter.unit = "%"; | |||
| parameter.ranges.def = 75.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 100.0f; | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoPluginPingPongPan::d_initProgramName(uint32_t index, d_string& programName) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| programName = "Default"; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Internal data | |||
| float DistrhoPluginPingPongPan::d_getParameterValue(uint32_t index) const | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramFreq: | |||
| return fFreq; | |||
| case paramWidth: | |||
| return fWidth; | |||
| default: | |||
| return 0.0f; | |||
| } | |||
| } | |||
| void DistrhoPluginPingPongPan::d_setParameterValue(uint32_t index, float value) | |||
| { | |||
| if (d_getSampleRate() <= 0.0) | |||
| return; | |||
| switch (index) | |||
| { | |||
| case paramFreq: | |||
| fFreq = value; | |||
| waveSpeed = (k2PI * fFreq / 100.0f)/(float)d_getSampleRate(); | |||
| break; | |||
| case paramWidth: | |||
| fWidth = value; | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoPluginPingPongPan::d_setProgram(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| fFreq = 50.0f; | |||
| fWidth = 75.0f; | |||
| // reset filter values | |||
| d_activate(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Process | |||
| void DistrhoPluginPingPongPan::d_activate() | |||
| { | |||
| waveSpeed = (k2PI * fFreq / 100.0f)/(float)d_getSampleRate(); | |||
| } | |||
| void DistrhoPluginPingPongPan::d_deactivate() | |||
| { | |||
| wavePos = 0.0f; | |||
| } | |||
| void DistrhoPluginPingPongPan::d_run(const float** inputs, float** outputs, uint32_t frames) | |||
| { | |||
| const float* in1 = inputs[0]; | |||
| const float* in2 = inputs[1]; | |||
| float* out1 = outputs[0]; | |||
| float* out2 = outputs[1]; | |||
| for (uint32_t i=0; i < frames; ++i) | |||
| { | |||
| pan = std::fmin(std::fmax(std::sin(wavePos) * (fWidth/100.0f), -1.0f), 1.0f); | |||
| if ((wavePos += waveSpeed) >= k2PI) | |||
| wavePos -= k2PI; | |||
| out1[i] = in1[i] * (pan > 0.0f ? 1.0f-pan : 1.0f); | |||
| out2[i] = in2[i] * (pan < 0.0f ? 1.0f+pan : 1.0f); | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() | |||
| { | |||
| return new DistrhoPluginPingPongPan(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,104 +0,0 @@ | |||
| /* | |||
| * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn | |||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||
| * 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_PINGPONGPAN_HPP_INCLUDED | |||
| #define DISTRHO_PLUGIN_PINGPONGPAN_HPP_INCLUDED | |||
| #include "DistrhoPlugin.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoPluginPingPongPan : public Plugin | |||
| { | |||
| public: | |||
| enum Parameters | |||
| { | |||
| paramFreq = 0, | |||
| paramWidth, | |||
| paramCount | |||
| }; | |||
| DistrhoPluginPingPongPan(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| const char* d_getLabel() const noexcept override | |||
| { | |||
| return "PingPongPan"; | |||
| } | |||
| const char* d_getMaker() const noexcept override | |||
| { | |||
| return "DISTRHO"; | |||
| } | |||
| const char* d_getLicense() const noexcept override | |||
| { | |||
| return "LGPL"; | |||
| } | |||
| uint32_t d_getVersion() const noexcept override | |||
| { | |||
| return 0x1000; | |||
| } | |||
| long d_getUniqueId() const noexcept override | |||
| { | |||
| return d_cconst('D', 'P', 'P', 'P'); | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Init | |||
| void d_initParameter(uint32_t index, Parameter& parameter) override; | |||
| void d_initProgramName(uint32_t index, d_string& programName) override; | |||
| // ------------------------------------------------------------------- | |||
| // Internal data | |||
| float d_getParameterValue(uint32_t index) const override; | |||
| void d_setParameterValue(uint32_t index, float value) override; | |||
| void d_setProgram(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Process | |||
| void d_activate() override; | |||
| void d_deactivate() override; | |||
| void d_run(const float** inputs, float** outputs, uint32_t frames) override; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| float fFreq; | |||
| float fWidth; | |||
| float waveSpeed; | |||
| float pan, wavePos; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoPluginPingPongPan) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_PLUGIN_PINGPONGPAN_HPP_INCLUDED | |||
| @@ -1,130 +0,0 @@ | |||
| /* | |||
| * DISTRHO PingPongPan Plugin, based on PingPongPan 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. | |||
| */ | |||
| #include "DistrhoPluginPingPongPan.hpp" | |||
| #include "DistrhoUIPingPongPan.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoUIPingPongPan::DistrhoUIPingPongPan() | |||
| : UI(), | |||
| fAboutWindow(this) | |||
| { | |||
| // background | |||
| fImgBackground = Image(DistrhoArtworkPingPongPan::backgroundData, DistrhoArtworkPingPongPan::backgroundWidth, DistrhoArtworkPingPongPan::backgroundHeight, GL_BGR); | |||
| Image imageAbout(DistrhoArtworkPingPongPan::aboutData, DistrhoArtworkPingPongPan::aboutWidth, DistrhoArtworkPingPongPan::aboutHeight, GL_BGR); | |||
| fAboutWindow.setImage(imageAbout); | |||
| // knobs | |||
| Image knobImage(DistrhoArtworkPingPongPan::knobData, DistrhoArtworkPingPongPan::knobWidth, DistrhoArtworkPingPongPan::knobHeight); | |||
| // knob Low-Mid | |||
| fKnobFreq = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPluginPingPongPan::paramFreq); | |||
| fKnobFreq->setAbsolutePos(60, 58); | |||
| fKnobFreq->setRange(0.0f, 100.0f); | |||
| fKnobFreq->setDefault(50.0f); | |||
| fKnobFreq->setRotationAngle(270); | |||
| fKnobFreq->setCallback(this); | |||
| // knob Mid-High | |||
| fKnobWidth = new ImageKnob(this, knobImage, ImageKnob::Vertical, DistrhoPluginPingPongPan::paramWidth); | |||
| fKnobWidth->setAbsolutePos(182, 58); | |||
| fKnobWidth->setRange(0.0f, 100.0f); | |||
| fKnobWidth->setDefault(75.0f); | |||
| fKnobWidth->setRotationAngle(270); | |||
| fKnobWidth->setCallback(this); | |||
| // about button | |||
| Image aboutImageNormal(DistrhoArtworkPingPongPan::aboutButtonNormalData, DistrhoArtworkPingPongPan::aboutButtonNormalWidth, DistrhoArtworkPingPongPan::aboutButtonNormalHeight); | |||
| Image aboutImageHover(DistrhoArtworkPingPongPan::aboutButtonHoverData, DistrhoArtworkPingPongPan::aboutButtonHoverWidth, DistrhoArtworkPingPongPan::aboutButtonHoverHeight); | |||
| fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); | |||
| fButtonAbout->setAbsolutePos(183, 8); | |||
| fButtonAbout->setCallback(this); | |||
| // set default values | |||
| d_programChanged(0); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void DistrhoUIPingPongPan::d_parameterChanged(uint32_t index, float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case DistrhoPluginPingPongPan::paramFreq: | |||
| fKnobFreq->setValue(value); | |||
| break; | |||
| case DistrhoPluginPingPongPan::paramWidth: | |||
| fKnobWidth->setValue(value); | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoUIPingPongPan::d_programChanged(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| fKnobFreq->setValue(50.0f); | |||
| fKnobWidth->setValue(75.0f); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void DistrhoUIPingPongPan::imageButtonClicked(ImageButton* button, int) | |||
| { | |||
| if (button != fButtonAbout) | |||
| return; | |||
| fAboutWindow.exec(); | |||
| } | |||
| void DistrhoUIPingPongPan::imageKnobDragStarted(ImageKnob* knob) | |||
| { | |||
| d_editParameter(knob->getId(), true); | |||
| } | |||
| void DistrhoUIPingPongPan::imageKnobDragFinished(ImageKnob* knob) | |||
| { | |||
| d_editParameter(knob->getId(), false); | |||
| } | |||
| void DistrhoUIPingPongPan::imageKnobValueChanged(ImageKnob* knob, float value) | |||
| { | |||
| d_setParameterValue(knob->getId(), value); | |||
| } | |||
| void DistrhoUIPingPongPan::onDisplay() | |||
| { | |||
| fImgBackground.draw(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| UI* createUI() | |||
| { | |||
| return new DistrhoUIPingPongPan(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,88 +0,0 @@ | |||
| /* | |||
| * DISTRHO PingPongPan Plugin, based on PingPongPan 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_UI_PINGPONGPAN_HPP_INCLUDED | |||
| #define DISTRHO_UI_PINGPONGPAN_HPP_INCLUDED | |||
| #include "DistrhoUI.hpp" | |||
| #include "ImageAboutWindow.hpp" | |||
| #include "ImageButton.hpp" | |||
| #include "ImageKnob.hpp" | |||
| #include "DistrhoArtworkPingPongPan.hpp" | |||
| using DGL::Image; | |||
| using DGL::ImageAboutWindow; | |||
| using DGL::ImageButton; | |||
| using DGL::ImageKnob; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoUIPingPongPan : public UI, | |||
| public ImageButton::Callback, | |||
| public ImageKnob::Callback | |||
| { | |||
| public: | |||
| DistrhoUIPingPongPan(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| uint d_getWidth() const noexcept override | |||
| { | |||
| return DistrhoArtworkPingPongPan::backgroundWidth; | |||
| } | |||
| uint d_getHeight() const noexcept override | |||
| { | |||
| return DistrhoArtworkPingPongPan::backgroundHeight; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void d_parameterChanged(uint32_t index, float value) override; | |||
| void d_programChanged(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void imageButtonClicked(ImageButton* button, int) override; | |||
| void imageKnobDragStarted(ImageKnob* knob) override; | |||
| void imageKnobDragFinished(ImageKnob* knob) override; | |||
| void imageKnobValueChanged(ImageKnob* knob, float value) override; | |||
| void onDisplay() override; | |||
| private: | |||
| Image fImgBackground; | |||
| ImageAboutWindow fAboutWindow; | |||
| ScopedPointer<ImageButton> fButtonAbout; | |||
| ScopedPointer<ImageKnob> fKnobFreq, fKnobWidth; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUIPingPongPan) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_UI_PINGPONGPAN_HPP_INCLUDED | |||
| @@ -1,39 +0,0 @@ | |||
| /* | |||
| * Power Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_NAME "PowerJuice" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_SYNTH 0 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 1 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 1 | |||
| #define DISTRHO_PLUGIN_WANT_LATENCY 0 | |||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 0 | |||
| #define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | |||
| // needed for spectrum | |||
| #define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 1 | |||
| #define DISTRHO_PLUGIN_URI "urn:distrho:PowerJuice" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,35 +0,0 @@ | |||
| /* (Auto-generated binary data file). */ | |||
| #ifndef BINARY_POWERJUICEARTWORK_HPP | |||
| #define BINARY_POWERJUICEARTWORK_HPP | |||
| namespace PowerJuiceArtwork | |||
| { | |||
| extern const char* aboutData; | |||
| const unsigned int aboutDataSize = 180000; | |||
| const unsigned int aboutWidth = 300; | |||
| const unsigned int aboutHeight = 200; | |||
| extern const char* aboutButtonHoverData; | |||
| const unsigned int aboutButtonHoverDataSize = 5888; | |||
| const unsigned int aboutButtonHoverWidth = 92; | |||
| const unsigned int aboutButtonHoverHeight = 16; | |||
| extern const char* aboutButtonNormalData; | |||
| const unsigned int aboutButtonNormalDataSize = 5888; | |||
| const unsigned int aboutButtonNormalWidth = 92; | |||
| const unsigned int aboutButtonNormalHeight = 16; | |||
| extern const char* backgroundData; | |||
| const unsigned int backgroundDataSize = 571956; | |||
| const unsigned int backgroundWidth = 619; | |||
| const unsigned int backgroundHeight = 308; | |||
| extern const char* knobData; | |||
| const unsigned int knobDataSize = 10404; | |||
| const unsigned int knobWidth = 51; | |||
| const unsigned int knobHeight = 51; | |||
| } | |||
| #endif // BINARY_POWERJUICEARTWORK_HPP | |||
| @@ -1,379 +0,0 @@ | |||
| /* | |||
| * Power Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #include "PowerJuicePlugin.hpp" | |||
| //#include <cstring> | |||
| #include <cstdlib> | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| PowerJuicePlugin::PowerJuicePlugin() | |||
| : Plugin(paramCount, 1, 0) // 1 program, 0 states | |||
| { | |||
| // set default values | |||
| d_setProgram(0); | |||
| // reset | |||
| d_deactivate(); | |||
| } | |||
| PowerJuicePlugin::~PowerJuicePlugin() | |||
| { | |||
| free(lookaheadStack.data); | |||
| free(RMSStack.data); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Init | |||
| void PowerJuicePlugin::d_initParameter(uint32_t index, Parameter& parameter) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramAttack: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Attack"; | |||
| parameter.symbol = "att"; | |||
| parameter.unit = "ms"; | |||
| parameter.ranges.def = 20.0f; | |||
| parameter.ranges.min = 0.1f; | |||
| parameter.ranges.max = 1000.0f; | |||
| break; | |||
| case paramRelease: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Release"; | |||
| parameter.symbol = "rel"; | |||
| parameter.unit = "ms"; | |||
| parameter.ranges.def = 200.0f; | |||
| parameter.ranges.min = 0.1f; | |||
| parameter.ranges.max = 1000.0f; | |||
| break; | |||
| case paramThreshold: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Threshold"; | |||
| parameter.symbol = "thr"; | |||
| parameter.unit = "dB"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -60.0f; | |||
| parameter.ranges.max = 0.0f; | |||
| break; | |||
| case paramRatio: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Ratio"; | |||
| parameter.symbol = "rat"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 1.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 10.0f; | |||
| break; | |||
| case paramMakeup: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Make-Up"; | |||
| parameter.symbol = "mak"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 20.0f; | |||
| break; | |||
| case paramMix: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Mix"; | |||
| parameter.symbol = "Mix"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 1.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| } | |||
| } | |||
| void PowerJuicePlugin::d_initProgramName(uint32_t index, d_string& programName) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| programName = "Default"; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Internal data | |||
| float PowerJuicePlugin::d_getParameterValue(uint32_t index) const | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramAttack: | |||
| return attack; | |||
| case paramRelease: | |||
| return release; | |||
| case paramThreshold: | |||
| return threshold; | |||
| case paramRatio: | |||
| return ratio; | |||
| case paramMakeup: | |||
| return makeup; | |||
| case paramMix: | |||
| return mix; | |||
| default: | |||
| return 0.0f; | |||
| } | |||
| } | |||
| void PowerJuicePlugin::d_setParameterValue(uint32_t index, float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramAttack: | |||
| attack = value; | |||
| attackSamples = d_getSampleRate()*(attack/1000.0f); | |||
| break; | |||
| case paramRelease: | |||
| release = value; | |||
| releaseSamples = d_getSampleRate()*(release/1000.0f); | |||
| break; | |||
| case paramThreshold: | |||
| threshold = value; | |||
| break; | |||
| case paramRatio: | |||
| ratio = value; | |||
| break; | |||
| case paramMakeup: | |||
| makeup = value; | |||
| makeupFloat = fromDB(makeup); | |||
| break; | |||
| case paramMix: | |||
| mix = value; | |||
| break; | |||
| } | |||
| } | |||
| void PowerJuicePlugin::d_setProgram(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| /* Default parameter values */ | |||
| attack = 20.0f; | |||
| release = 200.0f; | |||
| threshold = 0.0f; | |||
| ratio = 1.0f; | |||
| makeup = 0.0f; | |||
| mix = 1.0f; | |||
| makeupFloat = fromDB(makeup); | |||
| attackSamples = d_getSampleRate()*(attack/1000.0f); | |||
| releaseSamples = d_getSampleRate()*(release/1000.0f); | |||
| w = 563; //waveform plane size, size of the plane in pixels; | |||
| w2 = 1126; //wavefowm array | |||
| h = 121; //waveform plane height | |||
| x = 27; //waveform plane positions | |||
| y = 53; | |||
| dc = 113; //0DC line y position | |||
| /* Default variable values */ | |||
| averageCounter = 0; | |||
| inputMax = 0.0f; | |||
| balancer = 1.0f; | |||
| GR = 1.0f; | |||
| newRepaint = false; | |||
| input.start = 0; | |||
| rms.start = 0; | |||
| gainReduction.start = 0; | |||
| RMSStack.start = 0; | |||
| lookaheadStack.start = 0; | |||
| repaintSkip = 0; | |||
| kFloatRMSStackCount = 400.0f/44100.0f*d_getSampleRate(); | |||
| RMSStack.data = (float*) calloc(kFloatRMSStackCount, sizeof(float)); | |||
| kFloatLookaheadStackCount = 800.0f/44100.0f*d_getSampleRate(); | |||
| lookaheadStack.data = (float*) calloc(kFloatLookaheadStackCount, sizeof(float)); | |||
| refreshSkip= 300.0f/44100.0f*d_getSampleRate(); | |||
| std::memset(rms.data, 0, sizeof(float)*kFloatStackCount); | |||
| std::memset(gainReduction.data, 0, sizeof(float)*kFloatStackCount); | |||
| std::memset(RMSStack.data, 0, sizeof(float)*kFloatRMSStackCount); | |||
| std::memset(lookaheadStack.data, 0, sizeof(float)*kFloatLookaheadStackCount); | |||
| for (int j=0; j < kFloatStackCount; ++j) | |||
| history.rms[j] = h +y; | |||
| for (int j=0; j < kFloatStackCount; ++j) | |||
| history.gainReduction[j] = h +y; | |||
| d_activate(); | |||
| } | |||
| float PowerJuicePlugin::getRMSHistory(int n) { | |||
| return history.rms[n]; | |||
| } | |||
| bool PowerJuicePlugin::repaintNeeded() { | |||
| return newRepaint; | |||
| } | |||
| float PowerJuicePlugin::getGainReductionHistory(int n) { | |||
| if (n == kFloatStackCount-1) { | |||
| newRepaint = false; | |||
| //printf("falsing!\n"); | |||
| } | |||
| return history.gainReduction[n]; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Process | |||
| void PowerJuicePlugin::d_activate() | |||
| { | |||
| } | |||
| void PowerJuicePlugin::d_deactivate() | |||
| { | |||
| // all values to zero | |||
| } | |||
| void PowerJuicePlugin::d_run(const float** inputs, float** outputs, uint32_t frames) | |||
| { | |||
| const float* in = inputs[0]; | |||
| float* out = outputs[0]; | |||
| float sum; | |||
| float data; | |||
| float difference; | |||
| for (uint32_t i=0; i < frames; i++) { | |||
| sum = 0.0f; | |||
| data = 0.0f; | |||
| difference = 0; | |||
| //sanitizeDenormal(in[i]); // FIXME - you cannot modify inputs | |||
| /* compute last RMS */ | |||
| //store audio samples in an RMS buffer line | |||
| RMSStack.data[RMSStack.start++] = in[i]; | |||
| if (RMSStack.start == kFloatRMSStackCount) | |||
| RMSStack.start = 0; | |||
| //compute RMS over last kFloatRMSStackCount samples | |||
| for (int j=0; j < kFloatRMSStackCount; ++j) { | |||
| data = RMSStack.data[(RMSStack.start+j) % kFloatRMSStackCount]; | |||
| sum += data * data; | |||
| } | |||
| //root mean SQUARE | |||
| float RMS = sqrt(sum / kFloatRMSStackCount); | |||
| sanitizeDenormal(RMS); | |||
| /* compute gain reduction if needed */ | |||
| float RMSDB = toDB(RMS); | |||
| if (RMSDB>threshold) { | |||
| //attack stage | |||
| float difference = (RMSDB-threshold); | |||
| //sanitizeDenormal(difference); | |||
| targetGR = difference - difference/ratio; | |||
| if (targetGR>difference/(ratio/4.0f)) { | |||
| targetGR = difference - difference/(ratio*1.5f); | |||
| //more power! | |||
| } | |||
| // | |||
| if (GR<targetGR) { | |||
| //approach targetGR at attackSamples rate | |||
| GR -= (GR-targetGR)/(attackSamples); | |||
| } else { | |||
| //approach targetGR at releaseSamples rate | |||
| GR -= (GR-targetGR)/releaseSamples; | |||
| } | |||
| sanitizeDenormal(GR); | |||
| } else { | |||
| //release stage | |||
| //approach targetGR at releaseSamples rate, targetGR = 0.0f | |||
| GR -= GR/releaseSamples; | |||
| } | |||
| //store audio in lookahead buffer | |||
| lookaheadStack.data[lookaheadStack.start++] = in[i]; | |||
| //printf("rms\n"); | |||
| if (lookaheadStack.start == kFloatLookaheadStackCount) | |||
| lookaheadStack.start = 0; | |||
| if (++averageCounter >= refreshSkip) { | |||
| //add relevant values to the shared memory | |||
| rms.data[rms.start++] = RMSDB; | |||
| gainReduction.data[gainReduction.start++] = GR; | |||
| //rewind stack reading heads if needed | |||
| if (rms.start == kFloatStackCount) | |||
| rms.start = 0; | |||
| if (gainReduction.start == kFloatStackCount) | |||
| gainReduction.start = 0; | |||
| //saving in gfx format, for speed | |||
| //share memory | |||
| for (int j=0; j < kFloatStackCount; ++j) | |||
| history.rms[j] = -toIEC(rms.data[(rms.start+j) % kFloatStackCount])/200*h +h +y; | |||
| for (int j=0; j < kFloatStackCount; ++j) { | |||
| history.gainReduction[j] = -toIEC(-gainReduction.data[(gainReduction.start+j) % kFloatStackCount])/200*h +h +y; | |||
| } | |||
| repaintSkip++; | |||
| if (repaintSkip>5) { | |||
| repaintSkip = 0; | |||
| newRepaint = true; | |||
| } | |||
| averageCounter = 0; | |||
| inputMax = 0.0f; | |||
| } | |||
| /* compress, mix, done. */ | |||
| float compressedSignal = in[i]*fromDB(-GR); | |||
| out[i] = (compressedSignal*makeupFloat*mix)+in[i]*(1-mix); | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() | |||
| { | |||
| return new PowerJuicePlugin(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,212 +0,0 @@ | |||
| /* | |||
| * Power Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #ifndef POWERJUICEPLUGIN_HPP_INCLUDED | |||
| #define POWERJUICEPLUGIN_HPP_INCLUDED | |||
| #include "DistrhoPlugin.hpp" | |||
| #include <cmath> | |||
| static const int kFloatStackCount = 563; | |||
| struct FloatStack { //history for GUI! | |||
| int32_t start; | |||
| float data[kFloatStackCount]; | |||
| }; | |||
| struct FloatRMSStack { //rms, sr-dependent | |||
| int32_t start; | |||
| float* data; | |||
| }; | |||
| struct LookaheadStack { //lookahead buffer, sr-dependent | |||
| int32_t start; | |||
| float* data; | |||
| }; | |||
| struct SharedMemData { //history for the GUI ! | |||
| float rms[kFloatStackCount]; | |||
| float gainReduction[kFloatStackCount]; | |||
| }; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class PowerJuicePlugin : public Plugin | |||
| { | |||
| public: | |||
| enum Parameters | |||
| { | |||
| paramAttack = 0, | |||
| paramRelease, | |||
| paramThreshold, | |||
| paramRatio, | |||
| paramMakeup, | |||
| paramMix, | |||
| paramCount | |||
| }; | |||
| PowerJuicePlugin(); | |||
| ~PowerJuicePlugin() override; | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| const char* d_getLabel() const noexcept override | |||
| { | |||
| return "PowerJuice"; | |||
| } | |||
| const char* d_getMaker() const noexcept override | |||
| { | |||
| return "Andre Sklenar"; | |||
| } | |||
| const char* d_getLicense() const noexcept override | |||
| { | |||
| return "GPL v2+"; | |||
| } | |||
| uint32_t d_getVersion() const noexcept override | |||
| { | |||
| return 0x1000; | |||
| } | |||
| long d_getUniqueId() const noexcept override | |||
| { | |||
| return d_cconst('P', 'w', 'r', 'J'); | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Init | |||
| void d_initParameter(uint32_t index, Parameter& parameter) override; | |||
| void d_initProgramName(uint32_t index, d_string& programName) override; | |||
| // ------------------------------------------------------------------- | |||
| // Internal data | |||
| float d_getParameterValue(uint32_t index) const override; | |||
| void d_setParameterValue(uint32_t index, float value) override; | |||
| void d_setProgram(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Process | |||
| void d_activate() override; | |||
| void d_deactivate() override; | |||
| void d_run(const float** inputs, float** outputs, uint32_t frames) override; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| // params | |||
| float attack, release, threshold, ratio, makeup, mix; | |||
| float attackSamples, releaseSamples, makeupFloat; | |||
| float balancer; | |||
| float targetGR; | |||
| float GR; | |||
| SharedMemData history; | |||
| float sum; | |||
| float data; | |||
| float difference; | |||
| int w; //waveform plane size, size of the plane in pixels; | |||
| int w2; //wavefowm array | |||
| int h; //waveform plane height | |||
| int x; //waveform plane positions | |||
| int y; | |||
| int dc; //0DC line y position | |||
| int kFloatRMSStackCount; | |||
| int kFloatLookaheadStackCount; | |||
| float refreshSkip; | |||
| int averageCounter; | |||
| float inputMax; | |||
| FloatStack input, rms, gainReduction; | |||
| struct FloatRMSStack RMSStack; | |||
| struct LookaheadStack lookaheadStack; | |||
| bool newRepaint; | |||
| int repaintSkip; | |||
| float fromDB(float gdb) { | |||
| return (std::exp(gdb/20.f*std::log(10.f))); | |||
| }; | |||
| float toDB(float g) { | |||
| return (20.f*std::log10(g)); | |||
| } | |||
| float toIEC(float db) { | |||
| float def = 0.0f; /* Meter deflection %age */ | |||
| if (db < -70.0f) { | |||
| def = 0.0f; | |||
| } else if (db < -60.0f) { | |||
| def = (db + 70.0f) * 0.25f; | |||
| } else if (db < -50.0f) { | |||
| def = (db + 60.0f) * 0.5f + 5.0f; | |||
| } else if (db < -40.0f) { | |||
| def = (db + 50.0f) * 0.75f + 7.5; | |||
| } else if (db < -30.0f) { | |||
| def = (db + 40.0f) * 1.5f + 15.0f; | |||
| } else if (db < -20.0f) { | |||
| def = (db + 30.0f) * 2.0f + 30.0f; | |||
| } else if (db < 0.0f) { | |||
| def = (db + 20.0f) * 2.5f + 50.0f; | |||
| } else { | |||
| def = 100.0f; | |||
| } | |||
| return (def * 2.0f); | |||
| } | |||
| bool isNan(float& value ) { | |||
| if (((*(uint32_t *) &value) & 0x7fffffff) > 0x7f800000) { | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| void sanitizeDenormal(float& value) { | |||
| if (isNan(value)) { | |||
| //std::printf("Booo!\n"); | |||
| value = 0.f; | |||
| } | |||
| } | |||
| public: | |||
| //methods | |||
| float getRMSHistory(int n); | |||
| float getGainReductionHistory(int n); | |||
| bool repaintNeeded(); | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // POWERJUICE_HPP_INCLUDED | |||
| @@ -1,307 +0,0 @@ | |||
| /* | |||
| * Power Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #include "PowerJuiceUI.hpp" | |||
| #include <cstdlib> | |||
| #include <ctime> | |||
| using DGL::Point; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| PowerJuiceUI::PowerJuiceUI() | |||
| : UI(), | |||
| fAboutWindow(this), | |||
| dsp((PowerJuicePlugin*)d_getPluginInstancePointer()) | |||
| { | |||
| DISTRHO_SAFE_ASSERT(dsp != nullptr); | |||
| // background | |||
| fImgBackground = Image(PowerJuiceArtwork::backgroundData, PowerJuiceArtwork::backgroundWidth, PowerJuiceArtwork::backgroundHeight, GL_BGR); | |||
| // about | |||
| Image imageAbout(PowerJuiceArtwork::aboutData, PowerJuiceArtwork::aboutWidth, PowerJuiceArtwork::aboutHeight, GL_BGR); | |||
| fAboutWindow.setImage(imageAbout); | |||
| // knobs | |||
| Image knobImage(PowerJuiceArtwork::knobData, PowerJuiceArtwork::knobWidth, PowerJuiceArtwork::knobHeight); | |||
| // knob Attack | |||
| fKnobAttack = new ImageKnob(this, knobImage); | |||
| fKnobAttack->setAbsolutePos(37, 213); | |||
| fKnobAttack->setRange(0.1f, 1000.0f); | |||
| fKnobAttack->setStep(0.1f); | |||
| fKnobAttack->setValue(20.0f); | |||
| fKnobAttack->setRotationAngle(270); | |||
| fKnobAttack->setCallback(this); | |||
| // knob Release | |||
| fKnobRelease = new ImageKnob(this, knobImage); | |||
| fKnobRelease->setAbsolutePos(136, 213); | |||
| fKnobRelease->setRange(0.1f, 1000.0f); | |||
| fKnobRelease->setValue(0.1f); | |||
| fKnobRelease->setRotationAngle(270); | |||
| fKnobRelease->setCallback(this); | |||
| // knob Threshold | |||
| fKnobThreshold = new ImageKnob(this, knobImage); | |||
| fKnobThreshold->setAbsolutePos(235, 213); | |||
| fKnobThreshold->setRange(-60.0f, 0.0f); | |||
| fKnobThreshold->setValue(0.0f); | |||
| fKnobThreshold->setRotationAngle(270); | |||
| fKnobThreshold->setCallback(this); | |||
| // knob Ratio | |||
| fKnobRatio = new ImageKnob(this, knobImage); | |||
| fKnobRatio->setAbsolutePos(334, 213); | |||
| fKnobRatio->setRange(1.0f, 10.0f); | |||
| fKnobRatio->setValue(1.0f); | |||
| fKnobRatio->setRotationAngle(270); | |||
| fKnobRatio->setCallback(this); | |||
| // knob Make-Up | |||
| fKnobMakeup = new ImageKnob(this, knobImage); | |||
| fKnobMakeup->setAbsolutePos(433, 213); | |||
| fKnobMakeup->setRange(0.0f, 20.0f); | |||
| fKnobMakeup->setValue(0.0f); | |||
| fKnobMakeup->setRotationAngle(270); | |||
| fKnobMakeup->setCallback(this); | |||
| // knob Mix | |||
| fKnobMix = new ImageKnob(this, knobImage); | |||
| fKnobMix->setAbsolutePos(532, 213); | |||
| fKnobMix->setRange(0.0f, 1.0f); | |||
| fKnobMix->setValue(1.0f); | |||
| fKnobMix->setRotationAngle(270); | |||
| fKnobMix->setCallback(this); | |||
| // about button | |||
| Image aboutImageNormal(PowerJuiceArtwork::aboutButtonNormalData, PowerJuiceArtwork::aboutButtonNormalWidth, PowerJuiceArtwork::aboutButtonNormalHeight); | |||
| Image aboutImageHover(PowerJuiceArtwork::aboutButtonHoverData, PowerJuiceArtwork::aboutButtonHoverWidth, PowerJuiceArtwork::aboutButtonHoverHeight); | |||
| fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); | |||
| fButtonAbout->setAbsolutePos(502, 17); | |||
| fButtonAbout->setCallback(this); | |||
| // set default values | |||
| d_programChanged(0); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void PowerJuiceUI::d_parameterChanged(uint32_t index, float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case PowerJuicePlugin::paramAttack: | |||
| fKnobAttack->setValue(value); | |||
| break; | |||
| case PowerJuicePlugin::paramRelease: | |||
| fKnobRelease->setValue(value); | |||
| break; | |||
| case PowerJuicePlugin::paramThreshold: | |||
| fKnobThreshold->setValue(value); | |||
| break; | |||
| case PowerJuicePlugin::paramRatio: | |||
| fKnobRatio->setValue(value); | |||
| break; | |||
| case PowerJuicePlugin::paramMakeup: | |||
| fKnobMakeup->setValue(value); | |||
| break; | |||
| case PowerJuicePlugin::paramMix: | |||
| fKnobMix->setValue(value); | |||
| break; | |||
| } | |||
| } | |||
| void PowerJuiceUI::d_programChanged(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| fKnobAttack->setValue(20.0f); | |||
| fKnobRelease->setValue(200.0f); | |||
| fKnobThreshold->setValue(0.0f); | |||
| fKnobRatio->setValue(1.0f); | |||
| fKnobMakeup->setValue(0.0f); | |||
| fKnobMix->setValue(1.0f); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void PowerJuiceUI::imageButtonClicked(ImageButton* button, int) | |||
| { | |||
| if (button != fButtonAbout) | |||
| return; | |||
| fAboutWindow.exec(); | |||
| } | |||
| void PowerJuiceUI::imageKnobDragStarted(ImageKnob* knob) | |||
| { | |||
| if (knob == fKnobAttack) | |||
| d_editParameter(PowerJuicePlugin::paramAttack, true); | |||
| else if (knob == fKnobRelease) | |||
| d_editParameter(PowerJuicePlugin::paramRelease, true); | |||
| else if (knob == fKnobThreshold) | |||
| d_editParameter(PowerJuicePlugin::paramThreshold, true); | |||
| else if (knob == fKnobRatio) | |||
| d_editParameter(PowerJuicePlugin::paramRatio, true); | |||
| else if (knob == fKnobMakeup) | |||
| d_editParameter(PowerJuicePlugin::paramMakeup, true); | |||
| else if (knob == fKnobMix) | |||
| d_editParameter(PowerJuicePlugin::paramMix, true); | |||
| } | |||
| void PowerJuiceUI::imageKnobDragFinished(ImageKnob* knob) | |||
| { | |||
| if (knob == fKnobAttack) | |||
| d_editParameter(PowerJuicePlugin::paramAttack, false); | |||
| else if (knob == fKnobRelease) | |||
| d_editParameter(PowerJuicePlugin::paramRelease, false); | |||
| else if (knob == fKnobThreshold) | |||
| d_editParameter(PowerJuicePlugin::paramThreshold, false); | |||
| else if (knob == fKnobRatio) | |||
| d_editParameter(PowerJuicePlugin::paramRatio, false); | |||
| else if (knob == fKnobMakeup) | |||
| d_editParameter(PowerJuicePlugin::paramMakeup, false); | |||
| else if (knob == fKnobMix) | |||
| d_editParameter(PowerJuicePlugin::paramMix, false); | |||
| } | |||
| void PowerJuiceUI::imageKnobValueChanged(ImageKnob* knob, float value) | |||
| { | |||
| if (knob == fKnobAttack) | |||
| d_setParameterValue(PowerJuicePlugin::paramAttack, value); | |||
| else if (knob == fKnobRelease) | |||
| d_setParameterValue(PowerJuicePlugin::paramRelease, value); | |||
| else if (knob == fKnobThreshold) | |||
| d_setParameterValue(PowerJuicePlugin::paramThreshold, value); | |||
| else if (knob == fKnobRatio) | |||
| d_setParameterValue(PowerJuicePlugin::paramRatio, value); | |||
| else if (knob == fKnobMakeup) | |||
| d_setParameterValue(PowerJuicePlugin::paramMakeup, value); | |||
| else if (knob == fKnobMix) | |||
| d_setParameterValue(PowerJuicePlugin::paramMix, value); | |||
| } | |||
| void PowerJuiceUI::d_uiIdle() | |||
| { | |||
| if (dsp != nullptr && dsp->repaintNeeded()) | |||
| repaint(); | |||
| } | |||
| void PowerJuiceUI::onDisplay() | |||
| { | |||
| fImgBackground.draw(); | |||
| if (dsp == nullptr) | |||
| return; | |||
| int w = 563; //waveform plane size, size of the plane in pixels; | |||
| int w2 = 1126; //wavefowm array | |||
| int h = 121; //waveform plane height | |||
| int x = 27; //waveform plane positions | |||
| int y = 53; | |||
| int dc = 113; //0DC line y position | |||
| glEnable(GL_BLEND); | |||
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |||
| glEnable(GL_LINE_SMOOTH); | |||
| glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); | |||
| float thresholdPosition = (-toIEC(fKnobThreshold->getValue()))/200*h+h+y; | |||
| //draw waveform | |||
| /* | |||
| glColor4f(0.0f, 1.0f, 0.0f, 0.4f); | |||
| glLineWidth(1.2f); | |||
| for (int i=0; i<w; i++) { | |||
| glBegin(GL_LINES); | |||
| glVertex2i(x+i, -toIEC(shmData->input[i])/200*h+h+y); | |||
| glVertex2i(x+i, y+h); | |||
| glEnd(); | |||
| } | |||
| */ | |||
| //draw RMS | |||
| glColor4f(0.0f, 0.0f, 1.0f, 1.0f); | |||
| glLineWidth(2.0f); | |||
| glBegin(GL_LINE_STRIP); | |||
| for (int i=2; i<w; i++) { | |||
| float value = dsp->getRMSHistory(i); | |||
| if (value<thresholdPosition) { | |||
| glColor4f(0.0f, 0.5f, 0.0f, 1.0f); | |||
| } else { | |||
| glColor4f(0.0f, 0.5f, 0.2f, 1.0f); | |||
| } | |||
| glVertex2i(x+i, value); | |||
| } | |||
| glEnd(); | |||
| //draw gain reduction | |||
| glColor4f(1.0f, 1.0f, 1.0f, 0.3f); | |||
| glLineWidth(3.0f); | |||
| glBegin(GL_LINES); | |||
| for (int i=2; i<w; i++) { | |||
| glColor4f(1.0f, 1.0f, 1.0f, 0.3f); | |||
| float value = dsp->getGainReductionHistory(i); | |||
| glVertex2i(x+i, value); | |||
| glVertex2i(x+i, y); | |||
| value = dsp->getRMSHistory(i); | |||
| glColor4f(0.0f, 0.5f, 0.2f, 0.1f); | |||
| glVertex2i(x+i, value); | |||
| glVertex2i(x+i, y+h); | |||
| } | |||
| glEnd(); | |||
| //draw Threshold | |||
| glLineWidth(2.0f); | |||
| glColor4f(0.4f, 0.4f, 1.0f, 0.8f); | |||
| //float thresholdPosition = ((60-fKnobThreshold->getValue())/60); | |||
| glBegin(GL_LINES); | |||
| glVertex2i(x, thresholdPosition); | |||
| glVertex2i(x+w, thresholdPosition); | |||
| glEnd(); | |||
| // reset color | |||
| glColor4f(1.0f, 1.0f, 1.0f, 1.0f); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| UI* createUI() | |||
| { | |||
| return new PowerJuiceUI(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,130 +0,0 @@ | |||
| /* | |||
| * Power Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #ifndef POWERJUICEUI_HPP_INCLUDED | |||
| #define POWERJUICEUI_HPP_INCLUDED | |||
| #include "DistrhoUI.hpp" | |||
| #include "ImageAboutWindow.hpp" | |||
| #include "ImageButton.hpp" | |||
| #include "ImageKnob.hpp" | |||
| #include "ImageSlider.hpp" | |||
| #include "PowerJuiceArtwork.hpp" | |||
| #include "PowerJuicePlugin.hpp" | |||
| #include <cmath> | |||
| using DGL::Image; | |||
| using DGL::ImageAboutWindow; | |||
| using DGL::ImageButton; | |||
| using DGL::ImageKnob; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class PowerJuiceUI : public UI, | |||
| public ImageButton::Callback, | |||
| public ImageKnob::Callback | |||
| { | |||
| public: | |||
| PowerJuiceUI(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| uint d_getWidth() const noexcept override | |||
| { | |||
| return PowerJuiceArtwork::backgroundWidth; | |||
| } | |||
| uint d_getHeight() const noexcept override | |||
| { | |||
| return PowerJuiceArtwork::backgroundHeight; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void d_parameterChanged(uint32_t index, float value) override; | |||
| void d_programChanged(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // UI Callbacks | |||
| void d_uiIdle() override; | |||
| // ------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void imageButtonClicked(ImageButton* button, int) override; | |||
| void imageKnobDragStarted(ImageKnob* knob) override; | |||
| void imageKnobDragFinished(ImageKnob* knob) override; | |||
| void imageKnobValueChanged(ImageKnob* knob, float value) override; | |||
| void onDisplay() override; | |||
| private: | |||
| Image fImgBackground; | |||
| ImageAboutWindow fAboutWindow; | |||
| ScopedPointer<ImageKnob> fKnobAttack, fKnobRelease, fKnobThreshold; | |||
| ScopedPointer<ImageKnob> fKnobRatio, fKnobMakeup, fKnobMix; | |||
| ScopedPointer<ImageButton> fButtonAbout; | |||
| PowerJuicePlugin* const dsp; | |||
| float fromDB(float gdb) { | |||
| return (std::exp(gdb/20.f*std::log(10.f))); | |||
| }; | |||
| float toDB(float g) { | |||
| return (20.f*std::log10(g)); | |||
| } | |||
| float toIEC(float db) { | |||
| float def = 0.0f; /* Meter deflection %age */ | |||
| if (db < -70.0f) { | |||
| def = 0.0f; | |||
| } else if (db < -60.0f) { | |||
| def = (db + 70.0f) * 0.25f; | |||
| } else if (db < -50.0f) { | |||
| def = (db + 60.0f) * 0.5f + 5.0f; | |||
| } else if (db < -40.0f) { | |||
| def = (db + 50.0f) * 0.75f + 7.5; | |||
| } else if (db < -30.0f) { | |||
| def = (db + 40.0f) * 1.5f + 15.0f; | |||
| } else if (db < -20.0f) { | |||
| def = (db + 30.0f) * 2.0f + 30.0f; | |||
| } else if (db < 0.0f) { | |||
| def = (db + 20.0f) * 2.5f + 50.0f; | |||
| } else { | |||
| def = 100.0f; | |||
| } | |||
| return (def * 2.0f); | |||
| } | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // POWERJUICEUI_HPP_INCLUDED | |||
| @@ -1,38 +0,0 @@ | |||
| /* | |||
| * DISTRHO ProM Plugin | |||
| * Copyright (C) 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 "ProM" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_SYNTH 0 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 1 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 1 | |||
| #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_IS_RT_SAFE 0 | |||
| #define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 1 | |||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/ProM" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,84 +0,0 @@ | |||
| /* | |||
| * DISTRHO ProM Plugin | |||
| * Copyright (C) 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. | |||
| */ | |||
| #include "DistrhoPluginProM.hpp" | |||
| #include "libprojectM/projectM.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoPluginProM::DistrhoPluginProM() | |||
| : Plugin(0, 0, 0), | |||
| fPM(nullptr) | |||
| { | |||
| } | |||
| DistrhoPluginProM::~DistrhoPluginProM() | |||
| { | |||
| DISTRHO_SAFE_ASSERT(fPM == nullptr); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Init | |||
| void DistrhoPluginProM::d_initParameter(uint32_t, Parameter&) | |||
| { | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Internal data | |||
| float DistrhoPluginProM::d_getParameterValue(uint32_t) const | |||
| { | |||
| return 0.0f; | |||
| } | |||
| void DistrhoPluginProM::d_setParameterValue(uint32_t, float) | |||
| { | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Process | |||
| void DistrhoPluginProM::d_run(const float** inputs, float** outputs, uint32_t frames) | |||
| { | |||
| const float* in = inputs[0]; | |||
| float* out = outputs[0]; | |||
| if (in != out) | |||
| std::memcpy(out, in, sizeof(float)*frames); | |||
| const MutexLocker csm(fMutex); | |||
| if (fPM == nullptr) | |||
| return; | |||
| if (PCM* const pcm = fPM->pcm()) | |||
| pcm->addPCMfloat(in, frames); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() | |||
| { | |||
| return new DistrhoPluginProM(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,96 +0,0 @@ | |||
| /* | |||
| * DISTRHO ProM Plugin | |||
| * Copyright (C) 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_3BANDEQ_HPP_INCLUDED | |||
| #define DISTRHO_PLUGIN_3BANDEQ_HPP_INCLUDED | |||
| #include "DistrhoPlugin.hpp" | |||
| #include "extra/d_mutex.hpp" | |||
| class projectM; | |||
| class DistrhoUIProM; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoPluginProM : public Plugin | |||
| { | |||
| public: | |||
| DistrhoPluginProM(); | |||
| ~DistrhoPluginProM() override; | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| const char* d_getLabel() const noexcept override | |||
| { | |||
| return "ProM"; | |||
| } | |||
| const char* d_getMaker() const noexcept override | |||
| { | |||
| return "DISTRHO"; | |||
| } | |||
| const char* d_getLicense() const noexcept override | |||
| { | |||
| return "LGPL"; | |||
| } | |||
| uint32_t d_getVersion() const noexcept override | |||
| { | |||
| return 0x1000; | |||
| } | |||
| long d_getUniqueId() const noexcept override | |||
| { | |||
| return d_cconst('D', 'P', 'r', 'M'); | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Init | |||
| void d_initParameter(uint32_t, Parameter&) override; | |||
| // ------------------------------------------------------------------- | |||
| // Internal data | |||
| float d_getParameterValue(uint32_t) const override; | |||
| void d_setParameterValue(uint32_t, float) override; | |||
| // ------------------------------------------------------------------- | |||
| // Process | |||
| void d_run(const float** inputs, float** outputs, uint32_t frames) override; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| Mutex fMutex; | |||
| projectM* fPM; | |||
| friend class DistrhoUIProM; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoPluginProM) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_PLUGIN_3BANDEQ_HPP_INCLUDED | |||
| @@ -1,276 +0,0 @@ | |||
| /* | |||
| * DISTRHO ProM Plugin | |||
| * Copyright (C) 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. | |||
| */ | |||
| #include "DistrhoPluginProM.hpp" | |||
| #include "DistrhoUIProM.hpp" | |||
| #include "libprojectM/projectM.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| static const projectM::Settings kSettings = { | |||
| /* meshX */ 32, | |||
| /* meshY */ 24, | |||
| /* fps */ 35, | |||
| /* textureSize */ 1024, | |||
| /* windowWidth */ 512, | |||
| /* windowHeight */ 512, | |||
| /* presetURL */ "/usr/share/projectM/presets", | |||
| /* titleFontURL */ "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf", | |||
| /* menuFontURL */ "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf", | |||
| /* smoothPresetDuration */ 5, | |||
| /* presetDuration */ 30, | |||
| /* beatSensitivity */ 10.0f, | |||
| /* aspectCorrection */ true, | |||
| /* easterEgg */ 1.0f, | |||
| /* shuffleEnabled */ true, | |||
| /* softCutRatingsEnabled */ false | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoUIProM::DistrhoUIProM() | |||
| : UI() | |||
| { | |||
| } | |||
| DistrhoUIProM::~DistrhoUIProM() | |||
| { | |||
| if (DistrhoPluginProM* const dspPtr = (DistrhoPluginProM*)d_getPluginInstancePointer()) | |||
| { | |||
| const MutexLocker csm(dspPtr->fMutex); | |||
| dspPtr->fPM = nullptr; | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void DistrhoUIProM::d_parameterChanged(uint32_t, float) | |||
| { | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // UI Callbacks | |||
| void DistrhoUIProM::d_uiIdle() | |||
| { | |||
| if (fPM == nullptr) | |||
| return; | |||
| repaint(); | |||
| if (DistrhoPluginProM* const dspPtr = (DistrhoPluginProM*)d_getPluginInstancePointer()) | |||
| { | |||
| if (dspPtr->fPM != nullptr) | |||
| return; | |||
| const MutexLocker csm(dspPtr->fMutex); | |||
| dspPtr->fPM = fPM; | |||
| } | |||
| } | |||
| void DistrhoUIProM::d_uiReshape(int width, int height) | |||
| { | |||
| glEnable(GL_BLEND); | |||
| glEnable(GL_LINE_SMOOTH); | |||
| glEnable(GL_POINT_SMOOTH); | |||
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |||
| glShadeModel(GL_SMOOTH); | |||
| glMatrixMode(GL_TEXTURE); | |||
| glLoadIdentity(); | |||
| glMatrixMode(GL_PROJECTION); | |||
| glLoadIdentity(); | |||
| glOrtho(0, width, height, 0, 0.0f, 1.0f); | |||
| glViewport(0, 0, width, height); | |||
| glMatrixMode(GL_MODELVIEW); | |||
| glLoadIdentity(); | |||
| glDrawBuffer(GL_BACK); | |||
| glReadBuffer(GL_BACK); | |||
| glClearColor(0.0f, 0.0f, 0.0f, 0.0f); | |||
| glLineStipple(2, 0xAAAA); | |||
| if (fPM == nullptr) | |||
| fPM = new projectM(kSettings); // std::string("/usr/share/projectM/config.inp")); | |||
| fPM->projectM_resetGL(width, height); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void DistrhoUIProM::onDisplay() | |||
| { | |||
| if (fPM == nullptr) | |||
| return; | |||
| fPM->renderFrame(); | |||
| } | |||
| bool DistrhoUIProM::onKeyboard(const KeyboardEvent& ev) | |||
| { | |||
| if (fPM == nullptr) | |||
| return false; | |||
| projectMKeycode pmKey = PROJECTM_K_NONE; | |||
| projectMModifier pmMod = PROJECTM_KMOD_LSHIFT; | |||
| if ((ev.key >= PROJECTM_K_0 && ev.key <= PROJECTM_K_9) || | |||
| (ev.key >= PROJECTM_K_A && ev.key <= PROJECTM_K_Z) || | |||
| (ev.key >= PROJECTM_K_a && ev.key <= PROJECTM_K_z)) | |||
| { | |||
| pmKey = static_cast<projectMKeycode>(ev.key); | |||
| } | |||
| else | |||
| { | |||
| switch (ev.key) | |||
| { | |||
| case DGL::CHAR_BACKSPACE: | |||
| pmKey = PROJECTM_K_BACKSPACE; | |||
| break; | |||
| case DGL::CHAR_ESCAPE: | |||
| pmKey = PROJECTM_K_ESCAPE; | |||
| break; | |||
| case DGL::CHAR_DELETE: | |||
| pmKey = PROJECTM_K_DELETE; | |||
| break; | |||
| } | |||
| } | |||
| if (pmKey == PROJECTM_K_NONE) | |||
| return false; | |||
| if (ev.mod & DGL::MODIFIER_CTRL) | |||
| pmMod = PROJECTM_KMOD_LCTRL; | |||
| fPM->key_handler(ev.press ? PROJECTM_KEYUP : PROJECTM_KEYDOWN, pmKey, pmMod); | |||
| return true; | |||
| } | |||
| bool DistrhoUIProM::onSpecial(const SpecialEvent& ev) | |||
| { | |||
| if (fPM == nullptr) | |||
| return false; | |||
| projectMKeycode pmKey = PROJECTM_K_NONE; | |||
| projectMModifier pmMod = PROJECTM_KMOD_LSHIFT; | |||
| switch (ev.key) | |||
| { | |||
| case DGL::KEY_F1: | |||
| pmKey = PROJECTM_K_F1; | |||
| break; | |||
| case DGL::KEY_F2: | |||
| pmKey = PROJECTM_K_F2; | |||
| break; | |||
| case DGL::KEY_F3: | |||
| pmKey = PROJECTM_K_F3; | |||
| break; | |||
| case DGL::KEY_F4: | |||
| pmKey = PROJECTM_K_F4; | |||
| break; | |||
| case DGL::KEY_F5: | |||
| pmKey = PROJECTM_K_F5; | |||
| break; | |||
| case DGL::KEY_F6: | |||
| pmKey = PROJECTM_K_F6; | |||
| break; | |||
| case DGL::KEY_F7: | |||
| pmKey = PROJECTM_K_F7; | |||
| break; | |||
| case DGL::KEY_F8: | |||
| pmKey = PROJECTM_K_F8; | |||
| break; | |||
| case DGL::KEY_F9: | |||
| pmKey = PROJECTM_K_F9; | |||
| break; | |||
| case DGL::KEY_F10: | |||
| pmKey = PROJECTM_K_F10; | |||
| break; | |||
| case DGL::KEY_F11: | |||
| pmKey = PROJECTM_K_F11; | |||
| break; | |||
| case DGL::KEY_F12: | |||
| pmKey = PROJECTM_K_F12; | |||
| break; | |||
| case DGL::KEY_LEFT: | |||
| pmKey = PROJECTM_K_LEFT; | |||
| break; | |||
| case DGL::KEY_UP: | |||
| pmKey = PROJECTM_K_UP; | |||
| break; | |||
| case DGL::KEY_RIGHT: | |||
| pmKey = PROJECTM_K_RIGHT; | |||
| break; | |||
| case DGL::KEY_DOWN: | |||
| pmKey = PROJECTM_K_DOWN; | |||
| break; | |||
| case DGL::KEY_PAGE_UP: | |||
| pmKey = PROJECTM_K_PAGEUP; | |||
| break; | |||
| case DGL::KEY_PAGE_DOWN: | |||
| pmKey = PROJECTM_K_PAGEDOWN; | |||
| break; | |||
| case DGL::KEY_HOME: | |||
| pmKey = PROJECTM_K_HOME; | |||
| break; | |||
| case DGL::KEY_END: | |||
| pmKey = PROJECTM_K_END; | |||
| break; | |||
| case DGL::KEY_INSERT: | |||
| pmKey = PROJECTM_K_INSERT; | |||
| break; | |||
| case DGL::KEY_SHIFT: | |||
| pmKey = PROJECTM_K_LSHIFT; | |||
| break; | |||
| case DGL::KEY_CTRL: | |||
| pmKey = PROJECTM_K_LCTRL; | |||
| break; | |||
| case DGL::KEY_ALT: | |||
| case DGL::KEY_SUPER: | |||
| break; | |||
| } | |||
| if (pmKey == PROJECTM_K_NONE) | |||
| return false; | |||
| if (ev.mod & DGL::MODIFIER_CTRL) | |||
| pmMod = PROJECTM_KMOD_LCTRL; | |||
| fPM->key_handler(ev.press ? PROJECTM_KEYUP : PROJECTM_KEYDOWN, pmKey, pmMod); | |||
| return true; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| UI* createUI() | |||
| { | |||
| return new DistrhoUIProM(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,76 +0,0 @@ | |||
| /* | |||
| * DISTRHO ProM Plugin | |||
| * Copyright (C) 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_UI_3BANDEQ_HPP_INCLUDED | |||
| #define DISTRHO_UI_3BANDEQ_HPP_INCLUDED | |||
| #include "DistrhoUI.hpp" | |||
| class projectM; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoUIProM : public UI | |||
| { | |||
| public: | |||
| DistrhoUIProM(); | |||
| ~DistrhoUIProM() override; | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| uint d_getWidth() const noexcept override | |||
| { | |||
| return 512; | |||
| } | |||
| uint d_getHeight() const noexcept override | |||
| { | |||
| return 512; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void d_parameterChanged(uint32_t, float) override; | |||
| // ------------------------------------------------------------------- | |||
| // UI Callbacks | |||
| void d_uiIdle() override; | |||
| void d_uiReshape(int width, int height) override; | |||
| // ------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void onDisplay() override; | |||
| bool onKeyboard(const KeyboardEvent&) override; | |||
| bool onSpecial(const SpecialEvent&) override; | |||
| private: | |||
| ScopedPointer<projectM> fPM; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUIProM) | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_UI_3BANDEQ_HPP_INCLUDED | |||
| @@ -1,36 +0,0 @@ | |||
| /* | |||
| * Segment Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_NAME "SegmentJuice" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_SYNTH 1 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 0 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||
| #define DISTRHO_PLUGIN_WANT_LATENCY 0 | |||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 0 | |||
| #define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | |||
| #define DISTRHO_PLUGIN_URI "urn:distrho:SegmentJuice" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,40 +0,0 @@ | |||
| /* (Auto-generated binary data file). */ | |||
| #ifndef BINARY_SEGMENTJUICEARTWORK_HPP | |||
| #define BINARY_SEGMENTJUICEARTWORK_HPP | |||
| namespace SegmentJuiceArtwork | |||
| { | |||
| extern const char* aboutData; | |||
| const unsigned int aboutDataSize = 180000; | |||
| const unsigned int aboutWidth = 300; | |||
| const unsigned int aboutHeight = 200; | |||
| extern const char* aboutButtonHoverData; | |||
| const unsigned int aboutButtonHoverDataSize = 5888; | |||
| const unsigned int aboutButtonHoverWidth = 92; | |||
| const unsigned int aboutButtonHoverHeight = 16; | |||
| extern const char* aboutButtonNormalData; | |||
| const unsigned int aboutButtonNormalDataSize = 5888; | |||
| const unsigned int aboutButtonNormalWidth = 92; | |||
| const unsigned int aboutButtonNormalHeight = 16; | |||
| extern const char* backgroundData; | |||
| const unsigned int backgroundDataSize = 933432; | |||
| const unsigned int backgroundWidth = 712; | |||
| const unsigned int backgroundHeight = 437; | |||
| extern const char* knobData; | |||
| const unsigned int knobDataSize = 4900; | |||
| const unsigned int knobWidth = 35; | |||
| const unsigned int knobHeight = 35; | |||
| extern const char* knob2Data; | |||
| const unsigned int knob2DataSize = 9216; | |||
| const unsigned int knob2Width = 48; | |||
| const unsigned int knob2Height = 48; | |||
| } | |||
| #endif // BINARY_SEGMENTJUICEARTWORK_HPP | |||
| @@ -1,688 +0,0 @@ | |||
| /* | |||
| * Segment Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #include "SegmentJuicePlugin.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| SegmentJuicePlugin::SegmentJuicePlugin() | |||
| : Plugin(paramCount, 1, 0) // 1 program, 0 states | |||
| { | |||
| // set default values | |||
| d_setProgram(0); | |||
| // reset | |||
| d_deactivate(); | |||
| } | |||
| SegmentJuicePlugin::~SegmentJuicePlugin() | |||
| { | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Init | |||
| void SegmentJuicePlugin::d_initParameter(uint32_t index, Parameter& parameter) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramWave1: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Wave1"; | |||
| parameter.symbol = "w1"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 3.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 4.0f; | |||
| break; | |||
| case paramWave2: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Wave2"; | |||
| parameter.symbol = "w2"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 3.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 4.0f; | |||
| break; | |||
| case paramWave3: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Wave3"; | |||
| parameter.symbol = "w3"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 3.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 4.0f; | |||
| break; | |||
| case paramWave4: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Wave4"; | |||
| parameter.symbol = "w4"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 3.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 4.0f; | |||
| break; | |||
| case paramWave5: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Wave5"; | |||
| parameter.symbol = "w5"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 3.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 4.0f; | |||
| break; | |||
| case paramWave6: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "w6"; | |||
| parameter.symbol = ""; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 3.0f; | |||
| parameter.ranges.min = 1.0f; | |||
| parameter.ranges.max = 4.0f; | |||
| break; | |||
| case paramFM1: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "FM1"; | |||
| parameter.symbol = "f1"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramFM2: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "FM2"; | |||
| parameter.symbol = "f2"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramFM3: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "FM3"; | |||
| parameter.symbol = "f3"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramFM4: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "FM4"; | |||
| parameter.symbol = "f4"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramFM5: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "FM5"; | |||
| parameter.symbol = "f5"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramFM6: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "FM6"; | |||
| parameter.symbol = "f6"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -1.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramPan1: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Pan1"; | |||
| parameter.symbol = "p1"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -1.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramPan2: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Pan2"; | |||
| parameter.symbol = "p2"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -1.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramPan3: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Pan3"; | |||
| parameter.symbol = "p3"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -1.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramPan4: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Pan4"; | |||
| parameter.symbol = "p4"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -1.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramPan5: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Pan5"; | |||
| parameter.symbol = "p5"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -1.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramPan6: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "p6"; | |||
| parameter.symbol = "p6"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -1.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramAmp1: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Amp1"; | |||
| parameter.symbol = "a1"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramAmp2: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Amp2"; | |||
| parameter.symbol = "a2"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramAmp3: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Amp3"; | |||
| parameter.symbol = "a3"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramAmp4: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Amp4"; | |||
| parameter.symbol = "a4"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramAmp5: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Amp5"; | |||
| parameter.symbol = "a5"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramAmp6: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Amp6"; | |||
| parameter.symbol = "a6"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramAttack: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Attack"; | |||
| parameter.symbol = "att"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramDecay: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Decay"; | |||
| parameter.symbol = "dec"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramSustain: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Sustain"; | |||
| parameter.symbol = "sus"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 1.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramRelease: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Release"; | |||
| parameter.symbol = "rel"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramStereo: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Stereo"; | |||
| parameter.symbol = "str"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -1.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramTune: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Tune"; | |||
| parameter.symbol = "tun"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = -1.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramVolume: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Volume"; | |||
| parameter.symbol = "vol"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.5f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| case paramGlide: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Glide"; | |||
| parameter.symbol = "gld"; | |||
| parameter.unit = ""; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 0.0f; | |||
| parameter.ranges.max = 1.0f; | |||
| break; | |||
| } | |||
| } | |||
| void SegmentJuicePlugin::d_initProgramName(uint32_t index, d_string& programName) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| programName = "Default"; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Internal data | |||
| float SegmentJuicePlugin::d_getParameterValue(uint32_t index) const | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramWave1: | |||
| return wave1; | |||
| case paramWave2: | |||
| return wave2; | |||
| case paramWave3: | |||
| return wave3; | |||
| case paramWave4: | |||
| return wave4; | |||
| case paramWave5: | |||
| return wave5; | |||
| case paramWave6: | |||
| return wave6; | |||
| case paramFM1: | |||
| return FM1; | |||
| case paramFM2: | |||
| return FM2; | |||
| case paramFM3: | |||
| return FM3; | |||
| case paramFM4: | |||
| return FM4; | |||
| case paramFM5: | |||
| return FM5; | |||
| case paramFM6: | |||
| return FM6; | |||
| case paramPan1: | |||
| return pan1; | |||
| case paramPan2: | |||
| return pan2; | |||
| case paramPan3: | |||
| return pan3; | |||
| case paramPan4: | |||
| return pan4; | |||
| case paramPan5: | |||
| return pan5; | |||
| case paramPan6: | |||
| return pan6; | |||
| case paramAmp1: | |||
| return amp1; | |||
| case paramAmp2: | |||
| return amp2; | |||
| case paramAmp3: | |||
| return amp3; | |||
| case paramAmp4: | |||
| return amp4; | |||
| case paramAmp5: | |||
| return amp5; | |||
| case paramAmp6: | |||
| return amp6; | |||
| case paramAttack: | |||
| return attack; | |||
| case paramDecay: | |||
| return decay; | |||
| case paramSustain: | |||
| return sustain; | |||
| case paramRelease: | |||
| return release; | |||
| case paramStereo: | |||
| return stereo; | |||
| case paramTune: | |||
| return tune; | |||
| case paramVolume: | |||
| return volume; | |||
| case paramGlide: | |||
| return glide; | |||
| default: | |||
| return 0.0f; | |||
| } | |||
| } | |||
| void SegmentJuicePlugin::d_setParameterValue(uint32_t index, float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramWave1: | |||
| synthL.setWave(0, value); | |||
| synthR.setWave(0, value); | |||
| wave1 = value; | |||
| break; | |||
| case paramWave2: | |||
| synthL.setWave(1, value); | |||
| synthR.setWave(1, value); | |||
| wave2 = value; | |||
| break; | |||
| case paramWave3: | |||
| synthL.setWave(2, value); | |||
| synthR.setWave(2, value); | |||
| wave3 = value; | |||
| break; | |||
| case paramWave4: | |||
| synthL.setWave(3, value); | |||
| synthR.setWave(3, value); | |||
| wave4 = value; | |||
| break; | |||
| case paramWave5: | |||
| synthL.setWave(4, value); | |||
| synthR.setWave(4, value); | |||
| wave5 = value; | |||
| break; | |||
| case paramWave6: | |||
| synthL.setWave(5, value); | |||
| synthR.setWave(5, value); | |||
| wave6 = value; | |||
| break; | |||
| case paramFM1: | |||
| synthL.setFM(0, value); | |||
| synthR.setFM(0, value); | |||
| FM1 = value; | |||
| break; | |||
| case paramFM2: | |||
| synthL.setFM(1, value); | |||
| synthR.setFM(1, value); | |||
| FM2 = value; | |||
| break; | |||
| case paramFM3: | |||
| synthL.setFM(2, value); | |||
| synthR.setFM(2, value); | |||
| FM3 = value; | |||
| break; | |||
| case paramFM4: | |||
| synthL.setFM(3, value); | |||
| synthR.setFM(3, value); | |||
| FM4 = value; | |||
| break; | |||
| case paramFM5: | |||
| synthL.setFM(4, value); | |||
| synthR.setFM(4, value); | |||
| FM5 = value; | |||
| break; | |||
| case paramFM6: | |||
| synthL.setFM(5, value); | |||
| synthR.setFM(5, value); | |||
| FM6 = value; | |||
| break; | |||
| case paramPan1: | |||
| synthL.setPan(0, -value); | |||
| synthR.setPan(0, value); | |||
| pan1 = value; | |||
| break; | |||
| case paramPan2: | |||
| synthL.setPan(1, -value); | |||
| synthR.setPan(1, value); | |||
| pan2 = value; | |||
| break; | |||
| case paramPan3: | |||
| synthL.setPan(2, -value); | |||
| synthR.setPan(2, value); | |||
| pan3 = value; | |||
| break; | |||
| case paramPan4: | |||
| synthL.setPan(3, -value); | |||
| synthR.setPan(3, value); | |||
| pan4 = value; | |||
| break; | |||
| case paramPan5: | |||
| synthL.setPan(4, -value); | |||
| synthR.setPan(4, value); | |||
| pan5 = value; | |||
| break; | |||
| case paramPan6: | |||
| synthL.setPan(5, -value); | |||
| synthR.setPan(5, value); | |||
| pan6 = value; | |||
| break; | |||
| case paramAmp1: | |||
| synthL.setAmp(0, value); | |||
| synthR.setAmp(0, value); | |||
| amp1 = value; | |||
| break; | |||
| case paramAmp2: | |||
| synthL.setAmp(1, value); | |||
| synthR.setAmp(1, value); | |||
| amp2 = value; | |||
| break; | |||
| case paramAmp3: | |||
| synthL.setAmp(2, value); | |||
| synthR.setAmp(2, value); | |||
| amp3 = value; | |||
| break; | |||
| case paramAmp4: | |||
| synthL.setAmp(3, value); | |||
| synthR.setAmp(3, value); | |||
| amp4 = value; | |||
| break; | |||
| case paramAmp5: | |||
| synthL.setAmp(4, value); | |||
| synthR.setAmp(4, value); | |||
| amp5 = value; | |||
| break; | |||
| case paramAmp6: | |||
| synthL.setAmp(5, value); | |||
| synthR.setAmp(5, value); | |||
| amp6 = value; | |||
| break; | |||
| case paramAttack: | |||
| synthL.setAttack(value); | |||
| synthR.setAttack(value); | |||
| attack = value; | |||
| break; | |||
| case paramDecay: | |||
| synthL.setDecay(value); | |||
| synthR.setDecay(value); | |||
| attack = value; | |||
| break; | |||
| case paramSustain: | |||
| synthL.setSustain(value); | |||
| synthR.setSustain(value); | |||
| attack = value; | |||
| break; | |||
| case paramRelease: | |||
| synthL.setRelease(value); | |||
| synthR.setRelease(value); | |||
| attack = value; | |||
| break; | |||
| case paramStereo: | |||
| synthL.setStereo(-value); | |||
| synthR.setStereo(value); | |||
| attack = value; | |||
| break; | |||
| case paramTune: | |||
| synthL.setTune(value); | |||
| synthR.setTune(value); | |||
| attack = value; | |||
| break; | |||
| case paramVolume: | |||
| synthL.setMAmp(value); | |||
| synthR.setMAmp(value); | |||
| attack = value; | |||
| case paramGlide: | |||
| synthL.setGlide(value); | |||
| synthR.setGlide(value); | |||
| glide = value; | |||
| break; | |||
| } | |||
| } | |||
| void SegmentJuicePlugin::d_setProgram(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| /* Default parameter values */ | |||
| wave1=wave2=wave3=wave4=wave5=wave6=3.0f; | |||
| FM1=FM2=FM3=FM4=FM5=FM6=0.5f; | |||
| pan1=pan2=pan3=pan4=pan5=pan6=0.0f; | |||
| amp1=amp2=amp3=amp4=amp5=amp6=0.5f; | |||
| attack=decay=release=stereo=tune=glide=0.0f; | |||
| sustain=1.0f; | |||
| volume=0.5f; | |||
| for (int i=0; i<6; i++) { | |||
| synthL.setFM(i, 0.5f); | |||
| synthR.setFM(i, 0.5f); | |||
| synthL.setPan(i, 0.0f); | |||
| synthR.setPan(i, 0.0f); | |||
| synthL.setAmp(i, 0.5f); | |||
| synthR.setAmp(i, 0.5f); | |||
| } | |||
| /* Default variable values */ | |||
| synthL.setSampleRate(d_getSampleRate()); | |||
| synthR.setSampleRate(d_getSampleRate()); | |||
| synthL.setMAmp(0.5); | |||
| synthR.setMAmp(0.5); | |||
| synthL.setTune(0.0f); | |||
| synthR.setTune(0.0f); | |||
| synthL.setStereo(0.0f); | |||
| synthR.setStereo(0.0f); | |||
| synthL.setGlide(0.0f); | |||
| synthR.setGlide(0.0f); | |||
| synthL.setAttack(0.0f); | |||
| synthR.setAttack(0.0f); | |||
| synthL.setDecay(0.0f); | |||
| synthR.setDecay(0.0f); | |||
| synthL.setSustain(1.0f); | |||
| synthR.setSustain(1.0f); | |||
| synthL.setRelease(0.0f); | |||
| synthR.setRelease(0.0f); | |||
| /* reset filter values */ | |||
| d_activate(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Process | |||
| void SegmentJuicePlugin::d_activate() | |||
| { | |||
| } | |||
| void SegmentJuicePlugin::d_deactivate() | |||
| { | |||
| // all values to zero | |||
| } | |||
| void SegmentJuicePlugin::d_run(const float**, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) | |||
| { | |||
| for (uint32_t i = 0; i<midiEventCount; i++) { | |||
| int mType = midiEvents[i].buf[0] & 0xF0; | |||
| //int mChan = midiEvents[i].buf[0] & 0x0F; | |||
| int mNum = midiEvents[i].buf[1]; | |||
| if (mType == 0x90) { | |||
| //note on | |||
| synthL.play(mNum); | |||
| synthR.play(mNum); | |||
| } else if (mType == 0x80) { | |||
| //note off | |||
| synthL.stop(mNum); | |||
| synthR.stop(mNum); | |||
| } | |||
| } | |||
| for (uint32_t i = 0; i<frames; i++) { | |||
| outputs[0][i] = synthL.run(); | |||
| outputs[1][i] = synthR.run(); | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() | |||
| { | |||
| return new SegmentJuicePlugin(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,136 +0,0 @@ | |||
| /* | |||
| * Segment Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #ifndef SEGMENTJUICEPLUGIN_HPP_INCLUDED | |||
| #define SEGMENTJUICEPLUGIN_HPP_INCLUDED | |||
| #include "DistrhoPlugin.hpp" | |||
| #include <iostream> | |||
| #include "Synth.hxx" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class SegmentJuicePlugin : public Plugin | |||
| { | |||
| public: | |||
| enum Parameters | |||
| { | |||
| paramWave1 = 0, | |||
| paramWave2, | |||
| paramWave3, | |||
| paramWave4, | |||
| paramWave5, | |||
| paramWave6, | |||
| paramFM1, | |||
| paramFM2, | |||
| paramFM3, | |||
| paramFM4, | |||
| paramFM5, | |||
| paramFM6, | |||
| paramPan1, | |||
| paramPan2, | |||
| paramPan3, | |||
| paramPan4, | |||
| paramPan5, | |||
| paramPan6, | |||
| paramAmp1, | |||
| paramAmp2, | |||
| paramAmp3, | |||
| paramAmp4, | |||
| paramAmp5, | |||
| paramAmp6, | |||
| paramAttack, | |||
| paramDecay, | |||
| paramSustain, | |||
| paramRelease, | |||
| paramStereo, | |||
| paramTune, | |||
| paramVolume, | |||
| paramGlide, | |||
| paramCount | |||
| }; | |||
| SegmentJuicePlugin(); | |||
| ~SegmentJuicePlugin() override; | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| const char* d_getLabel() const noexcept override | |||
| { | |||
| return "SegmentJuice"; | |||
| } | |||
| const char* d_getMaker() const noexcept override | |||
| { | |||
| return "Andre Sklenar"; | |||
| } | |||
| const char* d_getLicense() const noexcept override | |||
| { | |||
| return "GPL v2+"; | |||
| } | |||
| uint32_t d_getVersion() const noexcept override | |||
| { | |||
| return 0x1000; | |||
| } | |||
| long d_getUniqueId() const noexcept override | |||
| { | |||
| return d_cconst('S', 'g', 't', 'J'); | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Init | |||
| void d_initParameter(uint32_t index, Parameter& parameter) override; | |||
| void d_initProgramName(uint32_t index, d_string& programName) override; | |||
| // ------------------------------------------------------------------- | |||
| // Internal data | |||
| float d_getParameterValue(uint32_t index) const override; | |||
| void d_setParameterValue(uint32_t index, float value) override; | |||
| void d_setProgram(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Process | |||
| void d_activate() override; | |||
| void d_deactivate() override; | |||
| void d_run(const float** inputs, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) override; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| CSynth synthL, synthR; | |||
| float wave1, wave2, wave3, wave4, wave5, wave6; | |||
| float FM1, FM2, FM3, FM4, FM5, FM6; | |||
| float pan1, pan2, pan3, pan4, pan5, pan6; | |||
| float amp1, amp2, amp3, amp4, amp5, amp6; | |||
| float attack, decay, sustain, release, stereo, tune, volume, glide; | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // SEGMENTJUICE_HPP_INCLUDED | |||
| @@ -1,821 +0,0 @@ | |||
| /* | |||
| * Segment Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #include "SegmentJuiceUI.hpp" | |||
| using DGL::Point; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| SegmentJuiceUI::SegmentJuiceUI() | |||
| : UI(), | |||
| fAboutWindow(this) | |||
| { | |||
| // background | |||
| fImgBackground = Image(SegmentJuiceArtwork::backgroundData, SegmentJuiceArtwork::backgroundWidth, SegmentJuiceArtwork::backgroundHeight, GL_BGR); | |||
| // about | |||
| Image imageAbout(SegmentJuiceArtwork::aboutData, SegmentJuiceArtwork::aboutWidth, SegmentJuiceArtwork::aboutHeight, GL_BGR); | |||
| fAboutWindow.setImage(imageAbout); | |||
| // knobs | |||
| Image knobImage(SegmentJuiceArtwork::knobData, SegmentJuiceArtwork::knobWidth, SegmentJuiceArtwork::knobHeight); | |||
| // knobs2 | |||
| Image knobImage2(SegmentJuiceArtwork::knob2Data, SegmentJuiceArtwork::knob2Width, SegmentJuiceArtwork::knob2Height); | |||
| // knob Wave1 | |||
| fKnobWave1 = new ImageKnob(this, knobImage); | |||
| fKnobWave1->setAbsolutePos(446, 79); | |||
| fKnobWave1->setRange(1.0f, 4.0f); | |||
| fKnobWave1->setValue(0.3f); | |||
| fKnobWave1->setRotationAngle(270); | |||
| fKnobWave1->setCallback(this); | |||
| // knob Wave2 | |||
| fKnobWave2 = new ImageKnob(this, knobImage); | |||
| fKnobWave2->setAbsolutePos(446, 139); | |||
| fKnobWave2->setRange(1.0f, 4.0f); | |||
| fKnobWave2->setValue(3.0f); | |||
| fKnobWave2->setRotationAngle(270); | |||
| fKnobWave2->setCallback(this); | |||
| // knob Wave3 | |||
| fKnobWave3 = new ImageKnob(this, knobImage); | |||
| fKnobWave3->setAbsolutePos(446, 199); | |||
| fKnobWave3->setRange(1.0f, 4.0f); | |||
| fKnobWave3->setValue(3.0f); | |||
| fKnobWave3->setRotationAngle(270); | |||
| fKnobWave3->setCallback(this); | |||
| // knob Wave4 | |||
| fKnobWave4 = new ImageKnob(this, knobImage); | |||
| fKnobWave4->setAbsolutePos(446, 259); | |||
| fKnobWave4->setRange(1.0f, 4.0f); | |||
| fKnobWave4->setValue(3.0f); | |||
| fKnobWave4->setRotationAngle(270); | |||
| fKnobWave4->setCallback(this); | |||
| // knob Wave5 | |||
| fKnobWave5 = new ImageKnob(this, knobImage); | |||
| fKnobWave5->setAbsolutePos(446, 319); | |||
| fKnobWave5->setRange(1.0f, 4.0f); | |||
| fKnobWave5->setValue(3.0f); | |||
| fKnobWave5->setRotationAngle(270); | |||
| fKnobWave5->setCallback(this); | |||
| // knob Wave6 | |||
| fKnobWave6 = new ImageKnob(this, knobImage); | |||
| fKnobWave6->setAbsolutePos(446, 379); | |||
| fKnobWave6->setRange(1.0f, 4.0f); | |||
| fKnobWave6->setValue(3.0f); | |||
| fKnobWave6->setRotationAngle(270); | |||
| fKnobWave6->setCallback(this); | |||
| // knob FM1 | |||
| fKnobFM1 = new ImageKnob(this, knobImage); | |||
| fKnobFM1->setAbsolutePos(510, 79); | |||
| fKnobFM1->setRange(0.0f, 1.0f); | |||
| fKnobFM1->setValue(0.5f); | |||
| fKnobFM1->setRotationAngle(270); | |||
| fKnobFM1->setCallback(this); | |||
| // knob FM2 | |||
| fKnobFM2 = new ImageKnob(this, knobImage); | |||
| fKnobFM2->setAbsolutePos(510, 139); | |||
| fKnobFM2->setRange(0.0f, 1.0f); | |||
| fKnobFM2->setValue(0.5f); | |||
| fKnobFM2->setRotationAngle(270); | |||
| fKnobFM2->setCallback(this); | |||
| // knob FM3 | |||
| fKnobFM3 = new ImageKnob(this, knobImage); | |||
| fKnobFM3->setAbsolutePos(510, 199); | |||
| fKnobFM3->setRange(0.0f, 1.0f); | |||
| fKnobFM3->setValue(0.5f); | |||
| fKnobFM3->setRotationAngle(270); | |||
| fKnobFM3->setCallback(this); | |||
| // knob FM4 | |||
| fKnobFM4 = new ImageKnob(this, knobImage); | |||
| fKnobFM4->setAbsolutePos(510, 259); | |||
| fKnobFM4->setRange(0.0f, 1.0f); | |||
| fKnobFM4->setValue(0.5f); | |||
| fKnobFM4->setRotationAngle(270); | |||
| fKnobFM4->setCallback(this); | |||
| // knob FM5 | |||
| fKnobFM5 = new ImageKnob(this, knobImage); | |||
| fKnobFM5->setAbsolutePos(510, 319); | |||
| fKnobFM5->setRange(0.0f, 1.0f); | |||
| fKnobFM5->setValue(0.5f); | |||
| fKnobFM5->setRotationAngle(270); | |||
| fKnobFM5->setCallback(this); | |||
| // knob FM6 | |||
| fKnobFM6 = new ImageKnob(this, knobImage); | |||
| fKnobFM6->setAbsolutePos(510, 379); | |||
| fKnobFM6->setRange(0.0f, 1.0f); | |||
| fKnobFM6->setValue(0.5f); | |||
| fKnobFM6->setRotationAngle(270); | |||
| fKnobFM6->setCallback(this); | |||
| // knob Pan1 | |||
| fKnobPan1 = new ImageKnob(this, knobImage); | |||
| fKnobPan1->setAbsolutePos(574, 79); | |||
| fKnobPan1->setRange(-1.0f, 1.0f); | |||
| fKnobPan1->setValue(0.0f); | |||
| fKnobPan1->setRotationAngle(270); | |||
| fKnobPan1->setCallback(this); | |||
| // knob Pan2 | |||
| fKnobPan2 = new ImageKnob(this, knobImage); | |||
| fKnobPan2->setAbsolutePos(574, 139); | |||
| fKnobPan2->setRange(-1.0f, 1.0f); | |||
| fKnobPan2->setValue(0.0f); | |||
| fKnobPan2->setRotationAngle(270); | |||
| fKnobPan2->setCallback(this); | |||
| // knob Pan3 | |||
| fKnobPan3 = new ImageKnob(this, knobImage); | |||
| fKnobPan3->setAbsolutePos(574, 199); | |||
| fKnobPan3->setRange(-1.0f, 1.0f); | |||
| fKnobPan3->setValue(0.0f); | |||
| fKnobPan3->setRotationAngle(270); | |||
| fKnobPan3->setCallback(this); | |||
| // knob Pan4 | |||
| fKnobPan4 = new ImageKnob(this, knobImage); | |||
| fKnobPan4->setAbsolutePos(574, 259); | |||
| fKnobPan4->setRange(-1.0f, 1.0f); | |||
| fKnobPan4->setValue(0.0f); | |||
| fKnobPan4->setRotationAngle(270); | |||
| fKnobPan4->setCallback(this); | |||
| // knob Pan5 | |||
| fKnobPan5 = new ImageKnob(this, knobImage); | |||
| fKnobPan5->setAbsolutePos(574, 319); | |||
| fKnobPan5->setRange(-1.0f, 1.0f); | |||
| fKnobPan5->setValue(0.0f); | |||
| fKnobPan5->setRotationAngle(270); | |||
| fKnobPan5->setCallback(this); | |||
| // knob Pan6 | |||
| fKnobPan6 = new ImageKnob(this, knobImage); | |||
| fKnobPan6->setAbsolutePos(574, 379); | |||
| fKnobPan6->setRange(-1.0f, 1.0f); | |||
| fKnobPan6->setValue(0.0f); | |||
| fKnobPan6->setRotationAngle(270); | |||
| fKnobPan6->setCallback(this); | |||
| // knob Amp1 | |||
| fKnobAmp1 = new ImageKnob(this, knobImage); | |||
| fKnobAmp1->setAbsolutePos(638, 79); | |||
| fKnobAmp1->setRange(0.0f, 1.0f); | |||
| fKnobAmp1->setValue(0.5f); | |||
| fKnobAmp1->setRotationAngle(270); | |||
| fKnobAmp1->setCallback(this); | |||
| // knob Amp2 | |||
| fKnobAmp2 = new ImageKnob(this, knobImage); | |||
| fKnobAmp2->setAbsolutePos(638, 139); | |||
| fKnobAmp2->setRange(0.0f, 1.0f); | |||
| fKnobAmp2->setValue(0.5f); | |||
| fKnobAmp2->setRotationAngle(270); | |||
| fKnobAmp2->setCallback(this); | |||
| // knob Amp3 | |||
| fKnobAmp3 = new ImageKnob(this, knobImage); | |||
| fKnobAmp3->setAbsolutePos(638, 199); | |||
| fKnobAmp3->setRange(0.0f, 1.0f); | |||
| fKnobAmp3->setValue(0.5f); | |||
| fKnobAmp3->setRotationAngle(270); | |||
| fKnobAmp3->setCallback(this); | |||
| // knob Amp4 | |||
| fKnobAmp4 = new ImageKnob(this, knobImage); | |||
| fKnobAmp4->setAbsolutePos(638, 259); | |||
| fKnobAmp4->setRange(0.0f, 1.0f); | |||
| fKnobAmp4->setValue(0.5f); | |||
| fKnobAmp4->setRotationAngle(270); | |||
| fKnobAmp4->setCallback(this); | |||
| // knob Amp5 | |||
| fKnobAmp5 = new ImageKnob(this, knobImage); | |||
| fKnobAmp5->setAbsolutePos(638, 319); | |||
| fKnobAmp5->setRange(0.0f, 1.0f); | |||
| fKnobAmp5->setValue(0.5f); | |||
| fKnobAmp5->setRotationAngle(270); | |||
| fKnobAmp5->setCallback(this); | |||
| // knob Amp6 | |||
| fKnobAmp6 = new ImageKnob(this, knobImage); | |||
| fKnobAmp6->setAbsolutePos(638, 379); | |||
| fKnobAmp6->setRange(0.0f, 1.0f); | |||
| fKnobAmp6->setValue(0.5f); | |||
| fKnobAmp6->setRotationAngle(270); | |||
| fKnobAmp6->setCallback(this); | |||
| // knob Attack | |||
| fKnobAttack = new ImageKnob(this, knobImage2); | |||
| fKnobAttack->setAbsolutePos(34, 248); | |||
| fKnobAttack->setRange(0.0f, 1.0f); | |||
| fKnobAttack->setValue(0.0f); | |||
| fKnobAttack->setRotationAngle(270); | |||
| fKnobAttack->setCallback(this); | |||
| // knob Decay | |||
| fKnobDecay = new ImageKnob(this, knobImage2); | |||
| fKnobDecay->setAbsolutePos(132, 248); | |||
| fKnobDecay->setRange(0.0f, 1.0f); | |||
| fKnobDecay->setValue(0.0f); | |||
| fKnobDecay->setRotationAngle(270); | |||
| fKnobDecay->setCallback(this); | |||
| // knob Sustain | |||
| fKnobSustain = new ImageKnob(this, knobImage2); | |||
| fKnobSustain->setAbsolutePos(232, 248); | |||
| fKnobSustain->setRange(0.0f, 1.0f); | |||
| fKnobSustain->setValue(1.0f); | |||
| fKnobSustain->setRotationAngle(270); | |||
| fKnobSustain->setCallback(this); | |||
| // knob Release | |||
| fKnobRelease = new ImageKnob(this, knobImage2); | |||
| fKnobRelease->setAbsolutePos(330, 248); | |||
| fKnobRelease->setRange(0.0f, 1.0f); | |||
| fKnobRelease->setValue(0.0f); | |||
| fKnobRelease->setRotationAngle(270); | |||
| fKnobRelease->setCallback(this); | |||
| // knob Stereo | |||
| fKnobStereo = new ImageKnob(this, knobImage2); | |||
| fKnobStereo->setAbsolutePos(34, 339); | |||
| fKnobStereo->setRange(-1.0f, 1.0f); | |||
| fKnobStereo->setValue(0.0f); | |||
| fKnobStereo->setRotationAngle(270); | |||
| fKnobStereo->setCallback(this); | |||
| // knob Tune | |||
| fKnobTune = new ImageKnob(this, knobImage2); | |||
| fKnobTune->setAbsolutePos(132, 339); | |||
| fKnobTune->setRange(-1.0f, 1.0f); | |||
| fKnobTune->setValue(0.0f); | |||
| fKnobTune->setRotationAngle(270); | |||
| fKnobTune->setCallback(this); | |||
| // knob Volume | |||
| fKnobVolume = new ImageKnob(this, knobImage2); | |||
| fKnobVolume->setAbsolutePos(232, 339); | |||
| fKnobVolume->setRange(0.0f, 1.0f); | |||
| fKnobVolume->setValue(0.5f); | |||
| fKnobVolume->setRotationAngle(270); | |||
| fKnobVolume->setCallback(this); | |||
| // knob Glide | |||
| fKnobGlide = new ImageKnob(this, knobImage2); | |||
| fKnobGlide->setAbsolutePos(330, 339); | |||
| fKnobGlide->setRange(0.0f, 1.0f); | |||
| fKnobGlide->setValue(0.0f); | |||
| fKnobGlide->setRotationAngle(270); | |||
| fKnobGlide->setCallback(this); | |||
| // about button | |||
| Image aboutImageNormal(SegmentJuiceArtwork::aboutButtonNormalData, SegmentJuiceArtwork::aboutButtonNormalWidth, SegmentJuiceArtwork::aboutButtonNormalHeight); | |||
| Image aboutImageHover(SegmentJuiceArtwork::aboutButtonHoverData, SegmentJuiceArtwork::aboutButtonHoverWidth, SegmentJuiceArtwork::aboutButtonHoverHeight); | |||
| fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); | |||
| fButtonAbout->setAbsolutePos(599, 17); | |||
| fButtonAbout->setCallback(this); | |||
| // set default values | |||
| d_programChanged(0); | |||
| } | |||
| void SegmentJuiceUI::updateSynth() { | |||
| synthL.setWave(0, fKnobWave1->getValue()); | |||
| synthL.setWave(1, fKnobWave2->getValue()); | |||
| synthL.setWave(2, fKnobWave3->getValue()); | |||
| synthL.setWave(3, fKnobWave4->getValue()); | |||
| synthL.setWave(4, fKnobWave5->getValue()); | |||
| synthL.setWave(5, fKnobWave6->getValue()); | |||
| synthL.setFM(0, fKnobFM1->getValue()); | |||
| synthL.setFM(1, fKnobFM2->getValue()); | |||
| synthL.setFM(2, fKnobFM3->getValue()); | |||
| synthL.setFM(3, fKnobFM4->getValue()); | |||
| synthL.setFM(4, fKnobFM5->getValue()); | |||
| synthL.setFM(5, fKnobFM6->getValue()); | |||
| synthL.setPan(0, -fKnobPan1->getValue()); | |||
| synthL.setPan(1, -fKnobPan2->getValue()); | |||
| synthL.setPan(2, -fKnobPan3->getValue()); | |||
| synthL.setPan(3, -fKnobPan4->getValue()); | |||
| synthL.setPan(4, -fKnobPan5->getValue()); | |||
| synthL.setPan(5, -fKnobPan6->getValue()); | |||
| synthL.setAmp(0, fKnobAmp1->getValue()); | |||
| synthL.setAmp(1, fKnobAmp2->getValue()); | |||
| synthL.setAmp(2, fKnobAmp3->getValue()); | |||
| synthL.setAmp(3, fKnobAmp4->getValue()); | |||
| synthL.setAmp(4, fKnobAmp5->getValue()); | |||
| synthL.setAmp(5, fKnobAmp6->getValue()); | |||
| synthL.setMAmp(fKnobVolume->getValue()); | |||
| synthR.setWave(0, fKnobWave1->getValue()); | |||
| synthR.setWave(1, fKnobWave2->getValue()); | |||
| synthR.setWave(2, fKnobWave3->getValue()); | |||
| synthR.setWave(3, fKnobWave4->getValue()); | |||
| synthR.setWave(4, fKnobWave5->getValue()); | |||
| synthR.setWave(5, fKnobWave6->getValue()); | |||
| synthR.setFM(0, fKnobFM1->getValue()); | |||
| synthR.setFM(1, fKnobFM2->getValue()); | |||
| synthR.setFM(2, fKnobFM3->getValue()); | |||
| synthR.setFM(3, fKnobFM4->getValue()); | |||
| synthR.setFM(4, fKnobFM5->getValue()); | |||
| synthR.setFM(5, fKnobFM6->getValue()); | |||
| synthR.setPan(0, fKnobPan1->getValue()); | |||
| synthR.setPan(1, fKnobPan2->getValue()); | |||
| synthR.setPan(2, fKnobPan3->getValue()); | |||
| synthR.setPan(3, fKnobPan4->getValue()); | |||
| synthR.setPan(4, fKnobPan5->getValue()); | |||
| synthR.setPan(5, fKnobPan6->getValue()); | |||
| synthR.setAmp(0, fKnobAmp1->getValue()); | |||
| synthR.setAmp(1, fKnobAmp2->getValue()); | |||
| synthR.setAmp(2, fKnobAmp3->getValue()); | |||
| synthR.setAmp(3, fKnobAmp4->getValue()); | |||
| synthR.setAmp(4, fKnobAmp5->getValue()); | |||
| synthR.setAmp(5, fKnobAmp6->getValue()); | |||
| synthR.setMAmp(fKnobVolume->getValue()); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void SegmentJuiceUI::d_parameterChanged(uint32_t index, float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case SegmentJuicePlugin::paramWave1: | |||
| fKnobWave1->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramWave2: | |||
| fKnobWave2->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramWave3: | |||
| fKnobWave3->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramWave4: | |||
| fKnobWave4->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramWave5: | |||
| fKnobWave5->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramWave6: | |||
| fKnobWave6->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramFM1: | |||
| fKnobFM1->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramFM2: | |||
| fKnobFM2->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramFM3: | |||
| fKnobFM3->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramFM4: | |||
| fKnobFM4->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramFM5: | |||
| fKnobFM5->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramFM6: | |||
| fKnobFM6->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramPan1: | |||
| fKnobPan1->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramPan2: | |||
| fKnobPan2->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramPan3: | |||
| fKnobPan3->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramPan4: | |||
| fKnobPan4->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramPan5: | |||
| fKnobPan5->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramPan6: | |||
| fKnobPan6->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramAmp1: | |||
| fKnobAmp1->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramAmp2: | |||
| fKnobAmp2->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramAmp3: | |||
| fKnobAmp3->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramAmp4: | |||
| fKnobAmp4->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramAmp5: | |||
| fKnobAmp5->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramAmp6: | |||
| fKnobAmp6->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramAttack: | |||
| fKnobAttack->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramDecay: | |||
| fKnobDecay->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramSustain: | |||
| fKnobSustain->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramRelease: | |||
| fKnobRelease->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramStereo: | |||
| fKnobStereo->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramTune: | |||
| fKnobTune->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramVolume: | |||
| fKnobVolume->setValue(value); | |||
| break; | |||
| case SegmentJuicePlugin::paramGlide: | |||
| fKnobGlide->setValue(value); | |||
| break; | |||
| } | |||
| updateSynth(); | |||
| } | |||
| void SegmentJuiceUI::d_programChanged(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| fKnobWave1->setValue(3.0f); | |||
| fKnobWave2->setValue(3.0f); | |||
| fKnobWave3->setValue(3.0f); | |||
| fKnobWave6->setValue(3.0f); | |||
| fKnobWave5->setValue(3.0f); | |||
| fKnobWave6->setValue(3.0f); | |||
| fKnobFM1->setValue(0.5f); | |||
| fKnobFM2->setValue(0.5f); | |||
| fKnobFM3->setValue(0.5f); | |||
| fKnobFM6->setValue(0.5f); | |||
| fKnobFM5->setValue(0.5f); | |||
| fKnobFM6->setValue(0.5f); | |||
| fKnobPan1->setValue(0.0f); | |||
| fKnobPan2->setValue(0.0f); | |||
| fKnobPan3->setValue(0.0f); | |||
| fKnobPan6->setValue(0.0f); | |||
| fKnobPan5->setValue(0.0f); | |||
| fKnobPan6->setValue(0.0f); | |||
| fKnobAmp1->setValue(0.5f); | |||
| fKnobAmp2->setValue(0.5f); | |||
| fKnobAmp3->setValue(0.5f); | |||
| fKnobAmp6->setValue(0.5f); | |||
| fKnobAmp5->setValue(0.5f); | |||
| fKnobAmp6->setValue(0.5f); | |||
| fKnobAttack->setValue(0.0f); | |||
| fKnobDecay->setValue(0.0f); | |||
| fKnobSustain->setValue(1.0f); | |||
| fKnobRelease->setValue(0.0f); | |||
| fKnobStereo->setValue(0.0f); | |||
| fKnobTune->setValue(0.0f); | |||
| fKnobVolume->setValue(0.5f); | |||
| fKnobGlide->setValue(0.0f); | |||
| for (int i=0; i<6; i++) { | |||
| synthL.setFM(i, 0.5f); | |||
| synthR.setFM(i, 0.5f); | |||
| synthL.setPan(i, 0.0f); | |||
| synthR.setPan(i, 0.0f); | |||
| synthL.setAmp(i, 0.5f); | |||
| synthR.setAmp(i, 0.5f); | |||
| } | |||
| synthL.setSampleRate(d_getSampleRate()); | |||
| synthR.setSampleRate(d_getSampleRate()); | |||
| synthL.setMAmp(0.5f); | |||
| synthR.setMAmp(0.5f); | |||
| synthL.play(69); | |||
| synthR.play(69); | |||
| synthL.setAttack(0); | |||
| synthR.setAttack(0); | |||
| synthL.setDecay(0); | |||
| synthR.setDecay(0); | |||
| synthL.setSustain(1); | |||
| synthR.setSustain(1); | |||
| synthL.setRelease(0); | |||
| synthR.setRelease(0); | |||
| synthL.setGlide(0); | |||
| synthR.setGlide(0); | |||
| synthL.setTune(0); | |||
| synthR.setTune(0); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void SegmentJuiceUI::imageButtonClicked(ImageButton* button, int) | |||
| { | |||
| if (button != fButtonAbout) | |||
| return; | |||
| fAboutWindow.exec(); | |||
| } | |||
| void SegmentJuiceUI::imageKnobDragStarted(ImageKnob* knob) | |||
| { | |||
| if (knob == fKnobWave1) | |||
| d_editParameter(SegmentJuicePlugin::paramWave1, true); | |||
| else if (knob == fKnobWave2) | |||
| d_editParameter(SegmentJuicePlugin::paramWave2, true); | |||
| else if (knob == fKnobWave3) | |||
| d_editParameter(SegmentJuicePlugin::paramWave3, true); | |||
| else if (knob == fKnobWave4) | |||
| d_editParameter(SegmentJuicePlugin::paramWave4, true); | |||
| else if (knob == fKnobWave5) | |||
| d_editParameter(SegmentJuicePlugin::paramWave5, true); | |||
| else if (knob == fKnobWave6) | |||
| d_editParameter(SegmentJuicePlugin::paramWave6, true); | |||
| else if (knob == fKnobFM1) | |||
| d_editParameter(SegmentJuicePlugin::paramFM1, true); | |||
| else if (knob == fKnobFM2) | |||
| d_editParameter(SegmentJuicePlugin::paramFM2, true); | |||
| else if (knob == fKnobFM3) | |||
| d_editParameter(SegmentJuicePlugin::paramFM3, true); | |||
| else if (knob == fKnobFM4) | |||
| d_editParameter(SegmentJuicePlugin::paramFM4, true); | |||
| else if (knob == fKnobFM5) | |||
| d_editParameter(SegmentJuicePlugin::paramFM5, true); | |||
| else if (knob == fKnobFM6) | |||
| d_editParameter(SegmentJuicePlugin::paramFM6, true); | |||
| else if (knob == fKnobPan1) | |||
| d_editParameter(SegmentJuicePlugin::paramPan1, true); | |||
| else if (knob == fKnobPan2) | |||
| d_editParameter(SegmentJuicePlugin::paramPan2, true); | |||
| else if (knob == fKnobPan3) | |||
| d_editParameter(SegmentJuicePlugin::paramPan3, true); | |||
| else if (knob == fKnobPan4) | |||
| d_editParameter(SegmentJuicePlugin::paramPan4, true); | |||
| else if (knob == fKnobPan5) | |||
| d_editParameter(SegmentJuicePlugin::paramPan5, true); | |||
| else if (knob == fKnobPan6) | |||
| d_editParameter(SegmentJuicePlugin::paramPan6, true); | |||
| else if (knob == fKnobAmp1) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp1, true); | |||
| else if (knob == fKnobAmp2) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp2, true); | |||
| else if (knob == fKnobAmp3) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp3, true); | |||
| else if (knob == fKnobAmp4) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp4, true); | |||
| else if (knob == fKnobAmp5) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp5, true); | |||
| else if (knob == fKnobAmp6) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp6, true); | |||
| else if (knob == fKnobAttack) | |||
| d_editParameter(SegmentJuicePlugin::paramAttack, true); | |||
| else if (knob == fKnobDecay) | |||
| d_editParameter(SegmentJuicePlugin::paramDecay, true); | |||
| else if (knob == fKnobSustain) | |||
| d_editParameter(SegmentJuicePlugin::paramSustain, true); | |||
| else if (knob == fKnobRelease) | |||
| d_editParameter(SegmentJuicePlugin::paramRelease, true); | |||
| else if (knob == fKnobStereo) | |||
| d_editParameter(SegmentJuicePlugin::paramStereo, true); | |||
| else if (knob == fKnobTune) | |||
| d_editParameter(SegmentJuicePlugin::paramTune, true); | |||
| else if (knob == fKnobVolume) | |||
| d_editParameter(SegmentJuicePlugin::paramVolume, true); | |||
| else if (knob == fKnobGlide) | |||
| d_editParameter(SegmentJuicePlugin::paramGlide, true); | |||
| } | |||
| void SegmentJuiceUI::imageKnobDragFinished(ImageKnob* knob) | |||
| { | |||
| if (knob == fKnobWave1) | |||
| d_editParameter(SegmentJuicePlugin::paramWave1, false); | |||
| else if (knob == fKnobWave2) | |||
| d_editParameter(SegmentJuicePlugin::paramWave2, false); | |||
| else if (knob == fKnobWave3) | |||
| d_editParameter(SegmentJuicePlugin::paramWave3, false); | |||
| else if (knob == fKnobWave4) | |||
| d_editParameter(SegmentJuicePlugin::paramWave4, false); | |||
| else if (knob == fKnobWave5) | |||
| d_editParameter(SegmentJuicePlugin::paramWave5, false); | |||
| else if (knob == fKnobWave6) | |||
| d_editParameter(SegmentJuicePlugin::paramWave6, false); | |||
| else if (knob == fKnobFM1) | |||
| d_editParameter(SegmentJuicePlugin::paramFM1, false); | |||
| else if (knob == fKnobFM2) | |||
| d_editParameter(SegmentJuicePlugin::paramFM2, false); | |||
| else if (knob == fKnobFM3) | |||
| d_editParameter(SegmentJuicePlugin::paramFM3, false); | |||
| else if (knob == fKnobFM4) | |||
| d_editParameter(SegmentJuicePlugin::paramFM4, false); | |||
| else if (knob == fKnobFM5) | |||
| d_editParameter(SegmentJuicePlugin::paramFM5, false); | |||
| else if (knob == fKnobFM6) | |||
| d_editParameter(SegmentJuicePlugin::paramFM6, false); | |||
| else if (knob == fKnobPan1) | |||
| d_editParameter(SegmentJuicePlugin::paramPan1, false); | |||
| else if (knob == fKnobPan2) | |||
| d_editParameter(SegmentJuicePlugin::paramPan2, false); | |||
| else if (knob == fKnobPan3) | |||
| d_editParameter(SegmentJuicePlugin::paramPan3, false); | |||
| else if (knob == fKnobPan4) | |||
| d_editParameter(SegmentJuicePlugin::paramPan4, false); | |||
| else if (knob == fKnobPan5) | |||
| d_editParameter(SegmentJuicePlugin::paramPan5, false); | |||
| else if (knob == fKnobPan6) | |||
| d_editParameter(SegmentJuicePlugin::paramPan6, false); | |||
| else if (knob == fKnobAmp1) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp1, false); | |||
| else if (knob == fKnobAmp2) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp2, false); | |||
| else if (knob == fKnobAmp3) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp3, false); | |||
| else if (knob == fKnobAmp4) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp4, false); | |||
| else if (knob == fKnobAmp5) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp5, false); | |||
| else if (knob == fKnobAmp6) | |||
| d_editParameter(SegmentJuicePlugin::paramAmp6, false); | |||
| else if (knob == fKnobAttack) | |||
| d_editParameter(SegmentJuicePlugin::paramAttack, false); | |||
| else if (knob == fKnobDecay) | |||
| d_editParameter(SegmentJuicePlugin::paramDecay, false); | |||
| else if (knob == fKnobSustain) | |||
| d_editParameter(SegmentJuicePlugin::paramSustain, false); | |||
| else if (knob == fKnobRelease) | |||
| d_editParameter(SegmentJuicePlugin::paramRelease, false); | |||
| else if (knob == fKnobStereo) | |||
| d_editParameter(SegmentJuicePlugin::paramStereo, false); | |||
| else if (knob == fKnobTune) | |||
| d_editParameter(SegmentJuicePlugin::paramTune, false); | |||
| else if (knob == fKnobVolume) | |||
| d_editParameter(SegmentJuicePlugin::paramVolume, false); | |||
| else if (knob == fKnobGlide) | |||
| d_editParameter(SegmentJuicePlugin::paramGlide, false); | |||
| } | |||
| void SegmentJuiceUI::imageKnobValueChanged(ImageKnob* knob, float value) | |||
| { | |||
| if (knob == fKnobWave1) | |||
| d_setParameterValue(SegmentJuicePlugin::paramWave1, value); | |||
| else if (knob == fKnobWave2) | |||
| d_setParameterValue(SegmentJuicePlugin::paramWave2, value); | |||
| else if (knob == fKnobWave3) | |||
| d_setParameterValue(SegmentJuicePlugin::paramWave3, value); | |||
| else if (knob == fKnobWave4) | |||
| d_setParameterValue(SegmentJuicePlugin::paramWave4, value); | |||
| else if (knob == fKnobWave5) | |||
| d_setParameterValue(SegmentJuicePlugin::paramWave5, value); | |||
| else if (knob == fKnobWave6) | |||
| d_setParameterValue(SegmentJuicePlugin::paramWave6, value); | |||
| else if (knob == fKnobFM1) | |||
| d_setParameterValue(SegmentJuicePlugin::paramFM1, value); | |||
| else if (knob == fKnobFM2) | |||
| d_setParameterValue(SegmentJuicePlugin::paramFM2, value); | |||
| else if (knob == fKnobFM3) | |||
| d_setParameterValue(SegmentJuicePlugin::paramFM3, value); | |||
| else if (knob == fKnobFM4) | |||
| d_setParameterValue(SegmentJuicePlugin::paramFM4, value); | |||
| else if (knob == fKnobFM5) | |||
| d_setParameterValue(SegmentJuicePlugin::paramFM5, value); | |||
| else if (knob == fKnobFM6) | |||
| d_setParameterValue(SegmentJuicePlugin::paramFM6, value); | |||
| else if (knob == fKnobPan1) | |||
| d_setParameterValue(SegmentJuicePlugin::paramPan1, value); | |||
| else if (knob == fKnobPan2) | |||
| d_setParameterValue(SegmentJuicePlugin::paramPan2, value); | |||
| else if (knob == fKnobPan3) | |||
| d_setParameterValue(SegmentJuicePlugin::paramPan3, value); | |||
| else if (knob == fKnobPan4) | |||
| d_setParameterValue(SegmentJuicePlugin::paramPan4, value); | |||
| else if (knob == fKnobPan5) | |||
| d_setParameterValue(SegmentJuicePlugin::paramPan5, value); | |||
| else if (knob == fKnobPan6) | |||
| d_setParameterValue(SegmentJuicePlugin::paramPan6, value); | |||
| else if (knob == fKnobAmp1) | |||
| d_setParameterValue(SegmentJuicePlugin::paramAmp1, value); | |||
| else if (knob == fKnobAmp2) | |||
| d_setParameterValue(SegmentJuicePlugin::paramAmp2, value); | |||
| else if (knob == fKnobAmp3) | |||
| d_setParameterValue(SegmentJuicePlugin::paramAmp3, value); | |||
| else if (knob == fKnobAmp4) | |||
| d_setParameterValue(SegmentJuicePlugin::paramAmp4, value); | |||
| else if (knob == fKnobAmp5) | |||
| d_setParameterValue(SegmentJuicePlugin::paramAmp5, value); | |||
| else if (knob == fKnobAmp6) | |||
| d_setParameterValue(SegmentJuicePlugin::paramAmp6, value); | |||
| else if (knob == fKnobAttack) | |||
| d_setParameterValue(SegmentJuicePlugin::paramAttack, value); | |||
| else if (knob == fKnobDecay) | |||
| d_setParameterValue(SegmentJuicePlugin::paramDecay, value); | |||
| else if (knob == fKnobSustain) | |||
| d_setParameterValue(SegmentJuicePlugin::paramSustain, value); | |||
| else if (knob == fKnobRelease) | |||
| d_setParameterValue(SegmentJuicePlugin::paramRelease, value); | |||
| else if (knob == fKnobStereo) | |||
| d_setParameterValue(SegmentJuicePlugin::paramStereo, value); | |||
| else if (knob == fKnobTune) | |||
| d_setParameterValue(SegmentJuicePlugin::paramTune, value); | |||
| else if (knob == fKnobVolume) | |||
| d_setParameterValue(SegmentJuicePlugin::paramVolume, value); | |||
| else if (knob == fKnobGlide) | |||
| d_setParameterValue(SegmentJuicePlugin::paramGlide, value); | |||
| updateSynth(); | |||
| } | |||
| void SegmentJuiceUI::onDisplay() | |||
| { | |||
| fImgBackground.draw(); | |||
| int cX = 23+4; | |||
| int cY = 50; | |||
| int cW = 388-cX-3; | |||
| int cH = 216-cY; | |||
| //draw waveform | |||
| synthL.play(71); | |||
| synthR.play(71); | |||
| //glEnable(GL_BLEND); | |||
| //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |||
| //glEnable( GL_LINE_SMOOTH ); | |||
| //glHint( GL_LINE_SMOOTH_HINT, GL_NICEST ); | |||
| glLineWidth(1.0f); | |||
| //draw #left waveform | |||
| glColor4f(0.0f, 1.0f, 0.0f, 0.5f); | |||
| glBegin(GL_LINE_STRIP); | |||
| for (int i = 0; i<cW; i++) { | |||
| float out = synthL.run()*cH/2+cH/2+cY; | |||
| glVertex2i(i+cX, out); | |||
| std::cout << out << std::endl; | |||
| } | |||
| //draw #right waveform | |||
| glEnd(); | |||
| glColor4f(0.0f, 0.0f, 1.0f, 0.5f); | |||
| glBegin(GL_LINE_STRIP); | |||
| for (int i = 0; i<cW; i++) { | |||
| glVertex2i(i+cX, synthR.run()*cH/2+cH/2+cY); | |||
| } | |||
| glEnd(); | |||
| //draw 0dc line | |||
| glColor4f(1.0f, 1.0f, 1.0f, 0.5f); | |||
| glBegin(GL_LINES); | |||
| glVertex2i(cX, cY+cH/2); | |||
| glVertex2i(cX+cW, cY+cH/2); | |||
| glEnd(); | |||
| glColor4f(1.0f, 1.0f, 1.0f, 1.0f); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| UI* createUI() | |||
| { | |||
| return new SegmentJuiceUI(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,100 +0,0 @@ | |||
| /* | |||
| * Segment Juice Plugin | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * 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 General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #ifndef WOBBLEJUICEUI_HPP_INCLUDED | |||
| #define WOBBLEJUICEUI_HPP_INCLUDED | |||
| #include "DistrhoUI.hpp" | |||
| #include "ImageAboutWindow.hpp" | |||
| #include "ImageButton.hpp" | |||
| #include "ImageKnob.hpp" | |||
| #include "ImageSlider.hpp" | |||
| #include "SegmentJuiceArtwork.hpp" | |||
| #include "SegmentJuicePlugin.hpp" | |||
| #include <iostream> | |||
| #include "Synth.hxx" | |||
| using DGL::Image; | |||
| using DGL::ImageAboutWindow; | |||
| using DGL::ImageButton; | |||
| using DGL::ImageKnob; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class SegmentJuiceUI : public UI, | |||
| public ImageButton::Callback, | |||
| public ImageKnob::Callback | |||
| { | |||
| public: | |||
| SegmentJuiceUI(); | |||
| void updateSynth(); | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| uint d_getWidth() const noexcept override | |||
| { | |||
| return SegmentJuiceArtwork::backgroundWidth; | |||
| } | |||
| uint d_getHeight() const noexcept override | |||
| { | |||
| return SegmentJuiceArtwork::backgroundHeight; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void d_parameterChanged(uint32_t index, float value) override; | |||
| void d_programChanged(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void imageButtonClicked(ImageButton* button, int) override; | |||
| void imageKnobDragStarted(ImageKnob* knob) override; | |||
| void imageKnobDragFinished(ImageKnob* knob) override; | |||
| void imageKnobValueChanged(ImageKnob* knob, float value) override; | |||
| void onDisplay() override; | |||
| private: | |||
| Image fImgBackground; | |||
| ImageAboutWindow fAboutWindow; | |||
| ScopedPointer<ImageButton> fButtonAbout; | |||
| ScopedPointer<ImageKnob> fKnobWave1, fKnobWave2, fKnobWave3, fKnobWave4, fKnobWave5, fKnobWave6; | |||
| ScopedPointer<ImageKnob> fKnobFM1, fKnobFM2, fKnobFM3, fKnobFM4, fKnobFM5, fKnobFM6; | |||
| ScopedPointer<ImageKnob> fKnobPan1, fKnobPan2, fKnobPan3, fKnobPan4, fKnobPan5, fKnobPan6; | |||
| ScopedPointer<ImageKnob> fKnobAmp1, fKnobAmp2, fKnobAmp3, fKnobAmp4, fKnobAmp5, fKnobAmp6; | |||
| ScopedPointer<ImageKnob> fKnobAttack, fKnobDecay, fKnobSustain, fKnobRelease; | |||
| ScopedPointer<ImageKnob> fKnobStereo, fKnobTune, fKnobVolume, fKnobGlide; | |||
| CSynth synthL, synthR; | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // WOBBLEJUICEUI_HPP_INCLUDED | |||
| @@ -1,299 +0,0 @@ | |||
| /* | |||
| * Segment Synthesizer Design | |||
| * Implemented by Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz . | |||
| * | |||
| * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz | |||
| */ | |||
| #ifndef SYNTH_HXX_INCLUDED | |||
| #define SYNTH_HXX_INCLUDED | |||
| #include <cmath> | |||
| #include <cstdlib> | |||
| class CSynth | |||
| { | |||
| public: | |||
| CSynth() | |||
| { | |||
| for (int i=0; i<6; i++) { | |||
| waves[i] = 3.0f; | |||
| } | |||
| for (int i=0; i<6; i++) { | |||
| FMs[i] = 0.5f*64; | |||
| } | |||
| for (int i=0; i<6; i++) { | |||
| pans[i] = 1.0f; | |||
| } | |||
| for (int i=0; i<6; i++) { | |||
| amps[i] = 0.5f; | |||
| } | |||
| waveBlend = 0; | |||
| freq = 0; | |||
| phaseAccum = 0; | |||
| playing = false; | |||
| cycleSize = 0; | |||
| sampleRate = 0; | |||
| notePlaying = 0; | |||
| env = 0; | |||
| envPhase = 0; | |||
| aCoeff=dCoeff=rCoeff=0; | |||
| stereo = 0; | |||
| tFreq=0; | |||
| gl = 0; | |||
| glideDistance = 0; | |||
| attack=decay=sustain=release=0.0f; | |||
| mAmp = 0.5; | |||
| freqOffset = 0; | |||
| } | |||
| float getSinePhase(float x) { | |||
| return -(std::sin(x)); | |||
| } | |||
| float getSawPhase(float x) { | |||
| return (-(2/M_PI *std::atan(1/std::tan(x/2)))); | |||
| } | |||
| float getRevSawPhase(float x) { | |||
| return ((2/M_PI *std::atan(1/std::tan(x/2)))); | |||
| } | |||
| float getSquarePhase(float x) { | |||
| return (std::round((std::sin(x)+1)/2)-0.5)*2; | |||
| } | |||
| //saw, sqr, sin, revSaw | |||
| float getBlendedPhase(float x, float wave, float polarity) | |||
| { | |||
| //wave = 2; | |||
| if (wave>=1 && wave<2) { | |||
| /* saw vs sqr */ | |||
| waveBlend = wave-1; | |||
| return (getSawPhase(x)*(1-waveBlend) + getSquarePhase(x)*waveBlend)*polarity; | |||
| } else if (wave>=2 && wave<3) { | |||
| /* sqr vs sin */ | |||
| waveBlend = wave-2; | |||
| return (getSquarePhase(x)*(1-waveBlend) + getSinePhase(x)*waveBlend)*polarity; | |||
| } else if (wave>=3 && wave<=4) { | |||
| /* sin vs revSaw */ | |||
| waveBlend = wave-3; | |||
| return (getSinePhase(x)*(1-waveBlend) + getRevSawPhase(x)*waveBlend)*polarity; | |||
| } else { | |||
| return 0.0f; | |||
| } | |||
| } | |||
| void setWave(int i, float nWave) { | |||
| waves[i] = nWave; | |||
| } | |||
| void setFM(int i, float nFM) { | |||
| FMs[i] = nFM*64; | |||
| } | |||
| void setPan(int i, float nPan) { | |||
| pans[i] = (nPan+1)/2; | |||
| } | |||
| void setAmp(int i, float nAmp) { | |||
| amps[i] = nAmp; | |||
| } | |||
| void setMAmp(float nMAmp) { | |||
| mAmp = nMAmp; | |||
| } | |||
| void setStereo(float nStereo) { | |||
| stereo = nStereo; | |||
| if (playing) { | |||
| freq = 440.0 * pow(2.0, (notePlaying - 69)/12); | |||
| freq += freq*(stereo/12); | |||
| } | |||
| } | |||
| void setTune(float nTune) { | |||
| freqOffset = nTune; | |||
| if (playing) { | |||
| freq = 440.0 * pow(2.0, (notePlaying - 69)/12); | |||
| freq +=freq*freqOffset; | |||
| freq += freq*(stereo/12); | |||
| tFreq = freq; | |||
| //gl = 1; | |||
| //freq += freq*freqOffset; | |||
| glideDistance = 0; | |||
| cycleSize = sampleRate/(freq/4); | |||
| //glide init | |||
| //gCoeff = 1.0f - expf(-1/glide); | |||
| } | |||
| } | |||
| void setAttack(float nAttack) { | |||
| attack = nAttack*sampleRate*4; | |||
| } | |||
| void setDecay(float nDecay) { | |||
| decay = nDecay*sampleRate; | |||
| } | |||
| void setSustain(float nSustain) { | |||
| sustain = nSustain*4; | |||
| } | |||
| void setRelease(float nRelease) { | |||
| release = nRelease*sampleRate; | |||
| } | |||
| void setGlide(float nGlide) { | |||
| glide = nGlide*sampleRate; | |||
| } | |||
| float getWave(int i) { | |||
| return waves[i]; | |||
| } | |||
| float getFM(int i) { | |||
| return FMs[i]; | |||
| } | |||
| float getPan(int i) { | |||
| return (pans[i]*2)-1; | |||
| } | |||
| float getAmp(int i) { | |||
| return amps[i]; | |||
| } | |||
| void stop(int note) { | |||
| if (note==notePlaying) { | |||
| envPhase = 2; //release | |||
| } | |||
| } | |||
| void play(float note) { | |||
| if (!playing || (playing && notePlaying==note)) { | |||
| notePlaying = note; | |||
| freq = 440.0 * pow(2.0, (notePlaying - 69)/12); | |||
| freq += freq*(freqOffset); | |||
| freq += freq*(stereo/12); | |||
| cycleSize = sampleRate/(freq/4); | |||
| tFreq = freq; | |||
| playing = true; | |||
| phaseAccum = 0; | |||
| env = 0.0f; | |||
| envPhase = 0; | |||
| //env init | |||
| aCoeff = 1.0f - expf(-1/attack); | |||
| dCoeff = 1.0f - expf(-1/decay); | |||
| rCoeff = 1.0f - expf(-1/release); | |||
| } else { | |||
| std::cout << "not playing" << std::endl; | |||
| //glide towards the target freq | |||
| notePlaying = note; | |||
| tFreq = 440.0 * pow(2.0, (notePlaying - 69)/12); | |||
| tFreq += tFreq*(freqOffset); | |||
| tFreq += tFreq*(stereo/12); | |||
| glideDistance = tFreq-freq; | |||
| gl = 0; | |||
| if (envPhase == 2) { | |||
| envPhase = 0; | |||
| } | |||
| //glide init | |||
| gCoeff = 1.0f - expf(-1/glide); | |||
| } | |||
| } | |||
| float run() { | |||
| float out = 0; | |||
| if (playing) { | |||
| if (freq!=tFreq) { | |||
| //gliding yo | |||
| gl+=gCoeff * ((1.0/1.0) - gl); | |||
| freq=(tFreq-glideDistance)+glideDistance*gl; | |||
| cycleSize = sampleRate/(freq/4); | |||
| } | |||
| out = getSinePhase((phaseAccum/cycleSize)*(2*M_PI))*amps[0]*0.5; | |||
| out += getSinePhase((phaseAccum/cycleSize)*2*(2*M_PI))*amps[0]*0.5; | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*(getBlendedPhase(phaseAccum/(cycleSize/8), waves[0], 1)*FMs[0])*(2*M_PI), waves[0], 1)*pans[0]*amps[0]*0.5; | |||
| if (phaseAccum<cycleSize*0.5) { | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*(getBlendedPhase(phaseAccum/(cycleSize*2), waves[1], -1)*FMs[1])*(2*M_PI), waves[1], -1)*pans[1]*amps[1]*0.5*2; | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*(getBlendedPhase(phaseAccum/(cycleSize*2), waves[2], -1)*FMs[2])*(2*M_PI), waves[2], -1)*pans[2]*amps[2]*0.5*2; | |||
| } else if (phaseAccum<cycleSize*0.75) { | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*(getBlendedPhase(phaseAccum/(cycleSize*8), waves[3], 1)*FMs[3])*4*(2*M_PI), waves[3], 1)*pans[3]*amps[3]*0.5*2; | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*(getBlendedPhase(phaseAccum/(cycleSize*8), waves[4], 1)*FMs[4])*8*(2*M_PI), waves[4], 1)*pans[4]*amps[4]*0.5*2; | |||
| } else {// if (phaseAccum<cycleSize*0.875) { | |||
| out += getBlendedPhase((phaseAccum/cycleSize)*(getBlendedPhase(phaseAccum/(cycleSize*8), waves[5], -1)*FMs[5])*16*(2*M_PI), waves[5], -1)*pans[5]*amps[5]*0.5*2; | |||
| } | |||
| phaseAccum++; | |||
| if (phaseAccum>cycleSize) { | |||
| phaseAccum = 0; | |||
| } | |||
| //calculate amplitude envelope | |||
| if (envPhase==0) { | |||
| //attack phase | |||
| env+=aCoeff * ((1.0/0.63) - env); | |||
| if (env>1.0) envPhase++; | |||
| } else if (envPhase==1) { | |||
| //decay and sustain phase | |||
| env+=dCoeff * (sustain - env); | |||
| } else { | |||
| //release phase | |||
| env += rCoeff * (1.0-(1.0/0.63) - env); | |||
| if (env<0.0) { playing = false; env = 0.0; } | |||
| } | |||
| //apply amplitude envelope | |||
| out*=env; | |||
| //apply master volume | |||
| out*=mAmp*0.5; | |||
| //apply hard clipping | |||
| if (out>1) out=1; | |||
| if (out<-1) out=-1; | |||
| } | |||
| return out; | |||
| } | |||
| void setSampleRate(float sr) { | |||
| sampleRate = sr; | |||
| attack = sampleRate/2; | |||
| decay = sampleRate/2; | |||
| release = sampleRate/2; | |||
| } | |||
| private: | |||
| /* vcf filter */ | |||
| float waves[6]; | |||
| float FMs[6]; | |||
| float pans[6]; | |||
| float amps[6]; | |||
| float waveBlend; | |||
| float freq; | |||
| float freqOffset; | |||
| float tFreq; //target frequency for gliding | |||
| float glideDistance; //freq distance | |||
| float stereo; | |||
| float mAmp; | |||
| float phaseAccum; | |||
| float cycleSize; | |||
| float sampleRate; | |||
| float notePlaying; | |||
| float glide, gl; | |||
| bool playing; | |||
| float attack, decay, sustain, release; | |||
| float env; | |||
| float envPhase; //0, 1(d+s), 2 | |||
| float aCoeff, dCoeff, rCoeff, gCoeff; | |||
| }; | |||
| #endif // SYNTH_HXX_INCLUDED | |||
| @@ -1,35 +0,0 @@ | |||
| /* (Auto-generated binary data file). */ | |||
| #ifndef BINARY_DISTRHOARTWORKSTEREOENHANCER_HPP | |||
| #define BINARY_DISTRHOARTWORKSTEREOENHANCER_HPP | |||
| namespace DistrhoArtworkStereoEnhancer | |||
| { | |||
| extern const char* aboutData; | |||
| const unsigned int aboutDataSize = 172710; | |||
| const unsigned int aboutWidth = 303; | |||
| const unsigned int aboutHeight = 190; | |||
| extern const char* aboutButtonHoverData; | |||
| const unsigned int aboutButtonHoverDataSize = 9152; | |||
| const unsigned int aboutButtonHoverWidth = 104; | |||
| const unsigned int aboutButtonHoverHeight = 22; | |||
| extern const char* aboutButtonNormalData; | |||
| const unsigned int aboutButtonNormalDataSize = 9152; | |||
| const unsigned int aboutButtonNormalWidth = 104; | |||
| const unsigned int aboutButtonNormalHeight = 22; | |||
| extern const char* backgroundData; | |||
| const unsigned int backgroundDataSize = 195024; | |||
| const unsigned int backgroundWidth = 478; | |||
| const unsigned int backgroundHeight = 136; | |||
| extern const char* knobData; | |||
| const unsigned int knobDataSize = 543036; | |||
| const unsigned int knobWidth = 59; | |||
| const unsigned int knobHeight = 2301; | |||
| } | |||
| #endif // BINARY_DISTRHOARTWORKSTEREOENHANCER_HPP | |||
| @@ -1,35 +0,0 @@ | |||
| /* | |||
| * DISTRHO 3BandEQ Plugin, based on StereoEnhancer by Michael Gruhn | |||
| * Copyright (C) 2012-2013 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 doc/LGPL.txt file. | |||
| */ | |||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_NAME "Stereo Enhancer" | |||
| #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 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 0 | |||
| #define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | |||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/StereoEnhancer" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -1,211 +0,0 @@ | |||
| /* | |||
| * DISTRHO StereoEnhancer Plugin, based on StereoEnhancer by Michael Gruhn | |||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||
| * Copyright (C) 2012-2013 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 doc/LGPL.txt file. | |||
| */ | |||
| #include "DistrhoPluginStereoEnhancer.hpp" | |||
| #include <cmath> | |||
| static const float kDC_ADD = 1e-30f; | |||
| static const float kPI = 3.141592654f; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoPluginStereoEnhancer::DistrhoPluginStereoEnhancer() | |||
| : Plugin(paramCount, 1, 0) // 1 program, 0 states | |||
| { | |||
| // set default values | |||
| d_setProgram(0); | |||
| // reset | |||
| d_deactivate(); | |||
| } | |||
| DistrhoPluginStereoEnhancer::~DistrhoPluginStereoEnhancer() | |||
| { | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Init | |||
| void DistrhoPluginStereoEnhancer::d_initParameter(uint32_t index, Parameter& parameter) | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramWidthLows: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Width Lows"; | |||
| parameter.symbol = "width_lows"; | |||
| parameter.unit = "%"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 100.0f; | |||
| parameter.ranges.max = 200.0f; | |||
| break; | |||
| case paramWidthHighs: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "WidthHighs"; | |||
| parameter.symbol = "width_highs"; | |||
| parameter.unit = "%"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 100.0f; | |||
| parameter.ranges.max = 200.0f; | |||
| break; | |||
| case paramCrossover: | |||
| parameter.hints = PARAMETER_IS_AUTOMABLE; | |||
| parameter.name = "Crossover"; | |||
| parameter.symbol = "crossover"; | |||
| parameter.unit = "%"; | |||
| parameter.ranges.def = 0.0f; | |||
| parameter.ranges.min = 27.51604f; | |||
| parameter.ranges.max = 100.0f; | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoPluginStereoEnhancer::d_initProgramName(uint32_t index, d_string& programName) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| programName = "Default"; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Internal data | |||
| float DistrhoPluginStereoEnhancer::d_getParameterValue(uint32_t index) const | |||
| { | |||
| switch (index) | |||
| { | |||
| case paramWidthLows: | |||
| return widthLP; | |||
| case paramWidthHighs: | |||
| return widthHP; | |||
| case paramCrossover: | |||
| return freqHP; | |||
| default: | |||
| return 0.0f; | |||
| } | |||
| } | |||
| void DistrhoPluginStereoEnhancer::d_setParameterValue(uint32_t index, float value) | |||
| { | |||
| if (d_getSampleRate() <= 0.0) | |||
| return; | |||
| switch (index) | |||
| { | |||
| case paramWidthLows: | |||
| widthLP = value; | |||
| widthCoeffLP = std::fmax(widthLP, 1.0f); | |||
| break; | |||
| case paramWidthHighs: | |||
| widthHP = value; | |||
| widthCoeffHP = std::fmax(widthHP, 1.0f); | |||
| break; | |||
| case paramCrossover: | |||
| freqHPFader = value; | |||
| freqHP = freqHPFader*freqHPFader*freqHPFader*24000.0f; | |||
| xHP = std::exp(-2.0f * kPI * freqHP / (float)d_getSampleRate()); | |||
| a0HP = 1.0f-xHP; | |||
| b1HP = -xHP; | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoPluginStereoEnhancer::d_setProgram(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| widthLP = 100.0f; | |||
| widthHP = 100.0f; | |||
| freqHPFader = 27.51604f; | |||
| // Internal stuff | |||
| widthCoeffLP = 1.0f; | |||
| widthCoeffHP = 1.0f; | |||
| freqHP = 500.0f; | |||
| // reset filter values | |||
| d_activate(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Process | |||
| void DistrhoPluginStereoEnhancer::d_activate() | |||
| { | |||
| xHP = std::exp(-2.0f * kPI * freqHP/ (float)d_getSampleRate()); | |||
| a0HP = 1.0f-xHP; | |||
| b1HP = -xHP; | |||
| } | |||
| void DistrhoPluginStereoEnhancer::d_deactivate() | |||
| { | |||
| out1HP = out2HP = 0.0f; | |||
| tmp1HP = tmp2HP = 0.0f; | |||
| } | |||
| void DistrhoPluginStereoEnhancer::d_run(float** inputs, float** outputs, uint32_t frames) | |||
| { | |||
| float* in1 = inputs[0]; | |||
| float* in2 = inputs[1]; | |||
| float* out1 = outputs[0]; | |||
| float* out2 = outputs[1]; | |||
| for (uint32_t i=0; i < frames; ++i) | |||
| { | |||
| out1HP = in1[i]; | |||
| out2HP = in2[i]; | |||
| in1[i] = (tmp1HP = a0HP * in1[i] - b1HP * tmp1HP + kDC_ADD); | |||
| in2[i] = (tmp2HP = a0HP * in2[i] - b1HP * tmp2HP + kDC_ADD); | |||
| out1HP -= in1[i] - kDC_ADD; | |||
| out2HP -= in2[i] - kDC_ADD; | |||
| monoLP = (in1[i] + in2[i]) / 2.0f; | |||
| stereoLP = in1[i] - in2[i]; | |||
| (*in1) = (monoLP + stereoLP * widthLP) / widthCoeffLP; | |||
| (*in2) = (monoLP - stereoLP * widthLP) / widthCoeffLP; | |||
| monoHP = (out1HP + out2HP) / 2.0f; | |||
| stereoHP = out1HP - out2HP; | |||
| out1HP = (monoHP + stereoHP * widthHP) / widthCoeffHP; | |||
| out2HP = (monoHP - stereoHP * widthHP) / widthCoeffHP; | |||
| out1[i] = in1[i] + out1HP; | |||
| out2[i] = in2[i] + out2HP; | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| Plugin* createPlugin() | |||
| { | |||
| return new DistrhoPluginStereoEnhancer(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,110 +0,0 @@ | |||
| /* | |||
| * DISTRHO StereoEnhancer Plugin, based on StereoEnhancer by Michael Gruhn | |||
| * Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||
| * Copyright (C) 2012-2013 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 doc/LGPL.txt file. | |||
| */ | |||
| #ifndef DISTRHO_PLUGIN_STEREO_ENHANCER_HPP_INCLUDED | |||
| #define DISTRHO_PLUGIN_STEREO_ENHANCER_HPP_INCLUDED | |||
| #include "DistrhoPlugin.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoPluginStereoEnhancer : public Plugin | |||
| { | |||
| public: | |||
| enum Parameters | |||
| { | |||
| paramWidthLows = 0, | |||
| paramWidthHighs, | |||
| paramCrossover, | |||
| paramCount | |||
| }; | |||
| DistrhoPluginStereoEnhancer(); | |||
| ~DistrhoPluginStereoEnhancer() override; | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| const char* d_getLabel() const noexcept override | |||
| { | |||
| return "StereoEnhancer"; | |||
| } | |||
| const char* d_getMaker() const noexcept override | |||
| { | |||
| return "DISTRHO"; | |||
| } | |||
| const char* d_getLicense() const noexcept override | |||
| { | |||
| return "LGPL"; | |||
| } | |||
| uint32_t d_getVersion() const noexcept override | |||
| { | |||
| return 0x1000; | |||
| } | |||
| long d_getUniqueId() const noexcept override | |||
| { | |||
| return d_cconst('D', 'S', 't', 'E'); | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Init | |||
| void d_initParameter(uint32_t index, Parameter& parameter) override; | |||
| void d_initProgramName(uint32_t index, d_string& programName) override; | |||
| // ------------------------------------------------------------------- | |||
| // Internal data | |||
| float d_getParameterValue(uint32_t index) const override; | |||
| void d_setParameterValue(uint32_t index, float value) override; | |||
| void d_setProgram(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Process | |||
| void d_activate() override; | |||
| void d_deactivate() override; | |||
| void d_run(float** inputs, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) override; | |||
| // ------------------------------------------------------------------- | |||
| private: | |||
| float widthLP, widthCoeffLP; | |||
| float freqHP, freqHPFader; | |||
| float widthHP, widthCoeffHP; | |||
| float xHP, a0HP, b1HP; | |||
| float out1HP, out2HP; | |||
| float tmp1HP, tmp2HP; | |||
| float monoHP, stereoHP; | |||
| float monoLP, stereoLP; | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_PLUGIN_STEREO_ENHANCER_HPP_INCLUDED | |||
| @@ -1,157 +0,0 @@ | |||
| /* | |||
| * DISTRHO StereoEnhancer Plugin, based on StereoEnhancer by Michael Gruhn | |||
| * Copyright (C) 2012-2013 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 doc/LGPL.txt file. | |||
| */ | |||
| #include "DistrhoUIStereoEnhancer.hpp" | |||
| using DGL::Point; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| DistrhoUIStereoEnhancer::DistrhoUIStereoEnhancer() | |||
| : UI(), | |||
| fAboutWindow(this) | |||
| { | |||
| // background | |||
| fImgBackground = Image(DistrhoArtworkStereoEnhancer::backgroundData, DistrhoArtworkStereoEnhancer::backgroundWidth, DistrhoArtworkStereoEnhancer::backgroundHeight, GL_BGR); | |||
| Image imageAbout(DistrhoArtworkStereoEnhancer::aboutData, DistrhoArtworkStereoEnhancer::aboutWidth, DistrhoArtworkStereoEnhancer::aboutHeight, GL_BGR); | |||
| fAboutWindow.setImage(imageAbout); | |||
| // knobs | |||
| Image knobImage(DistrhoArtworkStereoEnhancer::knobData, DistrhoArtworkStereoEnhancer::knobWidth, DistrhoArtworkStereoEnhancer::knobHeight); | |||
| fKnobWidthLows = new ImageKnob(this, knobImage); | |||
| fKnobWidthLows->setPos(140, 35); | |||
| fKnobWidthLows->setRange(0.0f, 200.0f); | |||
| fKnobWidthLows->setValue(100.0f); | |||
| fKnobWidthLows->setCallback(this); | |||
| fKnobWidthHighs = new ImageKnob(this, knobImage); | |||
| fKnobWidthHighs->setPos(362, 35); | |||
| fKnobWidthHighs->setRange(0.0f, 200.0f); | |||
| fKnobWidthHighs->setValue(100.0f); | |||
| fKnobWidthHighs->setCallback(this); | |||
| fKnobCrossover = new ImageKnob(this, knobImage); | |||
| fKnobCrossover->setPos(253, 35); | |||
| fKnobCrossover->setRange(0.0f, 100.0f); | |||
| fKnobCrossover->setValue(27.51604f); | |||
| fKnobCrossover->setCallback(this); | |||
| // about button | |||
| Image aboutImageNormal(DistrhoArtworkStereoEnhancer::aboutButtonNormalData, DistrhoArtworkStereoEnhancer::aboutButtonNormalWidth, DistrhoArtworkStereoEnhancer::aboutButtonNormalHeight); | |||
| Image aboutImageHover(DistrhoArtworkStereoEnhancer::aboutButtonHoverData, DistrhoArtworkStereoEnhancer::aboutButtonHoverWidth, DistrhoArtworkStereoEnhancer::aboutButtonHoverHeight); | |||
| fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); | |||
| fButtonAbout->setPos(346, 3); | |||
| fButtonAbout->setCallback(this); | |||
| } | |||
| DistrhoUIStereoEnhancer::~DistrhoUIStereoEnhancer() | |||
| { | |||
| delete fKnobWidthLows; | |||
| delete fKnobWidthHighs; | |||
| delete fKnobCrossover; | |||
| delete fButtonAbout; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void DistrhoUIStereoEnhancer::d_parameterChanged(uint32_t index, float value) | |||
| { | |||
| switch (index) | |||
| { | |||
| case DistrhoPluginStereoEnhancer::paramWidthLows: | |||
| fKnobWidthLows->setValue(value); | |||
| break; | |||
| case DistrhoPluginStereoEnhancer::paramWidthHighs: | |||
| fKnobWidthHighs->setValue(value); | |||
| break; | |||
| case DistrhoPluginStereoEnhancer::paramCrossover: | |||
| fKnobCrossover->setValue(value); | |||
| break; | |||
| } | |||
| } | |||
| void DistrhoUIStereoEnhancer::d_programChanged(uint32_t index) | |||
| { | |||
| if (index != 0) | |||
| return; | |||
| // Default values | |||
| fKnobWidthLows->setValue(100.0f); | |||
| fKnobWidthHighs->setValue(100.0f); | |||
| fKnobCrossover->setValue(27.51604f); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void DistrhoUIStereoEnhancer::imageButtonClicked(ImageButton* button, int) | |||
| { | |||
| if (button != fButtonAbout) | |||
| return; | |||
| fAboutWindow.exec(); | |||
| } | |||
| void DistrhoUIStereoEnhancer::imageKnobDragStarted(ImageKnob* knob) | |||
| { | |||
| if (knob == fKnobWidthLows) | |||
| d_editParameter(DistrhoPluginStereoEnhancer::paramWidthLows, true); | |||
| else if (knob == fKnobWidthHighs) | |||
| d_editParameter(DistrhoPluginStereoEnhancer::paramWidthHighs, true); | |||
| else if (knob == fKnobCrossover) | |||
| d_editParameter(DistrhoPluginStereoEnhancer::paramCrossover, true); | |||
| } | |||
| void DistrhoUIStereoEnhancer::imageKnobDragFinished(ImageKnob* knob) | |||
| { | |||
| if (knob == fKnobWidthLows) | |||
| d_editParameter(DistrhoPluginStereoEnhancer::paramWidthLows, false); | |||
| else if (knob == fKnobWidthHighs) | |||
| d_editParameter(DistrhoPluginStereoEnhancer::paramWidthHighs, false); | |||
| else if (knob == fKnobCrossover) | |||
| d_editParameter(DistrhoPluginStereoEnhancer::paramCrossover, false); | |||
| } | |||
| void DistrhoUIStereoEnhancer::imageKnobValueChanged(ImageKnob* knob, float value) | |||
| { | |||
| if (knob == fKnobWidthLows) | |||
| d_setParameterValue(DistrhoPluginStereoEnhancer::paramWidthLows, value); | |||
| else if (knob == fKnobWidthHighs) | |||
| d_setParameterValue(DistrhoPluginStereoEnhancer::paramWidthHighs, value); | |||
| else if (knob == fKnobCrossover) | |||
| d_setParameterValue(DistrhoPluginStereoEnhancer::paramCrossover, value); | |||
| } | |||
| void DistrhoUIStereoEnhancer::onDisplay() | |||
| { | |||
| fImgBackground.draw(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| UI* createUI() | |||
| { | |||
| return new DistrhoUIStereoEnhancer(); | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -1,90 +0,0 @@ | |||
| /* | |||
| * DISTRHO StereoEnhancer Plugin, based on StereoEnhancer by Michael Gruhn | |||
| * Copyright (C) 2012-2013 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 doc/LGPL.txt file. | |||
| */ | |||
| #ifndef DISTRHO_UI_STEREO_ENHANCER_HPP_INCLUDED | |||
| #define DISTRHO_UI_STEREO_ENHANCER_HPP_INCLUDED | |||
| #include "DistrhoUI.hpp" | |||
| #include "dgl/ImageAboutWindow.hpp" | |||
| #include "dgl/ImageButton.hpp" | |||
| #include "dgl/ImageKnob.hpp" | |||
| #include "DistrhoArtworkStereoEnhancer.hpp" | |||
| #include "DistrhoPluginStereoEnhancer.hpp" | |||
| using DGL::Image; | |||
| using DGL::ImageAboutWindow; | |||
| using DGL::ImageButton; | |||
| using DGL::ImageKnob; | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| class DistrhoUIStereoEnhancer : public UI, | |||
| public ImageButton::Callback, | |||
| public ImageKnob::Callback | |||
| { | |||
| public: | |||
| DistrhoUIStereoEnhancer(); | |||
| ~DistrhoUIStereoEnhancer() override; | |||
| protected: | |||
| // ------------------------------------------------------------------- | |||
| // Information | |||
| unsigned int d_getWidth() const noexcept override | |||
| { | |||
| return DistrhoArtworkStereoEnhancer::backgroundWidth; | |||
| } | |||
| unsigned int d_getHeight() const noexcept override | |||
| { | |||
| return DistrhoArtworkStereoEnhancer::backgroundHeight; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // DSP Callbacks | |||
| void d_parameterChanged(uint32_t index, float value) override; | |||
| void d_programChanged(uint32_t index) override; | |||
| // ------------------------------------------------------------------- | |||
| // Widget Callbacks | |||
| void imageButtonClicked(ImageButton* button, int) override; | |||
| void imageKnobDragStarted(ImageKnob* knob) override; | |||
| void imageKnobDragFinished(ImageKnob* knob) override; | |||
| void imageKnobValueChanged(ImageKnob* knob, float value) override; | |||
| void onDisplay() override; | |||
| private: | |||
| Image fImgBackground; | |||
| ImageAboutWindow fAboutWindow; | |||
| ImageKnob* fKnobWidthLows; | |||
| ImageKnob* fKnobWidthHighs; | |||
| ImageKnob* fKnobCrossover; | |||
| ImageButton* fButtonAbout; | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| #endif // DISTRHO_UI_STEREO_ENHANCER_HPP_INCLUDED | |||