| 
							- /*
 -  ==============================================================================
 - 
 -  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
 - 
 -  ==============================================================================
 - */
 - 
 - #include "VexVoice.h"
 - 
 - float convertPitch(float pitch)
 - {
 -     long convert;
 -     float *p = (float*)&convert;
 -     float fl, fr, warp, out;
 - 
 -     fl = std::floor(pitch);
 -     fr = pitch - fl;
 -     warp = fr*0.696f + fr*fr*0.225f + fr*fr*fr*0.079f; // chebychev approx
 - 
 -     out = fl+warp;
 -     out *= 8388608.0; //2^23;
 -     out += 127.0 * 8388608.0; //2^23;
 - 
 -     convert = (long)out; //magic
 - 
 -     return *p;
 - }
 - 
 - float bipolar(const float in)
 - {
 -     return in * 2.0f - 1.0f;
 - }
 - 
 - VexVoice::VexVoice(const float* const p, int po, WaveRenderer& w, float sr)
 -     : wr(w),
 -       parameters(p),
 -       poff(po)
 - {
 -     Ordinal = 1;
 -     SampleRate = sr;
 -     isOn = false;
 -     note = 0;
 - 
 -     lfoC = 2.f * (float)std::sin(float_Pi * 5.0f / SampleRate);
 - 
 -     lfoS[0] = 0.3f;
 -     lfoS[1] = 0.0f;
 - 
 -     lowL = 0.0f;
 -     bandL = 0.0f;
 -     highL = 0.0f;
 -     lowR = 0.0f;
 -     bandR = 0.0f;
 -     highR = 0.0f;
 -     q = 0.0f;
 -     cut = 0.0f;
 - }
 - 
 - void VexVoice::updateParameterPtr(const float* const p)
 - {
 -     parameters = p;
 - }
 - 
 - void VexVoice::doProcess(float* outBufferL, float* outBufferR, int bufferSize)
 - {
 -     if (outBufferL == nullptr || outBufferR == nullptr || bufferSize == 0)
 -         return;
 - 
 -     //float resAmt = 0.0;
 -     float A, B;
 -     float amod;
 - 
 -     wr.fillBuffer(outBufferL, bufferSize, oL);
 -     wr.fillBuffer(outBufferR, bufferSize, oR);
 - 
 -     for (int i = 0; i < bufferSize; i++)
 -     {
 -         //LFO
 -         lfoS[0] = lfoS[0] - lfoC * lfoS[1];
 -         lfoS[1] = lfoS[1] + lfoC * lfoS[0];
 -         LFOA = lfoS[0] * parameters[20 + poff];
 -         LFOF = lfoS[0] * parameters[21 + poff];
 - 
 -         //Filter Mod
 -         q = 1.1f - parameters[6 + poff];
 -         cut =  jlimit(0.001f, 0.999f, parameters[5 + poff]
 -                                     + (fadsr.getSample() * bipolar(parameters[8 + poff]))
 -                                     + Fvelocity
 -                                     + LFOF);
 - 
 -         amod = LFOA + Avelocity;
 - 
 -         //Filter
 -         //Left
 -         lowL = lowL + cut * bandL;
 -         highL =  outBufferL[i] - lowL - (q * bandL);
 -         bandL = cut * highL + bandL;
 -         B = (lowL  * ((q * 0.5f) + 0.5f));
 -         A = (highL * ((q * 0.5f) + 0.5f));
 -         outBufferL[i] = A + parameters[7 + poff] * ( B - A );
 -         outBufferL[i] += outBufferL[i] * amod;
 - 
 -         //Right
 -         lowR = lowR + cut * bandR;
 -         highR =  outBufferR[i] - lowR - (q * bandR);
 -         bandR = cut * highR + bandR;
 -         B = (lowR  * ((q * 0.5f) + 0.5f));
 -         A = (highR * ((q * 0.5f) + 0.5f));
 -         outBufferR[i] = A + parameters[7 + poff] * ( B - A );
 -         outBufferR[i] += outBufferR[i] * amod;
 -     }
 - 
 -     aadsr.doProcess(outBufferL, outBufferR, bufferSize);
 -     isOn = aadsr.getState();
 - }
 - 
 - void VexVoice::start(float f, float v, int n, int preroll, double s, long o)
 - {
 -     Ordinal = o;
 -     SampleRate = s;
 -     float oct = (parameters[1 + poff] - 0.5f) * 4.0f;
 -     float cent = (parameters[2 + poff] - 0.5f) * 0.1f;
 -     BaseFrequency = f * convertPitch(cent + oct);
 - 
 -     wr.reset(BaseFrequency, SampleRate, oL);
 -     wr.reset(BaseFrequency, SampleRate, oR);
 -     note = n;
 - 
 -     lfoS[0] = 0.5f;
 -     lfoS[1] = 0.0f;
 - 
 -     isOn = true;
 -     isReleased = false;
 -     v  = (v * v) - 1.0f;
 - 
 -     Avelocity = (v * bipolar(parameters[18 + poff]));
 -     Fvelocity = (1.0f + v) * bipolar(parameters[13 + poff]);
 - 
 -     aadsr.reset(preroll);
 -     fadsr.reset(preroll);
 - }
 - 
 - void VexVoice::release(const int p)
 - {
 -     isReleased = true;
 -     aadsr.release(p);
 -     fadsr.release(p);
 - }
 - 
 - void VexVoice::quickRelease()
 - {
 -     isReleased = true;
 -     aadsr.quickRelease();
 - }
 - 
 - void VexVoice::kill()
 - {
 -     isOn = false;
 - }
 - 
 - /*
 -  * params:
 - 
 -   1 = oct
 -   2 = cent
 -   3 = phaseOffset
 -   4 = phaseIncOffset
 -   5,6,7,8    = filter
 -   9,10,11,12 = F ADSR
 -  13          = F velocity
 -  14,15,16,17 = A ADSR
 -  18          = A velocity
 -  19 = lfoC
 -  20 = lfoA
 -  21 = lfoF
 - 
 -  22,23,24 = fx volumes
 - 
 -  *3
 - 
 -  83,84,85 = panning synths
 -  86,87,88 = volume synths
 -  89,90,91 = on/off synths
 - 
 -  */
 - void VexVoice::update(const int index)
 - {
 -     float p;
 - 
 -     switch (index-poff)
 -     {
 -     case 14:
 -     case 15:
 -     case 16:
 -     case 17:
 -         aadsr.setADSR(parameters[14+poff], parameters[15+poff], parameters[16+poff], parameters[17+poff], SampleRate);
 -         break;
 - 
 -     case  9:
 -     case 10:
 -     case 11:
 -     case 12:
 -         fadsr.setADSR(parameters[9+poff], parameters[10+poff], parameters[11+poff], parameters[12+poff], SampleRate);
 -         break;
 - 
 -     case 19:
 -         lfoC = 2.f * (float)sin(float_Pi*(parameters[19 + poff] * 10.0f) / SampleRate);
 -         break;
 - 
 -     case 3:
 -         p = bipolar(parameters[3 + poff]);
 -         oL.phaseOffset = p > 0.0f ? p : 0.0f;
 -         oR.phaseOffset  = p < 0.0f ? fabs(p) : 0.0f;
 -         break;
 - 
 -     case 4:
 -         p = bipolar(parameters[4 + poff]);
 -         oL.phaseIncOffset = p > 0.0f ? p : 0.0f;
 -         oR.phaseIncOffset  = p < 0.0f ? fabs(p) : 0.0f;
 -         break;
 -     }
 - }
 - 
 - long VexVoice::getOrdinal() const
 - {
 -     return Ordinal;
 - }
 - 
 - int VexVoice::getNote() const
 - {
 -     return note;
 - }
 - 
 - bool VexVoice::getIsOn() const
 - {
 -     return isOn;
 - }
 - 
 - bool VexVoice::getIsReleased() const
 - {
 -     return isReleased;
 - }
 
 
  |