|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347 |
- /*
- ==============================================================================
-
- This file is part of the JUCETICE project - Copyright 2008 by Lucio Asnaghi.
-
- JUCETICE is based around the JUCE library - "Jules' Utility Class Extensions"
- Copyright 2008 by Julian Storer.
-
- ------------------------------------------------------------------------------
-
- JUCE and JUCETICE can be redistributed and/or modified under the terms of
- the GNU Lesser General Public License, as published by the Free Software
- Foundation; either version 2 of the License, or (at your option) any later
- version.
-
- JUCE and JUCETICE are distributed in the hope that they 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 Lesser General Public License
- along with JUCE and JUCETICE; if not, visit www.gnu.org/licenses or write to
- Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- Boston, MA 02111-1307 USA
-
- ==============================================================================
-
- @author rockhardbuns
- @tweaker Lucio Asnaghi
- @tweaker falkTX
-
- ==============================================================================
- */
-
- #ifndef DISTRHO_VEX_WAVE_RENDERER_HEADER_INCLUDED
- #define DISTRHO_VEX_WAVE_RENDERER_HEADER_INCLUDED
-
- #ifndef CARLA_EXPORT
- #define CARLA_EXPORT
- #endif
-
- #ifdef CARLA_EXPORT
- #include "juce_audio_basics.h"
- #include "resources/Resources.h"
- #else
- #include "../StandardHeader.h"
- #include "resources/Resources.h"
- #endif
-
- struct OscSet {
- float phase;
- float phaseOffset;
- float phaseInc;
- float phaseIncOffset;
- float cut;
- float buf[4];
- };
-
- struct WaveTableNames {
- const char* name;
- const char* data;
- };
-
- class WaveRenderer
- {
- public:
- WaveRenderer()
- : cycle(256), //base pitch 86 Hz
- tableSize(0),
- daTable(nullptr),
- sWave("sine"),
- loadWave(true)
- {
- }
-
- ~WaveRenderer()
- {
- //M.setSize(0);
- daTable = nullptr;
- }
-
- const String& getCurrentWaveName() const
- {
- return sWave;
- }
-
- void setWaveLater(const String& waveName)
- {
- sWave = waveName;
- loadWave = true;
- }
-
- void actuallySetWave()
- {
- if (sWave == "asym_saw") {
- daTable = (uint16*) Wavetables::asym_saw;
- tableSize = Wavetables::asym_saw_size / 2;
- } else if (sWave == "bass_tone") {
- daTable = (uint16*) Wavetables::bass_tone;
- tableSize = Wavetables::bass_tone_size / 2;
- } else if (sWave == "buzz_1") {
- daTable = (uint16*) Wavetables::buzz_1;
- tableSize = Wavetables::buzz_1_size / 2;
- } else if (sWave == "buzz_2") {
- daTable = (uint16*) Wavetables::buzz_2;
- tableSize = Wavetables::buzz_2_size / 2;
- } else if (sWave == "dark_strings") {
- daTable = (uint16*) Wavetables::dark_strings;
- tableSize = Wavetables::dark_strings_size / 2;
- } else if (sWave == "deep_ring_1") {
- daTable = (uint16*) Wavetables::deep_ring_1;
- tableSize = Wavetables::deep_ring_1_size / 2;
- } else if (sWave == "deep_ring_2") {
- daTable = (uint16*) Wavetables::deep_ring_2;
- tableSize = Wavetables::deep_ring_2_size / 2;
- } else if (sWave == "epiano_tone") {
- daTable = (uint16*) Wavetables::epiano_tone;
- tableSize = Wavetables::epiano_tone_size / 2;
- } else if (sWave == "ghost_1") {
- daTable = (uint16*) Wavetables::ghost_1;
- tableSize = Wavetables::ghost_1_size / 2;
- } else if (sWave == "ghost_2") {
- daTable = (uint16*) Wavetables::ghost_2;
- tableSize = Wavetables::ghost_2_size / 2;
- } else if (sWave == "ghost_3") {
- daTable = (uint16*) Wavetables::ghost_3;
- tableSize = Wavetables::ghost_3_size / 2;
- } else if (sWave == "ghost_4") {
- daTable = (uint16*) Wavetables::ghost_4;
- tableSize = Wavetables::ghost_4_size / 2;
- } else if (sWave == "grind_1") {
- daTable = (uint16*) Wavetables::grind_1;
- tableSize = Wavetables::grind_1_size / 2;
- } else if (sWave == "grind_2") {
- daTable = (uint16*) Wavetables::grind_2;
- tableSize = Wavetables::grind_2_size / 2;
- } else if (sWave == "more_strings") {
- daTable = (uint16*) Wavetables::more_strings;
- tableSize = Wavetables::more_strings_size / 2;
- } else if (sWave == "multi_pulse") {
- daTable = (uint16*) Wavetables::multi_pulse;
- tableSize = Wavetables::multi_pulse_size / 2;
- } else if (sWave == "one_string") {
- daTable = (uint16*) Wavetables::one_string;
- tableSize = Wavetables::one_string_size / 2;
- } else if (sWave == "organ_1") {
- daTable = (uint16*) Wavetables::organ_1;
- tableSize = Wavetables::organ_1_size / 2;
- } else if (sWave == "organ_2") {
- daTable = (uint16*) Wavetables::organ_2;
- tableSize = Wavetables::organ_2_size / 2;
- } else if (sWave == "phasing_sqr") {
- daTable = (uint16*) Wavetables::phasing_sqr;
- tableSize = Wavetables::phasing_sqr_size / 2;
- } else if (sWave == "pulse") {
- daTable = (uint16*) Wavetables::pulse;
- tableSize = Wavetables::pulse_size / 2;
- } else if (sWave == "saw") {
- daTable = (uint16*) Wavetables::saw;
- tableSize = Wavetables::saw_size / 2;
- } else if (sWave == "sharp_1") {
- daTable = (uint16*) Wavetables::sharp_1;
- tableSize = Wavetables::sharp_1_size / 2;
- } else if (sWave == "sharp_2") {
- daTable = (uint16*) Wavetables::sharp_2;
- tableSize = Wavetables::sharp_2_size / 2;
- } else if (sWave == "sine") {
- daTable = (uint16*) Wavetables::sine;
- tableSize = Wavetables::sine_size / 2;
- } else if (sWave == "soft_1") {
- daTable = (uint16*) Wavetables::soft_1;
- tableSize = Wavetables::soft_1_size / 2;
- } else if (sWave == "soft_2") {
- daTable = (uint16*) Wavetables::soft_2;
- tableSize = Wavetables::soft_2_size / 2;
- } else if (sWave == "soft_3") {
- daTable = (uint16*) Wavetables::soft_3;
- tableSize = Wavetables::soft_3_size / 2;
- } else if (sWave == "soft_4") {
- daTable = (uint16*) Wavetables::soft_4;
- tableSize = Wavetables::soft_4_size / 2;
- } else if (sWave == "square") {
- daTable = (uint16*) Wavetables::square;
- tableSize = Wavetables::square_size / 2;
- } else if (sWave == "strings_1") {
- daTable = (uint16*) Wavetables::strings_1;
- tableSize = Wavetables::strings_1_size / 2;
- } else if (sWave == "strings_2") {
- daTable = (uint16*) Wavetables::strings_2;
- tableSize = Wavetables::strings_2_size / 2;
- } else if (sWave == "string_fuzz") {
- daTable = (uint16*) Wavetables::string_fuzz;
- tableSize = Wavetables::string_fuzz_size / 2;
- } else if (sWave == "syn_choir_1") {
- daTable = (uint16*) Wavetables::syn_choir_1;
- tableSize = Wavetables::syn_choir_1_size / 2;
- } else if (sWave == "syn_choir_2") {
- daTable = (uint16*) Wavetables::syn_choir_2;
- tableSize = Wavetables::syn_choir_2_size / 2;
- } else if (sWave == "syn_choir_3") {
- daTable = (uint16*) Wavetables::syn_choir_3;
- tableSize = Wavetables::syn_choir_3_size / 2;
- } else if (sWave == "thin_1") {
- daTable = (uint16*) Wavetables::thin_1;
- tableSize = Wavetables::thin_1_size / 2;
- } else if (sWave == "thin_2") {
- daTable = (uint16*) Wavetables::thin_2;
- tableSize = Wavetables::thin_2_size / 2;
- } else if (sWave == "two_strings") {
- daTable = (uint16*) Wavetables::two_strings;
- tableSize = Wavetables::two_strings_size / 2;
- } else if (sWave == "voice_1") {
- daTable = (uint16*) Wavetables::voice_1;
- tableSize = Wavetables::voice_1_size / 2;
- } else if (sWave == "voice_2") {
- daTable = (uint16*) Wavetables::voice_2;
- tableSize = Wavetables::voice_2_size / 2;
- }
-
- loadWave = false;
-
- #if 0
- // TODO - this fails on linux (host directory not plugin one)
- // String waveName = (File::getSpecialLocation(File::currentExecutableFile)).getParentDirectory().getFullPathName();
-
- File location = (File::getSpecialLocation(File::userHomeDirectory)).getChildFile(".vex");
- if (! location.exists ())
- location.createDirectory ();
-
- String waveName;
- waveName << location.getFullPathName()
- << "/"
- << sWave
- << ".raw";
-
- DBG( waveName );
-
- File f(waveName);
- if (f.existsAsFile ())
- {
- tableSize = int(f.getSize() / 2);
- if (tableSize > 0)
- {
- M.setSize(0);
- f.loadFileAsData(M);
- daTable = (uint16*) M.getData();
- }
- }
- else
- {
- tableSize = int(Wavetables::sine_size / 2);
- if (tableSize > 0)
- {
- M.setSize (0);
- M.append (Wavetables::sine, Wavetables::sine_size);
- daTable = (uint16*) M.getData();
- }
- }
- loadWave = false;
- #endif
- }
-
- void reset(float f, double s, OscSet& o)
- {
- if (loadWave) actuallySetWave();
-
- s = s * 2.0;
- f = f * 2.0f * (1.0f + o.phaseIncOffset * 0.01f);
- o.cut = float(2.0 * double_Pi * 9000.0 / s);
- o.phase = o.phaseOffset * tableSize * 0.5f;
- o.phaseInc = float(cycle / (s/f));
- o.buf[0] = 0.0f;
- o.buf[1] = 0.0f;
- o.buf[2] = 0.0f;
- o.buf[3] = 0.0f;
- }
-
- void setFrequency(float f, double s, OscSet& o)
- {
- s = s * 2.0;
- f = f * 2.0f;
- o.phaseInc = float((float)cycle / (s/f));
- }
-
- void fillBuffer(float* buffer, int bufferSize, OscSet& o)
- {
- if (buffer == nullptr || bufferSize == 0)
- return;
-
- float tmp;
-
- for (int i = 0; i < bufferSize; ++i)
- {
- buffer[i] = 0.0f;
-
- int index = roundFloatToInt(o.phase - 0.5f);
- float alpha = o.phase - (float)index;
- const float conv = 1.0f / 65535.0f;
- float sIndex = daTable[index] * conv - 0.5f;
- float sIndexp1 = daTable[(index + 1) % tableSize] * conv - 0.5f;
-
- tmp = sIndex + alpha * (sIndexp1 - sIndex);
- o.buf[1] = ((tmp - o.buf[1]) * o.cut) + o.buf[1];
- o.buf[2] = ((o.buf[1] - o.buf[2]) * o.cut) + o.buf[2];
- o.buf[3] = ((o.buf[2] - o.buf[3]) * o.cut) + o.buf[3];
- o.buf[0] = ((o.buf[3] - o.buf[0]) * o.cut) + o.buf[0];
-
- tmp = o.buf[0];
- buffer[i] += tmp;
- o.phase += o.phaseInc;
- if (o.phase > (float)tableSize)
- o.phase -= (float)tableSize;
-
- index = roundFloatToInt(o.phase - 0.5f);
- alpha = o.phase - (float)index;
- sIndex = daTable[index] * conv - 0.5f;
- sIndexp1 = daTable[(index + 1) % tableSize] * conv - 0.5f;
-
- tmp = sIndex + alpha * (sIndexp1 - sIndex);
- o.buf[1] = ((tmp - o.buf[1]) * o.cut) + o.buf[1];
- o.buf[2] = ((o.buf[1] - o.buf[2]) * o.cut) + o.buf[2];
- o.buf[3] = ((o.buf[2] - o.buf[3]) * o.cut) + o.buf[3];
- o.buf[0] = ((o.buf[3] - o.buf[0]) * o.cut) + o.buf[0];
-
- tmp = o.buf[0];
- buffer[i] += tmp;
- o.phase += o.phaseInc;
- if (o.phase > (float)tableSize)
- o.phase -= (float)tableSize;
- }
- }
-
- static int getWaveTableSize();
- static String getWaveTableName(const int index);
-
- private:
- static const int kWaveTableSize = 41;
- static WaveTableNames waveTableNames[kWaveTableSize];
-
- int cycle, tableSize;
- uint16* daTable;
- //MemoryBlock M;
- String sWave;
- bool loadWave;
- };
-
- #endif // DISTRHO_VEX_WAVE_RENDERER_HEADER_INCLUDED
|