Browse Source

Remove Mini-Series and Nekobi plugins, now on separate repos

tags/2018-04-16
falkTX 11 years ago
parent
commit
41c1217ac6
96 changed files with 3 additions and 39603 deletions
  1. +0
    -5
      Makefile
  2. +1
    -1
      README
  3. +0
    -12
      plugins/3BandEQ/DSSI-UI/premake.lua
  4. +0
    -11
      plugins/3BandEQ/DSSI/premake.lua
  5. +0
    -11
      plugins/3BandEQ/LADSPA/premake.lua
  6. +0
    -12
      plugins/3BandEQ/LV2-UI/premake.lua
  7. +0
    -11
      plugins/3BandEQ/LV2/premake.lua
  8. +0
    -14
      plugins/3BandEQ/VST/premake.lua
  9. +0
    -10107
      plugins/3BandEQ/source/DistrhoArtwork3BandEQ.cpp
  10. +0
    -40
      plugins/3BandEQ/source/DistrhoArtwork3BandEQ.hpp
  11. +0
    -260
      plugins/3BandEQ/source/DistrhoPlugin3BandEQ.cpp
  12. +0
    -112
      plugins/3BandEQ/source/DistrhoPlugin3BandEQ.hpp
  13. +0
    -35
      plugins/3BandEQ/source/DistrhoPluginInfo.h
  14. +0
    -236
      plugins/3BandEQ/source/DistrhoUI3BandEQ.cpp
  15. +0
    -99
      plugins/3BandEQ/source/DistrhoUI3BandEQ.hpp
  16. BIN
      plugins/3BandEQ/source/artwork/about.png
  17. BIN
      plugins/3BandEQ/source/artwork/aboutButtonHover.png
  18. BIN
      plugins/3BandEQ/source/artwork/aboutButtonNormal.png
  19. BIN
      plugins/3BandEQ/source/artwork/background.png
  20. BIN
      plugins/3BandEQ/source/artwork/knob.png
  21. BIN
      plugins/3BandEQ/source/artwork/slider.png
  22. +0
    -12
      plugins/3BandSplitter/DSSI-UI/premake.lua
  23. +0
    -11
      plugins/3BandSplitter/DSSI/premake.lua
  24. +0
    -11
      plugins/3BandSplitter/LADSPA/premake.lua
  25. +0
    -12
      plugins/3BandSplitter/LV2-UI/premake.lua
  26. +0
    -11
      plugins/3BandSplitter/LV2/premake.lua
  27. +0
    -14
      plugins/3BandSplitter/VST/premake.lua
  28. +0
    -10107
      plugins/3BandSplitter/source/DistrhoArtwork3BandSplitter.cpp
  29. +0
    -40
      plugins/3BandSplitter/source/DistrhoArtwork3BandSplitter.hpp
  30. +0
    -268
      plugins/3BandSplitter/source/DistrhoPlugin3BandSplitter.cpp
  31. +0
    -112
      plugins/3BandSplitter/source/DistrhoPlugin3BandSplitter.hpp
  32. +0
    -35
      plugins/3BandSplitter/source/DistrhoPluginInfo.h
  33. +0
    -236
      plugins/3BandSplitter/source/DistrhoUI3BandSplitter.cpp
  34. +0
    -99
      plugins/3BandSplitter/source/DistrhoUI3BandSplitter.hpp
  35. BIN
      plugins/3BandSplitter/source/artwork/about.png
  36. BIN
      plugins/3BandSplitter/source/artwork/aboutButtonHover.png
  37. BIN
      plugins/3BandSplitter/source/artwork/aboutButtonNormal.png
  38. BIN
      plugins/3BandSplitter/source/artwork/background.png
  39. BIN
      plugins/3BandSplitter/source/artwork/knob.png
  40. BIN
      plugins/3BandSplitter/source/artwork/slider.png
  41. +2
    -58
      plugins/Makefile
  42. +0
    -12
      plugins/Nekobi/DSSI-UI/premake.lua
  43. +0
    -16
      plugins/Nekobi/DSSI/premake.lua
  44. +0
    -12
      plugins/Nekobi/LV2-UI/premake.lua
  45. +0
    -16
      plugins/Nekobi/LV2/premake.lua
  46. +0
    -19
      plugins/Nekobi/VST/premake.lua
  47. +0
    -6890
      plugins/Nekobi/source/DistrhoArtworkNekobi.cpp
  48. +0
    -90
      plugins/Nekobi/source/DistrhoArtworkNekobi.hpp
  49. +0
    -36
      plugins/Nekobi/source/DistrhoPluginInfo.h
  50. +0
    -410
      plugins/Nekobi/source/DistrhoPluginNekobi.cpp
  51. +0
    -119
      plugins/Nekobi/source/DistrhoPluginNekobi.hpp
  52. +0
    -277
      plugins/Nekobi/source/DistrhoUINekobi.cpp
  53. +0
    -108
      plugins/Nekobi/source/DistrhoUINekobi.hpp
  54. +0
    -204
      plugins/Nekobi/source/NekoWidget.hpp
  55. BIN
      plugins/Nekobi/source/artwork/about.png
  56. BIN
      plugins/Nekobi/source/artwork/aboutButtonHover.png
  57. BIN
      plugins/Nekobi/source/artwork/aboutButtonNormal.png
  58. BIN
      plugins/Nekobi/source/artwork/background.png
  59. BIN
      plugins/Nekobi/source/artwork/claw1.png
  60. BIN
      plugins/Nekobi/source/artwork/claw2.png
  61. BIN
      plugins/Nekobi/source/artwork/knob.png
  62. BIN
      plugins/Nekobi/source/artwork/run1.png
  63. BIN
      plugins/Nekobi/source/artwork/run2.png
  64. BIN
      plugins/Nekobi/source/artwork/run3.png
  65. BIN
      plugins/Nekobi/source/artwork/run4.png
  66. BIN
      plugins/Nekobi/source/artwork/scratch1.png
  67. BIN
      plugins/Nekobi/source/artwork/scratch2.png
  68. BIN
      plugins/Nekobi/source/artwork/sit.png
  69. BIN
      plugins/Nekobi/source/artwork/slider.png
  70. BIN
      plugins/Nekobi/source/artwork/tail.png
  71. +0
    -1779
      plugins/Nekobi/source/nekobee-src/minblep_tables.c
  72. +0
    -77
      plugins/Nekobi/source/nekobee-src/nekobee.h
  73. +0
    -237
      plugins/Nekobi/source/nekobee-src/nekobee_synth.c
  74. +0
    -132
      plugins/Nekobi/source/nekobee-src/nekobee_synth.h
  75. +0
    -30
      plugins/Nekobi/source/nekobee-src/nekobee_types.h
  76. +0
    -256
      plugins/Nekobi/source/nekobee-src/nekobee_voice.c
  77. +0
    -183
      plugins/Nekobi/source/nekobee-src/nekobee_voice.h
  78. +0
    -414
      plugins/Nekobi/source/nekobee-src/nekobee_voice_render.c
  79. +0
    -12
      plugins/PingPongPan/DSSI-UI/premake.lua
  80. +0
    -11
      plugins/PingPongPan/DSSI/premake.lua
  81. +0
    -11
      plugins/PingPongPan/LADSPA/premake.lua
  82. +0
    -12
      plugins/PingPongPan/LV2-UI/premake.lua
  83. +0
    -11
      plugins/PingPongPan/LV2/premake.lua
  84. +0
    -14
      plugins/PingPongPan/VST/premake.lua
  85. +0
    -5651
      plugins/PingPongPan/source/DistrhoArtworkPingPongPan.cpp
  86. +0
    -35
      plugins/PingPongPan/source/DistrhoArtworkPingPongPan.hpp
  87. +0
    -35
      plugins/PingPongPan/source/DistrhoPluginInfo.h
  88. +0
    -165
      plugins/PingPongPan/source/DistrhoPluginPingPongPan.cpp
  89. +0
    -103
      plugins/PingPongPan/source/DistrhoPluginPingPongPan.hpp
  90. +0
    -145
      plugins/PingPongPan/source/DistrhoUIPingPongPan.cpp
  91. +0
    -89
      plugins/PingPongPan/source/DistrhoUIPingPongPan.hpp
  92. BIN
      plugins/PingPongPan/source/artwork/about.png
  93. BIN
      plugins/PingPongPan/source/artwork/aboutButtonHover.png
  94. BIN
      plugins/PingPongPan/source/artwork/aboutButtonNormal.png
  95. BIN
      plugins/PingPongPan/source/artwork/background.png
  96. BIN
      plugins/PingPongPan/source/artwork/knob.png

+ 0
- 5
Makefile View File

@@ -21,7 +21,6 @@ all:

install:
# make dirs
install -d $(DESTDIR)$(PREFIX)/lib/ladspa/
install -d $(DESTDIR)$(PREFIX)/lib/dssi/
install -d $(DESTDIR)$(PREFIX)/lib/lv2/
install -d $(DESTDIR)$(PREFIX)/lib/vst/
@@ -31,7 +30,6 @@ install:
install -d $(DESTDIR)/usr/src/distrho/scripts/

# install plugins
cp -r bin/ladspa/* $(DESTDIR)$(PREFIX)/lib/ladspa/
cp -r bin/dssi/* $(DESTDIR)$(PREFIX)/lib/dssi/
cp -r bin/lv2/*.lv2/ $(DESTDIR)$(PREFIX)/lib/lv2/
cp -r bin/vst/* $(DESTDIR)$(PREFIX)/lib/vst/
@@ -97,9 +95,6 @@ mingw:
# -----------------------------------------
# Custom build types

ladspa:
$(MAKE) -C plugins ladspa

dssi:
$(MAKE) -C libs/dgl
$(MAKE) -C plugins dssi


+ 1
- 1
README View File

@@ -47,7 +47,7 @@ You are now ready to start building. Run this on the source root folder:

$ make

If you just want to build specific plugin versions, you can use 'make ladspa', 'make dssi', 'make lv2' or 'make vst'.
If you just want to build specific plugin versions, you can use 'make dssi', 'make lv2' or 'make vst'.


To build in debug mode, use this:


+ 0
- 12
plugins/3BandEQ/DSSI-UI/premake.lua View File

@@ -1,12 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_dssi_ui_project("3BandEQ")
package.files = {
matchfiles (
"../source/DistrhoArtwork3BandEQ.cpp",
"../source/DistrhoUI3BandEQ.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 11
plugins/3BandEQ/DSSI/premake.lua View File

@@ -1,11 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_dssi_project("3BandEQ")
package.files = {
matchfiles (
"../source/DistrhoPlugin3BandEQ.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 11
plugins/3BandEQ/LADSPA/premake.lua View File

@@ -1,11 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_ladspa_project("3BandEQ")
package.files = {
matchfiles (
"../source/DistrhoPlugin3BandEQ.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 12
plugins/3BandEQ/LV2-UI/premake.lua View File

@@ -1,12 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_lv2_ui_project("3BandEQ")
package.files = {
matchfiles (
"../source/DistrhoArtwork3BandEQ.cpp",
"../source/DistrhoUI3BandEQ.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 11
plugins/3BandEQ/LV2/premake.lua View File

@@ -1,11 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_lv2_project("3BandEQ")
package.files = {
matchfiles (
"../source/DistrhoPlugin3BandEQ.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 14
plugins/3BandEQ/VST/premake.lua View File

@@ -1,14 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_vst_project("3BandEQ")
package.files = {
matchfiles (
"../source/DistrhoArtwork3BandEQ.cpp",
"../source/DistrhoPlugin3BandEQ.cpp",
"../source/DistrhoUI3BandEQ.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 10107
plugins/3BandEQ/source/DistrhoArtwork3BandEQ.cpp
File diff suppressed because it is too large
View File


+ 0
- 40
plugins/3BandEQ/source/DistrhoArtwork3BandEQ.hpp View File

@@ -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


+ 0
- 260
plugins/3BandEQ/source/DistrhoPlugin3BandEQ.cpp View File

@@ -1,260 +0,0 @@
/*
* DISTRHO 3BandEQ Plugin, based on 3BandEQ 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 "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();
}
DistrhoPlugin3BandEQ::~DistrhoPlugin3BandEQ()
{
}
// -----------------------------------------------------------------------
// 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 / kAMP_DB);
break;
case paramMid:
fMid = value;
midVol = std::exp( (fMid/48.0f) * 48 / kAMP_DB);
break;
case paramHigh:
fHigh = value;
highVol = std::exp( (fHigh/48.0f) * 48 / kAMP_DB);
break;
case paramMaster:
fMaster = value;
outVol = std::exp( (fMaster/48.0f) * 48 / kAMP_DB);
break;
case paramLowMidFreq:
fLowMidFreq = std::fmin(value, fMidHighFreq);
freqLP = fLowMidFreq; //fLowMidFreq * (fLowMidFreq / 24000.0f) * (fLowMidFreq / 24000.0f);
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; //fMidHighFreq * (fMidHighFreq / 24000.0f) * (fMidHighFreq / 24000.0f);
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()
{
xLP = std::exp(-2.0f * kPI * freqLP / (float)d_getSampleRate());
a0LP = 1.0f - xLP;
b1LP = -xLP;
xHP = std::exp(-2.0f * kPI * freqHP / (float)d_getSampleRate());
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(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)
{
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

+ 0
- 112
plugins/3BandEQ/source/DistrhoPlugin3BandEQ.hpp View File

@@ -1,112 +0,0 @@
/*
* DISTRHO 3BandEQ Plugin, based on 3BandEQ 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_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();
~DistrhoPlugin3BandEQ() override;
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(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;
};
// -----------------------------------------------------------------------
END_NAMESPACE_DISTRHO
#endif // DISTRHO_PLUGIN_3BANDEQ_HPP_INCLUDED

+ 0
- 35
plugins/3BandEQ/source/DistrhoPluginInfo.h View File

@@ -1,35 +0,0 @@
/*
* DISTRHO 3BandEQ Plugin, based on 3BandEQ 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 "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

+ 0
- 236
plugins/3BandEQ/source/DistrhoUI3BandEQ.cpp View File

@@ -1,236 +0,0 @@
/*
* DISTRHO 3BandEQ Plugin, based on 3BandEQ 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 "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 imageAbout(DistrhoArtwork3BandEQ::aboutData, DistrhoArtwork3BandEQ::aboutWidth, DistrhoArtwork3BandEQ::aboutHeight, GL_BGR);
fAboutWindow.setImage(imageAbout);

// 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->setStartPos(sliderPosStart);
fSliderLow->setEndPos(sliderPosEnd);
fSliderLow->setInverted(true);
fSliderLow->setRange(-24.0f, 24.0f);
fSliderLow->setValue(0.0f);
fSliderLow->setCallback(this);

// slider Mid
sliderPosStart.setX(120);
sliderPosEnd.setX(120);
fSliderMid = new ImageSlider(*fSliderLow);
fSliderMid->setStartPos(sliderPosStart);
fSliderMid->setEndPos(sliderPosEnd);

// slider High
sliderPosStart.setX(183);
sliderPosEnd.setX(183);
fSliderHigh = new ImageSlider(*fSliderLow);
fSliderHigh->setStartPos(sliderPosStart);
fSliderHigh->setEndPos(sliderPosEnd);

// slider Master
sliderPosStart.setX(287);
sliderPosEnd.setX(287);
fSliderMaster = new ImageSlider(*fSliderLow);
fSliderMaster->setStartPos(sliderPosStart);
fSliderMaster->setEndPos(sliderPosEnd);

// knobs
Image knobImage(DistrhoArtwork3BandEQ::knobData, DistrhoArtwork3BandEQ::knobWidth, DistrhoArtwork3BandEQ::knobHeight);

// knob Low-Mid
fKnobLowMid = new ImageKnob(this, knobImage);
fKnobLowMid->setPos(65, 269);
fKnobLowMid->setRange(0.0f, 1000.0f);
fKnobLowMid->setValue(220.0f);
fKnobLowMid->setRotationAngle(270);
fKnobLowMid->setCallback(this);

// knob Mid-High
fKnobMidHigh = new ImageKnob(this, knobImage);
fKnobMidHigh->setPos(159, 269);
fKnobMidHigh->setRange(1000.0f, 20000.0f);
fKnobMidHigh->setValue(2000.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->setPos(264, 300);
fButtonAbout->setCallback(this);
}

DistrhoUI3BandEQ::~DistrhoUI3BandEQ()
{
delete fSliderLow;
delete fSliderMid;
delete fSliderHigh;
delete fSliderMaster;
delete fKnobLowMid;
delete fKnobMidHigh;
delete fButtonAbout;
}

// -----------------------------------------------------------------------
// 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)
{
if (knob == fKnobLowMid)
d_editParameter(DistrhoPlugin3BandEQ::paramLowMidFreq, true);
else if (knob == fKnobMidHigh)
d_editParameter(DistrhoPlugin3BandEQ::paramMidHighFreq, true);
}

void DistrhoUI3BandEQ::imageKnobDragFinished(ImageKnob* knob)
{
if (knob == fKnobLowMid)
d_editParameter(DistrhoPlugin3BandEQ::paramLowMidFreq, false);
else if (knob == fKnobMidHigh)
d_editParameter(DistrhoPlugin3BandEQ::paramMidHighFreq, false);
}

void DistrhoUI3BandEQ::imageKnobValueChanged(ImageKnob* knob, float value)
{
if (knob == fKnobLowMid)
d_setParameterValue(DistrhoPlugin3BandEQ::paramLowMidFreq, value);
else if (knob == fKnobMidHigh)
d_setParameterValue(DistrhoPlugin3BandEQ::paramMidHighFreq, value);
}

void DistrhoUI3BandEQ::imageSliderDragStarted(ImageSlider* slider)
{
if (slider == fSliderLow)
d_editParameter(DistrhoPlugin3BandEQ::paramLow, true);
else if (slider == fSliderMid)
d_editParameter(DistrhoPlugin3BandEQ::paramMid, true);
else if (slider == fSliderHigh)
d_editParameter(DistrhoPlugin3BandEQ::paramHigh, true);
else if (slider == fSliderMaster)
d_editParameter(DistrhoPlugin3BandEQ::paramMaster, true);
}

void DistrhoUI3BandEQ::imageSliderDragFinished(ImageSlider* slider)
{
if (slider == fSliderLow)
d_editParameter(DistrhoPlugin3BandEQ::paramLow, false);
else if (slider == fSliderMid)
d_editParameter(DistrhoPlugin3BandEQ::paramMid, false);
else if (slider == fSliderHigh)
d_editParameter(DistrhoPlugin3BandEQ::paramHigh, false);
else if (slider == fSliderMaster)
d_editParameter(DistrhoPlugin3BandEQ::paramMaster, false);
}

void DistrhoUI3BandEQ::imageSliderValueChanged(ImageSlider* slider, float value)
{
if (slider == fSliderLow)
d_setParameterValue(DistrhoPlugin3BandEQ::paramLow, value);
else if (slider == fSliderMid)
d_setParameterValue(DistrhoPlugin3BandEQ::paramMid, value);
else if (slider == fSliderHigh)
d_setParameterValue(DistrhoPlugin3BandEQ::paramHigh, value);
else if (slider == fSliderMaster)
d_setParameterValue(DistrhoPlugin3BandEQ::paramMaster, value);
}

void DistrhoUI3BandEQ::onDisplay()
{
fImgBackground.draw();
}

// -----------------------------------------------------------------------

UI* createUI()
{
return new DistrhoUI3BandEQ();
}

// -----------------------------------------------------------------------

END_NAMESPACE_DISTRHO

+ 0
- 99
plugins/3BandEQ/source/DistrhoUI3BandEQ.hpp View File

@@ -1,99 +0,0 @@
/*
* DISTRHO 3BandEQ Plugin, based on 3BandEQ 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_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"
#include "DistrhoPlugin3BandEQ.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();
~DistrhoUI3BandEQ() override;

protected:
// -------------------------------------------------------------------
// Information

unsigned int d_getWidth() const noexcept override
{
return DistrhoArtwork3BandEQ::backgroundWidth;
}

unsigned int 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;

ImageSlider* fSliderLow;
ImageSlider* fSliderMid;
ImageSlider* fSliderHigh;
ImageSlider* fSliderMaster;
ImageKnob* fKnobLowMid;
ImageKnob* fKnobMidHigh;
ImageButton* fButtonAbout;
};

// -----------------------------------------------------------------------

END_NAMESPACE_DISTRHO

#endif // DISTRHO_UI_3BANDEQ_HPP_INCLUDED

BIN
plugins/3BandEQ/source/artwork/about.png View File

Before After
Width: 303  |  Height: 190  |  Size: 57KB

BIN
plugins/3BandEQ/source/artwork/aboutButtonHover.png View File

Before After
Width: 92  |  Height: 16  |  Size: 4.0KB

BIN
plugins/3BandEQ/source/artwork/aboutButtonNormal.png View File

Before After
Width: 92  |  Height: 16  |  Size: 4.1KB

BIN
plugins/3BandEQ/source/artwork/background.png View File

Before After
Width: 392  |  Height: 372  |  Size: 144KB

BIN
plugins/3BandEQ/source/artwork/knob.png View File

Before After
Width: 62  |  Height: 62  |  Size: 3.9KB

BIN
plugins/3BandEQ/source/artwork/slider.png View File

Before After
Width: 50  |  Height: 30  |  Size: 3.4KB

+ 0
- 12
plugins/3BandSplitter/DSSI-UI/premake.lua View File

@@ -1,12 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_dssi_ui_project("3BandSplitter")
package.files = {
matchfiles (
"../source/DistrhoArtwork3BandSplitter.cpp",
"../source/DistrhoUI3BandSplitter.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 11
plugins/3BandSplitter/DSSI/premake.lua View File

@@ -1,11 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_dssi_project("3BandSplitter")
package.files = {
matchfiles (
"../source/DistrhoPlugin3BandSplitter.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 11
plugins/3BandSplitter/LADSPA/premake.lua View File

@@ -1,11 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_ladspa_project("3BandSplitter")
package.files = {
matchfiles (
"../source/DistrhoPlugin3BandSplitter.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 12
plugins/3BandSplitter/LV2-UI/premake.lua View File

@@ -1,12 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_lv2_ui_project("3BandSplitter")
package.files = {
matchfiles (
"../source/DistrhoArtwork3BandSplitter.cpp",
"../source/DistrhoUI3BandSplitter.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 11
plugins/3BandSplitter/LV2/premake.lua View File

@@ -1,11 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_lv2_project("3BandSplitter")
package.files = {
matchfiles (
"../source/DistrhoPlugin3BandSplitter.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 14
plugins/3BandSplitter/VST/premake.lua View File

@@ -1,14 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_vst_project("3BandSplitter")
package.files = {
matchfiles (
"../source/DistrhoArtwork3BandSplitter.cpp",
"../source/DistrhoPlugin3BandSplitter.cpp",
"../source/DistrhoUI3BandSplitter.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 10107
plugins/3BandSplitter/source/DistrhoArtwork3BandSplitter.cpp
File diff suppressed because it is too large
View File


+ 0
- 40
plugins/3BandSplitter/source/DistrhoArtwork3BandSplitter.hpp View File

@@ -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


+ 0
- 268
plugins/3BandSplitter/source/DistrhoPlugin3BandSplitter.cpp View File

@@ -1,268 +0,0 @@
/*
* DISTRHO 3BandSplitter Plugin, based on 3BandSplitter 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 "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();
}
DistrhoPlugin3BandSplitter::~DistrhoPlugin3BandSplitter()
{
}
// -----------------------------------------------------------------------
// 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 / kAMP_DB);
break;
case paramMid:
fMid = value;
midVol = std::exp( (fMid/48.0f) * 48 / kAMP_DB);
break;
case paramHigh:
fHigh = value;
highVol = std::exp( (fHigh/48.0f) * 48 / kAMP_DB);
break;
case paramMaster:
fMaster = value;
outVol = std::exp( (fMaster/48.0f) * 48 / kAMP_DB);
break;
case paramLowMidFreq:
fLowMidFreq = std::fmin(value, fMidHighFreq);
freqLP = fLowMidFreq; //fLowMidFreq * (fLowMidFreq / 24000.0f) * (fLowMidFreq / 24000.0f);
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; //fMidHighFreq * (fMidHighFreq / 24000.0f) * (fMidHighFreq / 24000.0f);
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()
{
xLP = std::exp(-2.0f * kPI * freqLP / (float)d_getSampleRate());
a0LP = 1.0f - xLP;
b1LP = -xLP;
xHP = std::exp(-2.0f * kPI * freqHP / (float)d_getSampleRate());
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(float** inputs, float** outputs, uint32_t frames)
{
float* in1 = inputs[0];
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

+ 0
- 112
plugins/3BandSplitter/source/DistrhoPlugin3BandSplitter.hpp View File

@@ -1,112 +0,0 @@
/*
* DISTRHO 3BandSplitter Plugin, based on 3BandSplitter 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_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();
~DistrhoPlugin3BandSplitter() override;
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(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;
};
// -----------------------------------------------------------------------
END_NAMESPACE_DISTRHO
#endif // DISTRHO_PLUGIN_3BANDSPLITTER_HPP_INCLUDED

+ 0
- 35
plugins/3BandSplitter/source/DistrhoPluginInfo.h View File

@@ -1,35 +0,0 @@
/*
* DISTRHO 3BandSplitter Plugin, based on 3BandSplitter 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 "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

+ 0
- 236
plugins/3BandSplitter/source/DistrhoUI3BandSplitter.cpp View File

@@ -1,236 +0,0 @@
/*
* DISTRHO 3BandSplitter Plugin, based on 3BandSplitter 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 "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 imageAbout(DistrhoArtwork3BandSplitter::aboutData, DistrhoArtwork3BandSplitter::aboutWidth, DistrhoArtwork3BandSplitter::aboutHeight, GL_BGR);
fAboutWindow.setImage(imageAbout);

// 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->setStartPos(sliderPosStart);
fSliderLow->setEndPos(sliderPosEnd);
fSliderLow->setInverted(true);
fSliderLow->setRange(-24.0f, 24.0f);
fSliderLow->setValue(0.0f);
fSliderLow->setCallback(this);

// slider Mid
sliderPosStart.setX(120);
sliderPosEnd.setX(120);
fSliderMid = new ImageSlider(*fSliderLow);
fSliderMid->setStartPos(sliderPosStart);
fSliderMid->setEndPos(sliderPosEnd);

// slider High
sliderPosStart.setX(183);
sliderPosEnd.setX(183);
fSliderHigh = new ImageSlider(*fSliderLow);
fSliderHigh->setStartPos(sliderPosStart);
fSliderHigh->setEndPos(sliderPosEnd);

// slider Master
sliderPosStart.setX(287);
sliderPosEnd.setX(287);
fSliderMaster = new ImageSlider(*fSliderLow);
fSliderMaster->setStartPos(sliderPosStart);
fSliderMaster->setEndPos(sliderPosEnd);

// knobs
Image knobImage(DistrhoArtwork3BandSplitter::knobData, DistrhoArtwork3BandSplitter::knobWidth, DistrhoArtwork3BandSplitter::knobHeight);

// knob Low-Mid
fKnobLowMid = new ImageKnob(this, knobImage);
fKnobLowMid->setPos(65, 269);
fKnobLowMid->setRange(0.0f, 1000.0f);
fKnobLowMid->setValue(220.0f);
fKnobLowMid->setRotationAngle(270);
fKnobLowMid->setCallback(this);

// knob Mid-High
fKnobMidHigh = new ImageKnob(this, knobImage);
fKnobMidHigh->setPos(159, 269);
fKnobMidHigh->setRange(1000.0f, 20000.0f);
fKnobMidHigh->setValue(2000.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->setPos(264, 300);
fButtonAbout->setCallback(this);
}

DistrhoUI3BandSplitter::~DistrhoUI3BandSplitter()
{
delete fSliderLow;
delete fSliderMid;
delete fSliderHigh;
delete fSliderMaster;
delete fKnobLowMid;
delete fKnobMidHigh;
delete fButtonAbout;
}

// -----------------------------------------------------------------------
// 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)
{
if (knob == fKnobLowMid)
d_editParameter(DistrhoPlugin3BandSplitter::paramLowMidFreq, true);
else if (knob == fKnobMidHigh)
d_editParameter(DistrhoPlugin3BandSplitter::paramMidHighFreq, true);
}

void DistrhoUI3BandSplitter::imageKnobDragFinished(ImageKnob* knob)
{
if (knob == fKnobLowMid)
d_editParameter(DistrhoPlugin3BandSplitter::paramLowMidFreq, false);
else if (knob == fKnobMidHigh)
d_editParameter(DistrhoPlugin3BandSplitter::paramMidHighFreq, false);
}

void DistrhoUI3BandSplitter::imageKnobValueChanged(ImageKnob* knob, float value)
{
if (knob == fKnobLowMid)
d_setParameterValue(DistrhoPlugin3BandSplitter::paramLowMidFreq, value);
else if (knob == fKnobMidHigh)
d_setParameterValue(DistrhoPlugin3BandSplitter::paramMidHighFreq, value);
}

void DistrhoUI3BandSplitter::imageSliderDragStarted(ImageSlider* slider)
{
if (slider == fSliderLow)
d_editParameter(DistrhoPlugin3BandSplitter::paramLow, true);
else if (slider == fSliderMid)
d_editParameter(DistrhoPlugin3BandSplitter::paramMid, true);
else if (slider == fSliderHigh)
d_editParameter(DistrhoPlugin3BandSplitter::paramHigh, true);
else if (slider == fSliderMaster)
d_editParameter(DistrhoPlugin3BandSplitter::paramMaster, true);
}

void DistrhoUI3BandSplitter::imageSliderDragFinished(ImageSlider* slider)
{
if (slider == fSliderLow)
d_editParameter(DistrhoPlugin3BandSplitter::paramLow, false);
else if (slider == fSliderMid)
d_editParameter(DistrhoPlugin3BandSplitter::paramMid, false);
else if (slider == fSliderHigh)
d_editParameter(DistrhoPlugin3BandSplitter::paramHigh, false);
else if (slider == fSliderMaster)
d_editParameter(DistrhoPlugin3BandSplitter::paramMaster, false);
}

void DistrhoUI3BandSplitter::imageSliderValueChanged(ImageSlider* slider, float value)
{
if (slider == fSliderLow)
d_setParameterValue(DistrhoPlugin3BandSplitter::paramLow, value);
else if (slider == fSliderMid)
d_setParameterValue(DistrhoPlugin3BandSplitter::paramMid, value);
else if (slider == fSliderHigh)
d_setParameterValue(DistrhoPlugin3BandSplitter::paramHigh, value);
else if (slider == fSliderMaster)
d_setParameterValue(DistrhoPlugin3BandSplitter::paramMaster, value);
}

void DistrhoUI3BandSplitter::onDisplay()
{
fImgBackground.draw();
}

// -----------------------------------------------------------------------

UI* createUI()
{
return new DistrhoUI3BandSplitter();
}

// -----------------------------------------------------------------------

END_NAMESPACE_DISTRHO

+ 0
- 99
plugins/3BandSplitter/source/DistrhoUI3BandSplitter.hpp View File

@@ -1,99 +0,0 @@
/*
* DISTRHO 3BandSplitter Plugin, based on 3BandSplitter 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_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"
#include "DistrhoPlugin3BandSplitter.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();
~DistrhoUI3BandSplitter() override;

protected:
// -------------------------------------------------------------------
// Information

unsigned int d_getWidth() const noexcept override
{
return DistrhoArtwork3BandSplitter::backgroundWidth;
}

unsigned int 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;

ImageSlider* fSliderLow;
ImageSlider* fSliderMid;
ImageSlider* fSliderHigh;
ImageSlider* fSliderMaster;
ImageKnob* fKnobLowMid;
ImageKnob* fKnobMidHigh;
ImageButton* fButtonAbout;
};

// -----------------------------------------------------------------------

END_NAMESPACE_DISTRHO

#endif // DISTRHO_UI_3BANDSPLITTER_HPP_INCLUDED

BIN
plugins/3BandSplitter/source/artwork/about.png View File

Before After
Width: 303  |  Height: 190  |  Size: 58KB

BIN
plugins/3BandSplitter/source/artwork/aboutButtonHover.png View File

Before After
Width: 92  |  Height: 16  |  Size: 4.0KB

BIN
plugins/3BandSplitter/source/artwork/aboutButtonNormal.png View File

Before After
Width: 92  |  Height: 16  |  Size: 4.1KB

BIN
plugins/3BandSplitter/source/artwork/background.png View File

Before After
Width: 392  |  Height: 372  |  Size: 150KB

BIN
plugins/3BandSplitter/source/artwork/knob.png View File

Before After
Width: 62  |  Height: 62  |  Size: 3.9KB

BIN
plugins/3BandSplitter/source/artwork/slider.png View File

Before After
Width: 50  |  Height: 30  |  Size: 3.4KB

+ 2
- 58
plugins/Makefile View File

@@ -1,9 +1,9 @@
# -----------------------------------------
# Compile all the Plugins

all: libs ladspa dssi lv2 vst
all: libs dssi lv2 vst

plugins: ladspa dssi lv2 vst
plugins: dssi lv2 vst

# -----------------------------------------
# libs
@@ -11,28 +11,11 @@ plugins: ladspa dssi lv2 vst
libs:
$(MAKE) -C ../libs/dgl

# -----------------------------------------
# ladspa

ladspa:
mkdir -p ../bin/ladspa
$(MAKE) -C 3BandEQ/LADSPA
$(MAKE) -C 3BandSplitter/LADSPA
$(MAKE) -C PingPongPan/LADSPA

# -----------------------------------------
# dssi

dssi: libs
mkdir -p ../bin/dssi
$(MAKE) -C 3BandEQ/DSSI
$(MAKE) -C 3BandEQ/DSSI-UI
$(MAKE) -C 3BandSplitter/DSSI
$(MAKE) -C 3BandSplitter/DSSI-UI
$(MAKE) -C Nekobi/DSSI
$(MAKE) -C Nekobi/DSSI-UI
$(MAKE) -C PingPongPan/DSSI
$(MAKE) -C PingPongPan/DSSI-UI
$(MAKE) -C SegmentJuice/DSSI
$(MAKE) -C SegmentJuice/DSSI-UI

@@ -41,14 +24,6 @@ dssi: libs

lv2: libs
mkdir -p ../bin/lv2
$(MAKE) -C 3BandEQ/LV2
$(MAKE) -C 3BandEQ/LV2-UI
$(MAKE) -C 3BandSplitter/LV2
$(MAKE) -C 3BandSplitter/LV2-UI
$(MAKE) -C Nekobi/LV2
$(MAKE) -C Nekobi/LV2-UI
$(MAKE) -C PingPongPan/LV2
$(MAKE) -C PingPongPan/LV2-UI
$(MAKE) -C PowerJuice/LV2
$(MAKE) -C SegmentJuice/LV2
$(MAKE) -C SegmentJuice/LV2-UI
@@ -64,10 +39,6 @@ lv2: libs

vst: libs
mkdir -p ../bin/vst
$(MAKE) -C 3BandEQ/VST
$(MAKE) -C 3BandSplitter/VST
$(MAKE) -C Nekobi/VST
$(MAKE) -C PingPongPan/VST
$(MAKE) -C PowerJuice/VST
$(MAKE) -C SegmentJuice/VST
$(MAKE) -C VectorJuice/VST
@@ -78,32 +49,10 @@ vst: libs
# clean

clean:
# LADSPA
$(MAKE) clean -C 3BandEQ/LADSPA
$(MAKE) clean -C 3BandSplitter/LADSPA
$(MAKE) clean -C PingPongPan/LADSPA

# DSSI
$(MAKE) clean -C 3BandEQ/DSSI
$(MAKE) clean -C 3BandEQ/DSSI-UI
$(MAKE) clean -C 3BandSplitter/DSSI
$(MAKE) clean -C 3BandSplitter/DSSI-UI
$(MAKE) clean -C Nekobi/DSSI
$(MAKE) clean -C Nekobi/DSSI-UI
$(MAKE) clean -C PingPongPan/DSSI
$(MAKE) clean -C PingPongPan/DSSI-UI
$(MAKE) clean -C SegmentJuice/DSSI
$(MAKE) clean -C SegmentJuice/DSSI-UI

# LV2
$(MAKE) clean -C 3BandEQ/LV2
$(MAKE) clean -C 3BandEQ/LV2-UI
$(MAKE) clean -C 3BandSplitter/LV2
$(MAKE) clean -C 3BandSplitter/LV2-UI
$(MAKE) clean -C Nekobi/LV2
$(MAKE) clean -C Nekobi/LV2-UI
$(MAKE) clean -C PingPongPan/LV2
$(MAKE) clean -C PingPongPan/LV2-UI
$(MAKE) clean -C PowerJuice/LV2
$(MAKE) clean -C SegmentJuice/LV2
$(MAKE) clean -C SegmentJuice/LV2-UI
@@ -115,17 +64,12 @@ clean:
$(MAKE) clean -C GrooveJuice/LV2-UI

# VST
$(MAKE) clean -C 3BandEQ/VST
$(MAKE) clean -C 3BandSplitter/VST
$(MAKE) clean -C Nekobi/VST
$(MAKE) clean -C PingPongPan/VST
$(MAKE) clean -C PowerJuice/VST
$(MAKE) clean -C SegmentJuice/VST
$(MAKE) clean -C VectorJuice/VST
$(MAKE) clean -C WobbleJuice/VST
$(MAKE) clean -C GrooveJuice/VST

rm -rf */LADSPA/intermediate
rm -rf */DSSI/intermediate
rm -rf */DSSI-UI/intermediate
rm -rf */LV2/intermediate


+ 0
- 12
plugins/Nekobi/DSSI-UI/premake.lua View File

@@ -1,12 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_dssi_ui_project("Nekobi")
package.files = {
matchfiles (
"../source/DistrhoArtworkNekobi.cpp",
"../source/DistrhoUINekobi.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 16
plugins/Nekobi/DSSI/premake.lua View File

@@ -1,16 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_dssi_project("Nekobi")
package.links = {
package.links,
"pthread"
}
package.files = {
matchfiles (
"../source/DistrhoPluginNekobi.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 12
plugins/Nekobi/LV2-UI/premake.lua View File

@@ -1,12 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_lv2_ui_project("Nekobi")
package.files = {
matchfiles (
"../source/DistrhoArtworkNekobi.cpp",
"../source/DistrhoUINekobi.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 16
plugins/Nekobi/LV2/premake.lua View File

@@ -1,16 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_lv2_project("Nekobi")
package.links = {
package.links,
"pthread"
}
package.files = {
matchfiles (
"../source/DistrhoPluginNekobi.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 19
plugins/Nekobi/VST/premake.lua View File

@@ -1,19 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_vst_project("Nekobi")
package.links = {
package.links,
"pthread"
}
package.files = {
matchfiles (
"../source/DistrhoArtworkNekobi.cpp",
"../source/DistrhoPluginNekobi.cpp",
"../source/DistrhoUINekobi.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 6890
plugins/Nekobi/source/DistrhoArtworkNekobi.cpp
File diff suppressed because it is too large
View File


+ 0
- 90
plugins/Nekobi/source/DistrhoArtworkNekobi.hpp View File

@@ -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


+ 0
- 36
plugins/Nekobi/source/DistrhoPluginInfo.h View File

@@ -1,36 +0,0 @@
/*
* DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others.
* Copyright (C) 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 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 "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

+ 0
- 410
plugins/Nekobi/source/DistrhoPluginNekobi.cpp View File

@@ -1,410 +0,0 @@
/*
* DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others.
* Copyright (C) 2004 Sean Bolton and others
* Copyright (C) 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 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 "DistrhoPluginNekobi.hpp"
#ifdef CARLA_EXPORT
# include "CarlaUtils.hpp"
#else
# define CARLA_SAFE_ASSERT_INT2(...)
#endif
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* 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* synth)
{
return (pthread_mutex_lock(&synth->voicelist_mutex) == 0);
}
bool dssp_voicelist_mutex_unlock(nekobee_synth_t *synth)
{
return (pthread_mutex_unlock(&synth->voicelist_mutex) == 0);
}
// -----------------------------------------------------------------------
// nekobee_handle_raw_event
void nekobee_handle_raw_event(nekobee_synth_t* synth, uint8_t size, const uint8_t* 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 = new nekobee_synth_t;
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);
delete fSynth;
}
// -----------------------------------------------------------------------
// 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;
CARLA_SAFE_ASSERT_INT2(fSynth->waveform == 0.0f || fSynth->waveform == 1.0f, fSynth->waveform, value);
break;
case paramTuning:
fParams.tuning = value;
fSynth->tuning = (value+12.0f)/24.0f * 1.5 + 0.5f; // FIXME: log?
CARLA_SAFE_ASSERT_INT2(fSynth->tuning >= 0.5f && fSynth->tuning <= 2.0f, fSynth->tuning, value);
break;
case paramCutoff:
fParams.cutoff = value;
fSynth->cutoff = value/2.5f;
CARLA_SAFE_ASSERT_INT2(fSynth->cutoff >= 0.0f && fSynth->cutoff <= 40.0f, fSynth->cutoff, value);
break;
case paramResonance:
fParams.resonance = value;
fSynth->resonance = value/100.0f;
CARLA_SAFE_ASSERT_INT2(fSynth->resonance >= 0.0f && fSynth->resonance <= 0.95f, fSynth->resonance, value);
break;
case paramEnvMod:
fParams.envMod = value;
fSynth->envmod = value/100.0f;
CARLA_SAFE_ASSERT_INT2(fSynth->envmod >= 0.0f && fSynth->envmod <= 1.0f, fSynth->envmod, value);
break;
case paramDecay:
fParams.decay = value;
fSynth->decay = value/100.0f * 0.000491f + 0.000009f; // FIXME: log?
CARLA_SAFE_ASSERT_INT2(fSynth->decay >= 0.000009f && fSynth->decay <= 0.0005f, fSynth->decay, value);
break;
case paramAccent:
fParams.accent = value;
fSynth->accent = value/100.0f;
CARLA_SAFE_ASSERT_INT2(fSynth->accent >= 0.0f && fSynth->accent <= 1.0f, fSynth->accent, value);
break;
case paramVolume:
fParams.volume = value;
fSynth->volume = value/100.0f;
CARLA_SAFE_ASSERT_INT2(fSynth->volume >= 0.0f && fSynth->volume <= 1.0f, fSynth->volume, value);
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(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))
{
for (uint32_t i=0; i < frames; ++i)
*out++ = 0.0f;
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

+ 0
- 119
plugins/Nekobi/source/DistrhoPluginNekobi.hpp View File

@@ -1,119 +0,0 @@
/*
* DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others.
* Copyright (C) 2004 Sean Bolton and others
* Copyright (C) 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 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_NEKOBI_HPP_INCLUDED
#define DISTRHO_PLUGIN_NEKOBI_HPP_INCLUDED
#include "DistrhoPlugin.hpp"
extern "C" {
#include "nekobee-src/nekobee_types.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(float** inputs, 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;
};
// -----------------------------------------------------------------------
END_NAMESPACE_DISTRHO
#endif // DISTRHO_PLUGIN_NEKOBI_HPP_INCLUDED

+ 0
- 277
plugins/Nekobi/source/DistrhoUINekobi.cpp View File

@@ -1,277 +0,0 @@
/*
* DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others.
* Copyright (C) 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 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 "DistrhoUINekobi.hpp"

using DGL::Point;

START_NAMESPACE_DISTRHO

// -----------------------------------------------------------------------

DistrhoUINekobi::DistrhoUINekobi()
: UI(),
fAboutWindow(this)
{
// FIXME
fNeko.setTimerSpeed(4);

// background
fImgBackground = Image(DistrhoArtworkNekobi::backgroundData, DistrhoArtworkNekobi::backgroundWidth, DistrhoArtworkNekobi::backgroundHeight, GL_BGR);

Image imageAbout(DistrhoArtworkNekobi::aboutData, DistrhoArtworkNekobi::aboutWidth, DistrhoArtworkNekobi::aboutHeight, GL_BGR);
fAboutWindow.setImage(imageAbout);

// slider
Image sliderImage(DistrhoArtworkNekobi::sliderData, DistrhoArtworkNekobi::sliderWidth, DistrhoArtworkNekobi::sliderHeight);

fSliderWaveform = new ImageSlider(this, sliderImage);
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);
fKnobTuning->setPos(41, 43);
fKnobTuning->setRange(-12.0f, 12.0f);
fKnobTuning->setValue(0.0f);
fKnobTuning->setRotationAngle(305);
fKnobTuning->setCallback(this);

// knob Cutoff
fKnobCutoff = new ImageKnob(this, knobImage);
fKnobCutoff->setPos(185, 43);
fKnobCutoff->setRange(0.0f, 100.0f);
fKnobCutoff->setValue(25.0f);
fKnobCutoff->setRotationAngle(305);
fKnobCutoff->setCallback(this);

// knob Resonance
fKnobResonance = new ImageKnob(this, knobImage);
fKnobResonance->setPos(257, 43);
fKnobResonance->setRange(0.0f, 95.0f);
fKnobResonance->setValue(25.0f);
fKnobResonance->setRotationAngle(305);
fKnobResonance->setCallback(this);

// knob Env Mod
fKnobEnvMod = new ImageKnob(this, knobImage);
fKnobEnvMod->setPos(329, 43);
fKnobEnvMod->setRange(0.0f, 100.0f);
fKnobEnvMod->setValue(50.0f);
fKnobEnvMod->setRotationAngle(305);
fKnobEnvMod->setCallback(this);

// knob Decay
fKnobDecay = new ImageKnob(this, knobImage);
fKnobDecay->setPos(400, 43);
fKnobDecay->setRange(0.0f, 100.0f);
fKnobDecay->setValue(75.0f);
fKnobDecay->setRotationAngle(305);
fKnobDecay->setCallback(this);

// knob Accent
fKnobAccent = new ImageKnob(this, knobImage);
fKnobAccent->setPos(473, 43);
fKnobAccent->setRange(0.0f, 100.0f);
fKnobAccent->setValue(25.0f);
fKnobAccent->setRotationAngle(305);
fKnobAccent->setCallback(this);

// knob Volume
fKnobVolume = new ImageKnob(this, knobImage);
fKnobVolume->setPos(545, 43);
fKnobVolume->setRange(0.0f, 100.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->setPos(505, 5);
fButtonAbout->setCallback(this);
}

DistrhoUINekobi::~DistrhoUINekobi()
{
delete fSliderWaveform;
delete fKnobTuning;
delete fKnobCutoff;
delete fKnobResonance;
delete fKnobEnvMod;
delete fKnobDecay;
delete fKnobAccent;
delete fKnobVolume;
delete fButtonAbout;
}

// -----------------------------------------------------------------------
// 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)
{
if (knob == fKnobTuning)
d_editParameter(DistrhoPluginNekobi::paramTuning, true);
else if (knob == fKnobCutoff)
d_editParameter(DistrhoPluginNekobi::paramCutoff, true);
else if (knob == fKnobResonance)
d_editParameter(DistrhoPluginNekobi::paramResonance, true);
else if (knob == fKnobEnvMod)
d_editParameter(DistrhoPluginNekobi::paramEnvMod, true);
else if (knob == fKnobDecay)
d_editParameter(DistrhoPluginNekobi::paramDecay, true);
else if (knob == fKnobAccent)
d_editParameter(DistrhoPluginNekobi::paramAccent, true);
else if (knob == fKnobVolume)
d_editParameter(DistrhoPluginNekobi::paramVolume, true);
}

void DistrhoUINekobi::imageKnobDragFinished(ImageKnob* knob)
{
if (knob == fKnobTuning)
d_editParameter(DistrhoPluginNekobi::paramTuning, false);
else if (knob == fKnobCutoff)
d_editParameter(DistrhoPluginNekobi::paramCutoff, false);
else if (knob == fKnobResonance)
d_editParameter(DistrhoPluginNekobi::paramResonance, false);
else if (knob == fKnobEnvMod)
d_editParameter(DistrhoPluginNekobi::paramEnvMod, false);
else if (knob == fKnobDecay)
d_editParameter(DistrhoPluginNekobi::paramDecay, false);
else if (knob == fKnobAccent)
d_editParameter(DistrhoPluginNekobi::paramAccent, false);
else if (knob == fKnobVolume)
d_editParameter(DistrhoPluginNekobi::paramVolume, false);
}

void DistrhoUINekobi::imageKnobValueChanged(ImageKnob* knob, float value)
{
if (knob == fKnobTuning)
d_setParameterValue(DistrhoPluginNekobi::paramTuning, value);
else if (knob == fKnobCutoff)
d_setParameterValue(DistrhoPluginNekobi::paramCutoff, value);
else if (knob == fKnobResonance)
d_setParameterValue(DistrhoPluginNekobi::paramResonance, value);
else if (knob == fKnobEnvMod)
d_setParameterValue(DistrhoPluginNekobi::paramEnvMod, value);
else if (knob == fKnobDecay)
d_setParameterValue(DistrhoPluginNekobi::paramDecay, value);
else if (knob == fKnobAccent)
d_setParameterValue(DistrhoPluginNekobi::paramAccent, value);
else if (knob == fKnobVolume)
d_setParameterValue(DistrhoPluginNekobi::paramVolume, value);
}

void DistrhoUINekobi::imageSliderDragStarted(ImageSlider* slider)
{
if (slider != fSliderWaveform)
return;

d_editParameter(DistrhoPluginNekobi::paramWaveform, true);
}

void DistrhoUINekobi::imageSliderDragFinished(ImageSlider* slider)
{
if (slider != fSliderWaveform)
return;

d_editParameter(DistrhoPluginNekobi::paramWaveform, false);
}

void DistrhoUINekobi::imageSliderValueChanged(ImageSlider* slider, float value)
{
if (slider != fSliderWaveform)
return;

d_setParameterValue(DistrhoPluginNekobi::paramWaveform, value);
}

void DistrhoUINekobi::onDisplay()
{
fImgBackground.draw();
fNeko.draw();
}

// -----------------------------------------------------------------------

UI* createUI()
{
return new DistrhoUINekobi();
}

// -----------------------------------------------------------------------

END_NAMESPACE_DISTRHO

+ 0
- 108
plugins/Nekobi/source/DistrhoUINekobi.hpp View File

@@ -1,108 +0,0 @@
/*
* DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others.
* Copyright (C) 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 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_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 "DistrhoPluginNekobi.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();
~DistrhoUINekobi() override;

protected:
// -------------------------------------------------------------------
// Information

unsigned int d_getWidth() const noexcept override
{
return DistrhoArtworkNekobi::backgroundWidth;
}

unsigned int 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;
NekoWidget fNeko;

ImageKnob* fKnobTuning;
ImageKnob* fKnobCutoff;
ImageKnob* fKnobResonance;
ImageKnob* fKnobEnvMod;
ImageKnob* fKnobDecay;
ImageKnob* fKnobAccent;
ImageKnob* fKnobVolume;

ImageButton* fButtonAbout;
ImageSlider* fSliderWaveform;
ImageAboutWindow fAboutWindow;
};

// -----------------------------------------------------------------------

END_NAMESPACE_DISTRHO

#endif // DISTRHO_UI_NEKOBI_HPP_INCLUDED

+ 0
- 204
plugins/Nekobi/source/NekoWidget.hpp View File

@@ -1,204 +0,0 @@
/*
* Neko widget animation
* Copyright (C) 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 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 NEKO_WIDGET_HPP_INCLUDED
#define NEKO_WIDGET_HPP_INCLUDED

#include "DistrhoArtworkNekobi.hpp"

#include "Image.hpp"
#include "Widget.hpp"

#include <cstdlib> // rand

using DGL::Image;

USE_NAMESPACE_DGL;

// -----------------------------------------------------------------------

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->draw(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

BIN
plugins/Nekobi/source/artwork/about.png View File

Before After
Width: 303  |  Height: 190  |  Size: 60KB

BIN
plugins/Nekobi/source/artwork/aboutButtonHover.png View File

Before After
Width: 92  |  Height: 16  |  Size: 4.0KB

BIN
plugins/Nekobi/source/artwork/aboutButtonNormal.png View File

Before After
Width: 92  |  Height: 16  |  Size: 4.1KB

BIN
plugins/Nekobi/source/artwork/background.png View File

Before After
Width: 636  |  Height: 108  |  Size: 43KB

BIN
plugins/Nekobi/source/artwork/claw1.png View File

Before After
Width: 32  |  Height: 32  |  Size: 359B

BIN
plugins/Nekobi/source/artwork/claw2.png View File

Before After
Width: 32  |  Height: 32  |  Size: 354B

BIN
plugins/Nekobi/source/artwork/knob.png View File

Before After
Width: 50  |  Height: 50  |  Size: 2.9KB

BIN
plugins/Nekobi/source/artwork/run1.png View File

Before After
Width: 32  |  Height: 32  |  Size: 383B

BIN
plugins/Nekobi/source/artwork/run2.png View File

Before After
Width: 32  |  Height: 32  |  Size: 370B

BIN
plugins/Nekobi/source/artwork/run3.png View File

Before After
Width: 32  |  Height: 32  |  Size: 383B

BIN
plugins/Nekobi/source/artwork/run4.png View File

Before After
Width: 32  |  Height: 32  |  Size: 369B

BIN
plugins/Nekobi/source/artwork/scratch1.png View File

Before After
Width: 32  |  Height: 32  |  Size: 375B

BIN
plugins/Nekobi/source/artwork/scratch2.png View File

Before After
Width: 32  |  Height: 32  |  Size: 348B

BIN
plugins/Nekobi/source/artwork/sit.png View File

Before After
Width: 32  |  Height: 32  |  Size: 347B

BIN
plugins/Nekobi/source/artwork/slider.png View File

Before After
Width: 39  |  Height: 39  |  Size: 4.1KB

BIN
plugins/Nekobi/source/artwork/tail.png View File

Before After
Width: 32  |  Height: 32  |  Size: 353B

+ 0
- 1779
plugins/Nekobi/source/nekobee-src/minblep_tables.c
File diff suppressed because it is too large
View File


+ 0
- 77
plugins/Nekobi/source/nekobee-src/nekobee.h View File

@@ -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 */

+ 0
- 237
plugins/Nekobi/source/nekobee-src/nekobee_synth.c View File

@@ -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);
}
}

+ 0
- 132
plugins/Nekobi/source/nekobee-src/nekobee_synth.h View File

@@ -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 */

+ 0
- 30
plugins/Nekobi/source/nekobee-src/nekobee_types.h View File

@@ -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 */

+ 0
- 256
plugins/Nekobi/source/nekobee-src/nekobee_voice.c View File

@@ -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;
}

+ 0
- 183
plugins/Nekobi/source/nekobee-src/nekobee_voice.h View File

@@ -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 */

+ 0
- 414
plugins/Nekobi/source/nekobee-src/nekobee_voice_render.c View File

@@ -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;
}

+ 0
- 12
plugins/PingPongPan/DSSI-UI/premake.lua View File

@@ -1,12 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_dssi_ui_project("PingPongPan")
package.files = {
matchfiles (
"../source/DistrhoArtworkPingPongPan.cpp",
"../source/DistrhoUIPingPongPan.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 11
plugins/PingPongPan/DSSI/premake.lua View File

@@ -1,11 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_dssi_project("PingPongPan")
package.files = {
matchfiles (
"../source/DistrhoPluginPingPongPan.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 11
plugins/PingPongPan/LADSPA/premake.lua View File

@@ -1,11 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_ladspa_project("PingPongPan")
package.files = {
matchfiles (
"../source/DistrhoPluginPingPongPan.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 12
plugins/PingPongPan/LV2-UI/premake.lua View File

@@ -1,12 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_lv2_ui_project("PingPongPan")
package.files = {
matchfiles (
"../source/DistrhoArtworkPingPongPan.cpp",
"../source/DistrhoUIPingPongPan.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 11
plugins/PingPongPan/LV2/premake.lua View File

@@ -1,11 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_lv2_project("PingPongPan")
package.files = {
matchfiles (
"../source/DistrhoPluginPingPongPan.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp"
)
}

+ 0
- 14
plugins/PingPongPan/VST/premake.lua View File

@@ -1,14 +0,0 @@
dofile("../../../scripts/make-project.lua")
package = make_distrho_vst_project("PingPongPan")
package.files = {
matchfiles (
"../source/DistrhoArtworkPingPongPan.cpp",
"../source/DistrhoPluginPingPongPan.cpp",
"../source/DistrhoUIPingPongPan.cpp",
"../../../libs/distrho/DistrhoPluginMain.cpp",
"../../../libs/distrho/DistrhoUIMain.cpp"
)
}

+ 0
- 5651
plugins/PingPongPan/source/DistrhoArtworkPingPongPan.cpp
File diff suppressed because it is too large
View File


+ 0
- 35
plugins/PingPongPan/source/DistrhoArtworkPingPongPan.hpp View File

@@ -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


+ 0
- 35
plugins/PingPongPan/source/DistrhoPluginInfo.h View File

@@ -1,35 +0,0 @@
/*
* DISTRHO PingPongPan Plugin, based on PingPongPan 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 "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

+ 0
- 165
plugins/PingPongPan/source/DistrhoPluginPingPongPan.cpp View File

@@ -1,165 +0,0 @@
/*
* DISTRHO PingPongPan Plugin, based on PingPongPan 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 "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();
}
DistrhoPluginPingPongPan::~DistrhoPluginPingPongPan()
{
}
// -----------------------------------------------------------------------
// 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(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)
{
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

+ 0
- 103
plugins/PingPongPan/source/DistrhoPluginPingPongPan.hpp View File

@@ -1,103 +0,0 @@
/*
* DISTRHO PingPongPan Plugin, based on PingPongPan 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_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();
~DistrhoPluginPingPongPan() override;
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(float** inputs, float** outputs, uint32_t frames) override;
// -------------------------------------------------------------------
private:
float fFreq;
float fWidth;
float waveSpeed;
float pan, wavePos;
};
// -----------------------------------------------------------------------
END_NAMESPACE_DISTRHO
#endif // DISTRHO_PLUGIN_PINGPONGPAN_HPP_INCLUDED

+ 0
- 145
plugins/PingPongPan/source/DistrhoUIPingPongPan.cpp View File

@@ -1,145 +0,0 @@
/*
* DISTRHO PingPongPan Plugin, based on PingPongPan 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 "DistrhoUIPingPongPan.hpp"

using DGL::Point;

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);
fKnobFreq->setPos(60, 58);
fKnobFreq->setRange(0.0f, 100.0f);
fKnobFreq->setValue(50.0f);
fKnobFreq->setRotationAngle(270);
fKnobFreq->setCallback(this);

// knob Mid-High
fKnobWidth = new ImageKnob(this, knobImage);
fKnobWidth->setPos(182, 58);
fKnobWidth->setRange(0.0f, 100.0f);
fKnobWidth->setValue(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->setPos(183, 8);
fButtonAbout->setCallback(this);
}

DistrhoUIPingPongPan::~DistrhoUIPingPongPan()
{
delete fKnobFreq;
delete fKnobWidth;
delete fButtonAbout;
}

// -----------------------------------------------------------------------
// 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)
{
if (knob == fKnobFreq)
d_editParameter(DistrhoPluginPingPongPan::paramFreq, true);
else if (knob == fKnobWidth)
d_editParameter(DistrhoPluginPingPongPan::paramWidth, true);
}

void DistrhoUIPingPongPan::imageKnobDragFinished(ImageKnob* knob)
{
if (knob == fKnobFreq)
d_editParameter(DistrhoPluginPingPongPan::paramFreq, false);
else if (knob == fKnobWidth)
d_editParameter(DistrhoPluginPingPongPan::paramWidth, false);
}


void DistrhoUIPingPongPan::imageKnobValueChanged(ImageKnob* knob, float value)
{
if (knob == fKnobFreq)
d_setParameterValue(DistrhoPluginPingPongPan::paramFreq, value);
else if (knob == fKnobWidth)
d_setParameterValue(DistrhoPluginPingPongPan::paramWidth, value);
}

void DistrhoUIPingPongPan::onDisplay()
{
fImgBackground.draw();
}

// -----------------------------------------------------------------------

UI* createUI()
{
return new DistrhoUIPingPongPan();
}

// -----------------------------------------------------------------------

END_NAMESPACE_DISTRHO

+ 0
- 89
plugins/PingPongPan/source/DistrhoUIPingPongPan.hpp View File

@@ -1,89 +0,0 @@
/*
* DISTRHO PingPongPan Plugin, based on PingPongPan 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_PINGPONGPAN_HPP_INCLUDED
#define DISTRHO_UI_PINGPONGPAN_HPP_INCLUDED

#include "DistrhoUI.hpp"

#include "ImageAboutWindow.hpp"
#include "ImageButton.hpp"
#include "ImageKnob.hpp"

#include "DistrhoArtworkPingPongPan.hpp"
#include "DistrhoPluginPingPongPan.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();
~DistrhoUIPingPongPan() override;

protected:
// -------------------------------------------------------------------
// Information

unsigned int d_getWidth() const noexcept override
{
return DistrhoArtworkPingPongPan::backgroundWidth;
}

unsigned int 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;

ImageKnob* fKnobFreq;
ImageKnob* fKnobWidth;
ImageButton* fButtonAbout;
};

// -----------------------------------------------------------------------

END_NAMESPACE_DISTRHO

#endif // DISTRHO_UI_PINGPONGPAN_HPP_INCLUDED

BIN
plugins/PingPongPan/source/artwork/about.png View File

Before After
Width: 303  |  Height: 190  |  Size: 57KB

BIN
plugins/PingPongPan/source/artwork/aboutButtonHover.png View File

Before After
Width: 95  |  Height: 20  |  Size: 6.5KB

BIN
plugins/PingPongPan/source/artwork/aboutButtonNormal.png View File

Before After
Width: 95  |  Height: 20  |  Size: 6.3KB

BIN
plugins/PingPongPan/source/artwork/background.png View File

Before After
Width: 308  |  Height: 170  |  Size: 68KB

BIN
plugins/PingPongPan/source/artwork/knob.png View File

Before After
Width: 67  |  Height: 67  |  Size: 3.4KB

Loading…
Cancel
Save