commit 56df0ac2d5b2ad9d570fde72f33535f23b2fe689 Author: reales Date: Mon Jan 23 11:15:08 2017 +0100 First commit diff --git a/OB-Xd.jucer b/OB-Xd.jucer new file mode 100644 index 0000000..d8937ea --- /dev/null +++ b/OB-Xd.jucer @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Engine/APInterpolator.h b/Source/Engine/APInterpolator.h new file mode 100755 index 0000000..966ba6d --- /dev/null +++ b/Source/Engine/APInterpolator.h @@ -0,0 +1,45 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "SynthEngine.h" +class ApInterpolator +{ + private: + const float Nu; + float zd; + float li; +public : + ApInterpolator() : Nu(( 1 - 0.5) /(1 + 0.5)) + { + zd = 0; + li=0; + }; + inline float getInterp(float in) + { + float out = Nu * ( in - zd) + li; + zd = out; + li = in; + return out; + } +}; \ No newline at end of file diff --git a/Source/Engine/AdsrEnvelope.h b/Source/Engine/AdsrEnvelope.h new file mode 100755 index 0000000..a536b09 --- /dev/null +++ b/Source/Engine/AdsrEnvelope.h @@ -0,0 +1,150 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "ObxdVoice.h" +class AdsrEnvelope +{ +private: + float Value; + float attack, decay, sustain, release; + float ua,ud,us,ur; + float coef; + int state;//1 - attack 2- decay 3 - sustain 4 - release 5-silence + float SampleRate; + float uf; +public: + AdsrEnvelope() + { + uf = 1; + Value = 0.0; + attack=decay=sustain=release=0.0001; + ua=ud=us=ur=0.0001; + coef = 0; + state = 5; + SampleRate = 44000; + } + void ResetEnvelopeState() + { + Value = 0.0; + state = 5; + } + void setSampleRate(float sr) + { + SampleRate = sr; + } + void setUniqueDeriviance(float der) + { + uf = der; + setAttack(ua); + setDecay(ud); + setSustain(us); + setRelease(ur); + } + void setAttack(float atk) + { + ua = atk; + attack = atk*uf; + if(state == 1) + coef = (float)((log(0.001) - log(1.3)) / (SampleRate * (atk) / 1000)); + } + void setDecay(float dec) + { + ud = dec; + decay = dec*uf; + if(state == 2) + coef = (float)((log(jmin(sustain + 0.0001,0.99)) - log(1.0)) / (SampleRate * (dec) / 1000)); + } + void setSustain(float sust) + { + us = sust; + sustain = sust; + if(state == 2) + coef = (float)((log(jmin(sustain + 0.0001,0.99)) - log(1.0)) / (SampleRate * (decay) / 1000)); + } + void setRelease(float rel) + { + ur = rel; + release = rel*uf; + if(state == 4) + coef = (float)((log(0.00001) - log(Value + 0.0001)) / (SampleRate * (rel) / 1000)); + } + void triggerAttack() + { + state = 1; + //Value = Value +0.00001f; + coef = (float)((log(0.001) - log(1.3)) / (SampleRate * (attack)/1000 )); + } + void triggerRelease() + { + if(state!=4) + coef = (float)((log(0.00001) - log(Value+0.0001)) / (SampleRate * (release) / 1000)); + state = 4; + } + inline bool isActive() + { + return state!=5; + } + inline float processSample() + { + switch (state) + { + case 1: + if (Value - 1 > -0.1) + { + Value = jmin(Value, 0.99f); + state = 2; + coef = (float)((log(jmin(sustain + 0.0001, 0.99)) - log(1.0)) / (SampleRate * (decay) / 1000)); + goto dec; + } + else + { + Value = Value - (1-Value)*(coef); + } + break; + case 2: + dec: + if (Value - sustain < 10e-6) + { + state = 3; + } + else + { + Value =Value + Value * coef; + } + break; + case 3: Value = jmin(sustain, 0.9f); + break; + case 4: + if (Value > 20e-6) + Value = Value + Value * coef + dc; + else state = 5; + break; + case 5: + Value = 0.0f; + break; + } + return Value; + } + +}; diff --git a/Source/Engine/AudioUtils.h b/Source/Engine/AudioUtils.h new file mode 100755 index 0000000..f0c9811 --- /dev/null +++ b/Source/Engine/AudioUtils.h @@ -0,0 +1,90 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once + +#include "SynthEngine.h" + +const float sq2_12 = 1.0594630943592953f; + +const float dc = 1e-18; +const float ln2 = 0.69314718056f; +const float mult = ln2 / 12.0; +inline static float getPitch(float index) +{ + //Lookup table is not that effective compared to SSE exp + //SSE should be on + + //const int mulres = 2; + //const int lowerBound = -94; + //const int upperBound = 94; + //const int lutlen = (upperBound-lowerBound)*2; + return 440 * expf(mult * index); + //static const float lut [lutlen]={1.929,1.986,2.044,2.104,2.165,2.229,2.294,2.361,2.431,2.502,2.575,2.651,2.728,2.808,2.891,2.975,3.062,3.152,3.245,3.340,3.437,3.538,3.642,3.749,3.858,3.972,4.088,4.208,4.331,4.458,4.589,4.723,4.861,5.004,5.150,5.301,5.457,5.617,5.781,5.951,6.125,6.304,6.489,6.679,6.875,7.076,7.284,7.497,7.717,7.943,8.176,8.415,8.662,8.916,9.177,9.446,9.723,10.008,10.301,10.603,10.913,11.233,11.562,11.901,12.250,12.609,12.978,13.359,13.750,14.153,14.568,14.994,15.434,15.886,16.352,16.831,17.324,17.832,18.354,18.892,19.445,20.015,20.602,21.205,21.827,22.466,23.125,23.802,24.500,25.218,25.957,26.717,27.500,28.306,29.135,29.989,30.868,31.772,32.703,33.661,34.648,35.663,36.708,37.784,38.891,40.030,41.203,42.411,43.654,44.933,46.249,47.605,48.999,50.435,51.913,53.434,55.000,56.612,58.270,59.978,61.735,63.544,65.406,67.323,69.296,71.326,73.416,75.567,77.782,80.061,82.407,84.822,87.307,89.865,92.499,95.209,97.999,100.870,103.826,106.869,110.000,113.223,116.541,119.956,123.471,127.089,130.813,134.646,138.591,142.652,146.832,151.135,155.563,160.122,164.814,169.643,174.614,179.731,184.997,190.418,195.998,201.741,207.652,213.737,220.000,226.446,233.082,239.912,246.942,254.178,261.626,269.292,277.183,285.305,293.665,302.270,311.127,320.244,329.628,339.286,349.228,359.461,369.994,380.836,391.995,403.482,415.305,427.474,440.000,452.893,466.164,479.823,493.883,508.355,523.251,538.584,554.365,570.609,587.330,604.540,622.254,640.487,659.255,678.573,698.456,718.923,739.989,761.672,783.991,806.964,830.609,854.948,880.000,905.786,932.328,959.647,987.767,1016.710,1046.502,1077.167,1108.731,1141.219,1174.659,1209.079,1244.508,1280.975,1318.510,1357.146,1396.913,1437.846,1479.978,1523.344,1567.982,1613.927,1661.219,1709.896,1760.000,1811.572,1864.655,1919.294,1975.533,2033.421,2093.005,2154.334,2217.461,2282.438,2349.318,2418.158,2489.016,2561.950,2637.020,2714.291,2793.826,2875.691,2959.955,3046.689,3135.964,3227.854,3322.438,3419.792,3520.000,3623.144,3729.310,3838.587,3951.066,4066.842,4186.009,4308.668,4434.922,4564.875,4698.636,4836.317,4978.032,5123.899,5274.041,5428.582,5587.652,5751.382,5919.911,6093.377,6271.927,6455.709,6644.875,6839.585,7040.000,7246.288,7458.620,7677.174,7902.133,8133.683,8372.018,8617.337,8869.844,9129.751,9397.273,9672.634,9956.064,10247.798,10548.082,10857.164,11175.304,11502.765,11839.822,12186.755,12543.854,12911.417,13289.750,13679.170,14080.000,14492.576,14917.241,15354.349,15804.266,16267.366,16744.036,17234.674,17739.689,18259.501,18794.545,19345.268,19912.127,20495.597,21096.164,21714.329,22350.607,23005.530,23679.643,24373.510,25087.708,25822.834,26579.501,27358.340,28160.000,28985.151,29834.481,30708.698,31608.532,32534.732,33488.073,34469.348,35479.377,36519.002,37589.091,38690.535,39824.254,40991.194,42192.328,43428.657,44701.214,46011.060,47359.287,48747.020,50175.416,51645.668,53159.002,54716.680,56320.001,57970.303,59668.962,61417.396,63217.063,65069.465,66976.146,68938.697,70958.755,73038.005,75178.182,77381.071,79648.509,81982.388,84384.656,86857.315,89402.429,92022.120,94718.574,97494.040}; + //if(index > 92.0) + // return lut[lutlen-1]; + //if(index < -94.0) + // return lut[0]; + //index = (index - lowerBound)*mulres; + //int mi = floor(index); + //float ofs = index-mi; + // + // return lut[mi] + (lut[mi+1] - lut[mi]) * ofs; +}; + +inline static float tptlpupw(float & state , float inp , float cutoff , float srInv) +{ + cutoff = (cutoff * srInv)*juce::float_Pi; + double v = (inp - state) * cutoff / (1 + cutoff); + double res = v + state; + state = res + v; + return res; +} + +inline static float tptlp(float& state,float inp,float cutoff,float srInv) +{ + cutoff = tan(cutoff * (srInv)* (juce::float_Pi)) ; + double v = (inp - state) * cutoff / (1 + cutoff); + double res = v + state; + state = res + v; + return res; +}; + +inline static float tptpc(float& state,float inp,float cutoff) +{ + double v = (inp - state) * cutoff / (1 + cutoff); + double res = v + state; + state = res + v; + return res; +} + +inline static float linsc(float param,const float min,const float max) +{ + return (param) * (max - min) + min; +} + +inline static float logsc(float param, const float min,const float max,const float rolloff = 19.0f) +{ + return ((expf(param * logf(rolloff+1)) - 1.0f) / (rolloff)) * (max-min) + min; +} + diff --git a/Source/Engine/BlepData.h b/Source/Engine/BlepData.h new file mode 100755 index 0000000..39f5e65 --- /dev/null +++ b/Source/Engine/BlepData.h @@ -0,0 +1,35 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +//Bleps and blamps +//const float blep[] = {-0.00000000000000000647905f,-0.00000000001273982f,-0.0000000001160013f,-0.0000000004646626f,-0.000000001288395f,-0.000000002894978f,-0.00000000566087f,-0.00000001003746f,-0.00000001653689f,-0.00000002573661f,-0.00000003827332f,-0.00000005483587f,-0.00000007616185f,-0.000000103025f,-0.0000001362388f,-0.0000001766452f,-0.0000002251071f,-0.0000002824967f,-0.0000003497017f,-0.0000004275869f,-0.0000005170289f,-0.0000006188667f,-0.0000007339223f,-0.0000008629681f,-0.00000100674f,-0.000001165909f,-0.000001341089f,-0.000001532813f,-0.000001741532f,-0.000001967613f,-0.000002211317f,-0.000002472799f,-0.000002752102f,-0.000003049145f,-0.000003363705f,-0.000003695441f,-0.000004043864f,-0.000004408338f,-0.000004788075f,-0.000005182125f,-0.000005589381f,-0.000006008591f,-0.000006438312f,-0.000006876962f,-0.000007322767f,-0.000007773819f,-0.000008228023f,-0.000008683131f,-0.000009136737f,-0.000009586283f,-0.00001002906f,-0.00001046221f,-0.00001088277f,-0.0000112876f,-0.00001167348f,-0.00001203706f,-0.00001237489f,-0.00001268345f,-0.00001295913f,-0.00001319825f,-0.00001339708f,-0.00001355188f,-0.00001365886f,-0.00001371423f,-0.00001371423f,-0.00001365511f,-0.00001353318f,-0.00001334478f,-0.00001308638f,-0.00001275451f,-0.00001234585f,-0.00001185719f,-0.00001128549f,-0.00001062789f,-0.000009881717f,-0.000009044513f,-0.000008114053f,-0.000007088366f,-0.000005965746f,-0.000004744777f,-0.000003424346f,-0.000002003661f,-0.0000004822616f,0.000001139949f,0.000002862707f,0.000004685374f,0.000006606911f,0.000008625878f,0.00001074042f,0.00001294826f,0.00001524669f,0.00001763257f,0.0000201023f,0.00002265185f,0.00002527673f,0.00002797199f,0.00003073227f,0.00003355173f,0.00003642408f,0.00003934265f,0.00004230027f,0.0000452894f,0.00004830205f,0.00005132989f,0.00005436417f,0.00005739578f,0.00006041526f,0.00006341286f,0.00006637849f,0.00006930178f,0.00007217213f,0.00007497869f,0.00007771041f,0.0000803561f,0.00008290438f,0.00008534381f,0.00008766285f,0.00008984995f,0.00009189351f,0.00009378204f,0.00009550405f,0.00009704823f,0.00009840337f,0.0000995585f,0.0001005029f,0.000101226f,0.0001017177f,0.0001019683f,0.0001019683f,0.0001017089f,0.0001011814f,0.0001003782f,0.00009929171f,0.00009791533f,0.00009624296f,0.0000942692f,0.00009198939f,0.00008939965f,0.00008649687f,0.00008327877f,0.00007974397f,0.00007589195f,0.00007172312f,0.00006723884f,0.00006244142f,0.00005733419f,0.00005192146f,0.00004620857f,0.00004020192f,0.00003390891f,0.00002733804f,0.00002049886f,0.00001340195f,0.000006058992f,-0.000001517315f,-0.000009313229f,-0.00001731395f,-0.00002550369f,-0.00003386565f,-0.00004238205f,-0.00005103418f,-0.00005980239f,-0.00006866614f,-0.00007760408f,-0.00008659399f,-0.00009561296f,-0.0001046373f,-0.0001136426f,-0.0001226039f,-0.0001314958f,-0.0001402922f,-0.0001489666f,-0.0001574922f,-0.0001658417f,-0.000173988f,-0.0001819032f,-0.00018956f,-0.0001969304f,-0.0002039871f,-0.0002107025f,-0.0002170494f,-0.0002230009f,-0.0002285305f,-0.0002336121f,-0.0002382203f,-0.0002423302f,-0.0002459178f,-0.0002489599f,-0.000251434f,-0.0002533187f,-0.000254594f,-0.0002552405f,-0.0002552406f,-0.0002545775f,-0.0002532362f,-0.000251203f,-0.0002484658f,-0.0002450141f,-0.0002408391f,-0.0002359337f,-0.0002302928f,-0.0002239128f,-0.0002167925f,-0.0002089323f,-0.0002003348f,-0.0001910045f,-0.0001809482f,-0.0001701747f,-0.000158695f,-0.0001465221f,-0.0001336714f,-0.0001201603f,-0.0001060085f,-0.0000912379f,-0.00007587241f,-0.00005993822f,-0.00004346364f,-0.00002647906f,-0.000009016921f,0.000008888309f,0.00002720019f,0.00004588038f,0.00006488869f,0.00008418313f,0.00010372f,0.0001234541f,0.0001433384f,0.0001633248f,0.0001833635f,0.0002034039f,0.0002233938f,0.0002432803f,0.0002630094f,0.0002825267f,0.0003017767f,0.0003207039f,0.000339252f,0.0003573648f,0.0003749859f,0.000392059f,0.0004085281f,0.0004243375f,0.0004394322f,0.0004537578f,0.0004672609f,0.0004798889f,0.0004915908f,0.0005023165f,0.0005120176f,0.0005206478f,0.0005281619f,0.0005345173f,0.0005396733f,0.0005435915f,0.0005462359f,0.0005475735f,0.0005475735f,0.0005462083f,0.0005434533f,0.0005392868f,0.0005336907f,0.0005266501f,0.0005181535f,0.0005081931f,0.0004967647f,0.0004838678f,0.0004695059f,0.0004536861f,0.0004364196f,0.0004177217f,0.0003976117f,0.0003761127f,0.000353252f,0.0003290613f,0.0003035759f,0.0002768353f,0.0002488833f,0.0002197673f,0.0001895388f,0.0001582533f,0.00012597f,0.00009275173f,0.00005866511f,0.0000237802f,-0.0000118295f,-0.00004808725f,-0.00008491318f,-0.0001222244f,-0.0001599352f,-0.0001979572f,-0.0002361997f,-0.0002745696f,-0.0003129717f,-0.0003513091f,-0.0003894831f,-0.0004273935f,-0.0004649392f,-0.000502018f,-0.000538527f,-0.0005743632f,-0.0006094227f,-0.0006436026f,-0.0006767996f,-0.0007089116f,-0.000739837f,-0.0007694759f,-0.0007977294f,-0.0008245007f,-0.0008496949f,-0.0008732195f,-0.0008949846f,-0.0009149033f,-0.0009328918f,-0.0009488696f,-0.0009627602f,-0.0009744911f,-0.0009839938f,-0.0009912044f,-0.0009960639f,-0.0009985182f,-0.0009985184f,-0.0009960209f,-0.0009909876f,-0.0009833866f,-0.0009731922f,-0.0009603841f,-0.000944949f,-0.0009268797f,-0.0009061761f,-0.0008828441f,-0.0008568972f,-0.0008283553f,-0.0007972454f,-0.0007636016f,-0.0007274649f,-0.0006888835f,-0.0006479127f,-0.0006046146f,-0.0005590585f,-0.0005113207f,-0.000461484f,-0.0004096383f,-0.00035588f,-0.0003003121f,-0.0002430436f,-0.0001841902f,-0.000123873f,-0.00006221938f,0.0000006382491f,0.00006456191f,0.0001294087f,0.000195031f,0.0002612768f,0.0003279899f,0.0003950105f,0.0004621752f,0.0005293178f,0.0005962692f,0.000662858f,0.0007289113f,0.0007942542f,0.0008587113f,0.000922106f,0.0009842622f,0.001045004f,0.001104155f,0.001161542f,0.001216992f,0.001270335f,0.001321403f,0.001370031f,0.001416059f,0.001459328f,0.001499688f,0.001536989f,0.001571089f,0.001601853f,0.00162915f,0.001652856f,0.001672856f,0.00168904f,0.001701309f,0.001709568f,0.001713736f,0.001713736f,0.001709503f,0.001700983f,0.001688128f,0.001670905f,0.001649287f,0.00162326f,0.001592822f,0.001557979f,0.001518751f,0.001475169f,0.001427273f,0.001375118f,0.001318768f,0.001258299f,0.0011938f,0.00112537f,0.00105312f,0.0009771726f,0.0008976605f,0.0008147284f,0.0007285316f,0.0006392356f,0.0005470168f,0.000452061f,0.0003545642f,0.0002547312f,0.0001527762f,0.00004892161f,-0.00005660188f,-0.000163556f,-0.0002716954f,-0.000380768f,-0.0004905157f,-0.0006006749f,-0.0007109772f,-0.0008211494f,-0.0009309154f,-0.001039995f,-0.001148107f,-0.001254968f,-0.001360293f,-0.001463796f,-0.001565194f,-0.001664203f,-0.001760541f,-0.00185393f,-0.001944095f,-0.002030763f,-0.002113669f,-0.002192552f,-0.002267156f,-0.002337236f,-0.00240255f,-0.002462867f,-0.002517967f,-0.002567636f,-0.002611674f,-0.00264989f,-0.002682106f,-0.002708156f,-0.002727888f,-0.002741163f,-0.002747855f,-0.002747855f,-0.002741068f,-0.002727415f,-0.002706833f,-0.002679275f,-0.002644712f,-0.00260313f,-0.002554536f,-0.00249895f,-0.002436413f,-0.002366984f,-0.002290738f,-0.00220777f,-0.002118192f,-0.002022136f,-0.001919748f,-0.001811197f,-0.001696666f,-0.001576357f,-0.001450488f,-0.001319296f,-0.001183032f,-0.001041965f,-0.0008963801f,-0.0007465753f,-0.000592865f,-0.0004355772f,-0.0002750531f,-0.0001116469f,0.00005427531f,0.0002223361f,0.0003921479f,0.0005633132f,0.0007354259f,0.0009080721f,0.001080831f,0.001253275f,0.001424974f,0.001595491f,0.001764388f,0.001931224f,0.002095558f,0.00225695f,0.00241496f,0.002569152f,0.002719092f,0.002864352f,0.003004511f,0.003139153f,0.003267872f,0.003390269f,0.003505959f,0.003614566f,0.003715728f,0.003809096f,0.003894335f,0.003971129f,0.004039176f,0.004098192f,0.004147914f,0.004188097f,0.004218515f,0.004238968f,0.004249273f,0.004249273f,0.004238834f,0.004217846f,0.004186225f,0.00414391f,0.004090867f,0.00402709f,0.003952597f,0.003867435f,0.003771675f,0.00366542f,0.003548795f,0.003421957f,0.003285088f,0.003138398f,0.002982124f,0.002816529f,0.002641904f,0.002458566f,0.002266856f,0.002067143f,0.001859817f,0.001645294f,0.001424013f,0.001196436f,0.0009630446f,0.0007243421f,0.0004808514f,0.0002331134f,-0.00001831326f,-0.000272854f,-0.0005299192f,-0.0007889057f,-0.001049198f,-0.001310169f,-0.001571184f,-0.001831598f,-0.00209076f,-0.002348016f,-0.002602705f,-0.002854168f,-0.003101744f,-0.003344772f,-0.003582596f,-0.003814565f,-0.004040034f,-0.004258365f,-0.004468931f,-0.004671118f,-0.004864322f,-0.005047955f,-0.005221447f,-0.005384244f,-0.005535814f,-0.005675644f,-0.005803246f,-0.005918153f,-0.006019928f,-0.006108159f,-0.006182461f,-0.006242482f,-0.0062879f,-0.006318424f,-0.006333798f,-0.006333798f,-0.006318239f,-0.006286968f,-0.006239872f,-0.006176876f,-0.006097942f,-0.006003071f,-0.005892304f,-0.005765723f,-0.005623448f,-0.005465641f,-0.005292502f,-0.005104274f,-0.00490124f,-0.004683721f,-0.00445208f,-0.004206716f,-0.003948072f,-0.003676623f,-0.003392886f,-0.003097412f,-0.00279079f,-0.002473641f,-0.00214662f,-0.001810416f,-0.001465747f,-0.001113361f,-0.0007540347f,-0.0003885695f,-0.00001779301f,0.000357445f,0.0007362733f,0.001117802f,0.001501123f,0.001885314f,0.002269439f,0.002652552f,0.003033698f,0.003411914f,0.003786236f,0.004155695f,0.004519326f,0.004876164f,0.00522525f,0.005565635f,0.005896378f,0.006216552f,0.006525244f,0.006821561f,0.007104627f,0.00737359f,0.007627625f,0.00786593f,0.008087734f,0.008292301f,0.008478923f,0.008646932f,0.008795699f,0.008924631f,0.00903318f,0.009120842f,0.009187156f,0.009231713f,0.009254147f,0.009254147f,0.009231452f,0.009185852f,0.009117195f,0.009025384f,0.008910371f,0.008772171f,0.008610857f,0.008426555f,0.008219452f,0.007989793f,0.007737883f,0.007464082f,0.00716881f,0.006852544f,0.00651582f,0.006159228f,0.005783415f,0.005389084f,0.004976989f,0.004547938f,0.00410279f,0.003642453f,0.003167883f,0.002680082f,0.002180097f,0.001669016f,0.001147967f,0.000618115f,0.00008066116f,-0.0004631616f,-0.00101209f,-0.001564835f,-0.002120081f,-0.002676494f,-0.00323272f,-0.00378739f,-0.004339125f,-0.004886533f,-0.005428222f,-0.005962793f,-0.006488854f,-0.007005013f,-0.00750989f,-0.008002114f,-0.008480331f,-0.008943205f,-0.009389425f,-0.009817701f,-0.01022678f,-0.01061543f,-0.01098246f,-0.01132673f,-0.01164713f,-0.01194259f,-0.01221212f,-0.01245473f,-0.01266954f,-0.01285569f,-0.0130124f,-0.01313895f,-0.01323467f,-0.01329898f,-0.01333135f,-0.01333135f,-0.0132986f,-0.01323281f,-0.01313375f,-0.01300128f,-0.01283535f,-0.01263598f,-0.01240328f,-0.01213742f,-0.01183868f,-0.01150742f,-0.01114408f,-0.01074916f,-0.0103233f,-0.009867154f,-0.009381512f,-0.008867221f,-0.008325211f,-0.007756494f,-0.007162155f,-0.006543357f,-0.005901337f,-0.005237399f,-0.004552921f,-0.003849343f,-0.003128172f,-0.002390971f,-0.001639365f,-0.0008750302f,-0.00009969395f,0.000684869f,0.001476841f,0.002274366f,0.00307555f,0.003878473f,0.004681183f,0.00548171f,0.006278063f,0.007068242f,0.007850235f,0.008622028f,0.00938161f,0.01012697f,0.01085613f,0.01156709f,0.0122579f,0.01292663f,0.01357138f,0.01419029f,0.01478154f,0.01534335f,0.01587399f,0.0163718f,0.01683516f,0.01726254f,0.01765246f,0.01800352f,0.01831439f,0.01858385f,0.01881073f,0.01899397f,0.01913261f,0.01922577f,0.01927269f,0.01927269f,0.01922522f,0.01912981f,0.01898614f,0.01879397f,0.0185532f,0.01826382f,0.01792597f,0.01753988f,0.01710593f,0.01662459f,0.01609648f,0.01552231f,0.01490294f,0.01423935f,0.01353261f,0.01278393f,0.01199463f,0.01116617f,0.01030008f,0.009398025f,0.008461781f,0.007493218f,0.006494315f,0.005467145f,0.004413877f,0.003336768f,0.002238165f,0.001120494f,-0.00001374411f,-0.001161974f,-0.002321556f,-0.003489789f,-0.004663918f,-0.005841139f,-0.007018605f,-0.00819343f,-0.009362706f,-0.01052349f,-0.01167283f,-0.01280777f,-0.01392534f,-0.01502257f,-0.01609652f,-0.01714425f,-0.01816287f,-0.01914949f,-0.02010128f,-0.02101547f,-0.02188932f,-0.02272017f,-0.02350541f,-0.02424254f,-0.0249291f,-0.02556275f,-0.02614125f,-0.02666244f,-0.0271243f,-0.0275249f,-0.02786244f,-0.02813526f,-0.02834182f,-0.02848073f,-0.02855073f,-0.02855073f,-0.02847978f,-0.02833709f,-0.02812204f,-0.02783416f,-0.02747317f,-0.02703895f,-0.02653155f,-0.0259512f,-0.02529833f,-0.02457352f,-0.02377755f,-0.02291137f,-0.02197612f,-0.02097313f,-0.0199039f,-0.0187701f,-0.01757361f,-0.01631646f,-0.01500086f,-0.0136292f,-0.01220404f,-0.01072809f,-0.009204245f,-0.007635531f,-0.006025144f,-0.004376419f,-0.002692834f,-0.0009780014f,0.0007643371f,0.002530319f,0.004315969f,0.006117202f,0.007929836f,0.009749599f,0.01157214f,0.01339302f,0.01520776f,0.0170118f,0.01880056f,0.02056942f,0.02231371f,0.02402878f,0.02570995f,0.02735257f,0.02895199f,0.03050358f,0.03200279f,0.03344508f,0.03482598f,0.0361411f,0.03738614f,0.03855688f,0.03964922f,0.04065916f,0.04158286f,0.04241657f,0.04315674f,0.04379994f,0.04434294f,0.04478267f,0.04511627f,0.04534106f,0.04545458f,0.04545458f,0.04533904f,0.04510619f,0.04475449f,0.04428265f,0.04368963f,0.04297467f,0.04213728f,0.04117723f,0.0400946f,0.03888973f,0.03756326f,0.03611614f,0.03454959f,0.03286515f,0.03106467f,0.02915028f,0.02712444f,0.0249899f,0.02274973f,0.02040729f,0.01796626f,0.0154306f,0.01280459f,0.0100928f,0.007300086f,0.004431599f,0.00149277f,-0.001510693f,-0.004572812f,-0.007687343f,-0.01084779f,-0.0140474f,-0.01727918f,-0.02053593f,-0.02381019f,-0.02709431f,-0.03038045f,-0.03366055f,-0.03692642f,-0.04016965f,-0.0433817f,-0.04655391f,-0.04967746f,-0.05274343f,-0.05574282f,-0.05866651f,-0.06150533f,-0.06425006f,-0.06689143f,-0.06942014f,-0.0718269f,-0.0741024f,-0.0762374f,-0.07822263f,-0.08004894f,-0.08170721f,-0.08318842f,-0.08448366f,-0.08558414f,-0.08648119f,-0.08716629f,-0.08763114f,-0.08786753f,-0.08786753f,-0.08762339f,-0.08712758f,-0.08637285f,-0.08535216f,-0.08405878f,-0.08248625f,-0.0806284f,-0.07847939f,-0.0760337f,-0.07328612f,-0.07023184f,-0.06686636f,-0.06318557f,-0.05918573f,-0.0548635f,-0.05021592f,-0.04524045f,-0.03993496f,-0.03429772f,-0.02832745f,-0.02202329f,-0.0153848f,-0.008411995f,-0.001105332f,0.006534298f,0.01450555f,0.02280664f,0.03143534f,0.04038895f,0.04966436f,0.05925801f,0.06916586f,0.07938349f,0.08990602f,0.1007281f,0.1118441f,0.1232478f,0.1349327f,0.1468919f,0.1591179f,0.1716031f,0.1843393f,0.1973182f,0.210531f,0.2239684f,0.237621f,0.2514791f,0.2655325f,0.2797709f,0.2941837f,0.30876f,0.3234887f,0.3383583f,0.3533574f,0.3684742f,0.3836968f,0.3990131f,0.4144109f,0.4298779f,0.4454016f,0.4609695f,0.476569f,0.4921875f,0.5078124f,0.5234309f,0.5390304f,0.5545984f,0.5701221f,0.5855891f,0.6009868f,0.6163032f,0.6315258f,0.6466426f,0.6616417f,0.6765113f,0.69124f,0.7058163f,0.7202291f,0.7344675f,0.748521f,0.762379f,0.7760316f,0.7894691f,0.8026817f,0.8156607f,0.8283969f,0.8408821f,0.8531081f,0.8650672f,0.8767521f,0.8881558f,0.8992718f,0.910094f,0.9206165f,0.9308341f,0.940742f,0.9503356f,0.959611f,0.9685646f,0.9771933f,0.9854944f,0.9934657f,1.001105f,1.008412f,1.015385f,1.022023f,1.028327f,1.034298f,1.039935f,1.04524f,1.050216f,1.054863f,1.059186f,1.063185f,1.066866f,1.070232f,1.073286f,1.076034f,1.078479f,1.080628f,1.082486f,1.084059f,1.085352f,1.086373f,1.087128f,1.087623f,1.087867f,1.087867f,1.087631f,1.087166f,1.086481f,1.085584f,1.084484f,1.083188f,1.081707f,1.080049f,1.078223f,1.076237f,1.074102f,1.071827f,1.06942f,1.066891f,1.06425f,1.061505f,1.058666f,1.055743f,1.052743f,1.049677f,1.046554f,1.043382f,1.04017f,1.036926f,1.033661f,1.03038f,1.027094f,1.02381f,1.020536f,1.017279f,1.014047f,1.010848f,1.007687f,1.004573f,1.001511f,0.9985072f,0.9955684f,0.9926999f,0.9899071f,0.9871954f,0.9845694f,0.9820337f,0.9795927f,0.9772502f,0.9750101f,0.9728755f,0.9708497f,0.9689353f,0.9671348f,0.9654503f,0.9638838f,0.9624367f,0.9611102f,0.9599054f,0.9588227f,0.9578627f,0.9570253f,0.9563103f,0.9557173f,0.9552455f,0.9548938f,0.954661f,0.9545454f,0.9545454f,0.9546589f,0.9548837f,0.9552173f,0.955657f,0.9562f,0.9568432f,0.9575834f,0.9584171f,0.9593408f,0.9603508f,0.9614431f,0.9626138f,0.9638588f,0.965174f,0.9665549f,0.9679972f,0.9694964f,0.9710479f,0.9726474f,0.97429f,0.9759712f,0.9776862f,0.9794306f,0.9811994f,0.9829881f,0.9847922f,0.986607f,0.9884279f,0.9902503f,0.9920701f,0.9938828f,0.995684f,0.9974696f,0.9992356f,1.000978f,1.002693f,1.004376f,1.006025f,1.007635f,1.009204f,1.010728f,1.012204f,1.013629f,1.015001f,1.016316f,1.017574f,1.01877f,1.019904f,1.020973f,1.021976f,1.022911f,1.023777f,1.024573f,1.025298f,1.025951f,1.026531f,1.027039f,1.027473f,1.027834f,1.028122f,1.028337f,1.02848f,1.028551f,1.028551f,1.028481f,1.028342f,1.028135f,1.027862f,1.027525f,1.027124f,1.026662f,1.026141f,1.025563f,1.024929f,1.024243f,1.023505f,1.02272f,1.021889f,1.021015f,1.020101f,1.01915f,1.018163f,1.017144f,1.016096f,1.015023f,1.013925f,1.012808f,1.011673f,1.010523f,1.009363f,1.008193f,1.007019f,1.005841f,1.004664f,1.00349f,1.002321f,1.001162f,1.000014f,0.9988794f,0.9977618f,0.9966632f,0.9955861f,0.9945328f,0.9935057f,0.9925067f,0.9915382f,0.9906019f,0.9896999f,0.9888338f,0.9880053f,0.9872161f,0.9864674f,0.9857606f,0.985097f,0.9844776f,0.9839035f,0.9833754f,0.982894f,0.9824601f,0.982074f,0.9817362f,0.9814468f,0.981206f,0.9810138f,0.9808702f,0.9807748f,0.9807273f,0.9807273f,0.9807742f,0.9808674f,0.981006f,0.9811893f,0.9814162f,0.9816856f,0.9819965f,0.9823475f,0.9827375f,0.9831648f,0.9836282f,0.984126f,0.9846566f,0.9852184f,0.9858097f,0.9864286f,0.9870734f,0.9877421f,0.9884329f,0.9891438f,0.9898729f,0.9906183f,0.9913779f,0.9921497f,0.9929317f,0.9937219f,0.9945183f,0.9953188f,0.9961215f,0.9969244f,0.9977256f,0.9985231f,0.9993151f,1.0001f,1.000875f,1.001639f,1.002391f,1.003128f,1.003849f,1.004553f,1.005237f,1.005901f,1.006543f,1.007162f,1.007756f,1.008325f,1.008867f,1.009381f,1.009867f,1.010323f,1.010749f,1.011144f,1.011507f,1.011839f,1.012137f,1.012403f,1.012636f,1.012835f,1.013001f,1.013134f,1.013233f,1.013299f,1.013331f,1.013331f,1.013299f,1.013235f,1.013139f,1.013012f,1.012856f,1.012669f,1.012455f,1.012212f,1.011943f,1.011647f,1.011327f,1.010982f,1.010615f,1.010227f,1.009818f,1.009389f,1.008943f,1.00848f,1.008002f,1.00751f,1.007005f,1.006489f,1.005963f,1.005428f,1.004887f,1.004339f,1.003787f,1.003233f,1.002676f,1.00212f,1.001565f,1.001012f,1.000463f,0.9999193f,0.9993818f,0.998852f,0.998331f,0.9978198f,0.9973199f,0.9968321f,0.9963576f,0.9958972f,0.995452f,0.995023f,0.9946109f,0.9942166f,0.9938408f,0.9934841f,0.9931474f,0.9928312f,0.9925359f,0.9922621f,0.9920102f,0.9917805f,0.9915734f,0.9913891f,0.9912278f,0.9910896f,0.9909745f,0.9908828f,0.9908141f,0.9907685f,0.9907458f,0.9907458f,0.9907683f,0.9908128f,0.9908791f,0.9909668f,0.9910753f,0.9912043f,0.991353f,0.991521f,0.9917077f,0.9919122f,0.992134f,0.9923723f,0.9926264f,0.9928954f,0.9931784f,0.9934747f,0.9937834f,0.9941036f,0.9944344f,0.9947748f,0.9951238f,0.9954807f,0.9958443f,0.9962137f,0.9965881f,0.9969662f,0.9973474f,0.9977305f,0.9981146f,0.9984989f,0.9988822f,0.9992637f,0.9996425f,1.000018f,1.000389f,1.000754f,1.001113f,1.001466f,1.00181f,1.002147f,1.002474f,1.002791f,1.003097f,1.003393f,1.003677f,1.003948f,1.004207f,1.004452f,1.004684f,1.004901f,1.005104f,1.005293f,1.005466f,1.005623f,1.005766f,1.005892f,1.006003f,1.006098f,1.006177f,1.00624f,1.006287f,1.006318f,1.006334f,1.006334f,1.006318f,1.006288f,1.006243f,1.006182f,1.006108f,1.00602f,1.005918f,1.005803f,1.005676f,1.005536f,1.005384f,1.005221f,1.005048f,1.004864f,1.004671f,1.004469f,1.004258f,1.00404f,1.003815f,1.003583f,1.003345f,1.003102f,1.002854f,1.002603f,1.002348f,1.002091f,1.001832f,1.001571f,1.00131f,1.001049f,1.000789f,1.00053f,1.000273f,1.000018f,0.9997668f,0.9995191f,0.9992756f,0.9990369f,0.9988035f,0.9985759f,0.9983547f,0.9981402f,0.9979328f,0.9977331f,0.9975414f,0.997358f,0.9971834f,0.9970178f,0.9968615f,0.9967148f,0.996578f,0.9964512f,0.9963346f,0.9962283f,0.9961326f,0.9960474f,0.9959729f,0.9959091f,0.9958561f,0.9958138f,0.9957821f,0.9957612f,0.9957507f,0.9957507f,0.995761f,0.9957815f,0.9958119f,0.9958521f,0.9959018f,0.9959608f,0.9960288f,0.9961057f,0.9961909f,0.9962842f,0.9963855f,0.9964941f,0.9966097f,0.9967321f,0.9968608f,0.9969954f,0.9971356f,0.9972808f,0.9974308f,0.997585f,0.997743f,0.9979044f,0.9980687f,0.9982356f,0.9984044f,0.998575f,0.9987467f,0.9989191f,0.9990919f,0.9992645f,0.9994367f,0.9996078f,0.9997776f,0.9999457f,1.000112f,1.000275f,1.000436f,1.000593f,1.000746f,1.000896f,1.001042f,1.001183f,1.001319f,1.00145f,1.001576f,1.001697f,1.001811f,1.00192f,1.002022f,1.002118f,1.002208f,1.002291f,1.002367f,1.002436f,1.002499f,1.002555f,1.002603f,1.002645f,1.002679f,1.002707f,1.002727f,1.002741f,1.002748f,1.002748f,1.002741f,1.002728f,1.002708f,1.002682f,1.00265f,1.002612f,1.002568f,1.002518f,1.002463f,1.002403f,1.002337f,1.002267f,1.002192f,1.002114f,1.002031f,1.001944f,1.001854f,1.00176f,1.001664f,1.001565f,1.001464f,1.00136f,1.001255f,1.001148f,1.00104f,1.000931f,1.000821f,1.000711f,1.000601f,1.00049f,1.000381f,1.000272f,1.000164f,1.000057f,0.9999511f,0.9998472f,0.9997452f,0.9996454f,0.9995479f,0.9994529f,0.9993607f,0.9992715f,0.9991852f,0.9991023f,0.9990228f,0.9989468f,0.9988746f,0.9988062f,0.9987416f,0.9986812f,0.9986249f,0.9985727f,0.9985248f,0.9984812f,0.998442f,0.9984071f,0.9983767f,0.9983507f,0.998329f,0.9983118f,0.9982989f,0.9982904f,0.9982862f,0.9982862f,0.9982904f,0.9982986f,0.9983109f,0.9983271f,0.9983471f,0.9983708f,0.9983981f,0.9984289f,0.998463f,0.9985003f,0.9985406f,0.9985839f,0.9986299f,0.9986786f,0.9987296f,0.998783f,0.9988384f,0.9988958f,0.998955f,0.9990157f,0.9990779f,0.9991413f,0.9992057f,0.999271f,0.9993371f,0.9994037f,0.9994707f,0.9995378f,0.9996049f,0.999672f,0.9997387f,0.9998049f,0.9998705f,0.9999354f,0.9999993f,1.000062f,1.000124f,1.000184f,1.000243f,1.0003f,1.000356f,1.00041f,1.000461f,1.000511f,1.000559f,1.000605f,1.000648f,1.000689f,1.000727f,1.000764f,1.000797f,1.000828f,1.000857f,1.000883f,1.000906f,1.000927f,1.000945f,1.00096f,1.000973f,1.000983f,1.000991f,1.000996f,1.000998f,1.000998f,1.000996f,1.000991f,1.000984f,1.000974f,1.000963f,1.000949f,1.000933f,1.000915f,1.000895f,1.000873f,1.00085f,1.000824f,1.000798f,1.000769f,1.00074f,1.000709f,1.000677f,1.000644f,1.000609f,1.000574f,1.000538f,1.000502f,1.000465f,1.000427f,1.000389f,1.000351f,1.000313f,1.000275f,1.000236f,1.000198f,1.00016f,1.000122f,1.000085f,1.000048f,1.000012f,0.9999762f,0.9999413f,0.9999072f,0.999874f,0.9998417f,0.9998104f,0.9997802f,0.9997511f,0.9997231f,0.9996964f,0.9996709f,0.9996467f,0.9996238f,0.9996024f,0.9995822f,0.9995635f,0.9995463f,0.9995304f,0.9995161f,0.9995032f,0.9994918f,0.9994818f,0.9994733f,0.9994662f,0.9994607f,0.9994565f,0.9994537f,0.9994524f,0.9994524f,0.9994537f,0.9994563f,0.9994603f,0.9994655f,0.9994718f,0.9994793f,0.9994879f,0.9994977f,0.9995084f,0.9995201f,0.9995327f,0.9995462f,0.9995605f,0.9995756f,0.9995914f,0.9996079f,0.999625f,0.9996426f,0.9996607f,0.9996793f,0.9996982f,0.9997174f,0.999737f,0.9997567f,0.9997765f,0.9997966f,0.9998166f,0.9998366f,0.9998567f,0.9998765f,0.9998962f,0.9999158f,0.9999351f,0.9999541f,0.9999728f,0.9999911f,1.000009f,1.000026f,1.000043f,1.00006f,1.000076f,1.000091f,1.000106f,1.00012f,1.000134f,1.000147f,1.000159f,1.00017f,1.000181f,1.000191f,1.0002f,1.000209f,1.000217f,1.000224f,1.00023f,1.000236f,1.000241f,1.000245f,1.000248f,1.000251f,1.000253f,1.000255f,1.000255f,1.000255f,1.000255f,1.000253f,1.000251f,1.000249f,1.000246f,1.000242f,1.000238f,1.000234f,1.000229f,1.000223f,1.000217f,1.000211f,1.000204f,1.000197f,1.00019f,1.000182f,1.000174f,1.000166f,1.000157f,1.000149f,1.00014f,1.000131f,1.000123f,1.000114f,1.000105f,1.000096f,1.000087f,1.000078f,1.000069f,1.00006f,1.000051f,1.000042f,1.000034f,1.000026f,1.000017f,1.000009f,1.000001f,0.9999939f,0.9999866f,0.9999794f,0.9999726f,0.9999661f,0.9999598f,0.9999537f,0.999948f,0.9999427f,0.9999375f,0.9999327f,0.9999282f,0.9999241f,0.9999202f,0.9999167f,0.9999135f,0.9999106f,0.999908f,0.9999057f,0.9999037f,0.9999021f,0.9999007f,0.9998996f,0.9998988f,0.9998983f,0.999898f,0.999898f,0.9998983f,0.9998987f,0.9998994f,0.9999004f,0.9999015f,0.9999029f,0.9999045f,0.9999062f,0.9999081f,0.9999101f,0.9999123f,0.9999146f,0.9999171f,0.9999196f,0.9999223f,0.999925f,0.9999278f,0.9999307f,0.9999336f,0.9999366f,0.9999396f,0.9999425f,0.9999456f,0.9999486f,0.9999517f,0.9999547f,0.9999577f,0.9999606f,0.9999635f,0.9999664f,0.9999692f,0.999972f,0.9999747f,0.9999773f,0.9999799f,0.9999824f,0.9999847f,0.999987f,0.9999892f,0.9999913f,0.9999933f,0.9999952f,0.9999971f,0.9999988f,1.0f,1.000002f,1.000003f,1.000005f,1.000006f,1.000007f,1.000008f,1.000009f,1.00001f,1.000011f,1.000011f,1.000012f,1.000012f,1.000013f,1.000013f,1.000013f,1.000013f,1.000014f,1.000014f,1.000014f,1.000014f,1.000013f,1.000013f,1.000013f,1.000013f,1.000013f,1.000012f,1.000012f,1.000012f,1.000011f,1.000011f,1.00001f,1.00001f,1.00001f,1.000009f,1.000009f,1.000008f,1.000008f,1.000007f,1.000007f,1.000006f,1.000006f,1.000006f,1.000005f,1.000005f,1.000004f,1.000004f,1.000004f,1.000003f,1.000003f,1.000003f,1.000002f,1.000002f,1.000002f,1.000002f,1.000002f,1.000001f,1.000001f,1.000001f,1.000001f,1.000001f,1.000001f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f}; +const float blep[] = {-0.00000000000000000323952f,-0.000000000006369915f,-0.00000000006437058f,-0.000000000290332f,-0.0000000008765287f,-0.000000002091686f,-0.000000004277924f,-0.000000007849166f,-0.00000001328717f,-0.00000002113675f,-0.00000003200497f,-0.0000000465546f,-0.00000006549886f,-0.00000008959341f,-0.0000001196319f,-0.000000156442f,-0.0000002008762f,-0.0000002538019f,-0.0000003160992f,-0.0000003886443f,-0.0000004723078f,-0.0000005679478f,-0.0000006763945f,-0.0000007984452f,-0.0000009348541f,-0.000001086325f,-0.000001253499f,-0.000001436951f,-0.000001637172f,-0.000001854572f,-0.000002089465f,-0.000002342058f,-0.00000261245f,-0.000002900623f,-0.000003206425f,-0.000003529573f,-0.000003869653f,-0.000004226101f,-0.000004598206f,-0.0000049851f,-0.000005385753f,-0.000005798986f,-0.000006223451f,-0.000006657637f,-0.000007099864f,-0.000007548293f,-0.00000800092f,-0.000008455577f,-0.000008909934f,-0.00000936151f,-0.00000980767f,-0.00001024564f,-0.00001067249f,-0.00001108518f,-0.00001148054f,-0.00001185527f,-0.00001220597f,-0.00001252917f,-0.00001282129f,-0.00001307869f,-0.00001329766f,-0.00001347448f,-0.00001360537f,-0.00001368655f,-0.00001371423f,-0.00001368467f,-0.00001359414f,-0.00001343898f,-0.00001321558f,-0.00001292044f,-0.00001255018f,-0.00001210152f,-0.00001157134f,-0.00001095669f,-0.00001025481f,-0.000009463115f,-0.000008579284f,-0.00000760121f,-0.000006527056f,-0.000005355262f,-0.000004084562f,-0.000002714004f,-0.000001242961f,0.0000003288437f,0.000002001328f,0.000003774041f,0.000005646143f,0.000007616395f,0.000009683151f,0.00001184434f,0.00001409748f,0.00001643963f,0.00001886744f,0.00002137708f,0.00002396428f,0.00002662436f,0.00002935213f,0.00003214199f,0.0000349879f,0.00003788336f,0.00004082146f,0.00004379483f,0.00004679573f,0.00004981598f,0.00005284703f,0.00005587997f,0.00005890552f,0.00006191406f,0.00006489567f,0.00006784013f,0.00007073695f,0.00007357541f,0.00007634455f,0.00007903325f,0.00008163023f,0.00008412409f,0.00008650334f,0.0000887564f,0.00009087173f,0.00009283778f,0.00009464304f,0.00009627614f,0.0000977258f,0.00009898093f,0.0001000307f,0.0001008644f,0.0001014719f,0.000101843f,0.0001019683f,0.0001018386f,0.0001014451f,0.0001007798f,0.00009983495f,0.00009860352f,0.00009707915f,0.00009525608f,0.0000931293f,0.00009069452f,0.00008794825f,0.00008488781f,0.00008151137f,0.00007781796f,0.00007380754f,0.00006948099f,0.00006484013f,0.00005988781f,0.00005462782f,0.00004906502f,0.00004320524f,0.00003705541f,0.00003062348f,0.00002391845f,0.00001695041f,0.000009730472f,0.000002270838f,-0.000005415272f,-0.00001331359f,-0.00002140882f,-0.00002968467f,-0.00003812385f,-0.00004670812f,-0.00005541828f,-0.00006423426f,-0.00007313511f,-0.00008209904f,-0.00009110347f,-0.0001001251f,-0.0001091399f,-0.0001181233f,-0.0001270499f,-0.000135894f,-0.0001446294f,-0.0001532294f,-0.0001616669f,-0.0001699148f,-0.0001779456f,-0.0001857316f,-0.0001932452f,-0.0002004588f,-0.0002073448f,-0.0002138759f,-0.0002200251f,-0.0002257657f,-0.0002310713f,-0.0002359162f,-0.0002402752f,-0.000244124f,-0.0002474388f,-0.0002501969f,-0.0002523763f,-0.0002539564f,-0.0002549172f,-0.0002552405f,-0.000254909f,-0.0002539068f,-0.0002522196f,-0.0002498344f,-0.0002467399f,-0.0002429266f,-0.0002383864f,-0.0002331132f,-0.0002271028f,-0.0002203527f,-0.0002128624f,-0.0002046336f,-0.0001956697f,-0.0001859764f,-0.0001755615f,-0.0001644349f,-0.0001526086f,-0.0001400968f,-0.0001269159f,-0.0001130844f,-0.00009862323f,-0.00008355515f,-0.00006790531f,-0.00005170093f,-0.00003497135f,-0.00001774799f,-0.00000006430653f,0.00001804425f,0.00003654029f,0.00005538454f,0.00007453591f,0.00009395158f,0.000113587f,0.0001333962f,0.0001533316f,0.0001733442f,0.0001933837f,0.0002133988f,0.000233337f,0.0002531448f,0.0002727681f,0.0002921517f,0.0003112403f,0.0003299779f,0.0003483084f,0.0003661753f,0.0003835224f,0.0004002935f,0.0004164328f,0.0004318848f,0.000446595f,0.0004605093f,0.0004735749f,0.0004857398f,0.0004969536f,0.000507167f,0.0005163327f,0.0005244049f,0.0005313397f,0.0005370954f,0.0005416324f,0.0005449138f,0.0005469047f,0.0005475735f,0.0005468909f,0.0005448308f,0.00054137f,0.0005364888f,0.0005301705f,0.0005224018f,0.0005131732f,0.0005024789f,0.0004903163f,0.0004766868f,0.0004615959f,0.0004450528f,0.0004270707f,0.0004076667f,0.0003868621f,0.0003646823f,0.0003411567f,0.0003163186f,0.0002902056f,0.0002628593f,0.0002343253f,0.0002046531f,0.0001738961f,0.0001421117f,0.0001093609f,0.00007570842f,0.00004122265f,0.000005975352f,-0.00002995838f,-0.00006650022f,-0.0001035688f,-0.0001410798f,-0.0001789462f,-0.0002170785f,-0.0002553847f,-0.0002937707f,-0.0003321405f,-0.0003703961f,-0.0004084383f,-0.0004461663f,-0.0004834786f,-0.0005202725f,-0.0005564451f,-0.000591893f,-0.0006265126f,-0.0006602011f,-0.0006928555f,-0.0007243743f,-0.0007546564f,-0.0007836026f,-0.0008111151f,-0.0008370978f,-0.0008614572f,-0.0008841021f,-0.000904944f,-0.0009238975f,-0.0009408806f,-0.0009558149f,-0.0009686257f,-0.0009792425f,-0.0009875991f,-0.0009936342f,-0.0009972911f,-0.0009985183f,-0.0009972695f,-0.0009935042f,-0.0009871871f,-0.0009782895f,-0.0009667881f,-0.0009526666f,-0.0009359143f,-0.0009165279f,-0.0008945101f,-0.0008698707f,-0.0008426263f,-0.0008128004f,-0.0007804235f,-0.0007455333f,-0.0007081743f,-0.0006683981f,-0.0006262636f,-0.0005818366f,-0.0005351896f,-0.0004864023f,-0.0004355611f,-0.0003827592f,-0.000328096f,-0.0002716779f,-0.0002136169f,-0.0001540316f,-0.00009304621f,-0.00003079056f,0.00003260008f,0.00009698531f,0.0001622199f,0.0002281539f,0.0002946334f,0.0003615002f,0.0004285929f,0.0004957465f,0.0005627935f,0.0006295636f,0.0006958846f,0.0007615827f,0.0008264827f,0.0008904086f,0.0009531841f,0.001014633f,0.001074579f,0.001132848f,0.001189267f,0.001243664f,0.001295869f,0.001345717f,0.001393045f,0.001437694f,0.001479508f,0.001518338f,0.001554039f,0.001586471f,0.001615502f,0.001641003f,0.001662856f,0.001680948f,0.001695174f,0.001705439f,0.001711652f,0.001713736f,0.001711619f,0.001705243f,0.001694556f,0.001679517f,0.001660096f,0.001636274f,0.001608041f,0.0015754f,0.001538365f,0.00149696f,0.001451221f,0.001401196f,0.001346943f,0.001288534f,0.00122605f,0.001159585f,0.001089245f,0.001015146f,0.0009374166f,0.0008561945f,0.00077163f,0.0006838836f,0.0005931262f,0.0004995389f,0.0004033126f,0.0003046477f,0.0002037537f,0.0001008489f,-0.000003840135f,-0.0001100789f,-0.0002176257f,-0.0003262317f,-0.0004356419f,-0.0005455953f,-0.0006558261f,-0.0007660633f,-0.0008760325f,-0.0009854554f,-0.001094051f,-0.001201538f,-0.00130763f,-0.001412044f,-0.001514495f,-0.001614698f,-0.001712372f,-0.001807236f,-0.001899013f,-0.001987429f,-0.002072216f,-0.002153111f,-0.002229854f,-0.002302196f,-0.002369893f,-0.002432708f,-0.002490417f,-0.002542802f,-0.002589655f,-0.002630782f,-0.002665998f,-0.002695131f,-0.002718022f,-0.002734525f,-0.002744508f,-0.002747855f,-0.002744461f,-0.002734241f,-0.002717124f,-0.002693054f,-0.002661994f,-0.002623921f,-0.002578833f,-0.002526743f,-0.002467681f,-0.002401698f,-0.002328861f,-0.002249254f,-0.002162981f,-0.002070164f,-0.001970942f,-0.001865473f,-0.001753932f,-0.001636512f,-0.001513423f,-0.001384892f,-0.001251164f,-0.001112499f,-0.0009691728f,-0.0008214777f,-0.0006697202f,-0.000514221f,-0.0003553151f,-0.00019335f,-0.0000286858f,0.0001383057f,0.000307242f,0.0004777306f,0.0006493696f,0.000821749f,0.0009944516f,0.001167053f,0.001339125f,0.001510232f,0.001679939f,0.001847806f,0.002013391f,0.002176254f,0.002335955f,0.002492056f,0.002644122f,0.002791722f,0.002934432f,0.003071832f,0.003203512f,0.003329071f,0.003448114f,0.003560263f,0.003665147f,0.003762412f,0.003851715f,0.003932732f,0.004005152f,0.004068684f,0.004123054f,0.004168006f,0.004203306f,0.004228741f,0.00424412f,0.004249273f,0.004244054f,0.00422834f,0.004202035f,0.004165067f,0.004117389f,0.004058979f,0.003989844f,0.003910016f,0.003819555f,0.003718547f,0.003607107f,0.003485376f,0.003353522f,0.003211743f,0.003060261f,0.002899326f,0.002729217f,0.002550235f,0.002362711f,0.002167f,0.00196348f,0.001752555f,0.001534654f,0.001310225f,0.00107974f,0.0008436934f,0.0006025967f,0.0003569824f,0.0001074001f,-0.0001455836f,-0.0004013866f,-0.0006594124f,-0.0009190518f,-0.001179684f,-0.001440677f,-0.001701391f,-0.001961179f,-0.002219388f,-0.00247536f,-0.002728437f,-0.002977956f,-0.003223258f,-0.003463684f,-0.003698581f,-0.0039273f,-0.004149199f,-0.004363648f,-0.004570025f,-0.00476772f,-0.004956138f,-0.005134701f,-0.005302846f,-0.005460029f,-0.005605729f,-0.005739445f,-0.005860699f,-0.00596904f,-0.006064043f,-0.00614531f,-0.006212472f,-0.006265192f,-0.006303162f,-0.006326111f,-0.006333798f,-0.006326018f,-0.006302603f,-0.00626342f,-0.006208374f,-0.006137409f,-0.006050506f,-0.005947688f,-0.005829014f,-0.005694586f,-0.005544544f,-0.005379071f,-0.005198388f,-0.005002757f,-0.00479248f,-0.004567901f,-0.004329398f,-0.004077394f,-0.003812347f,-0.003534754f,-0.003245149f,-0.002944101f,-0.002632215f,-0.002310131f,-0.001978518f,-0.001638082f,-0.001289554f,-0.0009336979f,-0.0005713021f,-0.0002031813f,0.000169826f,0.0005468592f,0.0009270375f,0.001309462f,0.001693218f,0.002077376f,0.002460995f,0.002843125f,0.003222806f,0.003599075f,0.003970966f,0.004337511f,0.004697745f,0.005050707f,0.005395443f,0.005731007f,0.006056465f,0.006370898f,0.006673403f,0.006963094f,0.007239109f,0.007500608f,0.007746777f,0.007976831f,0.008190016f,0.008385612f,0.008562927f,0.008721316f,0.008860164f,0.008978905f,0.009077011f,0.009153998f,0.009209435f,0.00924293f,0.009254147f,0.009242799f,0.009208652f,0.009151524f,0.009071289f,0.008967876f,0.008841271f,0.008691514f,0.008518705f,0.008323003f,0.008104622f,0.007863839f,0.007600983f,0.007316446f,0.007010677f,0.006684182f,0.006337524f,0.005971322f,0.00558625f,0.005183036f,0.004762464f,0.004325364f,0.003872621f,0.003405168f,0.002923983f,0.00243009f,0.001924557f,0.001408492f,0.0008830409f,0.0003493881f,-0.0001912502f,-0.0007376259f,-0.001288463f,-0.001842458f,-0.002398288f,-0.002954608f,-0.003510056f,-0.004063257f,-0.004612829f,-0.005157377f,-0.005695507f,-0.006225824f,-0.006746934f,-0.007257451f,-0.007756001f,-0.008241222f,-0.008711768f,-0.009166314f,-0.009603563f,-0.01002224f,-0.0104211f,-0.01079894f,-0.0111546f,-0.01148693f,-0.01179486f,-0.01207736f,-0.01233342f,-0.01256214f,-0.01276262f,-0.01293405f,-0.01307567f,-0.01318681f,-0.01326682f,-0.01331517f,-0.01333135f,-0.01331498f,-0.01326571f,-0.01318328f,-0.01306752f,-0.01291832f,-0.01273567f,-0.01251963f,-0.01227035f,-0.01198805f,-0.01167305f,-0.01132575f,-0.01094662f,-0.01053623f,-0.01009522f,-0.009624333f,-0.009124367f,-0.008596216f,-0.008040853f,-0.007459324f,-0.006852756f,-0.006222347f,-0.005569368f,-0.00489516f,-0.004201132f,-0.003488758f,-0.002759571f,-0.002015168f,-0.001257198f,-0.0004873621f,0.0002925875f,0.001080855f,0.001875603f,0.002674958f,0.003477011f,0.004279828f,0.005081446f,0.005879886f,0.006673152f,0.007459238f,0.008236132f,0.009001819f,0.009754293f,0.01049155f,0.01121161f,0.01191249f,0.01259226f,0.01324901f,0.01388084f,0.01448592f,0.01506244f,0.01560867f,0.01612289f,0.01660348f,0.01704885f,0.0174575f,0.01782799f,0.01815895f,0.01844912f,0.01869729f,0.01890235f,0.01906329f,0.01917919f,0.01924923f,0.01927269f,0.01924895f,0.01917751f,0.01905798f,0.01889006f,0.01867359f,0.01840851f,0.0180949f,0.01773293f,0.01732291f,0.01686526f,0.01636053f,0.01580939f,0.01521263f,0.01457115f,0.01388597f,0.01315827f,0.01238928f,0.0115804f,0.01073312f,0.009849051f,0.008929903f,0.007977499f,0.006993767f,0.00598073f,0.004940511f,0.003875322f,0.002787467f,0.001679329f,0.0005533748f,-0.000587859f,-0.001741765f,-0.002905672f,-0.004076854f,-0.005252528f,-0.006429872f,-0.007606018f,-0.008778068f,-0.009943098f,-0.01109816f,-0.0122403f,-0.01336655f,-0.01447395f,-0.01555954f,-0.01662038f,-0.01765356f,-0.01865618f,-0.01962538f,-0.02055838f,-0.0214524f,-0.02230475f,-0.02311279f,-0.02387397f,-0.02458582f,-0.02524593f,-0.025852f,-0.02640185f,-0.02689337f,-0.0273246f,-0.02769367f,-0.02799885f,-0.02823854f,-0.02841127f,-0.02851573f,-0.02855073f,-0.02851526f,-0.02840843f,-0.02822957f,-0.0279781f,-0.02765367f,-0.02725606f,-0.02678525f,-0.02624137f,-0.02562477f,-0.02493592f,-0.02417553f,-0.02334446f,-0.02244375f,-0.02147463f,-0.02043852f,-0.019337f,-0.01817186f,-0.01694503f,-0.01565866f,-0.01431503f,-0.01291662f,-0.01146607f,-0.009966169f,-0.008419888f,-0.006830337f,-0.005200781f,-0.003534626f,-0.001835418f,-0.0001068321f,0.001647328f,0.003423144f,0.005216585f,0.007023519f,0.008839717f,0.01066087f,0.01248258f,0.01430039f,0.01610978f,0.01790618f,0.01968499f,0.02144156f,0.02317124f,0.02486936f,0.02653126f,0.02815228f,0.02972778f,0.03125319f,0.03272393f,0.03413552f,0.03548354f,0.03676362f,0.03797151f,0.03910305f,0.04015419f,0.04112101f,0.04199971f,0.04278665f,0.04347834f,0.04407144f,0.04456281f,0.04494947f,0.04522866f,0.04539782f,0.04545458f,0.04539681f,0.04522262f,0.04493034f,0.04451857f,0.04398613f,0.04333215f,0.04255597f,0.04165725f,0.04063592f,0.03949216f,0.0382265f,0.0368397f,0.03533286f,0.03370737f,0.03196491f,0.03010748f,0.02813736f,0.02605717f,0.02386982f,0.02157851f,0.01918678f,0.01669843f,0.01411759f,0.01144869f,0.008696442f,0.005865842f,0.002962185f,-0.00000896148f,-0.003041753f,-0.006130077f,-0.009267565f,-0.01244759f,-0.01566329f,-0.01890755f,-0.02217305f,-0.02545225f,-0.02873738f,-0.0320205f,-0.03529349f,-0.03854803f,-0.04177567f,-0.0449678f,-0.04811568f,-0.05121044f,-0.05424313f,-0.05720466f,-0.06008592f,-0.0628777f,-0.06557074f,-0.06815578f,-0.07062352f,-0.07296465f,-0.0751699f,-0.07723001f,-0.07913579f,-0.08087808f,-0.08244782f,-0.08383604f,-0.08503391f,-0.08603267f,-0.08682375f,-0.08739872f,-0.08774933f,-0.08786753f,-0.08774547f,-0.08737548f,-0.08675022f,-0.08586251f,-0.08470547f,-0.08327252f,-0.08155733f,-0.07955389f,-0.07725655f,-0.07465991f,-0.07175899f,-0.0685491f,-0.06502596f,-0.06118565f,-0.05702461f,-0.05253971f,-0.04772818f,-0.0425877f,-0.03711634f,-0.03131259f,-0.02517537f,-0.01870404f,-0.0118984f,-0.004758664f,0.002714483f,0.01051993f,0.0186561f,0.02712099f,0.03591214f,0.04502666f,0.05446118f,0.06421193f,0.07427467f,0.08464476f,0.09531708f,0.1062861f,0.117546f,0.1290903f,0.1409123f,0.1530049f,0.1653605f,0.1779712f,0.1908288f,0.2039246f,0.2172496f,0.2307947f,0.24455f,0.2585058f,0.2726517f,0.2869773f,0.3014719f,0.3161243f,0.3309234f,0.3458578f,0.3609158f,0.3760855f,0.3913549f,0.406712f,0.4221444f,0.4376397f,0.4531856f,0.4687693f,0.4843783f,0.5f,0.4843783f,0.4687693f,0.4531856f,0.4376398f,0.4221444f,0.4067121f,0.391355f,0.3760855f,0.3609158f,0.3458579f,0.3309235f,0.3161244f,0.3014719f,0.2869774f,0.2726517f,0.2585058f,0.24455f,0.2307947f,0.2172497f,0.2039246f,0.1908288f,0.1779712f,0.1653605f,0.1530049f,0.1409123f,0.1290903f,0.117546f,0.1062862f,0.09531713f,0.08464479f,0.07427472f,0.06421196f,0.05446124f,0.04502666f,0.03591222f,0.02712101f,0.01865613f,0.01051992f,0.002714515f,-0.004758716f,-0.0118984f,-0.01870406f,-0.02517533f,-0.03131258f,-0.03711629f,-0.04258764f,-0.04772818f,-0.05253971f,-0.0570246f,-0.06118572f,-0.06502593f,-0.06854904f,-0.07175899f,-0.07465994f,-0.07725644f,-0.07955384f,-0.08155727f,-0.08327246f,-0.08470547f,-0.08586252f,-0.08675027f,-0.08737552f,-0.08774543f,-0.0878675f,-0.08774936f,-0.08739877f,-0.0868237f,-0.08603263f,-0.08503389f,-0.08383608f,-0.08244777f,-0.08087802f,-0.07913578f,-0.07722998f,-0.07516992f,-0.07296467f,-0.07062352f,-0.06815577f,-0.06557071f,-0.06287766f,-0.06008589f,-0.0572046f,-0.05424309f,-0.0512104f,-0.04811561f,-0.04496777f,-0.04177558f,-0.03854799f,-0.03529334f,-0.03202045f,-0.02873731f,-0.02545214f,-0.02217293f,-0.01890755f,-0.01566327f,-0.0124476f,-0.009267449f,-0.006130099f,-0.003041744f,-0.000008940697f,0.002962232f,0.005865872f,0.008696496f,0.01144868f,0.01411766f,0.01669848f,0.01918679f,0.02157855f,0.02386987f,0.02605718f,0.02813739f,0.03010756f,0.0319649f,0.03370738f,0.03533292f,0.03683978f,0.03822649f,0.03949219f,0.04063594f,0.04165727f,0.04255605f,0.04333222f,0.0439862f,0.04451865f,0.04493034f,0.04522264f,0.0453968f,0.04545456f,0.04539782f,0.04522866f,0.04494947f,0.04456282f,0.0440715f,0.04347837f,0.04278672f,0.04199976f,0.04112107f,0.04015422f,0.03910309f,0.0379715f,0.03676367f,0.0354836f,0.03413558f,0.03272396f,0.03125322f,0.02972782f,0.02815235f,0.02653128f,0.02486938f,0.02317131f,0.02144158f,0.01968503f,0.01790619f,0.01610982f,0.01430041f,0.01248258f,0.01066089f,0.008839786f,0.007023573f,0.005216599f,0.003423214f,0.001647353f,-0.0001068115f,-0.001835346f,-0.003534675f,-0.005200744f,-0.006830335f,-0.008419752f,-0.009966135f,-0.01146603f,-0.01291656f,-0.01431501f,-0.01565862f,-0.016945f,-0.01817191f,-0.01933706f,-0.02043855f,-0.0214746f,-0.02244365f,-0.0233444f,-0.02417552f,-0.02493584f,-0.02562475f,-0.0262413f,-0.02678525f,-0.02725601f,-0.02765357f,-0.02797806f,-0.02822959f,-0.02840841f,-0.02851522f,-0.02855074f,-0.0285157f,-0.02841127f,-0.02823853f,-0.02799881f,-0.02769363f,-0.02732456f,-0.02689338f,-0.02640176f,-0.02585196f,-0.0252459f,-0.02458572f,-0.02387393f,-0.02311277f,-0.02230465f,-0.02145231f,-0.02055824f,-0.01962543f,-0.01865613f,-0.01765358f,-0.0166204f,-0.01555955f,-0.01447392f,-0.01336646f,-0.01224029f,-0.01109815f,-0.009943008f,-0.008777976f,-0.00760591f,-0.006429911f,-0.005252481f,-0.004076838f,-0.002905607f,-0.001741767f,-0.000587821f,0.0005534291f,0.001679361f,0.00278753f,0.003875315f,0.00494051f,0.00598073f,0.00699383f,0.007977545f,0.008929968f,0.009849131f,0.01073313f,0.01158041f,0.0123893f,0.01315832f,0.01388603f,0.01457119f,0.01521266f,0.01580942f,0.01636058f,0.01686531f,0.0173229f,0.01773292f,0.0180949f,0.01840854f,0.0186736f,0.01889008f,0.01905799f,0.01917756f,0.01924896f,0.01927269f,0.01924926f,0.01917922f,0.01906329f,0.01890236f,0.01869732f,0.01844913f,0.01815897f,0.01782799f,0.01745749f,0.0170489f,0.01660353f,0.01612294f,0.01560873f,0.01506251f,0.01448596f,0.01388085f,0.01324904f,0.01259232f,0.01191252f,0.01121163f,0.01049155f,0.00975436f,0.009001851f,0.00823617f,0.007459283f,0.006673157f,0.005879939f,0.005081475f,0.004279852f,0.003477037f,0.002674997f,0.001875639f,0.001080871f,0.0002925992f,-0.0004873276f,-0.001257181f,-0.002015114f,-0.002759576f,-0.003488779f,-0.004201174f,-0.00489521f,-0.005569339f,-0.006222367f,-0.006852627f,-0.007459283f,-0.008040786f,-0.008596182f,-0.009124279f,-0.009624243f,-0.01009512f,-0.01053619f,-0.01094651f,-0.01132572f,-0.01167297f,-0.01198804f,-0.01227033f,-0.0125196f,-0.01273561f,-0.01291823f,-0.01306748f,-0.01318324f,-0.01326561f,-0.01331496f,-0.01333129f,-0.01331508f,-0.0132668f,-0.01318681f,-0.01307559f,-0.01293397f,-0.01276255f,-0.01256204f,-0.01233339f,-0.01207733f,-0.01179481f,-0.01148689f,-0.01115453f,-0.01079893f,-0.01042104f,-0.01002216f,-0.0096035f,-0.009166241f,-0.008711696f,-0.008241177f,-0.007755876f,-0.007257342f,-0.006747007f,-0.006225824f,-0.005695462f,-0.005157351f,-0.004612803f,-0.004063249f,-0.003509998f,-0.002954602f,-0.002398252f,-0.00184238f,-0.001288414f,-0.0007375479f,-0.0001912117f,0.0003494024f,0.0008831024f,0.001408517f,0.001924634f,0.002430141f,0.002924025f,0.003405213f,0.003872633f,0.00432539f,0.004762471f,0.005183041f,0.005586267f,0.005971372f,0.006337583f,0.006684244f,0.007010698f,0.00731647f,0.007601023f,0.007863879f,0.008104682f,0.008323073f,0.008518755f,0.008691549f,0.008841336f,0.008967936f,0.00907135f,0.009151578f,0.009208679f,0.009242833f,0.009254217f,0.009243011f,0.009209514f,0.009154081f,0.009077072f,0.008978963f,0.00886023f,0.008721352f,0.008562982f,0.008385658f,0.008190036f,0.00797689f,0.007746816f,0.007500648f,0.007239163f,0.006963134f,0.006673455f,0.006370902f,0.006056488f,0.005731046f,0.005395472f,0.005050719f,0.00469774f,0.004337549f,0.003970981f,0.003599107f,0.003222883f,0.002843201f,0.002461076f,0.002077401f,0.001693249f,0.001309514f,0.0009270906f,0.0005468726f,0.0001698732f,-0.0002031326f,-0.0005712509f,-0.0009336472f,-0.001289487f,-0.001638055f,-0.001978517f,-0.002310157f,-0.00263226f,-0.002944112f,-0.003245115f,-0.003534794f,-0.003812313f,-0.004077435f,-0.004329443f,-0.004567862f,-0.004792452f,-0.005002737f,-0.005198359f,-0.005379081f,-0.005544543f,-0.005694628f,-0.005828977f,-0.005947709f,-0.006050467f,-0.006137371f,-0.00620842f,-0.006263494f,-0.006302595f,-0.006326079f,-0.006333828f,-0.006326079f,-0.006303191f,-0.006265163f,-0.006212473f,-0.006145358f,-0.006064057f,-0.005969048f,-0.005860686f,-0.00573945f,-0.005605698f,-0.005460024f,-0.005302906f,-0.005134702f,-0.004956126f,-0.004767776f,-0.004570007f,-0.004363656f,-0.004149199f,-0.00392735f,-0.003698587f,-0.003463626f,-0.0032233f,-0.002977967f,-0.002728462f,-0.002475381f,-0.002219319f,-0.001961112f,-0.001701355f,-0.001440644f,-0.001179695f,-0.0009189844f,-0.0006593466f,-0.0004013777f,-0.0001455545f,0.0001074076f,0.0003570318f,0.0006026626f,0.0008437634f,0.001079798f,0.001310289f,0.0015347f,0.001752615f,0.001963556f,0.002167046f,0.002362788f,0.002550304f,0.002729297f,0.002899408f,0.003060341f,0.003211796f,0.003353596f,0.003485382f,0.003607094f,0.003718555f,0.003819585f,0.003910005f,0.003989875f,0.004059017f,0.00411737f,0.004165053f,0.004202068f,0.004228354f,0.004244089f,0.004249275f,0.004244149f,0.004228771f,0.00420332f,0.004168034f,0.004123092f,0.004068673f,0.004005134f,0.003932714f,0.003851712f,0.003762424f,0.003665149f,0.003560245f,0.003448129f,0.003329158f,0.003203571f,0.003071904f,0.002934515f,0.002791762f,0.002644181f,0.00249213f,0.002336025f,0.002176285f,0.002013445f,0.001847863f,0.001680017f,0.001510262f,0.001339197f,0.001167119f,0.0009945035f,0.0008217692f,0.0006493926f,0.0004777908f,0.0003072619f,0.0001383424f,-0.00002861023f,-0.0001933575f,-0.0003552437f,-0.0005141497f,-0.0006697178f,-0.0008214712f,-0.0009691715f,-0.001112461f,-0.001251101f,-0.001384854f,-0.001513362f,-0.001636505f,-0.001753926f,-0.001865506f,-0.001970887f,-0.002070189f,-0.002162933f,-0.002249241f,-0.002328873f,-0.00240171f,-0.002467632f,-0.00252676f,-0.002578855f,-0.002623916f,-0.002661943f,-0.002693057f,-0.002717137f,-0.002734184f,-0.002744436f,-0.002747893f,-0.002744555f,-0.002734542f,-0.002717972f,-0.002695084f,-0.002665997f,-0.002630711f,-0.002589583f,-0.002542734f,-0.002490401f,-0.002432704f,-0.002369881f,-0.00230217f,-0.00222981f,-0.002153039f,-0.002072215f,-0.001987457f,-0.001899004f,-0.001807213f,-0.001712322f,-0.00161469f,-0.001514435f,-0.001412034f,-0.001307607f,-0.00120151f,-0.001093984f,-0.000985384f,-0.0008759499f,-0.0007660389f,-0.0006557703f,-0.0005456209f,-0.0004355907f,-0.0003261566f,-0.000217557f,-0.0001100302f,-0.000003814697f,0.0001009107f,0.0002037883f,0.0003046989f,0.0004033446f,0.0004996061f,0.0005931854f,0.0006839037f,0.0007716417f,0.0008562207f,0.0009374619f,0.001015186f,0.001089275f,0.001159608f,0.001226068f,0.001288593f,0.001347005f,0.001401246f,0.001451254f,0.00149703f,0.001538396f,0.00157547f,0.001608074f,0.001636326f,0.001660168f,0.00167954f,0.00169462f,0.001705289f,0.001711667f,0.001713812f,0.001711726f,0.001705468f,0.001695216f,0.00168097f,0.00166291f,0.001641035f,0.001615524f,0.001586497f,0.001554072f,0.001518369f,0.001479566f,0.001437724f,0.00139308f,0.001345754f,0.001295924f,0.001243711f,0.001189291f,0.001132905f,0.001074612f,0.00101465f,0.0009532571f,0.0008904338f,0.0008265376f,0.0007616282f,0.0006959438f,0.0006296039f,0.0005628467f,0.0004957914f,0.000428617f,0.0003615618f,0.0002946854f,0.0002281666f,0.0001622438f,0.00009703636f,0.00003266335f,-0.000030756f,-0.00009298325f,-0.0001540184f,-0.000213623f,-0.000271678f,-0.000328064f,-0.000382781f,-0.0004354715f,-0.0004863739f,-0.0005351305f,-0.0005818605f,-0.0006262064f,-0.0006684065f,-0.0007081032f,-0.0007455349f,-0.000780344f,-0.0008127689f,-0.0008425713f,-0.0008698702f,-0.0008944273f,-0.000916481f,-0.0009359121f,-0.0009526014f,-0.0009667873f,-0.0009782314f,-0.0009871721f,-0.0009934902f,-0.0009971857f,-0.000998497f,-0.0009973049f,-0.0009936094f,-0.0009875298f,-0.0009791851f,-0.0009685755f,-0.0009558201f,-0.0009407997f,-0.000923872f,-0.0009049177f,-0.0008840561f,-0.0008614063f,-0.0008370876f,-0.0008111f,-0.0007835627f,-0.0007545948f,-0.0007243156f,-0.0006928444f,-0.000660181f,-0.0006264448f,-0.0005918741f,-0.000556469f,-0.0005202293f,-0.0004833937f,-0.0004460812f,-0.000408411f,-0.0003703833f,-0.0003321171f,-0.0002937317f,-0.0002553463f,-0.0002170801f,-0.0001789331f,-0.0001410246f,-0.0001035929f,-0.00006651878f,-0.00002992153f,0.000005960464f,0.00004124641f,0.0000757575f,0.0001093745f,0.0001421571f,0.0001739264f,0.0002046824f,0.0002343655f,0.0002629161f,0.000290215f,0.0003163815f,0.000341177f,0.0003647208f,0.0003868937f,0.0004076958f,0.0004271269f,0.0004450679f,0.000461638f,0.0004767179f,0.0004903674f,0.0005025268f,0.000513196f,0.0005224347f,0.0005301833f,0.0005365014f,0.000541389f,0.0005448461f,0.0005469322f,0.0005475879f,0.0005469322f,0.0005449653f,0.000541687f,0.0005371571f,0.0005313754f,0.0005244613f,0.000516355f,0.0005072355f,0.0004969835f,0.0004857779f,0.0004736185f,0.0004605651f,0.0004466176f,0.0004318953f,0.0004164577f,0.0004003048f,0.0003835559f,0.0003662109f,0.0003483295f,0.0003300309f,0.0003112555f,0.000292182f,0.0002728105f,0.0002532005f,0.0002333522f,0.0002134442f,0.0001934171f,0.0001733899f,0.0001533628f,0.0001334548f,0.0001136065f,0.00009399652f,0.00007456541f,0.00005543232f,0.00003659725f,0.00001806021f,0.0f,-0.00001776218f,-0.00003492832f,-0.00005161762f,-0.00006783009f,-0.00008356571f,-0.00009858608f,-0.0001130104f,-0.0001268387f,-0.0001400709f,-0.0001525879f,-0.0001643896f,-0.0001754761f,-0.0001859665f,-0.0001956224f,-0.0002045631f,-0.0002127886f,-0.0002202988f,-0.0002270937f,-0.0002330542f,-0.0002382994f,-0.0002429485f,-0.0002467632f,-0.0002497435f,-0.0002521276f,-0.0002539158f,-0.0002548695f,-0.0002552271f,-0.0002548695f,-0.0002539158f,-0.0002523661f,-0.0002502203f,-0.0002473593f,-0.0002441406f,-0.0002402067f,-0.0002359152f,-0.0002310276f,-0.0002257824f,-0.0002199411f,-0.0002138615f,-0.000207305f,-0.0002003908f,-0.0001932383f,-0.0001857281f,-0.0001778603f,-0.0001698732f,-0.0001616478f,-0.0001531839f,-0.0001446009f,-0.0001358986f,-0.0001269579f,-0.0001181364f,-0.0001090765f,-0.0001001358f,-0.0000910759f,-0.00008201599f,-0.00007307529f,-0.00006425381f,-0.00005543232f,-0.00004673004f,-0.00003814697f,-0.00002968311f,-0.00002133846f,-0.00001323223f,-0.000005364418f,0.000002264977f,0.000009775162f,0.00001698732f,0.00002396107f,0.00003063679f,0.00003707409f,0.00004321337f,0.00004911423f,0.00005465746f,0.00005990267f,0.00006484985f,0.00006949902f,0.00007385015f,0.00007784367f,0.00008153915f,0.00008493662f,0.00008797646f,0.00009071827f,0.00009316206f,0.00009530783f,0.00009709597f,0.00009864569f,0.00009989738f,0.0001007915f,0.0001015067f,0.0001018643f,0.0001019835f,0.0001018643f,0.0001015067f,0.0001009107f,0.0001000762f,0.00009900331f,0.00009775162f,0.00009632111f,0.00009465218f,0.00009286404f,0.00009089708f,0.00008881092f,0.00008654594f,0.00008416176f,0.00008165836f,0.00007909536f,0.00007635355f,0.00007361174f,0.00007075071f,0.00006788969f,0.00006490946f,0.00006192923f,0.00005894899f,0.00005590916f,0.00005286932f,0.00004982948f,0.00004684925f,0.00004380941f,0.00004082918f,0.00003790855f,0.00003504753f,0.00003218651f,0.00002938509f,0.00002664328f,0.00002402067f,0.00002139807f,0.00001889467f,0.00001645088f,0.0000141263f,0.00001186132f,0.000009715557f,0.000007629395f,0.000005722046f,0.000003814697f,0.000002026558f,0.0000003576279f,-0.000001192093f,-0.000002622604f,-0.000004053116f,-0.000005364418f,-0.000006437302f,-0.000007510185f,-0.000008583069f,-0.000009417534f,-0.000010252f,-0.00001096725f,-0.0000115633f,-0.00001204014f,-0.00001251698f,-0.0000128746f,-0.00001323223f,-0.00001335144f,-0.00001358986f,-0.00001370907f,-0.00001370907f,-0.00001370907f,-0.00001358986f,-0.00001347065f,-0.00001323223f,-0.00001299381f,-0.00001275539f,-0.00001251698f,-0.00001215935f,-0.00001180172f,-0.00001144409f,-0.00001108646f,-0.00001060963f,-0.000010252f,-0.000009775162f,-0.000009298325f,-0.000008821487f,-0.00000846386f,-0.000007987022f,-0.000007510185f,-0.000007033348f,-0.00000667572f,-0.000006198883f,-0.000005722046f,-0.000005364418f,-0.00000500679f,-0.000004529953f,-0.000004172325f,-0.000003814697f,-0.000003457069f,-0.000003218651f,-0.000002861023f,-0.000002622604f,-0.000002264977f,-0.000002026558f,-0.000001788139f,-0.000001549721f,-0.000001430511f,-0.000001192093f,-0.000001072884f,-0.0000009536743f,-0.0000007152557f,-0.0000005960464f,-0.0000004768372f,-0.0000004768372f,-0.0000003576279f,-0.0000002384186f,-0.0000002384186f,-0.0000001192093f,-0.0000001192093f,-0.0000001192093f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f}; + + +const float blepd2[] = {-0.00000000000000000161967f,-0.000000000003185738f,-0.00000000003221653f,-0.0000000001454588f,-0.0000000004397739f,-0.000000001051358f,-0.000000002155025f,-0.000000003964459f,-0.00000000673149f,-0.00000001074516f,-0.00000001633306f,-0.00000002385991f,-0.00000003372702f,-0.00000004637046f,-0.00000006226129f,-0.00000008190624f,-0.0000001058457f,-0.0000001346515f,-0.000000168929f,-0.0000002093113f,-0.0000002564618f,-0.0000003110738f,-0.000000373866f,-0.0000004455827f,-0.0000005269923f,-0.0000006188858f,-0.0000007220755f,-0.0000008373934f,-0.0000009656874f,-0.000001107824f,-0.000001264685f,-0.000001437162f,-0.00000162616f,-0.000001832593f,-0.000002057377f,-0.000002301435f,-0.000002565696f,-0.00000285109f,-0.000003158544f,-0.000003488977f,-0.000003843303f,-0.000004222436f,-0.000004627272f,-0.000005058698f,-0.000005517584f,-0.000006004784f,-0.000006521137f,-0.000007067451f,-0.000007644513f,-0.000008253084f,-0.000008893898f,-0.000009567653f,-0.00001027502f,-0.00001101663f,-0.00001179308f,-0.00001260491f,-0.00001345263f,-0.00001433671f,-0.00001525757f,-0.00001621556f,-0.000017211f,-0.00001824415f,-0.0000193152f,-0.00002042429f,-0.00002157152f,-0.00002275689f,-0.00002398035f,-0.00002524179f,-0.00002654103f,-0.0000278778f,-0.00002925179f,-0.00003066257f,-0.00003210968f,-0.00003359255f,-0.00003511054f,-0.00003666294f,-0.00003824893f,-0.00003986764f,-0.00004151809f,-0.00004319922f,-0.00004490988f,-0.00004664884f,-0.00004841478f,-0.00005020628f,-0.00005202184f,-0.00005385984f,-0.00005571862f,-0.00005759637f,-0.00005949123f,-0.00006140124f,-0.0000633243f,-0.00006525829f,-0.00006720095f,-0.00006914994f,-0.00007110281f,-0.00007305706f,-0.00007501005f,-0.00007695908f,-0.00007890136f,-0.00008083399f,-0.00008275401f,-0.00008465834f,-0.00008654385f,-0.00008840729f,-0.00009024536f,-0.00009205466f,-0.00009383172f,-0.000095573f,-0.00009727487f,-0.00009893363f,-0.0001005455f,-0.0001021067f,-0.0001036133f,-0.0001050614f,-0.0001064468f,-0.0001077657f,-0.0001090137f,-0.0001101868f,-0.0001112808f,-0.0001122913f,-0.000113214f,-0.0001140447f,-0.000114779f,-0.0001154124f,-0.0001159406f,-0.0001163591f,-0.0001166634f,-0.0001168492f,-0.0001169118f,-0.000116847f,-0.0001166501f,-0.0001163167f,-0.0001158424f,-0.0001152229f,-0.0001144535f,-0.0001135301f,-0.0001124482f,-0.0001112036f,-0.000109792f,-0.0001082092f,-0.0001064511f,-0.0001045136f,-0.0001023926f,-0.0001000842f,-0.00009758458f,-0.00009488994f,-0.00009199658f,-0.0000889009f,-0.00008559941f,-0.00008208873f,-0.00007836559f,-0.00007442685f,-0.00007026945f,-0.00006589054f,-0.00006128734f,-0.00005645724f,-0.00005139777f,-0.00004610663f,-0.00004058166f,-0.00003482089f,-0.0000288225f,-0.00002258486f,-0.00001610654f,-0.000009386258f,-0.000002422962f,0.000004784214f,0.00001223593f,0.00001993262f,0.00002787454f,0.00003606169f,0.00004449385f,0.00005317058f,0.0000620912f,0.00007125478f,0.00008066017f,0.00009030596f,0.0001001905f,0.0001103118f,0.0001206677f,0.0001312558f,0.0001420733f,0.0001531173f,0.0001643846f,0.0001758714f,0.0001875742f,0.0001994887f,0.0002116105f,0.000223935f,0.0002364573f,0.000249172f,0.0002620737f,0.0002751564f,0.0002884141f,0.0003018404f,0.0003154284f,0.0003291712f,0.0003430615f,0.0003570916f,0.0003712537f,0.0003855395f,0.0003999405f,0.000414448f,0.0004290529f,0.0004437457f,0.0004585169f,0.0004733566f,0.0004882544f,0.0005031999f,0.0005181824f,0.0005331907f,0.0005482137f,0.0005632396f,0.0005782567f,0.0005932528f,0.0006082157f,0.0006231329f,0.0006379913f,0.0006527781f,0.0006674799f,0.0006820834f,0.0006965747f,0.0007109399f,0.0007251651f,0.0007392359f,0.0007531379f,0.0007668564f,0.0007803766f,0.0007936836f,0.0008067623f,0.0008195976f,0.0008321739f,0.000844476f,0.0008564882f,0.0008681949f,0.0008795803f,0.0008906288f,0.0009013244f,0.0009116511f,0.0009215932f,0.0009311347f,0.0009402594f,0.0009489518f,0.0009571955f,0.0009649748f,0.0009722738f,0.0009790767f,0.0009853678f,0.0009911316f,0.0009963523f,0.001001015f,0.001005103f,0.001008603f,0.001011499f,0.001013776f,0.00101542f,0.001016417f,0.001016751f,0.00101641f,0.001015379f,0.001013645f,0.001011195f,0.001008016f,0.001004095f,0.0009994205f,0.0009939804f,0.0009877633f,0.0009807578f,0.0009729532f,0.0009643392f,0.000954906f,0.0009446439f,0.0009335442f,0.0009215981f,0.0009087975f,0.000895135f,0.0008806036f,0.0008651965f,0.000848908f,0.0008317325f,0.0008136652f,0.000794702f,0.000774839f,0.0007540731f,0.0007324021f,0.0007098241f,0.000686338f,0.0006619433f,0.0006366402f,0.0006104296f,0.0005833131f,0.0005552928f,0.0005263721f,0.0004965544f,0.0004658444f,0.0004342471f,0.0004017687f,0.0003684158f,0.0003341961f,0.0002991177f,0.0002631898f,0.0002264222f,0.0001888257f,0.0001504118f,0.0001111927f,0.00007118154f,0.00003039229f,-0.00001116031f,-0.00005346067f,-0.0000964924f,-0.0001402383f,-0.0001846802f,-0.0002297993f,-0.0002755758f,-0.0003219893f,-0.0003690184f,-0.0004166407f,-0.0004648334f,-0.0005135727f,-0.0005628338f,-0.0006125913f,-0.000662819f,-0.0007134899f,-0.0007645761f,-0.0008160491f,-0.0008678794f,-0.000920037f,-0.0009724909f,-0.00102521f,-0.001078161f,-0.001131311f,-0.001184627f,-0.001238074f,-0.001291617f,-0.00134522f,-0.001398848f,-0.001452461f,-0.001506024f,-0.001559498f,-0.001612844f,-0.001666023f,-0.001718994f,-0.001771718f,-0.001824153f,-0.001876258f,-0.001927992f,-0.001979311f,-0.002030175f,-0.002080539f,-0.00213036f,-0.002179594f,-0.002228199f,-0.002276128f,-0.002323339f,-0.002369787f,-0.002415426f,-0.002460211f,-0.002504098f,-0.002547042f,-0.002588998f,-0.002629919f,-0.002669761f,-0.002708479f,-0.002746028f,-0.002782363f,-0.002817438f,-0.002851211f,-0.002883635f,-0.002914667f,-0.002944263f,-0.00297238f,-0.002998974f,-0.003024003f,-0.003047425f,-0.003069197f,-0.003089278f,-0.003107628f,-0.003124206f,-0.003138973f,-0.00315189f,-0.003162918f,-0.003172021f,-0.003179162f,-0.003184305f,-0.003187414f,-0.003188456f,-0.003187397f,-0.003184207f,-0.003178852f,-0.003171303f,-0.003161532f,-0.003149509f,-0.003135209f,-0.003118605f,-0.003099674f,-0.003078392f,-0.003054736f,-0.003028688f,-0.003000228f,-0.002969338f,-0.002936001f,-0.002900203f,-0.002861931f,-0.002821172f,-0.002777917f,-0.002732157f,-0.002683884f,-0.002633093f,-0.002579781f,-0.002523945f,-0.002465585f,-0.002404703f,-0.002341301f,-0.002275385f,-0.002206962f,-0.00213604f,-0.002062629f,-0.001986742f,-0.001908393f,-0.001827599f,-0.001744377f,-0.001658747f,-0.001570732f,-0.001480356f,-0.001387644f,-0.001292624f,-0.001195326f,-0.001095782f,-0.0009940268f,-0.0008900951f,-0.0007840253f,-0.0006758572f,-0.000565633f,-0.0004533964f,-0.0003391936f,-0.0002230724f,-0.000105083f,0.00001472269f,0.0001362908f,0.0002595653f,0.0003844883f,0.0005110001f,0.0006390389f,0.0007685409f,0.0008994406f,0.001031671f,0.001165162f,0.001299842f,0.00143564f,0.00157248f,0.001710286f,0.001848979f,0.001988479f,0.002128706f,0.002269576f,0.002411004f,0.002552905f,0.002695189f,0.002837768f,0.002980551f,0.003123446f,0.00326636f,0.003409198f,0.003551865f,0.003694262f,0.003836291f,0.003977854f,0.00411885f,0.004259177f,0.004398733f,0.004537415f,0.00467512f,0.004811741f,0.004947175f,0.005081315f,0.005214054f,0.005345285f,0.005474902f,0.005602796f,0.005728859f,0.005852982f,0.005975059f,0.006094979f,0.006212635f,0.006327918f,0.00644072f,0.006550934f,0.00665845f,0.006763163f,0.006864965f,0.006963751f,0.007059414f,0.00715185f,0.007240955f,0.007326625f,0.007408758f,0.007487254f,0.007562011f,0.007632932f,0.007699918f,0.007762874f,0.007821703f,0.007876316f,0.007926617f,0.007972518f,0.00801393f,0.008050769f,0.008082949f,0.008110387f,0.008133005f,0.008150723f,0.008163468f,0.008171163f,0.00817374f,0.00817113f,0.008163267f,0.008150087f,0.008131531f,0.008107541f,0.008078063f,0.008043045f,0.008002439f,0.007956197f,0.007904279f,0.007846646f,0.007783261f,0.007714093f,0.007639111f,0.007558292f,0.007471613f,0.007379055f,0.007280606f,0.007176253f,0.007065989f,0.006949811f,0.006827721f,0.006699723f,0.006565826f,0.006426041f,0.006280387f,0.006128883f,0.005971555f,0.005808432f,0.005639548f,0.005464939f,0.005284648f,0.005098721f,0.004907209f,0.004710167f,0.004507652f,0.00429973f,0.004086467f,0.003867937f,0.003644215f,0.003415383f,0.003181526f,0.002942733f,0.002699099f,0.002450722f,0.002197705f,0.001940155f,0.001678183f,0.001411905f,0.001141442f,0.000866916f,0.0005884565f,0.0003061958f,0.00002027045f,-0.000269179f,-0.0005620078f,-0.0008580672f,-0.001157205f,-0.001459264f,-0.001764085f,-0.002071504f,-0.002381352f,-0.002693458f,-0.003007648f,-0.003323744f,-0.003641563f,-0.003960921f,-0.004281629f,-0.004603496f,-0.004926328f,-0.005249927f,-0.005574093f,-0.005898623f,-0.006223311f,-0.006547949f,-0.006872326f,-0.00719623f,-0.007519444f,-0.007841753f,-0.008162936f,-0.008482771f,-0.008801037f,-0.009117509f,-0.009431961f,-0.009744165f,-0.01005389f,-0.01036091f,-0.010665f,-0.01096591f,-0.01126343f,-0.01155732f,-0.01184733f,-0.01213325f,-0.01241484f,-0.01269186f,-0.01296409f,-0.01323128f,-0.01349321f,-0.01374965f,-0.01400036f,-0.01424511f,-0.01448369f,-0.01471586f,-0.01494139f,-0.01516007f,-0.01537166f,-0.01557596f,-0.01577274f,-0.01596179f,-0.01614289f,-0.01631584f,-0.01648043f,-0.01663646f,-0.01678371f,-0.016922f,-0.01705114f,-0.01717092f,-0.01728117f,-0.01738171f,-0.01747235f,-0.01755291f,-0.01762324f,-0.01768317f,-0.01773253f,-0.01777117f,-0.01779895f,-0.01781571f,-0.01782132f,-0.01781564f,-0.01779855f,-0.01776993f,-0.01772966f,-0.01767763f,-0.01761373f,-0.01753788f,-0.01744997f,-0.01734994f,-0.01723769f,-0.01711316f,-0.0169763f,-0.01682703f,-0.01666532f,-0.01649113f,-0.01630442f,-0.01610517f,-0.01589336f,-0.01566898f,-0.01543203f,-0.01518252f,-0.01492045f,-0.01464587f,-0.01435879f,-0.01405925f,-0.01374731f,-0.01342301f,-0.01308644f,-0.01273765f,-0.01237674f,-0.01200379f,-0.0116189f,-0.01122219f,-0.01081377f,-0.01039376f,-0.009962313f,-0.009519557f,-0.009065652f,-0.008600758f,-0.008125048f,-0.0076387f,-0.007141904f,-0.006634858f,-0.006117766f,-0.005590844f,-0.005054317f,-0.004508416f,-0.003953383f,-0.003389467f,-0.002816927f,-0.002236029f,-0.001647047f,-0.001050266f,-0.0004459769f,0.000165521f,0.0007839202f,0.001408905f,0.002040152f,0.002677331f,0.003320103f,0.003968121f,0.004621034f,0.005278481f,0.005940095f,0.0066055f,0.007274317f,0.007946159f,0.008620631f,0.009297334f,0.009975861f,0.0106558f,0.01133674f,0.01201825f,0.01269991f,0.01338128f,0.01406193f,0.01474141f,0.01541928f,0.01609509f,0.01676838f,0.01743869f,0.01810557f,0.01876855f,0.01942716f,0.02008093f,0.02072939f,0.02137206f,0.02200848f,0.02263816f,0.02326062f,0.02387539f,0.02448198f,0.02507991f,0.0256687f,0.02624788f,0.02681695f,0.02737544f,0.02792288f,0.02845878f,0.02898267f,0.02949408f,0.02999254f,0.03047758f,0.03094872f,0.03140552f,0.03184751f,0.03227424f,0.03268526f,0.03308013f,0.03345839f,0.03381962f,0.0341634f,0.03448929f,0.03479686f,0.03508573f,0.03535548f,0.03560571f,0.03583604f,0.03604608f,0.03623546f,0.03640382f,0.03655079f,0.03667603f,0.03677921f,0.03685999f,0.03691806f,0.03695311f,0.03696484f,0.03695297f,0.03691722f,0.03685733f,0.03677304f,0.03666413f,0.03653035f,0.0363715f,0.03618737f,0.03597778f,0.03574255f,0.03548152f,0.03519455f,0.03488149f,0.03454224f,0.03417668f,0.03378474f,0.03336633f,0.0329214f,0.03244991f,0.03195183f,0.03142714f,0.03087586f,0.030298f,0.02969361f,0.02906274f,0.02840545f,0.02772185f,0.02701204f,0.02627613f,0.02551428f,0.02472663f,0.02391337f,0.0230747f,0.02221081f,0.02132195f,0.02040835f,0.0194703f,0.01850806f,0.01752196f,0.01651229f,0.01547941f,0.01442367f,0.01334546f,0.01224515f,0.01112318f,0.009979959f,0.008815948f,0.007631614f,0.006427442f,0.005203937f,0.003961621f,0.002701037f,0.001422742f,0.0001273141f,-0.001184653f,-0.002512547f,-0.003855737f,-0.005213577f,-0.006585402f,-0.007970529f,-0.00936826f,-0.01077788f,-0.01219865f,-0.01362984f,-0.01507066f,-0.01652035f,-0.01797809f,-0.0194431f,-0.02091452f,-0.02239153f,-0.02387326f,-0.02535884f,-0.02684739f,-0.028338f,-0.02982976f,-0.03132175f,-0.03281301f,-0.03430261f,-0.03578957f,-0.03727291f,-0.03875165f,-0.04022479f,-0.04169131f,-0.04315019f,-0.0446004f,-0.0460409f,-0.04747063f,-0.04888854f,-0.05029355f,-0.05168458f,-0.05306056f,-0.05442039f,-0.05576296f,-0.05708718f,-0.05839193f,-0.0596761f,-0.06093856f,-0.06217818f,-0.06339383f,-0.06458439f,-0.06574871f,-0.06688564f,-0.06799406f,-0.06907281f,-0.07012075f,-0.07113673f,-0.07211961f,-0.07306824f,-0.07398148f,-0.07485817f,-0.07569721f,-0.07649741f,-0.07725767f,-0.07797684f,-0.0786538f,-0.07928742f,-0.07987659f,-0.0804202f,-0.08091713f,-0.08136629f,-0.08176658f,-0.08211693f,-0.08241626f,-0.08266348f,-0.08285757f,-0.08299746f,-0.0830821f,-0.08311049f,-0.0830816f,-0.08299442f,-0.08284799f,-0.0826413f,-0.0823734f,-0.08204335f,-0.0816502f,-0.08119304f,-0.08067096f,-0.08008306f,-0.0794285f,-0.0787064f,-0.07791593f,-0.07705627f,-0.07612661f,-0.07512619f,-0.07405424f,-0.07291f,-0.07169278f,-0.07040184f,-0.06903653f,-0.06759617f,-0.06608013f,-0.0644878f,-0.06281858f,-0.0610719f,-0.05924723f,-0.05734402f,-0.05536178f,-0.05330006f,-0.05115838f,-0.04893633f,-0.04663351f,-0.04424955f,-0.04178409f,-0.03923682f,-0.03660745f,-0.03389569f,-0.03110133f,-0.02822413f,-0.02526391f,-0.02222052f,-0.01909383f,-0.01588372f,-0.01259014f,-0.009213022f,-0.00575236f,-0.002208161f,0.001419533f,0.005130656f,0.008925108f,0.01280277f,0.01676347f,0.02080704f,0.02493326f,0.02914189f,0.03343265f,0.03780524f,0.04225933f,0.04679457f,0.05141056f,0.05610688f,0.06088309f,0.06573872f,0.07067324f,0.07568614f,0.08077685f,0.08594477f,0.09118929f,0.09650976f,0.1019055f,0.1073758f,0.11292f,0.1185372f,0.1242267f,0.1299877f,0.1358194f,0.1417208f,0.1476911f,0.1537294f,0.1598347f,0.166006f,0.1722424f,0.1785428f,0.1849062f,0.1913315f,0.1978177f,0.2043636f,0.210968f,0.2176299f,0.224348f,0.2311212f,0.2379481f,0.2448276f,0.2517585f,0.2587393f,0.2657689f,0.2728458f,0.2799688f,0.2871364f,0.2943474f,0.3016003f,0.3088937f,0.3162261f,0.3235962f,0.3310025f,0.3384435f,0.3459177f,0.3534236f,0.3609598f,0.3685246f,0.3761167f,0.3837343f,0.391376f,0.3990403f,0.4067255f,0.4144301f,0.4221524f,0.4298909f,0.437644f,0.44541f,0.4531875f,0.4609746f,0.4687699f,0.4765718f,0.4843785f,0.4921884f,0.5f,0.4921885f,0.4843785f,0.4765718f,0.4687699f,0.4609746f,0.4531875f,0.44541f,0.4376439f,0.4298909f,0.4221524f,0.41443f,0.4067255f,0.3990403f,0.391376f,0.3837343f,0.3761167f,0.3685246f,0.3609598f,0.3534237f,0.3459177f,0.3384435f,0.3310025f,0.3235962f,0.3162261f,0.3088936f,0.3016003f,0.2943474f,0.2871364f,0.2799687f,0.2728457f,0.2657688f,0.2587394f,0.2517585f,0.2448276f,0.2379481f,0.2311212f,0.224348f,0.2176298f,0.210968f,0.2043636f,0.1978177f,0.1913315f,0.1849062f,0.1785428f,0.1722424f,0.166006f,0.1598346f,0.1537294f,0.1476911f,0.1417208f,0.1358194f,0.1299878f,0.1242267f,0.1185372f,0.11292f,0.1073758f,0.1019055f,0.09650975f,0.09118927f,0.08594477f,0.08077681f,0.07568616f,0.07067323f,0.06573874f,0.0608831f,0.05610687f,0.05141056f,0.04679453f,0.04225934f,0.03780526f,0.03343266f,0.02914184f,0.02493328f,0.02080703f,0.01676345f,0.01280278f,0.00892508f,0.005130649f,0.001419544f,-0.002208233f,-0.005752325f,-0.00921309f,-0.01259017f,-0.01588368f,-0.01909387f,-0.02222049f,-0.02526391f,-0.02822423f,-0.03110135f,-0.03389573f,-0.03660738f,-0.0392369f,-0.04178405f,-0.04424953f,-0.0466336f,-0.04893625f,-0.05115831f,-0.05330002f,-0.05536187f,-0.05734408f,-0.05924726f,-0.06107199f,-0.06281865f,-0.06448781f,-0.06608009f,-0.0675962f,-0.06903648f,-0.07040191f,-0.07169282f,-0.07290995f,-0.07405424f,-0.07512617f,-0.07612669f,-0.07705629f,-0.07791603f,-0.07870638f,-0.07942855f,-0.08008301f,-0.08067095f,-0.08119309f,-0.08165026f,-0.08204329f,-0.08237338f,-0.08264124f,-0.08284795f,-0.08299446f,-0.0830816f,-0.08311057f,-0.08308208f,-0.08299744f,-0.08285761f,-0.08266354f,-0.0824163f,-0.08211684f,-0.08176649f,-0.0813663f,-0.08091712f,-0.08042014f,-0.07987666f,-0.07928741f,-0.07865381f,-0.07797694f,-0.07725763f,-0.07649732f,-0.07569718f,-0.07485819f,-0.07398152f,-0.07306826f,-0.07211959f,-0.07113671f,-0.07012081f,-0.06907272f,-0.06799412f,-0.06688571f,-0.06574869f,-0.06458437f,-0.06339383f,-0.06217813f,-0.0609386f,-0.05967605f,-0.05839193f,-0.05708718f,-0.05576301f,-0.05442035f,-0.05306053f,-0.05168462f,-0.05029356f,-0.04888844f,-0.04747057f,-0.04604089f,-0.04460049f,-0.04315019f,-0.0416913f,-0.04022479f,-0.03875172f,-0.03727293f,-0.03578949f,-0.03430259f,-0.03281295f,-0.03132176f,-0.02982974f,-0.02833807f,-0.02684736f,-0.0253588f,-0.02387321f,-0.02239156f,-0.02091455f,-0.01944304f,-0.01797807f,-0.01652038f,-0.01507068f,-0.01362991f,-0.01219857f,-0.01077783f,-0.0093683f,-0.007970572f,-0.00658536f,-0.005213618f,-0.003855705f,-0.002512574f,-0.001184583f,0.0001273155f,0.001422763f,0.002701044f,0.003961623f,0.005203903f,0.006427407f,0.0076316f,0.008815885f,0.009979963f,0.01112318f,0.01224518f,0.01334548f,0.01442367f,0.01547939f,0.01651227f,0.01752192f,0.01850808f,0.01947027f,0.02040833f,0.02132195f,0.02221084f,0.02307469f,0.02391338f,0.02472663f,0.02551425f,0.02627611f,0.02701205f,0.02772182f,0.02840543f,0.02906269f,0.0296936f,0.03029799f,0.0308758f,0.03142715f,0.03195179f,0.0324499f,0.03292137f,0.03336632f,0.03378469f,0.03417671f,0.0345422f,0.03488147f,0.03519458f,0.03548151f,0.03574252f,0.03597778f,0.03618735f,0.03637147f,0.03653032f,0.03666413f,0.03677303f,0.03685731f,0.03691721f,0.03695297f,0.03696483f,0.03695309f,0.03691804f,0.03685999f,0.03677922f,0.03667599f,0.03655076f,0.03640378f,0.03623545f,0.03604609f,0.03583604f,0.03560567f,0.03535551f,0.03508574f,0.03479683f,0.03448927f,0.03416342f,0.03381962f,0.03345841f,0.0330801f,0.03268528f,0.03227425f,0.03184748f,0.03140551f,0.0309487f,0.03047758f,0.02999252f,0.02949405f,0.0289827f,0.02845877f,0.02792287f,0.0273754f,0.02681696f,0.02624792f,0.02566868f,0.02507991f,0.02448195f,0.02387536f,0.02326065f,0.02263814f,0.02200848f,0.02137208f,0.02072942f,0.02008092f,0.01942718f,0.01876855f,0.01810557f,0.01743865f,0.0167684f,0.0160951f,0.01541924f,0.01474142f,0.01406193f,0.0133813f,0.0126999f,0.01201826f,0.01133674f,0.01065576f,0.009975851f,0.009297311f,0.00862062f,0.007946134f,0.00727433f,0.006605506f,0.005940139f,0.005278468f,0.004621029f,0.00396812f,0.003320098f,0.002677321f,0.002040148f,0.001408935f,0.0007839203f,0.0001655221f,-0.000445962f,-0.001050234f,-0.001646996f,-0.002236009f,-0.002816916f,-0.003389478f,-0.003953457f,-0.004508495f,-0.005054355f,-0.005590916f,-0.006117821f,-0.006634831f,-0.007141948f,-0.007638693f,-0.008125067f,-0.008600712f,-0.009065628f,-0.009519577f,-0.00996232f,-0.01039374f,-0.01081371f,-0.01122224f,-0.01161897f,-0.01200378f,-0.01237667f,-0.01273763f,-0.01308644f,-0.01342309f,-0.01374722f,-0.01405919f,-0.01435876f,-0.01464581f,-0.01492047f,-0.0151825f,-0.01543212f,-0.01566899f,-0.01589334f,-0.01610518f,-0.01630437f,-0.01649117f,-0.01666534f,-0.01682711f,-0.01697636f,-0.01711321f,-0.01723778f,-0.01734996f,-0.01744998f,-0.01753783f,-0.01761365f,-0.01767755f,-0.01772964f,-0.01776993f,-0.01779854f,-0.01781559f,-0.01782131f,-0.01781571f,-0.0177989f,-0.01777112f,-0.0177325f,-0.01768315f,-0.01762319f,-0.01755285f,-0.01747227f,-0.01738179f,-0.01728117f,-0.01717103f,-0.01705122f,-0.016922f,-0.01678371f,-0.01663649f,-0.01648045f,-0.01631582f,-0.01614285f,-0.01596177f,-0.0157727f,-0.01557589f,-0.01537168f,-0.01516008f,-0.01494145f,-0.01471591f,-0.01448369f,-0.01424503f,-0.0140003f,-0.0137496f,-0.0134933f,-0.01323128f,-0.01296413f,-0.01269186f,-0.01241481f,-0.01213324f,-0.01184738f,-0.01155734f,-0.01126349f,-0.01096594f,-0.01066494f,-0.01036084f,-0.01005387f,-0.009744167f,-0.009431958f,-0.009117484f,-0.008800983f,-0.008482695f,-0.008162975f,-0.007841825f,-0.007519484f,-0.007196188f,-0.006872296f,-0.006547928f,-0.006223321f,-0.005898714f,-0.005574107f,-0.005249977f,-0.004926324f,-0.004603505f,-0.00428164f,-0.003960967f,-0.003641605f,-0.003323674f,-0.00300765f,-0.002693415f,-0.002381444f,-0.0020715f,-0.001764059f,-0.001459241f,-0.001157165f,-0.0008580685f,-0.0005620718f,-0.0002691746f,0.00002026558f,0.0003061891f,0.0005884171f,0.00086689f,0.001141429f,0.001411915f,0.001678169f,0.001940131f,0.002197742f,0.002450705f,0.002699077f,0.002942741f,0.003181517f,0.003415346f,0.003644228f,0.003867924f,0.004086494f,0.0042997f,0.004507661f,0.004710138f,0.004907191f,0.00509876f,0.005284607f,0.005464911f,0.005639553f,0.005808413f,0.005971551f,0.006128848f,0.006280363f,0.006426036f,0.006565809f,0.006699741f,0.006827712f,0.006949842f,0.007065952f,0.00717622f,0.007280588f,0.007379055f,0.007471621f,0.007558286f,0.00763911f,0.007714093f,0.007783294f,0.007846653f,0.007904232f,0.007956147f,0.0080024f,0.008042991f,0.008078039f,0.008107543f,0.008131504f,0.008150041f,0.008163273f,0.008171082f,0.008173704f,0.008171141f,0.008163452f,0.008150697f,0.008132994f,0.008110344f,0.008082926f,0.00805074f,0.008013904f,0.007972479f,0.007926583f,0.007876337f,0.007821739f,0.007762909f,0.007699907f,0.007632911f,0.007562041f,0.007487237f,0.007408738f,0.007326603f,0.007240951f,0.007151842f,0.007059395f,0.00696373f,0.006864965f,0.00676316f,0.006658435f,0.006550908f,0.006440699f,0.006327927f,0.006212592f,0.006094933f,0.005975068f,0.005852997f,0.005728841f,0.005602777f,0.005474865f,0.005345285f,0.005214036f,0.005081356f,0.004947186f,0.004811764f,0.00467509f,0.004537404f,0.004398704f,0.004259169f,0.00411886f,0.003977835f,0.003836274f,0.003694236f,0.003551841f,0.003409147f,0.003266394f,0.003123462f,0.00298053f,0.002837777f,0.002695203f,0.002552867f,0.002410948f,0.002269566f,0.00212872f,0.001988471f,0.001848996f,0.001710296f,0.00157243f,0.001435637f,0.001299858f,0.001165152f,0.001031697f,0.0008994341f,0.0007685423f,0.0006390214f,0.0005110502f,0.0003845096f,0.0002595782f,0.0001363158f,0.00001466274f,-0.0001051426f,-0.0002230406f,-0.0003392696f,-0.0004534721f,-0.0005656481f,-0.0006759167f,-0.0007840395f,-0.0008900166f,-0.0009939671f,-0.001095772f,-0.001195312f,-0.001292586f,-0.001387596f,-0.001480341f,-0.001570702f,-0.001658797f,-0.00174439f,-0.001827598f,-0.001908422f,-0.001986742f,-0.002062678f,-0.002136111f,-0.002207041f,-0.002275467f,-0.00234139f,-0.00240469f,-0.002465606f,-0.002524018f,-0.002579808f,-0.002633095f,-0.002683997f,-0.002732158f,-0.002777815f,-0.002821088f,-0.002861857f,-0.002900124f,-0.002936006f,-0.002969265f,-0.00300014f,-0.003028631f,-0.003054738f,-0.003078341f,-0.00309968f,-0.003118634f,-0.003135204f,-0.003149509f,-0.00316155f,-0.003171325f,-0.003178835f,-0.003184199f,-0.003187418f,-0.003188491f,-0.003187418f,-0.003184319f,-0.003179193f,-0.00317204f,-0.003162861f,-0.003151894f,-0.0031389f,-0.003124237f,-0.003107548f,-0.00308919f,-0.003069162f,-0.003047347f,-0.003023982f,-0.002998948f,-0.002972364f,-0.002944231f,-0.002914667f,-0.002883554f,-0.002851129f,-0.002817392f,-0.002782345f,-0.002745986f,-0.002708435f,-0.002669811f,-0.002629995f,-0.002589107f,-0.002547145f,-0.00250411f,-0.002460241f,-0.002415419f,-0.002369881f,-0.002323389f,-0.002276182f,-0.00222826f,-0.002179623f,-0.002130389f,-0.00208056f,-0.002030253f,-0.001979351f,-0.001927972f,-0.001876235f,-0.001824141f,-0.001771688f,-0.001718998f,-0.001666069f,-0.001612782f,-0.001559496f,-0.001505971f,-0.001452446f,-0.001398802f,-0.001345158f,-0.001291633f,-0.001237988f,-0.001184583f,-0.001131296f,-0.001078129f,-0.0010252f,-0.0009723902f,-0.0009199381f,-0.0008678436f,-0.0008161068f,-0.0007646084f,-0.0007135868f,-0.0006629229f,-0.0006126165f,-0.0005629063f,-0.0005136728f,-0.0004649162f,-0.0004166365f,-0.000369072f,-0.0003219843f,-0.0002756119f,-0.0002298355f,-0.0001846552f,-0.0001403093f,-0.00009655952f,-0.00005352497f,-0.00001120567f,0.00003039837f,0.00007116795f,0.0001111627f,0.0001503825f,0.0001888275f,0.000226438f,0.0002632141f,0.0002991557f,0.0003342032f,0.0003684163f,0.0004017949f,0.0004342794f,0.0004658699f,0.0004965663f,0.000526309f,0.0005552769f,0.0005832911f,0.0006104112f,0.0006366372f,0.0006619096f,0.0006862879f,0.0007097721f,0.0007323623f,0.0007540584f,0.0007748008f,0.0007947087f,0.000813663f,0.0008317232f,0.0008488894f,0.0008651614f,0.000880599f,0.0008951426f,0.000908792f,0.000921607f,0.0009335279f,0.0009446144f,0.000954926f,0.0009643435f,0.0009729266f,0.0009807348f,0.0009877682f,0.0009939671f,0.0009993911f,0.0010041f,0.001008034f,0.001011193f,0.001013637f,0.001015365f,0.001016378f,0.001016736f,0.001016438f,0.001015425f,0.001013756f,0.001011491f,0.00100857f,0.001005113f,0.001001f,0.0009963512f,0.000991106f,0.000985384f,0.0009790659f,0.000972271f,0.0009649396f,0.000957191f,0.0009489655f,0.0009402633f,0.0009311438f,0.000921607f,0.000911653f,0.0009013414f,0.0008906126f,0.0008795857f,0.0008682013f,0.0008564591f,0.0008444786f,0.0008321404f,0.0008195639f,0.0008067489f,0.0007936358f,0.000780344f,0.0007668138f,0.0007531047f,0.0007392168f,0.0007251501f,0.0007109046f,0.0006965399f,0.000682056f,0.0006674528f,0.0006527305f,0.0006379485f,0.000623107f,0.0006082058f,0.000593245f,0.0005782247f,0.0005632043f,0.0005481839f,0.0005331635f,0.0005182028f,0.000503242f,0.0004882813f,0.0004733801f,0.0004585385f,0.0004437566f,0.0004290938f,0.0004144907f,0.0003999472f,0.0003855824f,0.0003712773f,0.0003570914f,0.0003430843f,0.0003291965f,0.0003154278f,0.0003018379f,0.0002884269f,0.000275135f,0.0002620816f,0.000249207f,0.0002364516f,0.0002239347f,0.0002115965f,0.0001994967f,0.0001875758f,0.0001758933f,0.0001643896f,0.0001531243f,0.0001420975f,0.0001312494f,0.0001206398f,0.0001103282f,0.0001001954f,0.00009030104f,0.00008064508f,0.00007122755f,0.00006210804f,0.00005316734f,0.00004446507f,0.00003600121f,0.00002789497f,0.00001990795f,0.00001227856f,0.000004768372f,-0.000002384186f,-0.000009417534f,-0.00001609325f,-0.00002264977f,-0.00002884865f,-0.00003480911f,-0.00004065037f,-0.000046134f,-0.0000513792f,-0.0000565052f,-0.00006127357f,-0.00006592274f,-0.00007033348f,-0.0000743866f,-0.0000783205f,-0.0000821352f,-0.00008559227f,-0.00008893013f,-0.00009202957f,-0.00009489059f,-0.00009763241f,-0.0001001358f,-0.0001024008f,-0.0001045465f,-0.0001064539f,-0.000108242f,-0.0001097918f,-0.0001112223f,-0.0001124144f,-0.0001134872f,-0.0001144409f,-0.0001152754f,-0.0001158714f,-0.0001163483f,-0.0001167059f,-0.0001168251f,-0.0001169443f,-0.0001168251f,-0.0001167059f,-0.0001163483f,-0.0001159906f,-0.0001153946f,-0.0001147985f,-0.0001140833f,-0.0001132488f,-0.0001122952f,-0.0001113415f,-0.0001101494f,-0.0001090765f,-0.0001077652f,-0.0001064539f,-0.0001050234f,-0.0001035929f,-0.0001021624f,-0.0001006126f,-0.00009894371f,-0.00009727478f,-0.00009560585f,-0.00009381771f,-0.00009202957f,-0.00009024143f,-0.00008845329f,-0.00008654594f,-0.0000846386f,-0.00008273125f,-0.0000808239f,-0.00007891655f,-0.0000770092f,-0.00007498264f,-0.00007307529f,-0.00007116795f,-0.00006914139f,-0.00006723404f,-0.00006532669f,-0.00006330013f,-0.00006139278f,-0.00005948544f,-0.00005757809f,-0.00005578995f,-0.0000538826f,-0.00005197525f,-0.00005018711f,-0.00004839897f,-0.00004661083f,-0.0000449419f,-0.00004315376f,-0.00004148483f,-0.00003993511f,-0.00003826618f,-0.00003671646f,-0.00003516674f,-0.00003361702f,-0.0000320673f,-0.00003063679f,-0.00002920628f,-0.00002789497f,-0.00002658367f,-0.00002527237f,-0.00002396107f,-0.00002276897f,-0.00002157688f,-0.00002038479f,-0.0000193119f,-0.00001823902f,-0.00001716614f,-0.00001621246f,-0.00001525879f,-0.00001430511f,-0.00001347065f,-0.00001263618f,-0.00001180172f,-0.00001096725f,-0.000010252f,-0.000009536743f,-0.000008940697f,-0.000008225441f,-0.000007629395f,-0.000007033348f,-0.000006556511f,-0.000005960464f,-0.000005483627f,-0.000005125999f,-0.000004649162f,-0.000004291534f,-0.000003814697f,-0.000003457069f,-0.000003218651f,-0.000002861023f,-0.000002622604f,-0.000002264977f,-0.000002026558f,-0.000001788139f,-0.00000166893f,-0.000001430511f,-0.000001311302f,-0.000001072884f,-0.0000009536743f,-0.000000834465f,-0.0000007152557f,-0.0000005960464f,-0.0000005960464f,-0.0000004768372f,-0.0000003576279f,-0.0000003576279f,-0.0000002384186f,-0.0000002384186f,-0.0000001192093f,-0.0000001192093f,-0.0000001192093f,-0.0000001192093f,-0.0000001192093f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f}; +//const float sinc[] = {-0.0000000000000004146626f,-0.0000000008153554f,-0.000000006608794f,-0.00000002231452f,-0.00000005271932f,-0.0000001028222f,-0.0000001770186f,-0.0000002801043f,-0.0000004159667f,-0.0000005887875f,-0.0000008023567f,-0.000001060012f,-0.000001364875f,-0.000001719254f,-0.000002125701f,-0.000002586037f,-0.000003101586f,-0.000003672964f,-0.000004301162f,-0.000004984693f,-0.000005724337f,-0.000006517685f,-0.000007363614f,-0.000008259004f,-0.000009201491f,-0.0000101869f,-0.00001121161f,-0.00001227042f,-0.00001335814f,-0.00001446934f,-0.00001559716f,-0.00001673499f,-0.00001787554f,-0.00001901093f,-0.00002013206f,-0.00002123126f,-0.00002229924f,-0.00002332655f,-0.00002430342f,-0.00002521937f,-0.00002606464f,-0.00002682964f,-0.00002750236f,-0.00002807389f,-0.00002853177f,-0.00002886753f,-0.00002906936f,-0.00002912718f,-0.000029031f,-0.00002877125f,-0.00002833774f,-0.00002772232f,-0.00002691563f,-0.00002590959f,-0.00002469638f,-0.00002326917f,-0.00002162164f,-0.00001974807f,-0.00001764343f,-0.00001530361f,-0.00001272567f,-0.000009907111f,-0.00000684668f,-0.000003544063f,-0.000000000008901719f,0.000003783726f,0.000007804163f,0.00001205734f,0.00001653795f,0.00002123973f,0.00002615455f,0.00003127437f,0.00003658899f,0.00004208669f,0.00004775569f,0.00005358154f,0.00005954991f,0.00006564461f,0.00007184826f,0.00007814272f,0.00008450833f,0.00009092462f,0.00009737042f,0.0001038224f,0.0001102575f,0.0001166518f,0.0001229794f,0.0001292151f,0.0001353321f,0.000141303f,0.0001471007f,0.0001526976f,0.0001580642f,0.0001631721f,0.0001679937f,0.0001724985f,0.0001766593f,0.0001804467f,0.0001838327f,0.0001867896f,0.0001892897f,0.0001913057f,0.0001928118f,0.0001937835f,0.0001941954f,0.0001940243f,0.0001932491f,0.0001918477f,0.0001898017f,0.0001870925f,0.0001837039f,0.0001796213f,0.000174832f,0.0001693253f,0.0001630917f,0.0001561247f,0.0001484201f,0.0001399752f,0.0001307896f,0.0001208665f,0.00011021f,0.00009882782f,0.00008673003f,0.0000739288f,0.00006043956f,0.0000462813f,0.00003147223f,0.00001603677f,0.0000000008828794f,-0.00001660678f,-0.00003375489f,-0.0000514095f,-0.0000695338f,-0.00008808904f,-0.0001070329f,-0.0001263218f,-0.000145909f,-0.0001657452f,-0.0001857798f,-0.0002059596f,-0.0002262292f,-0.0002465314f,-0.0002668072f,-0.0002869967f,-0.0003070371f,-0.0003268659f,-0.000346418f,-0.0003656279f,-0.0003844293f,-0.0004027559f,-0.0004205392f,-0.0004377116f,-0.000454206f,-0.0004699535f,-0.0004848879f,-0.0004989429f,-0.0005120507f,-0.0005241478f,-0.0005351699f,-0.0005450547f,-0.000553741f,-0.00056117f,-0.0005672854f,-0.0005720326f,-0.0005753601f,-0.0005772181f,-0.0005775608f,-0.0005763454f,-0.0005735324f,-0.0005690854f,-0.0005629727f,-0.0005551658f,-0.0005456408f,-0.0005343778f,-0.0005213624f,-0.0005065827f,-0.0004900339f,-0.0004717147f,-0.0004516297f,-0.000429788f,-0.000406206f,-0.0003808998f,-0.0003538964f,-0.0003252267f,-0.0002949268f,-0.0002630385f,-0.000229609f,-0.0001946912f,-0.0001583428f,-0.000120628f,-0.00008161574f,-0.00004138021f,-0.000000001174241f,0.00004243673f,0.00008584376f,0.0001301253f,0.0001751824f,0.0002209108f,0.0002672028f,0.0003139461f,0.0003610245f,0.0004083186f,0.0004557047f,0.0005030571f,0.0005502466f,0.0005971416f,0.0006436078f,0.0006895107f,0.0007347089f,0.0007790703f,0.0008224531f,0.0008647171f,0.0009057221f,0.0009453298f,0.0009834005f,0.001019797f,0.001054382f,0.001087023f,0.001117587f,0.001145945f,0.001171971f,0.001195542f,0.001216542f,0.001234855f,0.001250372f,0.001262989f,0.001272609f,0.001279139f,0.001282493f,0.001282592f,0.001279365f,0.001272746f,0.001262679f,0.001249115f,0.001232014f,0.001211347f,0.001187091f,0.001159229f,0.001127759f,0.001092688f,0.00105403f,0.001011812f,0.0009660691f,0.0009168474f,0.000864203f,0.0008082025f,0.0007489228f,0.0006864509f,0.0006208845f,0.0005523318f,0.0004809105f,0.0004067487f,0.0003299846f,0.0002507657f,0.0001692495f,0.0000856025f,0.0000000001681457f,-0.00008737317f,-0.0001763248f,-0.0002666543f,-0.0003581528f,-0.0004506052f,-0.000543789f,-0.0006374689f,-0.0007314237f,-0.0008254071f,-0.0009191742f,-0.001012476f,-0.001105061f,-0.001196674f,-0.001287056f,-0.001375949f,-0.001463091f,-0.001548222f,-0.001631081f,-0.001711408f,-0.001788947f,-0.001863441f,-0.001934638f,-0.002002289f,-0.002066152f,-0.002125988f,-0.002181563f,-0.002232653f,-0.002279041f,-0.002320517f,-0.002356879f,-0.002387938f,-0.002413512f,-0.002433432f,-0.002447542f,-0.002455695f,-0.002457758f,-0.002453611f,-0.002443153f,-0.002426289f,-0.002402947f,-0.002373065f,-0.002336601f,-0.002293528f,-0.002243834f,-0.002187526f,-0.002124629f,-0.002055183f,-0.001979249f,-0.001896903f,-0.001808241f,-0.001713377f,-0.001612443f,-0.001505588f,-0.00139298f,-0.001274806f,-0.00115127f,-0.001022592f,-0.0008890104f,-0.0007507814f,-0.0006081769f,-0.000461485f,-0.0003110093f,-0.0001570807f,-0.000000008495208f,0.0001598481f,0.0003221285f,0.0004864598f,0.0006524571f,0.000819725f,0.0009878575f,0.00115644f,0.001325049f,0.001493253f,0.001660617f,0.001826699f,0.00199105f,0.002153224f,0.002312767f,0.00246923f,0.002622157f,0.002771102f,0.002915614f,0.003055251f,0.003189574f,0.003318152f,0.003440559f,0.003556381f,0.003665211f,0.003766656f,0.003860328f,0.00394587f,0.004022923f,0.00409115f,0.004150231f,0.004199864f,0.004239767f,0.004269676f,0.004289354f,0.00429858f,0.004297161f,0.004284924f,0.004261725f,0.004227444f,0.004181986f,0.004125285f,0.004057304f,0.003978032f,0.003887486f,0.003785716f,0.003672798f,0.003548839f,0.003413976f,0.003268377f,0.003112238f,0.002945788f,0.002769281f,0.002583016f,0.002387291f,0.002182461f,0.0019689f,0.00174701f,0.001517221f,0.001279992f,0.001035804f,0.0007851754f,0.0005286208f,0.0002667053f,0.000000007400844f,-0.0002708732f,-0.0005453171f,-0.000822686f,-0.001102325f,-0.001383562f,-0.001665712f,-0.001948076f,-0.002229945f,-0.0025106f,-0.002789313f,-0.00306534f,-0.003337967f,-0.003606441f,-0.003870023f,-0.004127973f,-0.004379555f,-0.004624038f,-0.004860698f,-0.005088819f,-0.0053077f,-0.005516648f,-0.005714987f,-0.005902058f,-0.006077222f,-0.006239852f,-0.006389364f,-0.00652518f,-0.006646751f,-0.006753562f,-0.006845124f,-0.00692098f,-0.006980707f,-0.007023915f,-0.007050253f,-0.007059402f,-0.007051091f,-0.007025081f,-0.006981179f,-0.006919236f,-0.006839138f,-0.006740823f,-0.006624273f,-0.006489516f,-0.006336622f,-0.006165716f,-0.005976964f,-0.005770581f,-0.005546832f,-0.005306027f,-0.005048524f,-0.00477473f,-0.004485108f,-0.004180138f,-0.003860373f,-0.003526405f,-0.003178869f,-0.002818443f,-0.002445847f,-0.002061841f,-0.001667227f,-0.001262844f,-0.0008495661f,-0.0004283041f,-0.0000000006289513f,0.0004343705f,0.0008737893f,0.00131726f,0.001763712f,0.002212069f,0.002661236f,0.003110097f,0.003557526f,0.004002382f,0.004443516f,0.004879772f,0.005309992f,0.005733015f,0.006147682f,0.006552839f,0.006947331f,0.007330051f,0.007699865f,0.008055672f,0.008396389f,0.008720956f,0.009028343f,0.009317543f,0.009587592f,0.009837545f,0.01006651f,0.01027363f,0.01045809f,0.01061911f,0.01075599f,0.01086805f,0.01095467f,0.01101531f,0.01104945f,0.01105666f,0.01103655f,0.0109888f,0.01091318f,0.01080948f,0.0106776f,0.01051749f,0.01032917f,0.01011273f,0.009868354f,0.009596256f,0.009296756f,0.00897024f,0.008617165f,0.008238057f,0.007833519f,0.007404223f,0.006950913f,0.006474404f,0.005975578f,0.005455385f,0.00491484f,0.004355025f,0.003777103f,0.003182234f,0.002571699f,0.001946815f,0.001308951f,0.0006595271f,0.000000009461362f,-0.0006680909f,-0.001343222f,-0.002023795f,-0.002708186f,-0.003394742f,-0.004081781f,-0.004767576f,-0.005450455f,-0.006128659f,-0.006800437f,-0.007464038f,-0.008117707f,-0.008759692f,-0.009388247f,-0.01000164f,-0.01059814f,-0.01117607f,-0.01173375f,-0.01226953f,-0.0127818f,-0.01326898f,-0.01372957f,-0.01416208f,-0.01456508f,-0.01493718f,-0.01527709f,-0.01558354f,-0.01585537f,-0.01609145f,-0.01629075f,-0.01645232f,-0.01657528f,-0.01665884f,-0.01670231f,-0.01670508f,-0.01666663f,-0.01658654f,-0.0164645f,-0.01630028f,-0.01609377f,-0.01584496f,-0.01555393f,-0.0152209f,-0.01484616f,-0.01443012f,-0.01397332f,-0.01347637f,-0.01294003f,-0.01236515f,-0.01175264f,-0.01110358f,-0.01041913f,-0.009700547f,-0.008949202f,-0.008166554f,-0.007354157f,-0.006513661f,-0.005646806f,-0.004755417f,-0.003841405f,-0.002906756f,-0.001953536f,-0.0009839179f,-0.00000002677436f,0.0009958354f,0.002001349f,0.003014139f,0.004031789f,0.005051837f,0.006071787f,0.007089114f,0.008101269f,0.009105683f,0.01009978f,0.01108097f,0.01204668f,0.01299429f,0.01392132f,0.01482519f,0.01570338f,0.01655342f,0.01737287f,0.01815933f,0.01891047f,0.019624f,0.02029773f,0.0209295f,0.02151725f,0.02205902f,0.02255288f,0.0229971f,0.02338997f,0.02372991f,0.02401544f,0.02424522f,0.02441803f,0.02453276f,0.02458844f,0.02458423f,0.02451945f,0.02439353f,0.02420606f,0.0239568f,0.02364562f,0.02327256f,0.02283782f,0.02234174f,0.02178482f,0.02116774f,0.0204913f,0.01975648f,0.01896442f,0.01811638f,0.01721383f,0.01625833f,0.01525163f,0.01419561f,0.01309236f,0.01194394f,0.01075272f,0.009521124f,0.008251725f,0.006947211f,0.00561039f,0.004244183f,0.002851616f,0.001435816f,0.000000001403875f,-0.00145252f,-0.002918363f,-0.00439407f,-0.00587606f,-0.00736087f,-0.00884482f,-0.01032424f,-0.01179543f,-0.01325468f,-0.01469825f,-0.01612241f,-0.01752342f,-0.01889757f,-0.02024117f,-0.02155055f,-0.02282209f,-0.02405223f,-0.02523742f,-0.02637431f,-0.0274595f,-0.02848973f,-0.02946183f,-0.03037274f,-0.03121951f,-0.03199932f,-0.03270948f,-0.03334744f,-0.03391081f,-0.03439734f,-0.03480496f,-0.03513174f,-0.03537596f,-0.03553608f,-0.03561075f,-0.03559877f,-0.0354992f,-0.03531127f,-0.03503444f,-0.03466836f,-0.03421291f,-0.03366818f,-0.03303449f,-0.03231237f,-0.03150259f,-0.03060617f,-0.02962425f,-0.02855828f,-0.02740993f,-0.02618106f,-0.02487379f,-0.02349042f,-0.02203347f,-0.02050567f,-0.01890997f,-0.01724951f,-0.01552762f,-0.01374781f,-0.0119138f,-0.0100295f,-0.008098888f,-0.006126203f,-0.004115802f,-0.002072226f,-0.00000002869215f,0.002095997f,0.00421098f,0.006339955f,0.008477859f,0.01061955f,0.01275979f,0.01489339f,0.01701499f,0.01911927f,0.02120086f,0.0232544f,0.02527455f,0.02725591f,0.02919327f,0.03108134f,0.03291493f,0.03468891f,0.03639825f,0.03803802f,0.03960337f,0.04108968f,0.04249235f,0.04380699f,0.04502936f,0.0461554f,0.04718123f,0.04810321f,0.04891787f,0.04962195f,0.05021247f,0.05068666f,0.05104201f,0.05127627f,0.05138747f,0.0513739f,0.05123415f,0.05096708f,0.05057187f,0.05004799f,0.04939524f,0.04861367f,0.04770371f,0.04666609f,0.04550183f,0.04421232f,0.04279922f,0.04126459f,0.03961067f,0.03784013f,0.03595594f,0.03396135f,0.03185993f,0.02965557f,0.02735246f,0.02495498f,0.0224679f,0.01989624f,0.01724527f,0.01452052f,0.01172776f,0.00887305f,0.005962508f,0.003002622f,0.00000002152608f,-0.003038481f,-0.006105907f,-0.009195124f,-0.0122988f,-0.01540967f,-0.01852018f,-0.02162274f,-0.0247097f,-0.02777335f,-0.03080594f,-0.03379967f,-0.03674688f,-0.03963977f,-0.04247065f,-0.04523187f,-0.04791586f,-0.05051514f,-0.05302232f,-0.05543026f,-0.05773184f,-0.05992015f,-0.0619885f,-0.06393037f,-0.06573948f,-0.06740976f,-0.06893552f,-0.0703112f,-0.07153161f,-0.07259185f,-0.07348735f,-0.07421388f,-0.07476757f,-0.07514492f,-0.07534279f,-0.07535845f,-0.07518956f,-0.07483421f,-0.07429089f,-0.07355858f,-0.07263661f,-0.07152481f,-0.07022347f,-0.06873333f,-0.06705556f,-0.06519189f,-0.06314433f,-0.06091555f,-0.05850857f,-0.05592693f,-0.05317461f,-0.05025607f,-0.04717624f,-0.04394036f,-0.04055427f,-0.03702418f,-0.03335674f,-0.029559f,-0.02563841f,-0.02160291f,-0.01746054f,-0.01321998f,-0.008890141f,-0.004480294f,-0.000000002192331f,0.004540871f,0.009132098f,0.01376347f,0.01842427f,0.02310366f,0.02779062f,0.03247395f,0.03714232f,0.0417842f,0.0463882f,0.05094265f,0.05543588f,0.0598562f,0.064192f,0.06843164f,0.07256348f,0.07657623f,0.08045848f,0.08419903f,0.08778686f,0.09121118f,0.0944614f,0.09752715f,0.1003985f,0.1030657f,0.1055193f,0.1077504f,0.1097502f,0.1115106f,0.1130238f,0.1142825f,0.1152799f,0.1160096f,0.1164658f,0.1166434f,0.1165375f,0.1161442f,0.1154599f,0.1144818f,0.1132076f,0.1116357f,0.1097653f,0.1075961f,0.1051285f,0.1023636f,0.09930325f,0.09594999f,0.09230704f,0.08837839f,0.08416864f,0.07968318f,0.07492816f,0.06991026f,0.06463706f,0.05911672f,0.05335823f,0.04737101f,0.04116539f,0.03475232f,0.02814324f,0.02135037f,0.01438651f,0.00726512f,0.00000002611637f,-0.007394183f,-0.01490238f,-0.02250916f,-0.03019838f,-0.03795356f,-0.04575768f,-0.05359355f,-0.0614434f,-0.06928907f,-0.07711238f,-0.0848946f,-0.09261686f,-0.10026f,-0.1078048f,-0.115232f,-0.1225218f,-0.1296549f,-0.1366116f,-0.1433723f,-0.1499174f,-0.1562276f,-0.1622836f,-0.168066f,-0.1735561f,-0.1787352f,-0.1835847f,-0.1880867f,-0.1922233f,-0.1959773f,-0.1993317f,-0.2022702f,-0.2047768f,-0.2068361f,-0.2084333f,-0.2095544f,-0.2101858f,-0.2103146f,-0.2099288f,-0.2090169f,-0.2075684f,-0.2055734f,-0.2030229f,-0.1999089f,-0.1962242f,-0.1919623f,-0.1871178f,-0.1816863f,-0.1756642f,-0.169049f,-0.1618391f,-0.1540339f,-0.1456339f,-0.1366405f,-0.1270562f,-0.1168846f,-0.1061302f,-0.09479851f,-0.08289628f,-0.07043102f,-0.05741157f,-0.04384747f,-0.02974959f,-0.01512949f,-0.00000002739072f,0.01562519f,0.03173161f,0.0483035f,0.0653245f,0.08277708f,0.1006431f,0.1189033f,0.1375377f,0.1565259f,0.175846f,0.195476f,0.2153927f,0.2355728f,0.255992f,0.2766253f,0.2974475f,0.3184327f,0.3395546f,0.3607862f,0.3821005f,0.4034701f,0.424867f,0.4462633f,0.4676306f,0.4889406f,0.5101647f,0.5312744f,0.5522412f,0.5730364f,0.5936315f,0.6139982f,0.6341084f,0.6539341f,0.6734477f,0.6926218f,0.7114294f,0.729844f,0.7478397f,0.7653905f,0.7824718f,0.799059f,0.8151283f,0.8306565f,0.8456216f,0.8600014f,0.8737755f,0.8869239f,0.8994272f,0.9112675f,0.9224272f,0.9328903f,0.9426413f,0.9516659f,0.959951f,0.9674842f,0.9742547f,0.9802522f,0.9854683f,0.9898949f,0.9935255f,0.9963549f,0.9983789f,0.9995946f,0.9999999f,0.9995946f,0.9983789f,0.9963549f,0.9935255f,0.9898949f,0.9854683f,0.9802522f,0.9742547f,0.9674842f,0.959951f,0.9516659f,0.9426413f,0.9328903f,0.9224272f,0.9112675f,0.8994272f,0.8869239f,0.8737755f,0.8600014f,0.8456215f,0.8306565f,0.8151283f,0.799059f,0.7824718f,0.7653905f,0.7478396f,0.729844f,0.7114294f,0.6926218f,0.6734477f,0.6539341f,0.6341084f,0.6139982f,0.5936314f,0.5730364f,0.5522412f,0.5312744f,0.5101647f,0.4889405f,0.4676306f,0.4462633f,0.424867f,0.40347f,0.3821005f,0.3607862f,0.3395546f,0.3184327f,0.2974475f,0.2766253f,0.255992f,0.2355728f,0.2153927f,0.195476f,0.175846f,0.1565259f,0.1375377f,0.1189033f,0.1006431f,0.08277708f,0.0653245f,0.0483035f,0.03173161f,0.01562519f,-0.00000002739072f,-0.01512949f,-0.02974959f,-0.04384747f,-0.05741156f,-0.07043102f,-0.08289627f,-0.09479851f,-0.1061301f,-0.1168846f,-0.1270562f,-0.1366405f,-0.1456338f,-0.1540339f,-0.1618391f,-0.169049f,-0.1756642f,-0.1816863f,-0.1871178f,-0.1919623f,-0.1962242f,-0.1999089f,-0.2030229f,-0.2055734f,-0.2075684f,-0.2090169f,-0.2099288f,-0.2103146f,-0.2101858f,-0.2095544f,-0.2084333f,-0.206836f,-0.2047767f,-0.2022702f,-0.1993317f,-0.1959773f,-0.1922233f,-0.1880867f,-0.1835847f,-0.1787352f,-0.1735561f,-0.168066f,-0.1622836f,-0.1562276f,-0.1499174f,-0.1433723f,-0.1366116f,-0.1296549f,-0.1225218f,-0.115232f,-0.1078048f,-0.10026f,-0.09261685f,-0.0848946f,-0.07711238f,-0.06928907f,-0.06144339f,-0.05359355f,-0.04575768f,-0.03795356f,-0.03019838f,-0.02250916f,-0.01490238f,-0.007394183f,0.00000002611637f,0.007265119f,0.01438651f,0.02135037f,0.02814324f,0.03475232f,0.04116539f,0.04737101f,0.05335823f,0.05911672f,0.06463704f,0.06991026f,0.07492816f,0.07968318f,0.08416864f,0.08837839f,0.09230704f,0.09594998f,0.09930325f,0.1023636f,0.1051285f,0.1075961f,0.1097653f,0.1116357f,0.1132076f,0.1144817f,0.1154599f,0.1161442f,0.1165375f,0.1166434f,0.1164658f,0.1160096f,0.1152799f,0.1142825f,0.1130238f,0.1115106f,0.1097502f,0.1077504f,0.1055193f,0.1030657f,0.1003985f,0.09752715f,0.0944614f,0.09121117f,0.08778685f,0.08419901f,0.08045847f,0.07657623f,0.07256348f,0.06843164f,0.064192f,0.0598562f,0.05543587f,0.05094265f,0.0463882f,0.04178419f,0.03714232f,0.03247395f,0.02779061f,0.02310366f,0.01842427f,0.01376347f,0.009132098f,0.00454087f,-0.00000000219233f,-0.004480293f,-0.008890141f,-0.01321997f,-0.01746054f,-0.0216029f,-0.02563841f,-0.029559f,-0.03335674f,-0.03702418f,-0.04055427f,-0.04394036f,-0.04717624f,-0.05025606f,-0.05317461f,-0.05592692f,-0.05850857f,-0.06091554f,-0.06314433f,-0.06519188f,-0.06705556f,-0.06873333f,-0.07022347f,-0.07152481f,-0.0726366f,-0.07355858f,-0.07429089f,-0.0748342f,-0.07518955f,-0.07535844f,-0.07534278f,-0.07514492f,-0.07476757f,-0.07421388f,-0.07348734f,-0.07259185f,-0.07153161f,-0.07031119f,-0.06893551f,-0.06740976f,-0.06573948f,-0.06393037f,-0.0619885f,-0.05992015f,-0.05773184f,-0.05543025f,-0.05302231f,-0.05051513f,-0.04791585f,-0.04523186f,-0.04247064f,-0.03963977f,-0.03674688f,-0.03379967f,-0.03080594f,-0.02777335f,-0.0247097f,-0.02162274f,-0.01852018f,-0.01540967f,-0.0122988f,-0.009195124f,-0.006105906f,-0.003038481f,0.00000002152608f,0.003002621f,0.005962508f,0.008873048f,0.01172776f,0.01452052f,0.01724527f,0.01989624f,0.0224679f,0.02495498f,0.02735246f,0.02965556f,0.03185993f,0.03396134f,0.03595594f,0.03784013f,0.03961066f,0.04126458f,0.04279922f,0.04421232f,0.04550183f,0.04666607f,0.0477037f,0.04861366f,0.04939524f,0.05004799f,0.05057187f,0.05096708f,0.05123416f,0.05137391f,0.05138747f,0.05127627f,0.05104201f,0.05068666f,0.05021247f,0.04962194f,0.04891786f,0.0481032f,0.04718122f,0.0461554f,0.04502935f,0.04380699f,0.04249234f,0.04108967f,0.03960337f,0.03803802f,0.03639825f,0.03468891f,0.03291493f,0.03108134f,0.02919327f,0.02725591f,0.02527454f,0.0232544f,0.02120086f,0.01911926f,0.01701499f,0.01489338f,0.01275979f,0.01061955f,0.008477859f,0.006339955f,0.00421098f,0.002095996f,-0.00000002869215f,-0.002072225f,-0.0041158f,-0.0061262f,-0.008098885f,-0.0100295f,-0.0119138f,-0.01374781f,-0.01552761f,-0.01724951f,-0.01890997f,-0.02050567f,-0.02203346f,-0.02349042f,-0.02487379f,-0.02618107f,-0.02740993f,-0.02855828f,-0.02962425f,-0.03060617f,-0.03150259f,-0.03231237f,-0.03303449f,-0.03366818f,-0.03421291f,-0.03466836f,-0.03503444f,-0.03531127f,-0.03549919f,-0.03559877f,-0.03561074f,-0.03553608f,-0.03537595f,-0.03513173f,-0.03480495f,-0.03439734f,-0.0339108f,-0.03334744f,-0.03270948f,-0.03199931f,-0.03121951f,-0.03037274f,-0.02946183f,-0.02848973f,-0.0274595f,-0.02637431f,-0.02523741f,-0.02405223f,-0.02282208f,-0.02155054f,-0.02024117f,-0.01889757f,-0.01752342f,-0.01612241f,-0.01469825f,-0.01325468f,-0.01179543f,-0.01032424f,-0.008844816f,-0.007360869f,-0.005876058f,-0.004394068f,-0.002918362f,-0.00145252f,0.000000001403874f,0.001435815f,0.002851615f,0.004244182f,0.005610391f,0.006947211f,0.008251725f,0.009521126f,0.01075272f,0.01194394f,0.01309236f,0.01419561f,0.01525163f,0.01625833f,0.01721382f,0.01811638f,0.01896442f,0.01975648f,0.0204913f,0.02116774f,0.02178482f,0.02234173f,0.02283782f,0.02327256f,0.02364562f,0.02395679f,0.02420606f,0.02439352f,0.02451944f,0.02458423f,0.02458843f,0.02453275f,0.02441803f,0.02424522f,0.02401544f,0.0237299f,0.02338997f,0.0229971f,0.02255288f,0.02205901f,0.02151725f,0.02092949f,0.02029772f,0.019624f,0.01891046f,0.01815932f,0.01737286f,0.01655341f,0.01570337f,0.01482518f,0.01392131f,0.01299429f,0.01204667f,0.01108097f,0.01009977f,0.009105679f,0.008101264f,0.007089111f,0.006071784f,0.005051837f,0.004031789f,0.003014139f,0.002001349f,0.0009958356f,-0.00000002677436f,-0.0009839179f,-0.001953536f,-0.002906756f,-0.003841405f,-0.004755417f,-0.005646806f,-0.00651366f,-0.007354157f,-0.008166554f,-0.008949202f,-0.009700547f,-0.01041913f,-0.01110358f,-0.01175264f,-0.01236514f,-0.01294002f,-0.01347637f,-0.01397331f,-0.01443012f,-0.01484615f,-0.01522089f,-0.01555393f,-0.01584495f,-0.01609377f,-0.01630028f,-0.01646449f,-0.01658654f,-0.01666662f,-0.01670508f,-0.01670231f,-0.01665884f,-0.01657527f,-0.01645231f,-0.01629074f,-0.01609144f,-0.01585536f,-0.01558354f,-0.01527708f,-0.01493718f,-0.01456507f,-0.01416208f,-0.01372957f,-0.01326897f,-0.01278179f,-0.01226952f,-0.01173374f,-0.01117606f,-0.01059814f,-0.01000163f,-0.009388241f,-0.008759692f,-0.008117708f,-0.007464039f,-0.006800437f,-0.006128659f,-0.005450456f,-0.004767576f,-0.004081781f,-0.003394742f,-0.002708186f,-0.002023795f,-0.001343222f,-0.0006680909f,0.000000009461361f,0.000659527f,0.001308951f,0.001946815f,0.002571699f,0.003182233f,0.003777103f,0.004355023f,0.004914839f,0.005455384f,0.005975577f,0.006474403f,0.006950912f,0.007404221f,0.007833516f,0.008238055f,0.008617163f,0.008970238f,0.009296755f,0.009596253f,0.009868351f,0.01011273f,0.01032916f,0.01051748f,0.0106776f,0.01080948f,0.01091317f,0.0109888f,0.01103654f,0.01105665f,0.01104945f,0.0110153f,0.01095467f,0.01086804f,0.01075598f,0.01061911f,0.01045808f,0.01027362f,0.0100665f,0.009837538f,0.009587585f,0.009317539f,0.009028343f,0.008720957f,0.008396389f,0.008055673f,0.007699866f,0.007330052f,0.006947332f,0.006552839f,0.00614768f,0.005733014f,0.005309992f,0.004879772f,0.004443516f,0.004002382f,0.003557525f,0.003110097f,0.002661235f,0.002212069f,0.001763712f,0.00131726f,0.0008737892f,0.0004343703f,-0.0000000006289512f,-0.000428304f,-0.0008495659f,-0.001262843f,-0.001667227f,-0.00206184f,-0.002445846f,-0.002818442f,-0.003178869f,-0.003526405f,-0.003860372f,-0.004180136f,-0.004485107f,-0.004774727f,-0.005048521f,-0.005306024f,-0.005546829f,-0.005770578f,-0.005976961f,-0.006165712f,-0.006336619f,-0.006489512f,-0.00662427f,-0.00674082f,-0.006839134f,-0.006919232f,-0.006981174f,-0.007025076f,-0.007051085f,-0.007059397f,-0.007050246f,-0.007023909f,-0.006980701f,-0.006920981f,-0.006845125f,-0.006753564f,-0.006646751f,-0.00652518f,-0.006389364f,-0.006239853f,-0.006077222f,-0.005902058f,-0.005714986f,-0.005516647f,-0.0053077f,-0.005088819f,-0.004860696f,-0.004624037f,-0.004379554f,-0.004127972f,-0.003870023f,-0.003606441f,-0.003337967f,-0.00306534f,-0.002789312f,-0.002510599f,-0.002229944f,-0.001948075f,-0.001665711f,-0.001383562f,-0.001102324f,-0.0008226858f,-0.000545317f,-0.0002708732f,0.000000007400842f,0.0002667052f,0.0005286207f,0.0007851752f,0.001035803f,0.001279991f,0.00151722f,0.001747009f,0.001968898f,0.00218246f,0.00238729f,0.002583014f,0.00276928f,0.002945785f,0.003112236f,0.003268375f,0.003413974f,0.003548836f,0.003672795f,0.003785713f,0.003887483f,0.003978028f,0.004057301f,0.004125282f,0.004181982f,0.004227445f,0.004261726f,0.004284925f,0.004297161f,0.004298581f,0.004289355f,0.004269677f,0.004239766f,0.004199863f,0.00415023f,0.00409115f,0.004022922f,0.003945869f,0.003860328f,0.003766655f,0.003665211f,0.003556381f,0.003440559f,0.003318152f,0.003189574f,0.00305525f,0.002915612f,0.0027711f,0.002622156f,0.002469228f,0.002312767f,0.002153223f,0.001991049f,0.001826698f,0.001660617f,0.001493253f,0.001325048f,0.001156439f,0.0009878572f,0.0008197247f,0.0006524568f,0.0004864595f,0.0003221283f,0.000159848f,-0.000000008495203f,-0.0001570806f,-0.000311009f,-0.0004614847f,-0.0006081765f,-0.0007507809f,-0.0008890096f,-0.001022591f,-0.001151269f,-0.001274805f,-0.001392979f,-0.001505586f,-0.001612441f,-0.001713375f,-0.001808239f,-0.001896901f,-0.001979249f,-0.002055184f,-0.002124629f,-0.002187526f,-0.002243834f,-0.002293528f,-0.002336601f,-0.002373065f,-0.002402947f,-0.002426289f,-0.002443152f,-0.002453612f,-0.002457757f,-0.002455694f,-0.002447542f,-0.002433432f,-0.002413512f,-0.002387937f,-0.002356878f,-0.002320515f,-0.002279041f,-0.002232652f,-0.002181562f,-0.002125986f,-0.002066151f,-0.002002288f,-0.001934637f,-0.00186344f,-0.001788946f,-0.001711408f,-0.00163108f,-0.001548221f,-0.00146309f,-0.001375948f,-0.001287055f,-0.001196673f,-0.001105061f,-0.001012476f,-0.0009191733f,-0.0008254063f,-0.000731423f,-0.0006374682f,-0.0005437887f,-0.0004506048f,-0.0003581525f,-0.0002666539f,-0.0001763247f,-0.00008737308f,0.0000000001681455f,0.00008560243f,0.0001692493f,0.0002507654f,0.0003299841f,0.0004067482f,0.0004809099f,0.0005523317f,0.0006208846f,0.0006864508f,0.0007489227f,0.0008082025f,0.000864203f,0.0009168478f,0.0009660696f,0.001011812f,0.00105403f,0.001092688f,0.001127759f,0.001159229f,0.001187091f,0.001211347f,0.001232015f,0.001249115f,0.001262678f,0.001272745f,0.001279364f,0.001282592f,0.001282492f,0.001279139f,0.001272609f,0.001262989f,0.001250371f,0.001234854f,0.001216542f,0.001195542f,0.00117197f,0.001145944f,0.001117586f,0.001087022f,0.001054382f,0.001019796f,0.0009834f,0.0009453294f,0.0009057216f,0.0008647162f,0.0008224522f,0.0007790695f,0.000734708f,0.00068951f,0.0006436071f,0.0005971409f,0.0005502461f,0.0005030563f,0.0004557039f,0.0004083179f,0.0003610241f,0.0003139455f,0.0002672023f,0.0002209105f,0.0001751821f,0.0001301251f,0.00008584363f,0.00004243672f,-0.000000001174241f,-0.00004138023f,-0.00008161574f,-0.000120628f,-0.0001583428f,-0.0001946912f,-0.000229609f,-0.0002630385f,-0.0002949268f,-0.0003252268f,-0.0003538965f,-0.0003808999f,-0.0004062061f,-0.0004297877f,-0.0004516298f,-0.0004717149f,-0.0004900336f,-0.0005065824f,-0.0005213621f,-0.0005343776f,-0.0005456405f,-0.0005551654f,-0.0005629724f,-0.0005690854f,-0.0005735317f,-0.0005763453f,-0.0005775606f,-0.0005772174f,-0.0005753593f,-0.0005720325f,-0.0005672846f,-0.0005611693f,-0.0005537404f,-0.0005450541f,-0.0005351692f,-0.0005241471f,-0.0005120501f,-0.0004989423f,-0.0004848873f,-0.0004699531f,-0.0004542055f,-0.0004377111f,-0.0004205382f,-0.0004027549f,-0.000384429f,-0.0003656275f,-0.0003464172f,-0.0003268652f,-0.0003070367f,-0.000286996f,-0.0002668065f,-0.0002465308f,-0.0002262287f,-0.0002059591f,-0.0001857798f,-0.0001657454f,-0.0001459089f,-0.0001263217f,-0.0001070331f,-0.00008808904f,-0.00006953394f,-0.0000514095f,-0.00003375489f,-0.00001660678f,0.0000000008828778f,0.00001603677f,0.00003147225f,0.00004628124f,0.00006043958f,0.00007392884f,0.00008672991f,0.00009882788f,0.00011021f,0.0001208664f,0.0001307898f,0.000139975f,0.0001484199f,0.0001561245f,0.0001630915f,0.0001693251f,0.0001748318f,0.0001796211f,0.0001837037f,0.0001870922f,0.0001898014f,0.0001918475f,0.0001932488f,0.0001940241f,0.0001941947f,0.0001937831f,0.0001928118f,0.0001913049f,0.0001892889f,0.0001867894f,0.0001838327f,0.0001804467f,0.0001766592f,0.0001724985f,0.0001679931f,0.0001631719f,0.0001580636f,0.0001526968f,0.0001471006f,0.0001413024f,0.0001353313f,0.0001292145f,0.0001229788f,0.0001166512f,0.0001102571f,0.0001038223f,0.0000973703f,0.00009092497f,0.00008450833f,0.00007814272f,0.00007184815f,0.00006564461f,0.00005954991f,0.00005358154f,0.00004775569f,0.00004208676f,0.00003658899f,0.00003127437f,0.0000261546f,0.00002123973f,0.00001653798f,0.00001205736f,0.000007804163f,0.000003783703f,-0.000000000008901681f,-0.000003544079f,-0.00000684668f,-0.000009907134f,-0.00001272555f,-0.00001530365f,-0.00001764329f,-0.00001974791f,-0.0000216217f,-0.00002326923f,-0.00002469646f,-0.00002590943f,-0.00002691537f,-0.00002772242f,-0.00002833794f,-0.00002877093f,-0.00002903067f,-0.00002912695f,-0.00002906912f,-0.00002886715f,-0.00002853203f,-0.00002807362f,-0.00002750264f,-0.00002682936f,-0.00002606478f,-0.00002521952f,-0.00002430297f,-0.00002332625f,-0.00002229894f,-0.00002123156f,-0.00002013221f,-0.00001901063f,-0.00001787523f,-0.00001673514f,-0.00001559686f,-0.00001446904f,-0.00001335829f,-0.00001227042f,-0.00001121161f,-0.00001018676f,-0.000009201491f,-0.000008259004f,-0.00000736348f,-0.000006517685f,-0.000005724337f,-0.000004984693f,-0.000004300695f,-0.000003672964f,-0.000003101586f,-0.000002586037f,-0.000002125701f,-0.000001719344f,-0.000001364625f,-0.000001060089f,-0.0000008023567f,-0.0000005888515f,-0.0000004159667f,-0.0000002801043f,-0.0000001770186f,-0.0000001028222f,-0.00000005271932f,-0.00000002231452f,-0.000000006608794f,-0.0000000008153554f,-0.0000000000000004146626f}; +const float blamp[] = {-0.00000000000000000000158f,-0.000000000000003110314f,-0.00000000000003765157f,-0.0000000000002108462f,-0.0000000000007806025f,-0.000000000002229926f,-0.000000000005340088f,-0.00000000001126152f,-0.000000000021582f,-0.00000000003839055f,-0.00000000006433866f,-0.0000000001026978f,-0.0000000001574114f,-0.0000000002331401f,-0.0000000003353009f,-0.0000000004701026f,-0.0000000006445743f,-0.0000000008665851f,-0.000000001144857f,-0.00000000148897f,-0.000000001909357f,-0.000000002417294f,-0.000000003024884f,-0.00000000374502f,-0.000000004591358f,-0.000000005578261f,-0.000000006720754f,-0.00000000803445f,-0.000000009535487f,-0.00000001124044f,-0.00000001316624f,-0.00000001533007f,-0.00000001774926f,-0.00000002044119f,-0.00000002342315f,-0.00000002671221f,-0.00000003032512f,-0.00000003427812f,-0.00000003858687f,-0.00000004326622f,-0.00000004833011f,-0.00000005379141f,-0.00000005966174f,-0.00000006595133f,-0.00000007266886f,-0.00000007982128f,-0.00000008741367f,-0.00000009544908f,-0.0000001039283f,-0.0000001128499f,-0.0000001222099f,-0.0000001320015f,-0.0000001422155f,-0.0000001528393f,-0.0000001638577f,-0.0000001752522f,-0.0000001870009f,-0.0000001990786f,-0.0000002114567f,-0.0000002241032f,-0.0000002369823f,-0.0000002500546f,-0.0000002632772f,-0.0000002766033f,-0.0000002899826f,-0.000000303361f,-0.0000003166807f,-0.0000003298805f,-0.0000003428954f,-0.0000003556571f,-0.000000368094f,-0.000000380131f,-0.00000039169f,-0.00000040269f,-0.0000004130472f,-0.000000422675f,-0.0000004314848f,-0.0000004393854f,-0.000000446284f,-0.0000004520859f,-0.0000004566952f,-0.0000004600148f,-0.0000004619469f,-0.0000004623933f,-0.0000004612555f,-0.0000004584355f,-0.0000004538358f,-0.00000044736f,-0.0000004389129f,-0.0000004284014f,-0.0000004157345f,-0.0000004008238f,-0.0000003835841f,-0.0000003639334f,-0.000000341794f,-0.0000003170926f,-0.0000002897603f,-0.0000002597339f,-0.0000002269556f,-0.0000001913739f,-0.0000001529438f,-0.0000001116273f,-0.00000006739359f,-0.00000002021991f,0.00000002990852f,0.00000008299788f,0.0000001390455f,0.0000001980394f,0.0000002599583f,0.0000003247707f,0.0000003924353f,0.0000004629003f,0.0000005361034f,0.0000006119715f,0.0000006904204f,0.0000007713552f,0.0000008546694f,0.0000009402455f,0.000001027954f,0.000001117656f,0.0000012092f,0.000001302422f,0.00000139715f,0.000001493198f,0.000001590372f,0.000001688465f,0.000001787262f,0.000001886537f,0.000001986054f,0.000002085569f,0.000002184829f,0.000002283571f,0.000002381528f,0.000002478421f,0.00000257397f,0.000002667883f,0.000002759868f,0.000002849626f,0.000002936854f,0.000003021247f,0.000003102497f,0.000003180294f,0.00000325433f,0.000003324295f,0.000003389882f,0.000003450784f,0.0000035067f,0.000003557331f,0.000003602385f,0.000003641574f,0.000003674621f,0.000003701253f,0.000003721208f,0.000003734236f,0.000003740096f,0.000003738561f,0.000003729416f,0.000003712461f,0.000003687513f,0.000003654404f,0.000003612982f,0.000003563116f,0.000003504691f,0.000003437616f,0.000003361818f,0.000003277247f,0.000003183874f,0.000003081693f,0.000002970725f,0.000002851011f,0.000002722621f,0.000002585647f,0.000002440208f,0.00000228645f,0.000002124545f,0.000001954691f,0.000001777114f,0.000001592067f,0.000001399828f,0.000001200706f,0.0000009950314f,0.0000007831657f,0.0000005654944f,0.0000003424294f,0.0000001144082f,-0.0000001181072f,-0.0000003546303f,-0.0000005946512f,-0.0000008376375f,-0.000001083035f,-0.000001330267f,-0.000001578741f,-0.000001827841f,-0.000002076938f,-0.000002325383f,-0.000002572515f,-0.000002817659f,-0.000003060127f,-0.000003299222f,-0.000003534238f,-0.000003764462f,-0.000003989177f,-0.000004207661f,-0.000004419192f,-0.000004623048f,-0.000004818508f,-0.000005004859f,-0.000005181391f,-0.000005347405f,-0.000005502211f,-0.000005645134f,-0.000005775511f,-0.000005892699f,-0.000005996072f,-0.000006085026f,-0.000006158982f,-0.000006217383f,-0.000006259704f,-0.000006285445f,-0.000006294143f,-0.000006285363f,-0.000006258711f,-0.000006213826f,-0.000006150388f,-0.000006068119f,-0.000005966781f,-0.000005846184f,-0.00000570618f,-0.00000554667f,-0.000005367604f,-0.000005168979f,-0.000004950847f,-0.000004713307f,-0.000004456514f,-0.000004180674f,-0.000003886049f,-0.000003572954f,-0.000003241759f,-0.000002892891f,-0.000002526827f,-0.000002144104f,-0.000001745312f,-0.000001331094f,-0.0000009021492f,-0.0000004592271f,-0.000000003131211f,0.0000004652842f,0.0000009451151f,0.000001435408f,0.000001935164f,0.000002443337f,0.000002958837f,0.000003480534f,0.000004007257f,0.000004537797f,0.000005070911f,0.000005605325f,0.000006139731f,0.000006672798f,0.00000720317f,0.000007729468f,0.000008250298f,0.000008764249f,0.000009269901f,0.000009765825f,0.00001025059f,0.00001072276f,0.0000111809f,0.0000116236f,0.00001204945f,0.00001245703f,0.00001284499f,0.00001321195f,0.0000135566f,0.00001387763f,0.00001417379f,0.00001444384f,0.0000146866f,0.00001490095f,0.00001508579f,0.00001524009f,0.00001536288f,0.00001545324f,0.00001551034f,0.00001553338f,0.00001552167f,0.00001547457f,0.00001539153f,0.00001527207f,0.00001511581f,0.00001492244f,0.00001469175f,0.0000144236f,0.00001411798f,0.00001377495f,0.00001339466f,0.00001297737f,0.00001252344f,0.00001203333f,0.00001150759f,0.00001094688f,0.00001035195f,0.000009723673f,0.000009063001f,0.000008370994f,0.000007648811f,0.000006897708f,0.000006119037f,0.000005314245f,0.000004484873f,0.000003632549f,0.000002758991f,0.000001866002f,0.0000009554656f,0.0000000293446f,-0.0000009103238f,-0.000001861431f,-0.000002821803f,-0.000003789203f,-0.000004761334f,-0.000005735851f,-0.000006710357f,-0.000007682414f,-0.000008649548f,-0.000009609254f,-0.000010559f,-0.00001149623f,-0.00001241839f,-0.00001332291f,-0.0000142072f,-0.00001506871f,-0.0000159049f,-0.00001671321f,-0.00001749115f,-0.00001823625f,-0.00001894606f,-0.00001961822f,-0.00002025038f,-0.00002084027f,-0.00002138569f,-0.00002188452f,-0.00002233469f,-0.00002273427f,-0.00002308136f,-0.00002337422f,-0.00002361118f,-0.0000237907f,-0.00002391134f,-0.00002397181f,-0.00002397093f,-0.00002390765f,-0.00002378109f,-0.00002359048f,-0.00002333521f,-0.00002301483f,-0.00002262904f,-0.0000221777f,-0.00002166084f,-0.00002107863f,-0.00002043144f,-0.00001971979f,-0.00001894436f,-0.00001810604f,-0.00001720585f,-0.000016245f,-0.00001522487f,-0.00001414703f,-0.00001301318f,-0.00001182523f,-0.00001058522f,-0.000009295385f,-0.0000079581f,-0.000006575903f,-0.000005151487f,-0.000003687695f,-0.000002187511f,-0.000000654058f,0.0000009094055f,0.000002499496f,0.000004112709f,0.000005745426f,0.000007393924f,0.000009054379f,0.00001072288f,0.00001239543f,0.00001406797f,0.00001573636f,0.00001739642f,0.00001904392f,0.00002067458f,0.00002228414f,0.00002386828f,0.00002542269f,0.00002694309f,0.00002842518f,0.00002986472f,0.0000312575f,0.00003259937f,0.00003388622f,0.00003511405f,0.00003627891f,0.00003737697f,0.00003840451f,0.0000393579f,0.00004023369f,0.00004102853f,0.00004173923f,0.00004236277f,0.0000428963f,0.00004333714f,0.00004368282f,0.00004393107f,0.0000440798f,0.00004412717f,0.00004407154f,0.00004391153f,0.00004364597f,0.00004327397f,0.00004279485f,0.00004220822f,0.00004151393f,0.00004071213f,0.0000398032f,0.00003878781f,0.00003766692f,0.00003644174f,0.00003511378f,0.0000336848f,0.00003215687f,0.00003053233f,0.00002881377f,0.00002700408f,0.0000251064f,0.00002312415f,0.000021061f,0.00001892088f,0.00001670797f,0.00001442668f,0.00001208166f,0.000009677785f,0.000007220158f,0.000004714075f,0.000002165033f,-0.0000004212855f,-0.000003039025f,-0.000005682166f,-0.000008344544f,-0.00001101985f,-0.00001370167f,-0.00001638347f,-0.00001905861f,-0.00002172041f,-0.0000243621f,-0.00002697687f,-0.00002955789f,-0.00003209829f,-0.00003459125f,-0.00003702993f,-0.00003940756f,-0.00004171741f,-0.00004395281f,-0.00004610723f,-0.00004817419f,-0.00005014739f,-0.00005202064f,-0.00005378793f,-0.00005544342f,-0.00005698147f,-0.00005839666f,-0.0000596838f,-0.00006083793f,-0.00006185437f,-0.00006272872f,-0.00006345684f,-0.00006403493f,-0.00006445951f,-0.00006472741f,-0.00006483583f,-0.0000647823f,-0.00006456475f,-0.00006418147f,-0.00006363112f,-0.0000629128f,-0.00006202599f,-0.00006097057f,-0.00005974685f,-0.00005835556f,-0.00005679786f,-0.00005507532f,-0.00005318998f,-0.00005114425f,-0.00004894102f,-0.0000465836f,-0.0000440757f,-0.00004142147f,-0.0000386255f,-0.00003569276f,-0.00003262862f,-0.00002943888f,-0.00002612971f,-0.00002270765f,-0.00001917962f,-0.00001555288f,-0.00001183505f,-0.000008034044f,-0.000004158124f,-0.0000002158205f,0.000003784052f,0.000007832421f,0.00001191998f,0.00001603719f,0.00002017433f,0.00002432149f,0.00002846862f,0.00003260554f,0.00003672193f,0.00004080743f,0.0000448516f,0.00004884397f,0.00005277406f,0.00005663141f,0.00006040561f,0.00006408633f,0.00006766331f,0.00007112644f,0.00007446574f,0.00007767144f,0.00008073394f,0.00008364389f,0.0000863922f,0.00008897006f,0.00009136897f,0.00009358074f,0.00009559758f,0.00009741205f,0.00009901713f,0.0001004062f,0.0001015732f,0.0001025124f,0.0001032186f,0.0001036871f,0.0001039139f,0.0001038952f,0.0001036282f,0.0001031102f,0.0001023395f,0.0001013147f,0.0001000352f,0.00009850099f,0.00009671263f,0.00009467133f,0.00009237898f,0.00008983805f,0.00008705173f,0.00008402379f,0.00008075868f,0.00007726149f,0.00007353791f,0.00006959431f,0.00006543764f,0.0000610755f,0.00005651606f,0.00005176808f,0.00004684091f,0.00004174445f,0.00003648914f,0.00003108594f,0.0000255463f,0.00001988217f,0.00001410593f,0.000008230396f,0.000002268797f,-0.000003765277f,-0.000009857887f,-0.00001599478f,-0.00002216142f,-0.00002834301f,-0.00003452456f,-0.00004069088f,-0.00004682664f,-0.00005291638f,-0.0000589446f,-0.00006489573f,-0.00007075422f,-0.00007650456f,-0.00008213132f,-0.00008761918f,-0.00009295299f,-0.00009811776f,-0.0001030988f,-0.0001078816f,-0.0001124521f,-0.0001167965f,-0.0001209014f,-0.0001247538f,-0.0001283412f,-0.0001316517f,-0.0001346738f,-0.0001373967f,-0.0001398099f,-0.000141904f,-0.0001436699f,-0.0001450994f,-0.000146185f,-0.0001469198f,-0.000147298f,-0.0001473143f,-0.0001469643f,-0.0001462447f,-0.0001451526f,-0.0001436865f,-0.0001418454f,-0.0001396294f,-0.0001370395f,-0.0001340776f,-0.0001307466f,-0.0001270503f,-0.0001229934f,-0.0001185817f,-0.0001138217f,-0.000108721f,-0.0001032882f,-0.00009753257f,-0.00009146451f,-0.00008509523f,-0.00007843678f,-0.00007150211f,-0.00006430499f,-0.00005685997f,-0.00004918243f,-0.00004128846f,-0.00003319489f,-0.00002491923f,-0.00001647966f,-0.000007894953f,0.000000815531f,0.000009631897f,0.00001853376f,0.00002750028f,0.00003651022f,0.000045542f,0.00005457371f,0.00006358321f,0.00007254814f,0.000081446f,0.00009025419f,0.00009895006f,0.000107511f,0.0001159144f,0.0001241379f,0.0001321592f,0.0001399563f,0.0001475075f,0.0001547914f,0.0001617871f,0.000168474f,0.0001748323f,0.0001808424f,0.0001864858f,0.0001917442f,0.0001966004f,0.0002010379f,0.0002050408f,0.0002085944f,0.0002116848f,0.0002142991f,0.0002164254f,0.0002180528f,0.0002191718f,0.0002197735f,0.0002198507f,0.0002193972f,0.0002184079f,0.0002168791f,0.0002148084f,0.0002121947f,0.0002090381f,0.0002053402f,0.0002011039f,0.0001963333f,0.000191034f,0.0001852131f,0.0001788787f,0.0001720406f,0.0001647098f,0.0001568987f,0.0001486208f,0.0001398913f,0.0001307263f,0.0001211434f,0.0001111613f,0.0001008f,0.00009008046f,0.00007902503f,0.00006765696f,0.0000560006f,0.00004408128f,0.00003192524f,0.00001955963f,0.000007012435f,-0.000005687625f,-0.0000185111f,-0.00003142792f,-0.0000444074f,-0.0000574184f,-0.00007042931f,-0.00008340816f,-0.00009632271f,-0.0001091405f,-0.0001218289f,-0.0001343552f,-0.0001466869f,-0.0001587914f,-0.0001706363f,-0.0001821896f,-0.0001934195f,-0.0002042947f,-0.0002147843f,-0.0002248583f,-0.000234487f,-0.0002436416f,-0.0002522943f,-0.0002604178f,-0.0002679863f,-0.0002749746f,-0.0002813589f,-0.0002871166f,-0.0002922262f,-0.0002966678f,-0.0003004226f,-0.0003034736f,-0.000305805f,-0.0003074028f,-0.0003082546f,-0.0003083497f,-0.0003076791f,-0.0003062355f,-0.0003040136f,-0.0003010097f,-0.0002972222f,-0.0002926512f,-0.000287299f,-0.0002811696f,-0.000274269f,-0.0002666053f,-0.0002581883f,-0.00024903f,-0.0002391444f,-0.0002285471f,-0.0002172561f,-0.0002052909f,-0.000192673f,-0.000179426f,-0.0001655751f,-0.0001511472f,-0.000136171f,-0.0001206771f,-0.0001046975f,-0.00008826565f,-0.00007141684f,-0.0000541876f,-0.00003661585f,-0.00001874081f,-0.0000006029191f,0.00001775628f,0.00003629419f,0.00005496729f,0.00007373116f,0.00009254071f,0.0001113501f,0.000130113f,0.0001487827f,0.000167312f,0.0001856537f,0.0002037601f,0.0002215841f,0.0002390781f,0.0002561952f,0.0002728887f,0.0002891122f,0.0003048202f,0.0003199677f,0.0003345105f,0.0003484056f,0.0003616108f,0.0003740852f,0.0003857891f,0.0003966844f,0.0004067343f,0.0004159037f,0.0004241593f,0.0004314695f,0.0004378047f,0.0004431373f,0.0004474419f,0.0004506952f,0.0004528763f,0.0004539665f,0.0004539496f,0.0004528121f,0.0004505429f,0.0004471334f,0.0004425781f,0.0004368738f,0.0004300203f,0.0004220203f,0.0004128791f,0.000402605f,0.0003912093f,0.0003787059f,0.0003651119f,0.0003504471f,0.0003347343f,0.0003179989f,0.0003002696f,0.0002815774f,0.0002619564f,0.0002414434f,0.0002200776f,0.000197901f,0.0001749583f,0.0001512962f,0.0001269643f,0.0001020142f,0.0000764996f,0.00005047654f,0.00002400292f,-0.000002861472f,-0.00003005509f,-0.00005751475f,-0.00008517579f,-0.0001129722f,-0.0001408367f,-0.0001687009f,-0.0001964957f,-0.000224151f,-0.0002515961f,-0.0002787601f,-0.0003055715f,-0.0003319588f,-0.0003578507f,-0.000383176f,-0.0004078638f,-0.0004318441f,-0.0004550472f,-0.0004774047f,-0.0004988492f,-0.0005193146f,-0.0005387363f,-0.0005570512f,-0.0005741981f,-0.0005901178f,-0.0006047534f,-0.0006180501f,-0.0006299557f,-0.0006404207f,-0.0006493983f,-0.0006568446f,-0.0006627192f,-0.0006669846f,-0.0006696067f,-0.000670555f,-0.0006698028f,-0.000667327f,-0.0006631084f,-0.0006571318f,-0.0006493861f,-0.0006398643f,-0.0006285638f,-0.0006154862f,-0.0006006375f,-0.0005840281f,-0.0005656731f,-0.0005455917f,-0.0005238081f,-0.0005003508f,-0.0004752528f,-0.0004485519f,-0.0004202901f,-0.0003905143f,-0.0003592754f,-0.0003266292f,-0.0002926355f,-0.0002573586f,-0.0002208668f,-0.0001832328f,-0.0001445329f,-0.0001048478f,-0.00006426145f,-0.00002286186f,0.00001925972f,0.00006200864f,0.0001052871f,0.0001489943f,0.0001930266f,0.0002372778f,0.0002816393f,0.0003260003f,0.0003702481f,0.0004142681f,0.0004579443f,0.0005011595f,0.0005437954f,0.000585733f,0.0006268527f,0.0006670349f,0.00070616f,0.0007441086f,0.000780762f,0.0008160025f,0.0008497136f,0.0008817801f,0.0009120889f,0.0009405288f,0.0009669909f,0.0009913694f,0.001013561f,0.001033466f,0.001050988f,0.001066035f,0.001078518f,0.001088355f,0.001095465f,0.001099776f,0.001101218f,0.001099728f,0.00109525f,0.001087731f,0.001077128f,0.001063402f,0.001046522f,0.001026463f,0.001003209f,0.0009767489f,0.0009470819f,0.0009142137f,0.0008781583f,0.0008389378f,0.0007965825f,0.0007511316f,0.0007026325f,0.0006511415f,0.0005967236f,0.0005394528f,0.000479412f,0.000416693f,0.0003513969f,0.0002836335f,0.0002135221f,0.0001411908f,0.00006677673f,-0.000009573766f,-0.00008770554f,-0.0001674545f,-0.0002486478f,-0.0003311039f,-0.0004146325f,-0.0004990351f,-0.0005841046f,-0.0006696261f,-0.0007553766f,-0.0008411251f,-0.0009266334f,-0.001011656f,-0.001095939f,-0.001179224f,-0.001261245f,-0.001341728f,-0.001420396f,-0.001496964f,-0.001571142f,-0.001642635f,-0.001711145f,-0.001776367f,-0.001837994f,-0.001895714f,-0.001949212f,-0.001998171f,-0.00204227f,-0.002081188f,-0.002114601f,-0.002142183f,-0.002163609f,-0.002178551f,-0.002186684f,-0.002187683f,-0.00218122f,-0.002166974f,-0.002144622f,-0.002113844f,-0.002074323f,-0.002025745f,-0.0019678f,-0.001900179f,-0.001822582f,-0.00173471f,-0.001636271f,-0.001526978f,-0.00140655f,-0.001274713f,-0.001131198f,-0.0009757464f,-0.0008081039f,-0.0006280258f,-0.0004352751f,-0.0002296236f,-0.00001085194f,0.00022125f,0.0004668827f,0.0007262369f,0.0009994933f,0.001286822f,0.001588383f,0.001904324f,0.002234784f,0.002579888f,0.002939752f,0.003314479f,0.00370416f,0.004108875f,0.004528692f,0.004963665f,0.005413838f,0.005879242f,0.006359896f,0.005879242f,0.005413839f,0.004963665f,0.004528692f,0.004108875f,0.00370416f,0.003314479f,0.002939752f,0.002579888f,0.002234785f,0.001904326f,0.001588384f,0.001286823f,0.0009994945f,0.0007262379f,0.0004668832f,0.0002212506f,-0.00001084991f,-0.0002296232f,-0.0004352741f,-0.0006280243f,-0.000808103f,-0.0009757448f,-0.001131197f,-0.001274711f,-0.001406547f,-0.001526974f,-0.001636267f,-0.001734708f,-0.001822578f,-0.001900176f,-0.001967797f,-0.002025742f,-0.00207432f,-0.002113841f,-0.00214462f,-0.002166972f,-0.002181217f,-0.00218768f,-0.002186682f,-0.00217855f,-0.002163604f,-0.00214218f,-0.002114598f,-0.002081186f,-0.002042267f,-0.001998167f,-0.00194921f,-0.001895711f,-0.001837987f,-0.00177636f,-0.001711138f,-0.00164263f,-0.001571134f,-0.001496956f,-0.00142039f,-0.001341723f,-0.001261238f,-0.001179218f,-0.001095932f,-0.001011651f,-0.0009266287f,-0.0008411184f,-0.0007553697f,-0.0006696209f,-0.0005840957f,-0.0004990324f,-0.0004146248f,-0.0003310964f,-0.0002486408f,-0.0001674518f,-0.00008770078f,-0.000009566545f,0.00006677955f,0.000141196f,0.0002135262f,0.0002836362f,0.0003513992f,0.0004166961f,0.0004794151f,0.0005394593f,0.0005967319f,0.0006511435f,0.0007026345f,0.0007511377f,0.0007965863f,0.0008389428f,0.0008781627f,0.000914216f,0.000947088f,0.0009767562f,0.001003213f,0.001026466f,0.001046523f,0.001063414f,0.001077138f,0.00108774f,0.001095265f,0.001099743f,0.001101233f,0.001099788f,0.001095474f,0.001088366f,0.001078531f,0.001066044f,0.001051001f,0.001033477f,0.00101357f,0.0009913817f,0.0009670034f,0.0009405389f,0.0009121001f,0.0008817911f,0.0008497238f,0.0008160174f,0.0007807761f,0.0007441193f,0.0007061735f,0.000667043f,0.000626862f,0.0005857423f,0.0005438104f,0.0005011708f,0.0004579574f,0.0004142821f,0.0003702566f,0.0003260151f,0.0002816468f,0.0002372861f,0.0001930445f,0.0001490116f,0.0001052916f,0.00006201863f,0.0000192672f,-0.00002284348f,-0.00006425381f,-0.0001048297f,-0.0001445264f,-0.0001832247f,-0.0002208501f,-0.0002573431f,-0.000292629f,-0.0003266186f,-0.000359267f,-0.0003904998f,-0.0004202724f,-0.0004485399f,-0.0004752427f,-0.0005003363f,-0.0005237907f,-0.0005455762f,-0.000565663f,-0.0005840212f,-0.0006006211f,-0.0006154776f,-0.0006285608f,-0.0006398559f,-0.0006493777f,-0.0006571263f,-0.0006631017f,-0.0006673187f,-0.0006697923f,-0.0006705523f,-0.0006695986f,-0.000666976f,-0.0006627142f,-0.0006568283f,-0.0006493926f,-0.0006404072f,-0.0006299466f,-0.0006180406f,-0.0006047487f,-0.0005901009f,-0.0005741864f,-0.0005570352f,-0.0005387217f,-0.0005193055f,-0.0004988462f,-0.0004773885f,-0.0004550368f,-0.0004318357f,-0.0004078597f,-0.0003831685f,-0.0003578365f,-0.0003319532f,-0.0003055632f,-0.000278756f,-0.0002515912f,-0.0002241433f,-0.0001964867f,-0.000168696f,-0.0001408309f,-0.0001129508f,-0.00008514524f,-0.00005748868f,-0.00003002584f,-0.000002831221f,0.00002402067f,0.00005050004f,0.00007651746f,0.0001020432f,0.0001269877f,0.0001513213f,0.0001749843f,0.0001979321f,0.0002201051f,0.0002414733f,0.0002619773f,0.0002816021f,0.0003002882f,0.0003180206f,0.0003347546f,0.0003504753f,0.0003651381f,0.0003787279f,0.00039123f,0.0004026294f,0.0004128963f,0.0004220456f,0.0004300475f,0.000436902f,0.0004425943f,0.000447154f,0.0004505664f,0.0004528314f,0.0004539788f,0.0004539937f,0.0004529059f,0.0004507154f,0.000447467f,0.0004431605f,0.0004378259f,0.0004314929f,0.0004241765f,0.0004159212f,0.000406757f,0.0003967136f,0.000385806f,0.0003741086f,0.0003616363f,0.0003484339f,0.0003345311f,0.0003199875f,0.000304848f,0.0002891272f,0.0002729148f,0.0002562106f,0.000239104f,0.0002216101f,0.0002037883f,0.0001856685f,0.00016734f,0.000148803f,0.0001301318f,0.0001113713f,0.00009256601f,0.00007376075f,0.00005498528f,0.00003632903f,0.00001779199f,-0.0000005662441f,-0.00001871586f,-0.00003659725f,-0.00005415082f,-0.00007140636f,-0.00008824468f,-0.0001046658f,-0.0001206696f,-0.000136137f,-0.0001511276f,-0.0001655519f,-0.00017941f,-0.0001926422f,-0.0002052784f,-0.0002172291f,-0.0002285242f,-0.0002391338f,-0.0002489984f,-0.0002581775f,-0.0002665818f,-0.000274241f,-0.0002811551f,-0.0002872646f,-0.000292629f,-0.0002971888f,-0.0003009737f,-0.0003039837f,-0.0003062189f,-0.0003076494f,-0.0003083348f,-0.0003082454f,-0.0003073812f,-0.0003057718f,-0.0003034472f,-0.0003004074f,-0.0002966523f,-0.0002922118f,-0.0002870858f,-0.0002813339f,-0.0002749562f,-0.0002679527f,-0.0002603829f,-0.0002522767f,-0.000243634f,-0.0002344549f,-0.0002248287f,-0.0002147555f,-0.0002042651f,-0.0001933873f,-0.0001821816f,-0.0001706183f,-0.000158757f,-0.0001466572f,-0.0001343489f,-0.0001218021f,-0.0001091063f,-0.0000962913f,-0.0000833869f,-0.00007042289f,-0.00005739927f,-0.00004437566f,-0.00003141165f,-0.00001847744f,-0.000005662441f,0.000007033348f,0.00001958013f,0.00003194809f,0.00004410744f,0.00005602837f,0.00006768107f,0.00007903576f,0.00009009242f,0.0001008213f,0.0001111925f,0.0001211762f,0.0001307428f,0.0001399219f,0.000148654f,0.0001569092f,0.0001647174f,0.0001720488f,0.0001789033f,0.0001852214f,0.0001910627f,0.0001963377f,0.0002011359f,0.0002053678f,0.0002090633f,0.0002122223f,0.0002148151f,0.0002169013f,0.0002184212f,0.0002194047f,0.0002198815f,0.0002197921f,0.0002191961f,0.0002180636f,0.0002164543f,0.0002143085f,0.0002117157f,0.0002086163f,0.0002050698f,0.0002010465f,0.0001966059f,0.0001917481f,0.0001865029f,0.0001808703f,0.0001748502f,0.0001685023f,0.0001617968f,0.0001548231f,0.0001475215f,0.0001399815f,0.0001321733f,0.0001241565f,0.000115931f,0.0001075268f,0.00009897351f,0.00009027123f,0.00008144975f,0.00007256866f,0.00006359816f,0.00005459785f,0.00004559755f,0.00003656745f,0.00002753735f,0.00001856685f,0.000009685755f,0.0000008642673f,-0.000007838011f,-0.00001642108f,-0.00002488494f,-0.00003314018f,-0.00004124641f,-0.00004914403f,-0.00005680323f,-0.00006425381f,-0.00007146597f,-0.00007838011f,-0.00008505583f,-0.00009140372f,-0.0000974834f,-0.0001032352f,-0.0001086891f,-0.0001137853f,-0.0001185238f,-0.0001229346f,-0.0001270175f,-0.000130713f,-0.000134021f,-0.0001370013f,-0.0001395941f,-0.0001417994f,-0.0001436472f,-0.0001451075f,-0.0001462102f,-0.0001469254f,-0.0001472831f,-0.0001472533f,-0.0001468658f,-0.0001461506f,-0.0001450479f,-0.0001436174f,-0.0001418591f,-0.0001397729f,-0.0001373589f,-0.0001346171f,-0.0001316071f,-0.000128299f,-0.0001247227f,-0.0001208484f,-0.0001167655f,-0.0001124144f,-0.0001078248f,-0.0001030564f,-0.00009807944f,-0.00009289384f,-0.00008755922f,-0.0000820756f,-0.00007647276f,-0.00007072091f,-0.00006484985f,-0.00005888939f,-0.00005286932f,-0.00004678965f,-0.00004065037f,-0.00003448129f,-0.00002831221f,-0.00002211332f,-0.00001594424f,-0.000009804964f,-0.00000372529f,0.000002324581f,0.000008285046f,0.0000141561f,0.00001993775f,0.00002560019f,0.00003114343f,0.00003653765f,0.00004178286f,0.00004687905f,0.00005182624f,0.00005656481f,0.00006112456f,0.0000654757f,0.00006964803f,0.00007358193f,0.00007730722f,0.0000807941f,0.00008407235f,0.00008708239f,0.0000898838f,0.000092417f,0.00009471178f,0.00009676814f,0.00009855628f,0.0001000762f,0.0001013577f,0.000102371f,0.0001031458f,0.0001036823f,0.0001039505f,0.0001039505f,0.0001037419f,0.000103265f,0.0001025498f,0.0001016259f,0.0001004636f,0.00009906292f,0.00009745359f,0.00009563565f,0.0000936389f,0.00009140372f,0.00008901954f,0.00008642673f,0.00008368492f,0.00008076429f,0.00007772446f,0.00007450581f,0.00007116795f,0.00006771088f,0.0000641346f,0.00006043911f,0.00005668402f,0.00005280972f,0.00004887581f,0.0000448823f,0.00004085898f,0.00003677607f,0.00003266335f,0.00002852082f,0.0000243783f,0.00002020597f,0.00001609325f,0.00001198053f,0.000007867813f,0.000003814697f,-0.0000001788139f,-0.00000411272f,-0.000007987022f,-0.00001180172f,-0.00001549721f,-0.00001913309f,-0.00002264977f,-0.00002610683f,-0.00002938509f,-0.00003260374f,-0.00003564358f,-0.00003856421f,-0.00004136562f,-0.00004404783f,-0.00004655123f,-0.00004887581f,-0.00005108118f,-0.00005316734f,-0.00005501509f,-0.00005674362f,-0.00005829334f,-0.00005972385f,-0.00006091595f,-0.00006198883f,-0.0000628829f,-0.00006359816f,-0.0000641346f,-0.00006455183f,-0.00006473064f,-0.00006479025f,-0.00006467104f,-0.00006443262f,-0.00006401539f,-0.00006341934f,-0.00006270409f,-0.00006181002f,-0.00006079674f,-0.00005966425f,-0.00005835295f,-0.00005692244f,-0.00005537271f,-0.00005376339f,-0.00005197525f,-0.00005012751f,-0.00004816055f,-0.00004607439f,-0.00004392862f,-0.00004166365f,-0.00003933907f,-0.00003701448f,-0.00003457069f,-0.0000320673f,-0.0000295043f,-0.0000269413f,-0.0000243187f,-0.00002169609f,-0.00001901388f,-0.00001633167f,-0.00001364946f,-0.00001096725f,-0.000008285046f,-0.000005662441f,-0.000002980232f,-0.0000003576279f,0.000002205372f,0.000004768372f,0.000007271767f,0.000009715557f,0.00001209974f,0.00001448393f,0.00001674891f,0.00001895428f,0.00002110004f,0.00002318621f,0.00002515316f,0.00002706051f,0.00002884865f,0.00003057718f,0.00003218651f,0.00003373623f,0.00003516674f,0.00003647804f,0.00003772974f,0.00003880262f,0.0000398159f,0.00004076958f,0.00004154444f,0.00004225969f,0.00004285574f,0.00004333258f,0.0000436902f,0.00004392862f,0.00004410744f,0.00004416704f,0.00004410744f,0.00004398823f,0.00004374981f,0.00004339218f,0.00004291534f,0.0000423789f,0.00004178286f,0.0000410676f,0.00004029274f,0.00003939867f,0.000038445f,0.00003743172f,0.00003629923f,0.00003516674f,0.00003391504f,0.00003266335f,0.00003129244f,0.00002992153f,0.00002849102f,0.0000270009f,0.00002545118f,0.00002390146f,0.00002235174f,0.00002074242f,0.00001907349f,0.00001746416f,0.00001579523f,0.0000141263f,0.00001245737f,0.00001078844f,0.000009119511f,0.000007450581f,0.000005781651f,0.000004172325f,0.000002563f,0.0000009536743f,-0.0000005960464f,-0.000002145767f,-0.000003635883f,-0.000005125999f,-0.000006556511f,-0.000007927418f,-0.00000923872f,-0.00001055002f,-0.00001180172f,-0.00001299381f,-0.0000141263f,-0.00001519918f,-0.00001621246f,-0.00001716614f,-0.00001806021f,-0.00001889467f,-0.00001966953f,-0.00002038479f,-0.00002104044f,-0.00002163649f,-0.00002211332f,-0.00002259016f,-0.00002294779f,-0.00002330542f,-0.00002354383f,-0.00002372265f,-0.00002384186f,-0.00002396107f,-0.00002396107f,-0.00002390146f,-0.00002378225f,-0.00002354383f,-0.00002336502f,-0.000023067f,-0.00002270937f,-0.00002229214f,-0.0000218749f,-0.00002133846f,-0.00002080202f,-0.00002020597f,-0.00001960993f,-0.00001889467f,-0.00001817942f,-0.00001746416f,-0.0000166893f,-0.00001585484f,-0.00001502037f,-0.00001418591f,-0.00001329184f,-0.00001239777f,-0.00001144409f,-0.00001055002f,-0.000009596348f,-0.000008583069f,-0.000007629395f,-0.00000667572f,-0.000005722046f,-0.000004708767f,-0.000003755093f,-0.000002801418f,-0.000001847744f,-0.0000008940697f,0.00000005960464f,0.000001013279f,0.000001907349f,0.000002801418f,0.000003695488f,0.000004529953f,0.000005364418f,0.000006139278f,0.000006914139f,0.000007688999f,0.000008404255f,0.000009119511f,0.000009775162f,0.00001037121f,0.00001096725f,0.0000115633f,0.00001209974f,0.00001257658f,0.00001299381f,0.00001341105f,0.00001382828f,0.0000141263f,0.00001448393f,0.00001472235f,0.00001496077f,0.00001513958f,0.00001531839f,0.0000154376f,0.00001549721f,0.00001555681f,0.00001555681f,0.00001555681f,0.00001549721f,0.000015378f,0.00001525879f,0.00001513958f,0.00001496077f,0.00001472235f,0.00001448393f,0.00001418591f,0.00001388788f,0.00001358986f,0.00001323223f,0.0000128746f,0.00001251698f,0.00001209974f,0.00001168251f,0.00001120567f,0.00001072884f,0.0000103116f,0.000009775162f,0.000009298325f,0.000008821487f,0.000008285046f,0.000007748604f,0.000007212162f,0.000006735325f,0.000006198883f,0.000005722046f,0.000005185604f,0.000004649162f,0.00000411272f,0.000003576279f,0.000003039837f,0.000002563f,0.000002026558f,0.000001549721f,0.000001013279f,0.0000005364418f,0.0000001192093f,-0.0000003576279f,-0.000000834465f,-0.000001251698f,-0.00000166893f,-0.000002026558f,-0.00000244379f,-0.000002801418f,-0.000003159046f,-0.000003457069f,-0.000003814697f,-0.00000411272f,-0.000004351139f,-0.000004589558f,-0.000004827976f,-0.000005066395f,-0.000005245209f,-0.000005424023f,-0.000005602837f,-0.000005781651f,-0.00000590086f,-0.000005960464f,-0.000006079674f,-0.000006139278f,-0.000006139278f,-0.000006198883f,-0.000006198883f,-0.000006198883f,-0.000006139278f,-0.000006139278f,-0.000006079674f,-0.000006020069f,-0.00000590086f,-0.000005781651f,-0.000005662441f,-0.000005543232f,-0.000005424023f,-0.000005245209f,-0.000005066395f,-0.000004887581f,-0.000004708767f,-0.000004529953f,-0.000004351139f,-0.00000411272f,-0.000003874302f,-0.000003695488f,-0.000003457069f,-0.000003218651f,-0.000002980232f,-0.000002741814f,-0.000002503395f,-0.000002205372f,-0.000001966953f,-0.000001728535f,-0.000001490116f,-0.000001251698f,-0.000001013279f,-0.0000007748604f,-0.0000004768372f,-0.0000002384186f,0.0f,0.0000001788139f,0.0000004172325f,0.0000006556511f,0.0000008940697f,0.000001072884f,0.000001311302f,0.000001490116f,0.00000166893f,0.000001847744f,0.000002026558f,0.000002205372f,0.000002384186f,0.000002503395f,0.000002682209f,0.000002801418f,0.000002920628f,0.000003039837f,0.000003159046f,0.000003278255f,0.000003397465f,0.000003457069f,0.000003516674f,0.000003576279f,0.000003635883f,0.000003695488f,0.000003755093f,0.000003755093f,0.000003814697f,0.000003814697f,0.000003814697f,0.000003814697f,0.000003814697f,0.000003814697f,0.000003814697f,0.000003755093f,0.000003755093f,0.000003695488f,0.000003635883f,0.000003576279f,0.000003516674f,0.000003457069f,0.000003397465f,0.00000333786f,0.000003278255f,0.000003218651f,0.000003099442f,0.000003039837f,0.000002920628f,0.000002861023f,0.000002741814f,0.000002682209f,0.000002563f,0.00000244379f,0.000002384186f,0.000002264977f,0.000002205372f,0.000002086163f,0.000001966953f,0.000001907349f,0.000001788139f,0.00000166893f,0.000001609325f,0.000001490116f,0.000001370907f,0.000001311302f,0.000001192093f,0.000001132488f,0.000001013279f,0.0000009536743f,0.000000834465f,0.0000007748604f,0.0000007152557f,0.0000006556511f,0.0000005364418f,0.0000004768372f,0.0000004172325f,0.0000003576279f,0.0000002980232f,0.0000002384186f,0.0000001788139f,0.0000001192093f,0.00000005960464f,0.0f,0.0f,-0.00000005960464f,-0.0000001192093f,-0.0000001192093f,-0.0000001788139f,-0.0000001788139f,-0.0000002384186f,-0.0000002384186f,-0.0000002980232f,-0.0000002980232f,-0.0000002980232f,-0.0000002980232f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000002980232f,-0.0000002980232f,-0.0000002980232f,-0.0000002980232f,-0.0000002980232f,-0.0000002384186f,-0.0000002384186f,-0.0000002384186f,-0.0000002384186f,-0.0000002384186f,-0.0000001788139f,-0.0000001788139f,-0.0000001788139f,-0.0000001788139f,-0.0000001192093f,-0.0000001192093f,-0.0000001192093f,-0.0000001192093f,-0.0000001192093f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.00000005960464f,0.0f}; +const float blampd2[] = {-0.00000000000000000000079f,-0.000000000000001555538f,-0.0000000000000188418f,-0.0000000000001055974f,-0.0000000000003913555f,-0.000000000001119447f,-0.000000000002685064f,-0.000000000005673093f,-0.00000000001089572f,-0.00000000001942924f,-0.00000000003265103f,-0.0000000000522765f,-0.00000000008039512f,-0.0000000001195052f,-0.0000000001725481f,-0.0000000002429424f,-0.0000000003346181f,-0.0000000004520484f,-0.000000000600281f,-0.0000000007849686f,-0.000000001012397f,-0.000000001289514f,-0.000000001623957f,-0.000000002024079f,-0.000000002498969f,-0.000000003058479f,-0.000000003713246f,-0.000000004474705f,-0.000000005355116f,-0.000000006367573f,-0.000000007526025f,-0.000000008845286f,-0.00000001034105f,-0.00000001202989f,-0.00000001392929f,-0.00000001605762f,-0.00000001843415f,-0.00000002107906f,-0.00000002401345f,-0.00000002725931f,-0.00000003083953f,-0.00000003477788f,-0.00000003909902f,-0.0000000438285f,-0.0000000489927f,-0.00000005461886f,-0.00000006073503f,-0.00000006737008f,-0.00000007455365f,-0.00000008231616f,-0.00000009068871f,-0.00000009970314f,-0.0000001093919f,-0.0000001197883f,-0.0000001309258f,-0.0000001428389f,-0.0000001555623f,-0.0000001691313f,-0.0000001835816f,-0.0000001989494f,-0.000000215271f,-0.000000232583f,-0.0000002509226f,-0.0000002703266f,-0.0000002908324f,-0.0000003124771f,-0.000000335298f,-0.0000003593323f,-0.0000003846168f,-0.0000004111886f,-0.0000004390838f,-0.0000004683389f,-0.0000004989894f,-0.0000005310706f,-0.000000564617f,-0.0000005996627f,-0.0000006362407f,-0.0000006743836f,-0.0000007141227f,-0.0000007554885f,-0.0000007985106f,-0.000000843217f,-0.0000008896347f,-0.0000009377896f,-0.0000009877057f,-0.000001039406f,-0.000001092911f,-0.00000114824f,-0.000001205412f,-0.000001264442f,-0.000001325343f,-0.000001388127f,-0.000001452805f,-0.000001519382f,-0.000001587865f,-0.000001658256f,-0.000001730554f,-0.000001804758f,-0.000001880861f,-0.000001958857f,-0.000002038734f,-0.000002120478f,-0.000002204073f,-0.000002289499f,-0.000002376731f,-0.000002465745f,-0.00000255651f,-0.000002648993f,-0.000002743157f,-0.000002838962f,-0.000002936363f,-0.000003035315f,-0.000003135764f,-0.000003237656f,-0.000003340931f,-0.000003445527f,-0.000003551377f,-0.000003658408f,-0.000003766547f,-0.000003875713f,-0.000003985823f,-0.000004096789f,-0.000004208519f,-0.000004320917f,-0.000004433883f,-0.00000454731f,-0.000004661091f,-0.000004775111f,-0.000004889252f,-0.000005003392f,-0.000005117404f,-0.000005231158f,-0.000005344516f,-0.000005457341f,-0.000005569488f,-0.000005680808f,-0.000005791149f,-0.000005900354f,-0.000006008262f,-0.000006114708f,-0.000006219523f,-0.000006322532f,-0.000006423561f,-0.000006522427f,-0.000006618945f,-0.000006712926f,-0.00000680418f,-0.000006892508f,-0.000006977713f,-0.000007059592f,-0.00000713794f,-0.000007212545f,-0.000007283198f,-0.000007349682f,-0.000007411781f,-0.000007469273f,-0.000007521936f,-0.000007569546f,-0.000007611874f,-0.000007648692f,-0.000007679768f,-0.000007704869f,-0.000007723761f,-0.000007736209f,-0.000007741975f,-0.000007740822f,-0.000007732511f,-0.000007716804f,-0.000007693461f,-0.000007662242f,-0.000007622908f,-0.00000757522f,-0.00000751894f,-0.00000745383f,-0.000007379653f,-0.000007296173f,-0.000007203158f,-0.000007100373f,-0.00000698759f,-0.000006864581f,-0.000006731119f,-0.000006586983f,-0.000006431953f,-0.000006265812f,-0.000006088349f,-0.000005899353f,-0.000005698621f,-0.000005485952f,-0.000005261152f,-0.000005024028f,-0.000004774396f,-0.000004512077f,-0.000004236896f,-0.000003948686f,-0.000003647285f,-0.000003332539f,-0.0000030043f,-0.000002662429f,-0.000002306791f,-0.000001937264f,-0.000001553728f,-0.000001156078f,-0.0000007442121f,-0.0000003180409f,0.000000122517f,0.0000005775334f,0.00000104707f,0.000001531179f,0.0000020299f,0.000002543266f,0.000003071296f,0.000003613997f,0.000004171369f,0.000004743395f,0.000005330049f,0.000005931294f,0.000006547077f,0.000007177336f,0.000007821993f,0.000008480959f,0.000009154132f,0.000009841395f,0.00001054262f,0.00001125766f,0.00001198636f,0.00001272854f,0.00001348403f,0.00001425261f,0.00001503408f,0.0000158282f,0.00001663473f,0.0000174534f,0.00001828395f,0.00001912608f,0.00001997949f,0.00002084385f,0.00002171883f,0.00002260407f,0.00002349921f,0.00002440386f,0.00002531763f,0.00002624009f,0.00002717083f,0.00002810939f,0.00002905531f,0.00003000812f,0.00003096732f,0.00003193241f,0.00003290286f,0.00003387814f,0.00003485768f,0.00003584094f,0.00003682732f,0.00003781622f,0.00003880704f,0.00003979915f,0.00004079191f,0.00004178466f,0.00004277674f,0.00004376748f,0.00004475617f,0.00004574211f,0.00004672459f,0.00004770287f,0.00004867621f,0.00004964386f,0.00005060505f,0.00005155901f,0.00005250495f,0.00005344208f,0.0000543696f,0.00005528668f,0.00005619252f,0.00005708626f,0.00005796709f,0.00005883415f,0.00005968659f,0.00006052355f,0.00006134418f,0.0000621476f,0.00006293293f,0.00006369931f,0.00006444585f,0.00006517167f,0.00006587588f,0.0000665576f,0.00006721594f,0.00006785001f,0.00006845893f,0.00006904182f,0.00006959778f,0.00007012593f,0.00007062541f,0.00007109533f,0.00007153483f,0.00007194304f,0.0000723191f,0.00007266218f,0.00007297142f,0.00007324597f,0.00007348505f,0.00007368781f,0.00007385344f,0.00007398118f,0.00007407023f,0.00007411983f,0.00007412922f,0.00007409767f,0.00007402445f,0.00007390886f,0.00007375021f,0.00007354782f,0.00007330106f,0.00007300928f,0.00007267187f,0.00007228825f,0.00007185784f,0.00007138011f,0.00007085451f,0.00007028058f,0.00006965782f,0.00006898579f,0.00006826408f,0.00006749229f,0.00006667006f,0.00006579705f,0.00006487297f,0.00006389753f,0.00006287049f,0.00006179164f,0.00006066082f,0.00005947786f,0.00005824266f,0.00005695514f,0.00005561526f,0.00005422302f,0.00005277845f,0.00005128161f,0.00004973262f,0.00004813161f,0.00004647877f,0.00004477432f,0.00004301852f,0.00004121168f,0.00003935414f,0.00003744628f,0.00003548852f,0.00003348133f,0.00003142523f,0.00002932076f,0.00002716852f,0.00002496914f,0.00002272331f,0.00002043174f,0.00001809521f,0.00001571453f,0.00001329055f,0.00001082417f,0.000008316342f,0.000005768043f,0.000003180309f,0.0000005542149f,-0.000002109119f,-0.000004808528f,-0.000007542806f,-0.0000103107f,-0.00001311092f,-0.00001594212f,-0.00001880293f,-0.00002169191f,-0.00002460761f,-0.00002754852f,-0.00003051309f,-0.00003349972f,-0.00003650678f,-0.00003953262f,-0.0000425755f,-0.0000456337f,-0.00004870541f,-0.00005178881f,-0.00005488204f,-0.0000579832f,-0.00006109037f,-0.00006420156f,-0.00006731477f,-0.00007042798f,-0.00007353912f,-0.00007664608f,-0.00007974674f,-0.00008283895f,-0.00008592051f,-0.00008898922f,-0.00009204284f,-0.00009507911f,-0.00009809574f,-0.0001010904f,-0.0001040609f,-0.0001070047f,-0.0001099195f,-0.000112803f,-0.0001156527f,-0.0001184662f,-0.0001212412f,-0.0001239751f,-0.0001266656f,-0.0001293101f,-0.0001319063f,-0.0001344516f,-0.0001369437f,-0.00013938f,-0.000141758f,-0.0001440754f,-0.0001463297f,-0.0001485183f,-0.0001506389f,-0.0001526891f,-0.0001546663f,-0.0001565682f,-0.0001583924f,-0.0001601366f,-0.0001617982f,-0.0001633751f,-0.0001648649f,-0.0001662653f,-0.000167574f,-0.0001687889f,-0.0001699076f,-0.000170928f,-0.000171848f,-0.0001726654f,-0.0001733782f,-0.0001739844f,-0.000174482f,-0.000174869f,-0.0001751435f,-0.0001753038f,-0.0001753479f,-0.0001752742f,-0.0001750809f,-0.0001747664f,-0.0001743292f,-0.0001737676f,-0.0001730803f,-0.0001722659f,-0.0001713229f,-0.0001702503f,-0.0001690467f,-0.000167711f,-0.0001662422f,-0.0001646392f,-0.0001629013f,-0.0001610276f,-0.0001590172f,-0.0001568696f,-0.0001545842f,-0.0001521604f,-0.0001495979f,-0.0001468962f,-0.0001440552f,-0.0001410748f,-0.0001379547f,-0.0001346952f,-0.0001312962f,-0.0001277581f,-0.0001240811f,-0.0001202656f,-0.0001163121f,-0.0001122213f,-0.0001079938f,-0.0001036304f,-0.00009913211f,-0.00009449985f,-0.00008973476f,-0.00008483804f,-0.000079811f,-0.00007465507f,-0.00006937178f,-0.00006396275f,-0.00005842971f,-0.00005277452f,-0.00004699911f,-0.00004110553f,-0.00003509596f,-0.00002897264f,-0.00002273795f,-0.00001639437f,-0.000009944477f,-0.000003390955f,0.000003263405f,0.00001001571f,0.00001686296f,0.00002380205f,0.00003082979f,0.00003794286f,0.00004513787f,0.00005241132f,0.00005975959f,0.000067179f,0.00007466574f,0.00008221593f,0.00008982559f,0.00009749064f,0.0001052069f,0.0001129702f,0.000120776f,0.0001286201f,0.0001364979f,0.0001444048f,0.0001523362f,0.0001602872f,0.0001682531f,0.000176229f,0.0001842099f,0.0001921908f,0.0002001666f,0.0002081321f,0.0002160821f,0.0002240114f,0.0002319145f,0.0002397861f,0.0002476208f,0.0002554131f,0.0002631575f,0.0002708484f,0.0002784802f,0.0002860472f,0.0002935439f,0.0003009645f,0.0003083033f,0.0003155546f,0.0003227127f,0.0003297717f,0.0003367259f,0.0003435696f,0.0003502969f,0.0003569021f,0.0003633794f,0.0003697231f,0.0003759274f,0.0003819866f,0.000387895f,0.000393647f,0.0003992368f,0.0004046589f,0.0004099077f,0.0004149778f,0.0004198634f,0.0004245594f,0.0004290603f,0.0004333608f,0.0004374556f,0.0004413396f,0.0004450077f,0.0004484547f,0.0004516759f,0.0004546662f,0.000457421f,0.0004599356f,0.0004622053f,0.0004642258f,0.0004659925f,0.0004675014f,0.0004687481f,0.0004697288f,0.0004704394f,0.0004708763f,0.0004710357f,0.0004709141f,0.0004705083f,0.0004698149f,0.0004688308f,0.0004675533f,0.0004659794f,0.0004641065f,0.0004619323f,0.0004594543f,0.0004566706f,0.0004535791f,0.0004501781f,0.0004464659f,0.0004424412f,0.0004381028f,0.0004334496f,0.0004284807f,0.0004231955f,0.0004175936f,0.0004116747f,0.0004054387f,0.0003988859f,0.0003920165f,0.0003848311f,0.0003773305f,0.0003695157f,0.0003613879f,0.0003529486f,0.0003441992f,0.0003351419f,0.0003257786f,0.0003161115f,0.0003061434f,0.0002958768f,0.0002853148f,0.0002744607f,0.0002633177f,0.0002518897f,0.0002401804f,0.000228194f,0.0002159349f,0.0002034076f,0.0001906169f,0.0001775678f,0.0001642656f,0.0001507158f,0.0001369241f,0.0001228964f,0.0001086388f,0.00009415769f,0.00007945971f,0.00006455164f,0.0000494405f,0.00003413351f,0.00001863814f,0.000002962022f,-0.00001288697f,-0.00002890078f,-0.00004507113f,-0.00006138958f,-0.00007784744f,-0.00009443589f,-0.0001111459f,-0.0001279682f,-0.0001448934f,-0.000161912f,-0.0001790142f,-0.00019619f,-0.0002134295f,-0.0002307223f,-0.0002480581f,-0.0002654264f,-0.0002828163f,-0.0003002172f,-0.000317618f,-0.0003350078f,-0.0003523752f,-0.000369709f,-0.0003869977f,-0.0004042299f,-0.0004213937f,-0.0004384776f,-0.0004554698f,-0.0004723583f,-0.0004891311f,-0.0005057764f,-0.0005222819f,-0.0005386356f,-0.0005548253f,-0.0005708387f,-0.0005866637f,-0.000602288f,-0.0006176993f,-0.0006328853f,-0.0006478339f,-0.0006625326f,-0.0006769692f,-0.0006911317f,-0.0007050076f,-0.0007185851f,-0.0007318518f,-0.0007447959f,-0.0007574054f,-0.0007696682f,-0.0007815728f,-0.0007931073f,-0.0008042602f,-0.0008150199f,-0.0008253751f,-0.0008353146f,-0.0008448273f,-0.0008539021f,-0.0008625283f,-0.0008706952f,-0.0008783923f,-0.0008856094f,-0.0008923364f,-0.0008985632f,-0.0009042803f,-0.0009094781f,-0.0009141474f,-0.0009182792f,-0.0009218645f,-0.000924895f,-0.0009273623f,-0.0009292583f,-0.0009305754f,-0.0009313059f,-0.0009314429f,-0.0009309793f,-0.0009299086f,-0.0009282245f,-0.000925921f,-0.0009229926f,-0.0009194339f,-0.00091524f,-0.0009104062f,-0.0009049284f,-0.0008988026f,-0.0008920254f,-0.0008845935f,-0.0008765042f,-0.0008677552f,-0.0008583445f,-0.0008482704f,-0.0008375319f,-0.0008261281f,-0.0008140586f,-0.0008013237f,-0.0007879237f,-0.0007738596f,-0.0007591327f,-0.0007437448f,-0.0007276981f,-0.0007109955f,-0.0006936399f,-0.0006756349f,-0.0006569847f,-0.0006376937f,-0.0006177668f,-0.0005972094f,-0.0005760275f,-0.0005542274f,-0.0005318159f,-0.0005088002f,-0.0004851882f,-0.0004609881f,-0.0004362085f,-0.0004108586f,-0.000384948f,-0.0003584869f,-0.0003314858f,-0.0003039557f,-0.0002759081f,-0.000247355f,-0.0002183088f,-0.0001887823f,-0.000158789f,-0.0001283426f,-0.00009745736f,-0.00006614791f,-0.00003442939f,-0.000002317386f,0.00003017213f,0.00006302272f,0.00009621755f,0.0001297394f,0.0001635705f,0.0001976929f,0.000232088f,0.000266737f,0.0003016207f,0.0003367194f,0.0003720131f,0.0004074815f,0.0004431038f,0.0004788591f,0.0005147259f,0.0005506826f,0.000586707f,0.0006227769f,0.0006588697f,0.0006949624f,0.0007310318f,0.0007670546f,0.0008030069f,0.0008388649f,0.0008746043f,0.0009102009f,0.0009456301f,0.000980867f,0.001015887f,0.001050664f,0.001085174f,0.001119391f,0.001153289f,0.001186843f,0.001220027f,0.001252816f,0.001285183f,0.001317103f,0.001348549f,0.001379496f,0.001409917f,0.001439787f,0.00146908f,0.001497769f,0.00152583f,0.001553236f,0.001579962f,0.001605981f,0.001631269f,0.001655801f,0.001679551f,0.001702495f,0.001724607f,0.001745863f,0.001766239f,0.001785711f,0.001804255f,0.001821848f,0.001838466f,0.001854087f,0.001868688f,0.001882247f,0.001894743f,0.001906153f,0.001916457f,0.001925635f,0.001933666f,0.001940531f,0.00194621f,0.001950686f,0.001953939f,0.001955952f,0.001956709f,0.001956193f,0.001954388f,0.001951278f,0.00194685f,0.001941089f,0.001933981f,0.001925515f,0.001915678f,0.001904459f,0.001891847f,0.001877834f,0.001862408f,0.001845563f,0.001827291f,0.001807585f,0.00178644f,0.00176385f,0.00173981f,0.001714319f,0.001687373f,0.001658971f,0.001629112f,0.001597796f,0.001565025f,0.0015308f,0.001495125f,0.001458004f,0.001419441f,0.001379443f,0.001338016f,0.001295169f,0.001250911f,0.001205251f,0.001158201f,0.001109772f,0.001059978f,0.001008833f,0.0009563518f,0.0009025513f,0.0008474487f,0.0007910624f,0.000733412f,0.0006745181f,0.0006144025f,0.0005530881f,0.0004905987f,0.0004269595f,0.0003621966f,0.0002963374f,0.0002294102f,0.0001614446f,0.00009247124f,0.00002252185f,-0.00004837065f,-0.0001201723f,-0.0001928479f,-0.0002663613f,-0.000340675f,-0.0004157508f,-0.0004915489f,-0.0005680287f,-0.0006451484f,-0.0007228652f,-0.0008011351f,-0.0008799131f,-0.0009591531f,-0.001038808f,-0.001118829f,-0.001199167f,-0.001279773f,-0.001360594f,-0.001441578f,-0.001522671f,-0.00160382f,-0.001684968f,-0.00176606f,-0.001847038f,-0.001927843f,-0.002008417f,-0.002088698f,-0.002168627f,-0.00224814f,-0.002327175f,-0.002405669f,-0.002483555f,-0.002560769f,-0.002637245f,-0.002712915f,-0.002787711f,-0.002861565f,-0.002934407f,-0.003006167f,-0.003076774f,-0.003146156f,-0.003214241f,-0.003280957f,-0.003346228f,-0.003409982f,-0.003472143f,-0.003532637f,-0.003591386f,-0.003648316f,-0.003703348f,-0.003756405f,-0.00380741f,-0.003856285f,-0.00390295f,-0.003947326f,-0.003989335f,-0.004028896f,-0.004065929f,-0.004100354f,-0.004132092f,-0.004161059f,-0.004187176f,-0.004210362f,-0.004230535f,-0.004247614f,-0.004261517f,-0.004272163f,-0.004279471f,-0.004283357f,-0.004283743f,-0.004280544f,-0.004273681f,-0.004263072f,-0.004248635f,-0.00423029f,-0.004207956f,-0.004181552f,-0.004150998f,-0.004116214f,-0.00407712f,-0.004033636f,-0.003985685f,-0.003933186f,-0.003876062f,-0.003814235f,-0.003747628f,-0.003676163f,-0.003599765f,-0.003518358f,-0.003431867f,-0.003340217f,-0.003243334f,-0.003141146f,-0.00303358f,-0.002920564f,-0.002802027f,-0.002677898f,-0.00254811f,-0.002412592f,-0.002271278f,-0.0021241f,-0.001970992f,-0.001811891f,-0.00164673f,-0.001475448f,-0.001297983f,-0.001114273f,-0.000924259f,-0.0007278814f,-0.0005250828f,-0.0003158064f,-0.00009999688f,0.0001224002f,0.0003514379f,0.0005871683f,0.0008296419f,0.001078908f,0.001335016f,0.001598011f,0.00186794f,0.002144847f,0.002428775f,0.002719765f,0.003017858f,0.003323092f,0.003635505f,0.003955133f,0.004282011f,0.004616172f,0.004957647f,0.005306467f,0.005662661f,0.006026255f,0.006397276f,0.006775748f,0.007161694f,0.007555134f,0.007956089f,0.008364576f,0.008780613f,0.009204214f,0.009635393f,0.01007416f,0.01052053f,0.01097451f,0.0114361f,0.01190531f,0.01238215f,0.01286662f,0.01238215f,0.01190531f,0.0114361f,0.01097451f,0.01052053f,0.01007416f,0.009635393f,0.009204214f,0.008780614f,0.008364577f,0.007956089f,0.007555135f,0.007161694f,0.006775748f,0.006397277f,0.006026255f,0.005662661f,0.005306467f,0.004957648f,0.004616171f,0.004282011f,0.003955133f,0.003635505f,0.003323091f,0.003017858f,0.002719766f,0.002428776f,0.002144847f,0.001867941f,0.001598012f,0.001335017f,0.001078907f,0.0008296408f,0.0005871691f,0.0003514364f,0.0001224019f,-0.00009999797f,-0.0003158078f,-0.0005250834f,-0.0007278807f,-0.0009242594f,-0.001114272f,-0.001297984f,-0.00147545f,-0.001646731f,-0.001811892f,-0.001970991f,-0.002124101f,-0.002271276f,-0.002412591f,-0.00254811f,-0.002677899f,-0.002802026f,-0.002920564f,-0.003033578f,-0.003141146f,-0.003243335f,-0.003340218f,-0.003431868f,-0.003518358f,-0.003599763f,-0.003676161f,-0.003747627f,-0.003814235f,-0.00387606f,-0.003933184f,-0.003985684f,-0.004033636f,-0.004077122f,-0.004116215f,-0.004150994f,-0.004181549f,-0.004207954f,-0.004230291f,-0.004248634f,-0.004263073f,-0.004273683f,-0.004280545f,-0.004283741f,-0.004283354f,-0.004279472f,-0.004272163f,-0.004261516f,-0.004247613f,-0.004230537f,-0.00421036f,-0.004187174f,-0.00416106f,-0.004132092f,-0.004100353f,-0.004065931f,-0.004028894f,-0.003989331f,-0.003947325f,-0.003902949f,-0.003856286f,-0.003807411f,-0.003756404f,-0.003703348f,-0.003648318f,-0.003591388f,-0.003532633f,-0.003472142f,-0.003409982f,-0.003346227f,-0.003280953f,-0.00321424f,-0.003146157f,-0.003076777f,-0.003006168f,-0.002934404f,-0.002861567f,-0.002787709f,-0.002712913f,-0.002637245f,-0.002560772f,-0.002483554f,-0.002405666f,-0.002327174f,-0.002248138f,-0.002168626f,-0.002088696f,-0.002008416f,-0.001927845f,-0.001847036f,-0.001766056f,-0.001684964f,-0.001603819f,-0.001522668f,-0.001441583f,-0.001360595f,-0.001279771f,-0.001199171f,-0.001118824f,-0.001038805f,-0.0009591579f,-0.0008799136f,-0.0008011311f,-0.0007228702f,-0.0006451458f,-0.0005680323f,-0.0004915446f,-0.0004157424f,-0.0003406703f,-0.0002663583f,-0.0001928508f,-0.0001201779f,-0.00004836917f,0.00002251565f,0.00009247661f,0.0001614392f,0.0002294183f,0.0002963394f,0.0003622025f,0.000426963f,0.0004906058f,0.0005530864f,0.0006144047f,0.000674516f,0.0007334203f,0.0007910579f,0.0008474439f,0.0009025484f,0.0009563565f,0.001008838f,0.001059979f,0.001109779f,0.001158208f,0.001205251f,0.001250908f,0.001295164f,0.00133802f,0.001379445f,0.00141944f,0.001458004f,0.001495123f,0.001530796f,0.001565024f,0.001597792f,0.001629114f,0.001658976f,0.001687378f,0.001714319f,0.001739815f,0.00176385f,0.001786441f,0.001807585f,0.001827285f,0.001845568f,0.001862407f,0.001877829f,0.001891851f,0.001904458f,0.001915678f,0.001925513f,0.001933977f,0.001941085f,0.001946852f,0.001951277f,0.001954392f,0.001956195f,0.001956716f,0.001955956f,0.001953945f,0.001950681f,0.001946211f,0.001940534f,0.001933664f,0.001925632f,0.001916453f,0.001906157f,0.001894742f,0.001882255f,0.001868695f,0.001854092f,0.001838461f,0.001821846f,0.001804262f,0.00178571f,0.001766235f,0.001745865f,0.001724601f,0.001702502f,0.001679555f,0.001655802f,0.001631275f,0.001605988f,0.001579955f,0.001553237f,0.001525834f,0.001497775f,0.001469076f,0.001439795f,0.001409918f,0.00137949f,0.001348555f,0.001317099f,0.00128518f,0.001252815f,0.001220033f,0.001186848f,0.00115329f,0.00111939f,0.001085177f,0.001050666f,0.001015887f,0.0009808689f,0.0009456277f,0.0009102076f,0.0008746088f,0.0008388609f,0.0008030087f,0.0007670522f,0.0007310361f,0.0006949604f,0.0006588697f,0.0006227791f,0.0005867183f,0.0005506873f,0.0005147159f,0.0004788637f,0.0004431009f,0.0004074872f,0.0003720224f,0.0003367066f,0.0003016293f,0.0002667308f,0.0002321005f,0.0001977086f,0.0001635849f,0.0001297295f,0.0000962317f,0.00006303191f,0.00003015995f,-0.000002324581f,-0.00003442168f,-0.00006616116f,-0.00009745359f,-0.0001283288f,-0.0001587868f,-0.0001887679f,-0.000218302f,-0.0002473593f,-0.0002759099f,-0.0003039539f,-0.0003314912f,-0.0003584921f,-0.0003849566f,-0.0004108548f,-0.0004362166f,-0.0004609823f,-0.0004851818f,-0.0005087852f,-0.0005318224f,-0.0005542338f,-0.0005760193f,-0.0005972087f,-0.0006177723f,-0.0006376803f,-0.0006569922f,-0.0006756186f,-0.0006936491f,-0.000710994f,-0.0007276833f,-0.0007437468f,-0.0007591248f,-0.0007738471f,-0.0007879138f,-0.0008013248f,-0.0008140504f,-0.0008261204f,-0.0008375347f,-0.0008482635f,-0.0008583367f,-0.0008677542f,-0.0008765161f,-0.0008845925f,-0.0008920133f,-0.0008988082f,-0.0009049177f,-0.0009104013f,-0.0009152293f,-0.0009194314f,-0.0009229779f,-0.0009259284f,-0.0009282231f,-0.0009298921f,-0.0009309649f,-0.0009314418f,-0.0009312928f,-0.0009305775f,-0.0009292662f,-0.0009273589f,-0.0009248853f,-0.0009218752f,-0.0009182692f,-0.0009141564f,-0.0009094775f,-0.0009042919f,-0.0008985698f,-0.0008923411f,-0.0008856058f,-0.0008783937f,-0.0008707047f,-0.0008625388f,-0.0008538961f,-0.0008448362f,-0.0008352995f,-0.0008253753f,-0.0008150041f,-0.0008042455f,-0.0007930994f,-0.0007815659f,-0.0007696748f,-0.0007573962f,-0.0007447898f,-0.0007318556f,-0.0007185936f,-0.0007050037f,-0.0006911159f,-0.0006769598f,-0.0006625354f,-0.0006478429f,-0.0006328821f,-0.0006176829f,-0.0006022751f,-0.0005866587f,-0.0005708337f,-0.0005548298f,-0.0005386472f,-0.0005222857f,-0.0005057752f,-0.0004891157f,-0.0004723668f,-0.0004554689f,-0.0004384816f,-0.0004214048f,-0.0004042387f,-0.0003869832f,-0.0003696978f,-0.0003523827f,-0.0003350079f,-0.0003176033f,-0.0003002286f,-0.000282824f,-0.0002654195f,-0.0002480447f,-0.0002307296f,-0.0002134144f,-0.0001961887f,-0.0001790226f,-0.000161916f,-0.0001448989f,-0.0001279712f,-0.0001111329f,-0.00009444356f,-0.00007784367f,-0.00006139278f,-0.00004506111f,-0.00002890825f,-0.0000128746f,0.00000295043f,0.00001862645f,0.00003412366f,0.00004944205f,0.00006455183f,0.00007945299f,0.00009414554f,0.0001086295f,0.0001229048f,0.0001369119f,0.0001507103f,0.0001642704f,0.0001775622f,0.0001906157f,0.0002034009f,0.0002159476f,0.0002281964f,0.0002401769f,0.0002518892f,0.0002633333f,0.0002744496f,0.0002853274f,0.0002958775f,0.0003061593f,0.0003161132f,0.0003257692f,0.0003351569f,0.000344187f,0.0003529489f,0.000361383f,0.000369519f,0.0003773272f,0.0003848374f,0.0003920197f,0.0003988743f,0.0004054308f,0.0004116893f,0.0004175901f,0.000423193f,0.000428468f,0.000433445f,0.0004380941f,0.0004424453f,0.0004464686f,0.0004501939f,0.0004535913f,0.000456661f,0.0004594624f,0.000461936f,0.0004641116f,0.0004659891f,0.0004675686f,0.0004688203f,0.0004698038f,0.0004705191f,0.0004709065f,0.0004710257f,0.0004708767f,0.0004704297f,0.0004697442f,0.0004687607f,0.000467509f,0.0004659891f,0.0004642308f,0.0004622042f,0.0004599392f,0.0004574358f,0.0004546642f,0.000451684f,0.0004484653f,0.0004450083f,0.0004413426f,0.0004374683f,0.0004333556f,0.000429064f,0.0004245639f,0.0004198551f,0.0004149675f,0.0004099011f,0.0004046559f,0.0003992319f,0.0003936589f,0.000387907f,0.0003819764f,0.0003759265f,0.0003697276f,0.0003633797f,0.0003569126f,0.0003502965f,0.0003435612f,0.0003367364f,0.0003297627f,0.0003227293f,0.000315547f,0.000308305f,0.0003009737f,0.0002935529f,0.0002860427f,0.0002784729f,0.0002708435f,0.0002631545f,0.0002554059f,0.0002476275f,0.0002397895f,0.0002319217f,0.0002240241f,0.0002160966f,0.0002081394f,0.0002001822f,0.0001921952f,0.000184238f,0.0001762509f,0.0001682639f,0.0001602769f,0.0001523495f,0.0001444221f,0.0001364946f,0.0001286268f,0.000120759f,0.0001129508f,0.0001052022f,0.0000975132f,0.0000898242f,0.00008219481f,0.00007468462f,0.00006717443f,0.00005978346f,0.00005239248f,0.00004512072f,0.00003796816f,0.0000308156f,0.00002378225f,0.00001686811f,0.00001001358f,0.000003278255f,-0.000003397465f,-0.000009953976f,-0.00001639128f,-0.00002270937f,-0.00002896786f,-0.00003510714f,-0.0000411272f,-0.00004696846f,-0.00005275011f,-0.00005841255f,-0.00006395578f,-0.00006937981f,-0.00007462502f,-0.00007981062f,-0.00008481741f,-0.00008970499f,-0.00009447336f,-0.00009912252f,-0.0001036525f,-0.0001080036f,-0.0001122355f,-0.0001162887f,-0.0001202822f,-0.0001240969f,-0.0001277328f,-0.000131309f,-0.0001347065f,-0.0001379251f,-0.0001410842f,-0.0001440644f,-0.0001468658f,-0.0001496077f,-0.0001521707f,-0.0001545548f,-0.0001568794f,-0.0001590252f,-0.0001610518f,-0.0001628995f,-0.000164628f,-0.0001662374f,-0.0001677275f,-0.0001690388f,-0.0001702309f,-0.0001713037f,-0.0001722574f,-0.0001730919f,-0.0001737475f,-0.0001743436f,-0.0001747608f,-0.0001750588f,-0.0001752973f,-0.0001753569f,-0.0001752973f,-0.0001751184f,-0.00017488f,-0.0001744628f,-0.000173986f,-0.0001733899f,-0.0001726747f,-0.0001718402f,-0.0001709461f,-0.0001699328f,-0.0001688004f,-0.0001675487f,-0.0001662374f,-0.0001648664f,-0.0001633763f,-0.000161767f,-0.0001601577f,-0.0001583695f,-0.0001565814f,-0.0001546741f,-0.0001527071f,-0.0001506209f,-0.0001485348f,-0.0001463294f,-0.0001440644f,-0.0001417398f,-0.0001393557f,-0.0001369119f,-0.0001344681f,-0.0001319051f,-0.0001292825f,-0.0001266599f,-0.0001239777f,-0.0001212358f,-0.0001184344f,-0.000115633f,-0.000112772f,-0.000109911f,-0.0001069903f,-0.0001040697f,-0.0001010895f,-0.00009810925f,-0.00009506941f,-0.00009202957f,-0.00008898973f,-0.00008589029f,-0.00008285046f,-0.00007975101f,-0.00007665157f,-0.00007355213f,-0.00007045269f,-0.00006729364f,-0.0000641942f,-0.00006109476f,-0.00005799532f,-0.00005489588f,-0.00005179644f,-0.00004869699f,-0.00004565716f,-0.00004255772f,-0.00003951788f,-0.00003647804f,-0.00003349781f,-0.00003051758f,-0.00002753735f,-0.00002461672f,-0.00002169609f,-0.00001877546f,-0.00001591444f,-0.00001311302f,-0.0000103116f,-0.00000756979f,-0.000004827976f,-0.000002086163f,0.0000005364418f,0.000003159046f,0.000005781651f,0.00000834465f,0.00001084805f,0.00001329184f,0.00001573563f,0.00001811981f,0.00002044439f,0.00002270937f,0.00002497435f,0.00002717972f,0.00002932549f,0.00003141165f,0.00003349781f,0.00003546476f,0.00003743172f,0.00003933907f,0.00004118681f,0.00004303455f,0.00004476309f,0.00004649162f,0.00004816055f,0.00004971027f,0.00005125999f,0.00005280972f,0.00005424023f,0.00005561113f,0.00005698204f,0.00005823374f,0.00005948544f,0.00006067753f,0.00006181002f,0.0000628829f,0.00006389618f,0.00006484985f,0.00006580353f,0.0000666976f,0.00006747246f,0.00006824732f,0.00006896257f,0.00006967783f,0.00007027388f,0.00007086992f,0.00007140636f,0.0000718832f,0.00007230043f,0.00007265806f,0.00007301569f,0.00007331371f,0.00007355213f,0.00007373095f,0.00007390976f,0.00007402897f,0.00007408857f,0.00007414818f,0.00007414818f,0.00007408857f,0.00007396936f,0.00007385015f,0.00007367134f,0.00007349253f,0.00007325411f,0.00007295609f,0.00007265806f,0.00007230043f,0.00007194281f,0.00007152557f,0.00007110834f,0.0000706315f,0.00007015467f,0.00006961823f,0.00006902218f,0.00006848574f,0.00006783009f,0.00006723404f,0.00006657839f,0.00006586313f,0.00006514788f,0.00006443262f,0.00006371737f,0.0000629425f,0.00006216764f,0.00006133318f,0.00006049871f,0.00005966425f,0.00005882978f,0.00005799532f,0.00005710125f,0.00005620718f,0.00005531311f,0.00005435944f,0.00005346537f,0.00005251169f,0.00005155802f,0.00005060434f,0.00004965067f,0.00004869699f,0.00004768372f,0.00004673004f,0.00004571676f,0.00004476309f,0.00004374981f,0.00004279613f,0.00004178286f,0.00004076958f,0.0000398159f,0.00003880262f,0.00003784895f,0.00003683567f,0.00003582239f,0.00003486872f,0.00003385544f,0.00003290176f,0.00003194809f,0.00003099442f,0.00003004074f,0.00002908707f,0.00002813339f,0.00002717972f,0.00002622604f,0.00002533197f,0.0000243783f,0.00002348423f,0.00002259016f,0.00002169609f,0.00002086163f,0.00001996756f,0.00001913309f,0.00001829863f,0.00001746416f,0.0000166297f,0.00001585484f,0.00001502037f,0.00001424551f,0.00001347065f,0.00001275539f,0.00001198053f,0.00001126528f,0.00001055002f,0.000009834766f,0.000009179115f,0.00000846386f,0.000007808208f,0.000007152557f,0.000006556511f,0.000005960464f,0.000005364418f,0.000004768372f,0.000004172325f,0.000003635883f,0.000003099442f,0.000002563f,0.000002026558f,0.000001549721f,0.000001072884f,0.0000005960464f,0.0000001192093f,-0.0000002980232f,-0.0000007152557f,-0.000001132488f,-0.000001549721f,-0.000001907349f,-0.000002324581f,-0.000002682209f,-0.000002980232f,-0.00000333786f,-0.000003635883f,-0.000003933907f,-0.00000423193f,-0.000004529953f,-0.000004768372f,-0.00000500679f,-0.000005245209f,-0.000005483627f,-0.000005722046f,-0.00000590086f,-0.000006079674f,-0.000006258488f,-0.000006437302f,-0.000006556511f,-0.000006735325f,-0.000006854534f,-0.000006973743f,-0.000007092953f,-0.000007212162f,-0.000007271767f,-0.000007390976f,-0.000007450581f,-0.000007510185f,-0.00000756979f,-0.000007629395f,-0.000007629395f,-0.000007688999f,-0.000007688999f,-0.000007748604f,-0.000007748604f,-0.000007748604f,-0.000007748604f,-0.000007748604f,-0.000007688999f,-0.000007688999f,-0.000007629395f,-0.000007629395f,-0.00000756979f,-0.000007510185f,-0.000007450581f,-0.000007390976f,-0.000007331371f,-0.000007271767f,-0.000007212162f,-0.000007152557f,-0.000007033348f,-0.000006973743f,-0.000006914139f,-0.00000679493f,-0.000006735325f,-0.000006616116f,-0.000006496906f,-0.000006437302f,-0.000006318092f,-0.000006198883f,-0.000006139278f,-0.000006020069f,-0.00000590086f,-0.000005781651f,-0.000005662441f,-0.000005543232f,-0.000005424023f,-0.000005364418f,-0.000005245209f,-0.000005125999f,-0.00000500679f,-0.000004887581f,-0.000004768372f,-0.000004649162f,-0.000004529953f,-0.000004410744f,-0.000004291534f,-0.00000423193f,-0.00000411272f,-0.000003993511f,-0.000003874302f,-0.000003755093f,-0.000003635883f,-0.000003516674f,-0.000003457069f,-0.00000333786f,-0.000003218651f,-0.000003159046f,-0.000003039837f,-0.000002920628f,-0.000002861023f,-0.000002741814f,-0.000002622604f,-0.000002563f,-0.00000244379f,-0.000002384186f,-0.000002264977f,-0.000002205372f,-0.000002086163f,-0.000002026558f,-0.000001966953f,-0.000001847744f,-0.000001788139f,-0.000001728535f,-0.00000166893f,-0.000001609325f,-0.000001490116f,-0.000001430511f,-0.000001370907f,-0.000001311302f,-0.000001251698f,-0.000001192093f,-0.000001132488f,-0.000001072884f,-0.000001013279f,-0.0000009536743f,-0.0000009536743f,-0.0000008940697f,-0.000000834465f,-0.0000007748604f,-0.0000007748604f,-0.0000007152557f,-0.0000006556511f,-0.0000006556511f,-0.0000005960464f,-0.0000005364418f,-0.0000005364418f,-0.0000004768372f,-0.0000004768372f,-0.0000004172325f,-0.0000004172325f,-0.0000003576279f,-0.0000003576279f,-0.0000003576279f,-0.0000002980232f,-0.0000002980232f,-0.0000002384186f,-0.0000002384186f,-0.0000002384186f,-0.0000002384186f,-0.0000001788139f,-0.0000001788139f,-0.0000001788139f,-0.0000001788139f,-0.0000001192093f,-0.0000001192093f,-0.0000001192093f,-0.0000001192093f,-0.0000001192093f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,-0.00000005960464f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f}; +const int B_OVERSAMPLING =64; +const int Samples = 16; diff --git a/Source/Engine/Decimator.h b/Source/Engine/Decimator.h new file mode 100755 index 0000000..546ed66 --- /dev/null +++ b/Source/Engine/Decimator.h @@ -0,0 +1,86 @@ +#pragma once +//MusicDsp +// T.Rochebois +//still indev +class Decimator17 +{ +private: + const float h0,h1,h3,h5,h7,h9,h11,h13,h15,h17; + float R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17; +public: + Decimator17() + : h0(0.5) + , h1(0.314356238) + , h3(-0.0947515890) + , h5(0.0463142134) + , h7(-0.0240881704) + , h9(0.0120250406) + , h11(-0.00543170841) + , h13(0.00207426259) + , h15(-0.000572688237) + , h17(5.18944944e-005) + { + R1=R2=R3=R4=R5=R6=R7=R8=R9=R10=R11=R12=R13=R14=R15=R16=R17=0; + } + float Calc(const float x0,const float x1) + { + float h17x0 = h17 *x0; + float h15x0 = h15 *x0; + float h13x0 = h13 *x0; + float h11x0= h11 *x0; + float h9x0=h9*x0; + float h7x0=h7*x0; + float h5x0=h5*x0; + float h3x0=h3*x0; + float h1x0=h1*x0; + float R18=R17+h17x0; + R17 = R16 + h15x0; + R16 = R15 + h13x0; + R15 = R14 + h11x0; + R14 = R13 + h9x0; + R13 = R12 + h7x0; + R12 = R11 + h5x0; + R11 = R10 + h3x0; + R10 = R9 + h1x0; + R9 = R8 + h1x0 + h0*x1; + R8 = R7 + h3x0; + R7 = R6 + h5x0; + R6 = R5 + h7x0; + R5 = R4 + h9x0; + R4 = R3 + h11x0; + R3 = R2 + h13x0; + R2 = R1 + h15x0; + R1 = h17x0; + return R18; + } +}; +class Decimator9 +{ +private: + const float h0,h1,h3,h5,h7,h9; + float R1,R2,R3,R4,R5,R6,R7,R8,R9; +public: + Decimator9() : h0(8192/16384.0f),h1(5042/16384.0f),h3(-1277/16384.0f),h5(429/16384.0f),h7(-116/16384.0f),h9(18/16384.0f) + { + R1=R2=R3=R4=R5=R6=R7=R8=R9=0.0f; + } + inline float Calc(const float x0,const float x1) + { + float h9x0=h9*x0; + float h7x0=h7*x0; + float h5x0=h5*x0; + float h3x0=h3*x0; + float h1x0=h1*x0; + float R10=R9+h9x0; + R9=R8+h7x0; + R8=R7+h5x0; + R7=R6+h3x0; + R6=R5+h1x0; + R5=R4+h1x0+h0*x1; + R4=R3+h3x0; + R3=R2+h5x0; + R2=R1+h7x0; + R1=h9x0; + return R10; + } +}; diff --git a/Source/Engine/DelayLine.h b/Source/Engine/DelayLine.h new file mode 100755 index 0000000..6c407ed --- /dev/null +++ b/Source/Engine/DelayLine.h @@ -0,0 +1,71 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "SynthEngine.h" +//Always feed first then get delayed sample! +#define DEMAX 64 +template class DelayLine +{ +private: + float dl[DEMAX]; + int iidx; +public: + DelayLine() + { + iidx = 0; + zeromem(dl,sizeof(float)*DEMAX); + //jassert(DM > DMAX); + } + inline float feedReturn(float sm) + { + dl[iidx] = sm; + iidx--; + iidx=(iidx&(DEMAX-1)); + return dl[(iidx + DM)&(DEMAX-1)]; + } + inline void fillZeroes() + { + zeromem(dl,DEMAX*sizeof(float)); + } +}; +template class DelayLineBoolean +{ +private: + bool dl[DEMAX]; + int iidx; +public: + DelayLineBoolean() + { + iidx = 0; + zeromem(dl,sizeof(bool)*DEMAX); + } + inline float feedReturn(bool sm) + { + dl[iidx] = sm; + iidx--; + iidx=(iidx&(DEMAX-1)); + return dl[(iidx + DM)&(DEMAX-1)]; + } + +}; diff --git a/Source/Engine/Filter.h b/Source/Engine/Filter.h new file mode 100755 index 0000000..415e5dc --- /dev/null +++ b/Source/Engine/Filter.h @@ -0,0 +1,185 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== +*/ +#pragma once +#include "ObxdVoice.h" +#include +class Filter +{ +private: + float s1,s2,s3,s4; + float R; + float R24; + float rcor,rcorInv; + float rcor24,rcor24Inv; + + //24 db multimode + float mmt; + int mmch; +public: + float SampleRate; + float sampleRateInv; + bool bandPassSw; + float mm; + bool selfOscPush; + Filter() + { + selfOscPush = false; + bandPassSw = false; + mm=0; + s1=s2=s3=s4=0; + SampleRate = 44000; + sampleRateInv = 1 / SampleRate; + rcor =500.0 / 44000; + rcorInv = 1 / rcor; + rcor24 = 970.0 / 44000; + rcor24Inv = 1 / rcor24; + R=1; + R24=0; + } + void setMultimode(float m) + { + mm = m; + mmch = (int)(mm * 3); + mmt = mm*3-mmch; + } + inline void setSampleRate(float sr) + { + SampleRate = sr; + sampleRateInv = 1/SampleRate; + float rcrate =sqrt((44000/SampleRate)); + rcor = (500.0 / 44000)*rcrate; + rcor24 = (970.0 / 44000)*rcrate; + rcorInv = 1 / rcor; + rcor24Inv = 1 / rcor24; + } + inline void setResonance(float res) + { + R = 1-res; + R24 =( 3.5 * res); + } + + inline float diodePairResistanceApprox(float x) + { + return (((((0.0103592f)*x + 0.00920833f)*x + 0.185f)*x + 0.05f )*x + 1.0f); + //Taylor approx of slightly mismatched diode pair + } + //resolve 0-delay feedback + inline float NR(float sample, float g) + { + //calculating feedback non-linear transconducance and compensated for R (-1) + //Boosting non-linearity + float tCfb; + if(!selfOscPush) + tCfb = diodePairResistanceApprox(s1*0.0876f) - 1.0f; + else + tCfb = diodePairResistanceApprox(s1*0.0876f) - 1.035f; + //float tCfb = 0; + //disable non-linearity == digital filter + + //resolve linear feedback + float y = ((sample - 2*(s1*(R+tCfb)) - g*s1 - s2)/(1+ g*(2*(R+tCfb)+ g))); + + //float y = ((sample - 2*(s1*(R+tCfb)) - g2*s1 - s2)/(1+ g1*(2*(R+tCfb)+ g2))); + + return y; + } + inline float Apply(float sample,float g) + { + + float gpw = tanf(g *sampleRateInv * juce::float_Pi); + g = gpw; + //float v = ((sample- R * s1*2 - g2*s1 - s2)/(1+ R*g1*2 + g1*g2)); + float v = NR(sample,g); + + float y1 = v*g + s1; + s1 = v*g + y1; + + float y2 = y1*g + s2; + s2 = y1*g + y2; + + float mc; + if(!bandPassSw) + mc = (1-mm)*y2 + (mm)*v; + else + { + + mc =2 * ( mm < 0.5 ? + ((0.5 - mm) * y2 + (mm) * y1): + ((1-mm) * y1 + (mm-0.5) * v) + ); + } + + return mc; + } + inline float NR24(float sample,float g,float lpc) + { + float ml = 1 / (1+g); + float S = (lpc*(lpc*(lpc*s1 + s2) + s3) +s4)*ml; + float G = lpc*lpc*lpc*lpc; + float y = (sample - R24 * S) / (1 + R24*G); + return y; + } + inline float Apply4Pole(float sample,float g) + { + float g1 = (float)tan(g *sampleRateInv * juce::float_Pi); + g = g1; + + + + float lpc = g / (1 + g); + float y0 = NR24(sample,g,lpc); + //first low pass in cascade + double v = (y0 - s1) * lpc; + double res = v + s1; + s1 = res + v; + //damping + s1 =atan(s1*rcor24)*rcor24Inv; + + float y1= res; + float y2 = tptpc(s2,y1,g); + float y3 = tptpc(s3,y2,g); + float y4 = tptpc(s4,y3,g); + float mc; + switch(mmch) + { + case 0: + mc = ((1 - mmt) * y4 + (mmt) * y3); + break; + case 1: + mc = ((1 - mmt) * y3 + (mmt) * y2); + break; + case 2: + mc = ((1 - mmt) * y2 + (mmt) * y1); + break; + case 3: + mc = y1; + break; + default: + mc=0; + break; + } + //half volume comp + return mc * (1 + R24 * 0.45); + } +}; diff --git a/Source/Engine/Lfo.h b/Source/Engine/Lfo.h new file mode 100755 index 0000000..c48991a --- /dev/null +++ b/Source/Engine/Lfo.h @@ -0,0 +1,159 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "SynthEngine.h" +class Lfo +{ +private: + float phase; + float s, sq, sh; + float s1; + Random rg; + float SampleRate; + float SampleRateInv; + + float syncRate; + bool synced; + +public: + float Frequency; + float phaseInc; + float frUnsc;//frequency value without sync + float rawParam; + int waveForm; + Lfo() + { + phaseInc = 0; + frUnsc=0; + syncRate = 1; + rawParam=0; + synced = false; + s1=0; + Frequency=1; + phase=0; + s=sq=sh=0; + rg=Random(); + } + void setSynced() + { + synced = true; + recalcRate(rawParam); + } + void setUnsynced() + { + synced = false; + phaseInc = frUnsc; + } + void hostSyncRetrigger(float bpm,float quaters) + { + if(synced) + { + phaseInc = (bpm/60.0)*syncRate; + phase = phaseInc*quaters; + phase = (fmod(phase,1)*float_Pi*2-float_Pi); + } + } + inline float getVal() + { + float Res = 0; + if((waveForm &1) !=0 ) + Res+=s; + if((waveForm&2)!=0) + Res+=sq; + if((waveForm&4)!=0) + Res+=sh; + return tptlpupw(s1, Res,3000,SampleRateInv); + } + void setSamlpeRate(float sr) + { + SampleRate=sr; + SampleRateInv = 1 / SampleRate; + } + inline void update() + { + phase+=((phaseInc * float_Pi*2 * SampleRateInv)); + sq = (phase>0?1:-1); + s = sin(phase); + if(phase > float_Pi) + { + phase-=2*float_Pi; + sh = rg.nextFloat()*2-1; + } + + } + void setFrequency(float val) + { + frUnsc = val; + if(!synced) + phaseInc = val; + } + void setRawParam(float param)//used for synced rate changes + { + rawParam = param; + if(synced) + { + recalcRate(param); + } + } + void recalcRate(float param) + { + const int ratesCount = 9; + int parval = (int)(param*(ratesCount-1)); + float rt = 1; + switch(parval) + { + case 0: + rt = 1.0 / 8; + break; + case 1: + rt = 1.0 / 4; + break; + case 2: + rt = 1.0 / 3; + break; + case 3: + rt = 1.0 / 2; + break; + case 4: + rt = 1.0; + break; + case 5: + rt = 3.0 / 2; + break; + case 6: + rt = 2; + break; + case 7: + rt = 3; + break; + case 8: + rt = 4; + break; + default: + rt = 1; + break; + } + syncRate = rt; + } +}; diff --git a/Source/Engine/Motherboard.h b/Source/Engine/Motherboard.h new file mode 100755 index 0000000..d673c66 --- /dev/null +++ b/Source/Engine/Motherboard.h @@ -0,0 +1,380 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright � 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== +*/ +#pragma once +#include +#include "VoiceQueue.h" +#include "SynthEngine.h" +#include "Lfo.h" + +class Motherboard +{ +private: + VoiceQueue vq; + int totalvc; + bool wasUni; + bool awaitingkeys[129]; + int priorities[129]; + + Decimator17 left,right; + int asPlayedCounter; + float lkl,lkr; + float sampleRate,sampleRateInv; + //JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Motherboard) +public: + bool asPlayedMode; + Lfo mlfo,vibratoLfo; + float vibratoAmount; + bool vibratoEnabled; + + float Volume; + const static int MAX_VOICES=8; + float pannings[MAX_VOICES]; + ObxdVoice voices[MAX_VOICES]; + bool uni; + bool Oversample; + + bool economyMode; + Motherboard(): left(),right() + { + economyMode = true; + lkl=lkr=0; + vibratoEnabled = true; + asPlayedMode = false; + asPlayedCounter = 0; + for(int i = 0 ; i < 129 ; i++) + { + awaitingkeys[i] = false; + priorities[i] = 0; + } + vibratoAmount = 0; + Oversample=false; + mlfo= Lfo(); + vibratoLfo=Lfo(); + vibratoLfo.waveForm = 1; + uni = false; + wasUni = false; + Volume=0; + // voices = new ObxdVoice* [MAX_VOICES]; + // pannings = new float[MAX_VOICES]; + totalvc = MAX_VOICES; + vq = VoiceQueue(MAX_VOICES,voices); + for(int i = 0 ; i < MAX_VOICES;++i) + { + pannings[i]= 0.5; + } + } + ~Motherboard() + { + //delete pannings; + //for(int i = 0 ; i < MAX_VOICES;++i) + //{ + // delete voices[i]; + //} + //delete voices; + } + void setVoiceCount(int count) + { + for(int i = count ; i < MAX_VOICES;i++) + { + voices[i].NoteOff(); + voices[i].ResetEnvelope(); + } + vq.reInit(count); + totalvc = count; + } + void unisonOn() + { + //for(int i = 0 ; i < 110;i++) + // awaitingkeys[i] = false; + } + void setSampleRate(float sr) + { + sampleRate = sr; + sampleRateInv = 1 / sampleRate; + mlfo.setSamlpeRate(sr); + vibratoLfo.setSamlpeRate(sr); + for(int i = 0 ; i < MAX_VOICES;++i) + { + voices[i].setSampleRate(sr); + } + SetOversample(Oversample); + } + void sustainOn() + { + for(int i = 0 ; i < MAX_VOICES;i++) + { + ObxdVoice* p = vq.getNext(); + p->sustOn(); + } + } + void sustainOff() + { + for(int i = 0 ; i < MAX_VOICES;i++) + { + ObxdVoice* p = vq.getNext(); + p->sustOff(); + } + } + void setNoteOn(int noteNo,float velocity) + { + asPlayedCounter++; + priorities[noteNo] = asPlayedCounter; + bool processed=false; + if (wasUni != uni) + unisonOn(); + if (uni) + { + if(!asPlayedMode) + { + int minmidi = 129; + for(int i = 0 ; i < totalvc; i++) + { + ObxdVoice* p = vq.getNext(); + if(p->midiIndx < minmidi && p->Active) + { + minmidi = p->midiIndx; + } + } + if(minmidi < noteNo) + { + awaitingkeys[noteNo] = true; + } + else + { + for(int i = 0 ; i < totalvc;i++) + { + ObxdVoice* p = vq.getNext(); + if(p->midiIndx > noteNo && p->Active) + { + awaitingkeys[p->midiIndx] = true; + p->NoteOn(noteNo,-0.5); + } + else + { + p->NoteOn(noteNo,velocity); + } + } + } + processed = true; + } + else + { + for(int i = 0 ; i < totalvc; i++) + { + ObxdVoice* p = vq.getNext(); + if(p->Active) + { + awaitingkeys[p->midiIndx] = true; + p->NoteOn(noteNo,-0.5); + } + else + { + p->NoteOn(noteNo,velocity); + } + } + processed = true; + } + } + else + { + for (int i = 0; i < totalvc && !processed; i++) + { + ObxdVoice* p = vq.getNext(); + if (!p->Active) + { + p->NoteOn(noteNo,velocity); + processed = true; + } + } + } + // if voice steal occured + if(!processed) + { + // + if(!asPlayedMode) + { + int maxmidi = 0; + ObxdVoice* highestVoiceAvalible = NULL; + for(int i = 0 ; i < totalvc; i++) + { + ObxdVoice* p = vq.getNext(); + if(p->midiIndx > maxmidi) + { + maxmidi = p->midiIndx; + highestVoiceAvalible = p; + } + } + if(maxmidi < noteNo) + { + awaitingkeys[noteNo] = true; + } + else + { + highestVoiceAvalible->NoteOn(noteNo,-0.5); + awaitingkeys[maxmidi] = true; + } + } + else + { + int minPriority = INT_MAX; + ObxdVoice* minPriorityVoice = NULL; + for(int i = 0 ; i < totalvc; i++) + { + ObxdVoice* p = vq.getNext(); + if(priorities[p->midiIndx] midiIndx]; + minPriorityVoice = p; + } + } + awaitingkeys[minPriorityVoice->midiIndx] = true; + minPriorityVoice->NoteOn(noteNo,-0.5); + } + } + wasUni = uni; + } + + void setNoteOff(int noteNo) + { + awaitingkeys[noteNo] = false; + int reallocKey = 0; + //Voice release case + if(!asPlayedMode) + { + while(reallocKey < 129 &&(!awaitingkeys[reallocKey])) + { + reallocKey++; + } + } + else + { + reallocKey = 129; + int maxPriority = INT_MIN; + for(int i = 0 ; i < 129;i++) + { + if(awaitingkeys[i] && (maxPriority < priorities[i])) + { + reallocKey = i; + maxPriority = priorities[i]; + } + } + } + if(reallocKey !=129) + { + for(int i = 0 ; i < totalvc; i++) + { + ObxdVoice* p = vq.getNext(); + if((p->midiIndx == noteNo) && (p->Active)) + { + p->NoteOn(reallocKey,-0.5); + awaitingkeys[reallocKey] = false; + } + + } + } + else + //No realloc + { + for (int i = 0; i < totalvc; i++) + { + ObxdVoice* n = vq.getNext(); + if (n->midiIndx==noteNo && n->Active) + { + n->NoteOff(); + } + } + } + } + void SetOversample(bool over) + { + if(over==true) + { + mlfo.setSamlpeRate(sampleRate*2); + vibratoLfo.setSamlpeRate(sampleRate*2); + } + else + { + mlfo.setSamlpeRate(sampleRate); + vibratoLfo.setSamlpeRate(sampleRate); + } + for(int i = 0 ; i < MAX_VOICES;i++) + { + voices[i].setHQ(over); + if(over) + voices[i].setSampleRate(sampleRate*2); + else + voices[i].setSampleRate(sampleRate); + } + Oversample = over; + } + inline float processSynthVoice(ObxdVoice& b,float lfoIn,float vibIn ) + { + if(economyMode) + b.checkAdsrState(); + if(b.shouldProcessed||(!economyMode)) + { + b.lfoIn=lfoIn; + b.lfoVibratoIn=vibIn; + return b.ProcessSample(); + } + return 0; + } + void processSample(float* sm1,float* sm2) + { + mlfo.update(); + vibratoLfo.update(); + float vl=0,vr=0; + float vlo = 0 , vro = 0 ; + float lfovalue = mlfo.getVal(); + float viblfo = vibratoEnabled?(vibratoLfo.getVal() * vibratoAmount):0; + float lfovalue2=0,viblfo2; + if(Oversample) + { + mlfo.update(); + vibratoLfo.update(); + lfovalue2 = mlfo.getVal(); + viblfo2 = vibratoEnabled?(vibratoLfo.getVal() * vibratoAmount):0; + } + + for(int i = 0 ; i < totalvc;i++) + { + float x1 = processSynthVoice(voices[i],lfovalue,viblfo); + if(Oversample) + { + float x2 = processSynthVoice(voices[i],lfovalue2,viblfo2); + vlo+=x2*(1-pannings[i]); + vro+=x2*(pannings[i]); + } + vl+=x1*(1-pannings[i]); + vr+=x1*(pannings[i]); + } + if(Oversample) + { + vl = left.Calc(vl,vlo); + vr = right.Calc(vr,vro); + } + *sm1 = vl*Volume; + *sm2 = vr*Volume; + } +}; diff --git a/Source/Engine/ObxdBank.h b/Source/Engine/ObxdBank.h new file mode 100755 index 0000000..b44dddc --- /dev/null +++ b/Source/Engine/ObxdBank.h @@ -0,0 +1,39 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "ObxdVoice.h" +#include "ParamsEnum.h" +const int PROGRAMCOUNT = 128; +class ObxdBank +{ +public: + ObxdParams programs[PROGRAMCOUNT]; + ObxdParams* currentProgramPtr; + int currentProgram; + ObxdBank() + { + currentProgram=0; + currentProgramPtr = programs+currentProgram; + } +}; \ No newline at end of file diff --git a/Source/Engine/ObxdOscillatorB.h b/Source/Engine/ObxdOscillatorB.h new file mode 100755 index 0000000..8c28f0f --- /dev/null +++ b/Source/Engine/ObxdOscillatorB.h @@ -0,0 +1,253 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright � 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once + +#include "ObxdVoice.h" +#include "SynthEngine.h" +#include "AudioUtils.h" +#include "BlepData.h" +#include "DelayLine.h" +#include "SawOsc.h" +#include "PulseOsc.h" +#include "TriangleOsc.h" + +class ObxdOscillatorB +{ +private: + float SampleRate; + float pitch1; + float pitch2; + float sampleRateInv; + + + float x1,x2; + + float osc1Factor; + float osc2Factor; + + float pw1w,pw2w; + //blep const + const int n; + const int hsam; + //delay line implements fixed sample delay + DelayLine del1,del2; + DelayLine xmodd; + DelayLineBoolean syncd; + DelayLine syncFracd; + DelayLine cvd; + Random wn; + SawOsc o1s,o2s; + PulseOsc o1p,o2p; + TriangleOsc o1t,o2t; +public: + + float tune;//+-1 + int oct; + + float dirt; + + float notePlaying; + + + float totalDetune; + + float osc2Det; + float pulseWidth; + float pw1,pw2; + + + bool quantizeCw; + + float o1mx,o2mx; + float nmx; + float pto1,pto2; + + + //osc pitches + float osc1Saw,osc2Saw, + osc1Pul,osc2Pul; + + float osc1p,osc2p; + bool hardSync; + float xmod; + + + ObxdOscillatorB() : + n(Samples*2), + hsam(Samples), + o1s(),o2s(), + o1p(),o2p(), + o1t(),o2t() + { + dirt = 0.1; + totalDetune = 0; + wn = Random(Random::getSystemRandom().nextInt64()); + osc1Factor = wn.nextFloat()-0.5; + osc2Factor = wn.nextFloat()-0.5; + nmx=0; + oct=0; + tune=0; + pw1w=pw2w=0; + pto1=pto2=0; + pw1=pw2=0; + xmod = 0; + hardSync = false; + osc1p=osc2p=10; + osc1Saw=osc2Saw=osc1Pul=osc2Pul=false; + osc2Det = 0; + notePlaying = 30; + pulseWidth = 0; + o1mx=o2mx=0; + x1=wn.nextFloat(); + x2=wn.nextFloat(); + + //del1 = new DelayLine(hsam); + //del2 = new DelayLine(hsam); + //xmodd = new DelayLine(hsam); + //syncd = new DelayLineBoolean(hsam); + //syncFracd = new DelayLine(hsam); + //cvd = new DelayLine(hsam); + } + ~ObxdOscillatorB() + { + //delete del1; + //delete del2; + //delete xmodd; + //delete cvd; + //delete syncd; + //delete syncFracd; + } + void setDecimation() + { + o1p.setDecimation(); + o1t.setDecimation(); + o1s.setDecimation(); + o2p.setDecimation(); + o2t.setDecimation(); + o2s.setDecimation(); + } + void removeDecimation() + { + o1p.removeDecimation(); + o1t.removeDecimation(); + o1s.removeDecimation(); + o2p.removeDecimation(); + o2t.removeDecimation(); + o2s.removeDecimation(); + } + void setSampleRate(float sr) + { + SampleRate = sr; + sampleRateInv = 1.0f / SampleRate; + } + inline float ProcessSample() + { + float noiseGen = wn.nextFloat()-0.5; + pitch1 = getPitch(dirt * noiseGen + notePlaying + (quantizeCw?((int)(osc1p)):osc1p)+ pto1 + tune + oct+totalDetune*osc1Factor); + bool hsr = false; + float hsfrac=0; + float fs = jmin(pitch1*(sampleRateInv),0.45f); + x1+=fs; + hsfrac = 0; + float osc1mix=0.0f; + float pwcalc =jlimit(0.1f,1.0f,(pulseWidth + pw1)*0.5f + 0.5f); + + if(osc1Pul) + o1p.processMaster(x1,fs,pwcalc,pw1w); + if(osc1Saw) + o1s.processMaster(x1,fs); + else if(!osc1Pul) + o1t.processMaster(x1,fs); + + if(x1 >= 1.0f) + { + x1-=1.0f; + hsfrac = x1/fs; + hsr = true; + } + + + + pw1w = pwcalc; + + hsr &= hardSync; + //Delaying our hard sync gate signal and frac + hsr = syncd.feedReturn(hsr) != 0.0f; + hsfrac = syncFracd.feedReturn(hsfrac); + + if(osc1Pul) + osc1mix += o1p.getValue(x1,pwcalc) + o1p.aliasReduction(); + if(osc1Saw) + osc1mix += o1s.getValue(x1) + o1s.aliasReduction(); + else if(!osc1Pul) + osc1mix = o1t.getValue(x1) + o1t.aliasReduction(); + //Pitch control needs additional delay buffer to compensate + //This will give us less aliasing on xmod + //Hard sync gate signal delayed too + noiseGen = wn.nextFloat()-0.5; + pitch2 = getPitch(cvd.feedReturn(dirt *noiseGen + notePlaying + osc2Det + (quantizeCw?((int)(osc2p)):osc2p) + pto2+ osc1mix *xmod + tune + oct +totalDetune*osc2Factor)); + + fs = jmin(pitch2 * (sampleRateInv),0.45f); + + pwcalc = jlimit(0.1f,1.0f,(pulseWidth + pw2)*0.5f + 0.5f); + + float osc2mix=0.0f; + + x2 +=fs; + + if(osc2Pul) + o2p.processSlave(x2,fs,hsr,hsfrac,pwcalc,pw2w); + if(osc2Saw) + o2s.processSlave(x2,fs,hsr,hsfrac); + else if(!osc2Pul) + o2t.processSlave(x2,fs,hsr,hsfrac); + + + if(x2 >= 1.0f) + x2-=1.0; + + + pw2w=pwcalc; + //On hard sync reset slave phase is affected that way + if(hsr) + { + float fracMaster = (fs * hsfrac); + x2 =fracMaster; + } + //Delaying osc1 signal + //And getting delayed back + osc1mix = xmodd.feedReturn(osc1mix); + + if(osc2Pul) + osc2mix += o2p.getValue(x2,pwcalc) + o2p.aliasReduction(); + if(osc2Saw) + osc2mix += o2s.getValue(x2) + o2s.aliasReduction(); + else if(!osc2Pul) + osc2mix = o2t.getValue(x2) + o2t.aliasReduction(); + + //mixing + float res =o1mx*osc1mix + o2mx *osc2mix + (noiseGen)*(nmx*1.3 + 0.0006); + return res*3; + } +}; diff --git a/Source/Engine/ObxdVoice.h b/Source/Engine/ObxdVoice.h new file mode 100755 index 0000000..f87f177 --- /dev/null +++ b/Source/Engine/ObxdVoice.h @@ -0,0 +1,312 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright � 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "ObxdOscillatorB.h" +#include "AdsrEnvelope.h" +#include "Filter.h" +#include "Decimator.h" +#include "APInterpolator.h" + +class ObxdVoice +{ +private: + float SampleRate; + float sampleRateInv; + float Volume; + float port; + float velocityValue; + + float d1,d2; + float c1,c2; + + bool hq; + + //JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ObxdVoice) +public: + bool sustainHold; + //bool resetAdsrsOnAttack; + + AdsrEnvelope env; + AdsrEnvelope fenv; + ObxdOscillatorB osc; + Filter flt; + + Random ng; + + float vamp,vflt; + + float cutoff; + float fenvamt; + + float EnvDetune; + float FenvDetune; + + float FltDetune; + float FltDetAmt; + + float PortaDetune; + float PortaDetuneAmt; + + float levelDetune; + float levelDetuneAmt; + + float brightCoef; + + int midiIndx; + + bool Active; + bool shouldProcessed; + + float fltKF; + + float porta; + float prtst; + + float cutoffwas,envelopewas; + + float lfoIn; + float lfoVibratoIn; + + float pitchWheel; + float pitchWheelAmt; + bool pitchWheelOsc2Only; + + float lfoa1,lfoa2; + bool lfoo1,lfoo2,lfof; + bool lfopw1,lfopw2; + + bool Oversample; + bool selfOscPush; + + float envpitchmod; + float pwenvmod; + + float pwOfs; + bool pwEnvBoth; + bool pitchModBoth; + + bool invertFenv; + + + bool fourpole; + + + DelayLine lenvd,fenvd,lfod; + + ApInterpolator ap; + float oscpsw; + int legatoMode; + float briHold; + + ObxdVoice() + : ap() + { + hq = false; + selfOscPush = false; + pitchModBoth = false; + pwOfs = 0 ; + invertFenv = false; + pwEnvBoth = false; + ng = Random(Random::getSystemRandom().nextInt64()); + sustainHold = false; + shouldProcessed = false; + vamp=vflt=0; + velocityValue=0; + lfoVibratoIn=0; + fourpole = false; + legatoMode = 0; + brightCoef =briHold= 1; + envpitchmod = 0; + pwenvmod = 0; + oscpsw = 0; + cutoffwas = envelopewas=0; + Oversample= false; + c1=c2=d1=d2=0; + pitchWheel=pitchWheelAmt=0; + lfoIn=0; + PortaDetuneAmt=0; + FltDetAmt=0; + levelDetuneAmt=0; + porta =0; + prtst=0; + fltKF= false; + cutoff=0; + fenvamt = 0; + Active = false; + midiIndx = 30; + levelDetune = Random::getSystemRandom().nextFloat()-0.5; + EnvDetune = Random::getSystemRandom().nextFloat()-0.5; + FenvDetune = Random::getSystemRandom().nextFloat()-0.5; + FltDetune = Random::getSystemRandom().nextFloat()-0.5; + PortaDetune =Random::getSystemRandom().nextFloat()-0.5; + // lenvd=new DelayLine(Samples*2); + // fenvd=new DelayLine(Samples*2); + } + ~ObxdVoice() + { + // delete lenvd; + // delete fenvd; + } + inline float ProcessSample() + { + //portamento on osc input voltage + //implements rc circuit + float ptNote =tptlpupw(prtst, midiIndx-81, porta * (1+PortaDetune*PortaDetuneAmt),sampleRateInv); + osc.notePlaying = ptNote; + //both envelopes and filter cv need a delay equal to osc internal delay + float lfoDelayed = lfod.feedReturn(lfoIn); + //filter envelope undelayed + float envm = fenv.processSample() * (1 - (1-velocityValue)*vflt); + if(invertFenv) + envm = -envm; + //filter exp cutoff calculation + float cutoffcalc = jmin( + getPitch( + (lfof?lfoDelayed*lfoa1:0)+ + cutoff+ + FltDetune*FltDetAmt+ + fenvamt*fenvd.feedReturn(envm)+ + -45 + (fltKF*(ptNote+40)) + ) + //noisy filter cutoff + +(ng.nextFloat()-0.5f)*3.5f + , (flt.SampleRate*0.5f-120.0f));//for numerical stability purposes + + //limit our max cutoff on self osc to prevent alising + if(selfOscPush) + cutoffcalc = jmin(cutoffcalc,19000.0f); + + + //PW modulation + osc.pw1 = (lfopw1?(lfoIn * lfoa2):0) + (pwEnvBoth?(pwenvmod * envm) : 0); + osc.pw2 = (lfopw2?(lfoIn * lfoa2):0) + pwenvmod * envm + pwOfs; + + //Pitch modulation + osc.pto1 = (!pitchWheelOsc2Only? (pitchWheel*pitchWheelAmt):0 ) + ( lfoo1?(lfoIn * lfoa1):0) + (pitchModBoth?(envpitchmod * envm):0) + lfoVibratoIn; + osc.pto2 = (pitchWheel *pitchWheelAmt) + (lfoo2?lfoIn*lfoa1:0) + (envpitchmod * envm) + lfoVibratoIn; + + + + //variable sort magic - upsample trick + float envVal = lenvd.feedReturn(env.processSample() * (1 - (1-velocityValue)*vamp)); + + float oscps = osc.ProcessSample() * (1 - levelDetuneAmt*levelDetune); + + + oscps = oscps - tptlpupw(c1,oscps,12,sampleRateInv); + + float x1 = oscps; + x1 = tptpc(d2,x1,brightCoef); + if(fourpole) + x1 = flt.Apply4Pole(x1,(cutoffcalc)); + else + x1 = flt.Apply(x1,(cutoffcalc)); + x1 *= (envVal); + return x1; + } + void setBrightness(float val) + { + briHold = val; + brightCoef = tan(jmin(val,flt.SampleRate*0.5f-10)* (juce::float_Pi)*flt.sampleRateInv); + + } + void setEnvDer(float d) + { + env.setUniqueDeriviance(1 + EnvDetune*d); + fenv.setUniqueDeriviance(1 + FenvDetune*d); + } + void setHQ(bool hq) + { + if(hq) + { + osc.setDecimation(); + } + else + { + osc.removeDecimation(); + } + } + void setSampleRate(float sr) + { + flt.setSampleRate(sr); + osc.setSampleRate(sr); + env.setSampleRate(sr); + fenv.setSampleRate(sr); + SampleRate = sr; + sampleRateInv = 1 / sr; + brightCoef = tan(jmin(briHold,flt.SampleRate*0.5f-10)* (juce::float_Pi) * flt.sampleRateInv); + } + void checkAdsrState() + { + shouldProcessed = env.isActive(); + } + void ResetEnvelope() + { + env.ResetEnvelopeState(); + fenv.ResetEnvelopeState(); + } + void NoteOn(int mididx,float velocity) + { + if(!shouldProcessed) + { + //When your processing is paused we need to clear delay lines and envelopes + //Not doing this will cause clicks or glitches + lenvd.fillZeroes(); + fenvd.fillZeroes(); + ResetEnvelope(); + } + shouldProcessed = true; + if(velocity!=-0.5) + velocityValue = velocity; + midiIndx = mididx; + if((!Active)||(legatoMode&1)) + env.triggerAttack(); + if((!Active)||(legatoMode&2)) + fenv.triggerAttack(); + Active = true; + } + void NoteOff() + { + if(!sustainHold) + { + env.triggerRelease(); + fenv.triggerRelease(); + } + Active = false; + } + void sustOn() + { + sustainHold = true; + } + void sustOff() + { + sustainHold = false; + if(!Active) + { + env.triggerRelease(); + fenv.triggerRelease(); + } + + } +}; diff --git a/Source/Engine/ParamSmoother.h b/Source/Engine/ParamSmoother.h new file mode 100755 index 0000000..c2c4c6a --- /dev/null +++ b/Source/Engine/ParamSmoother.h @@ -0,0 +1,54 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "SynthEngine.h" + +const float PSSC = 0.0030; +class ParamSmoother +{ + private: + float steepValue; + float integralValue; + float srCor; + public : + ParamSmoother() + { + steepValue=integralValue=0; + srCor=1; + }; + float smoothStep() + { + integralValue = integralValue + ( steepValue - integralValue)*PSSC*srCor + dc; + return integralValue; + } + void setSteep(float value) + { + steepValue = value; + } + void setSampleRate(float sr) + { + srCor = sr / 44000; + } + +}; diff --git a/Source/Engine/Params.h b/Source/Engine/Params.h new file mode 100755 index 0000000..ae1b63f --- /dev/null +++ b/Source/Engine/Params.h @@ -0,0 +1,79 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright � 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "ObxdVoice.h" +#include "ParamsEnum.h" +class ObxdParams +{ +public: + float values[PARAM_COUNT]; + String name; + ObxdParams() + { + name = "Default"; + //values = new float[PARAM_COUNT]; + setDefaultValues(); + } + void setDefaultValues() + { + for(int k = 0 ; k < PARAM_COUNT;++k) + { + values[k] = 0.0f; + } + values[VOICE_COUNT] = 1.0f; + values[BRIGHTNESS]=1.0f; + values[OCTAVE]=0.5; + values[TUNE] = 0.5f; + values[OSC2_DET]=0.4; + values[LSUS]=1.0f; + values[CUTOFF]=1.0f; + values[VOLUME]=0.5f; + values[OSC1MIX]=1; + values[OSC2MIX]=1; + values[OSC1Saw]=1; + values[OSC2Saw]=1; + values[BENDLFORATE]=0.6; + +// values[FILTER_DRIVE]= 0.01; + values[PAN1]=0.5; + values[PAN2]=0.5; + values[PAN3]=0.5; + values[PAN4]=0.5; + values[PAN5]=0.5; + values[PAN6]=0.5; + values[PAN7]=0.5; + values[PAN8]=0.5; + values[ECONOMY_MODE] = 1; + values[ENVDER] = 0.3; + values[FILTERDER]=0.3; + values[LEVEL_DIF]=0.3; + values[PORTADER]=0.3; + values[UDET]=0.2; + } + ~ObxdParams() + { + //delete values; + } + //JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ObxdParams) +}; diff --git a/Source/Engine/ParamsEnum.h b/Source/Engine/ParamsEnum.h new file mode 100755 index 0000000..9cb3eb0 --- /dev/null +++ b/Source/Engine/ParamsEnum.h @@ -0,0 +1,94 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "ObxdVoice.h" +enum ObxdParameters +{ + UNDEFINED, + MIDILEARN, + VOLUME, + VOICE_COUNT, + TUNE, + OCTAVE, + BENDRANGE, + BENDOSC2, + LEGATOMODE, + BENDLFORATE, + VFLTENV, + VAMPENV, + + ASPLAYEDALLOCATION, + PORTAMENTO, + UNISON, + UDET, + OSC2_DET, + LFOFREQ, + LFOSINWAVE,LFOSQUAREWAVE,LFOSHWAVE, + LFO1AMT,LFO2AMT, + LFOOSC1,LFOOSC2,LFOFILTER,LFOPW1,LFOPW2, + OSC2HS, + XMOD, + OSC1P, + OSC2P, + OSCQuantize, + OSC1Saw, + OSC1Pul, + OSC2Saw, + OSC2Pul, + PW, + BRIGHTNESS, + ENVPITCH, + OSC1MIX, + OSC2MIX, + NOISEMIX, + FLT_KF, + CUTOFF, + RESONANCE, + MULTIMODE, + FILTER_WARM, + BANDPASS, + FOURPOLE, + ENVELOPE_AMT, + LATK, + LDEC, + LSUS, + LREL, + FATK, + FDEC, + FSUS, + FREL, + ENVDER,FILTERDER,PORTADER, + PAN1,PAN2,PAN3,PAN4,PAN5,PAN6,PAN7,PAN8, + UNLEARN, + ECONOMY_MODE, + LFO_SYNC, + PW_ENV, + PW_ENV_BOTH, + ENV_PITCH_BOTH, + FENV_INVERT, + PW_OSC2_OFS, + LEVEL_DIF, + SELF_OSC_PUSH, + PARAM_COUNT, +}; diff --git a/Source/Engine/PulseOsc.h b/Source/Engine/PulseOsc.h new file mode 100755 index 0000000..a795268 --- /dev/null +++ b/Source/Engine/PulseOsc.h @@ -0,0 +1,194 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright � 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "SynthEngine.h" +#include "BlepData.h" +class PulseOsc +{ + DelayLine del1; + bool pw1t; + float buffer1[Samples*2]; + const int hsam; + const int n; + float const * blepPTR; + int bP1; +public: + PulseOsc() : hsam(Samples) + , n(Samples*2) + { + // del1 = new DelayLine(hsam); + pw1t = false; + bP1=0; + //buffer1= new float[n]; + for(int i = 0 ; i < n ; i++) + buffer1[i]=0; + blepPTR = blep; + } + ~PulseOsc() + { + // delete buffer1; + // delete del1; + } + inline void setDecimation() + { + blepPTR = blepd2; + } + inline void removeDecimation() + { + blepPTR = blep; + } + inline float aliasReduction() + { + return -getNextBlep(buffer1,bP1); + } + inline void processMaster(float x,float delta,float pulseWidth,float pulseWidthWas) + { + float summated = delta- (pulseWidth - pulseWidthWas); + if((pw1t) && x >= 1.0f) + { + x -= 1.0f; + if(pw1t) + mixInImpulseCenter(buffer1,bP1,x/delta, 1); + pw1t=false; + } + if((!pw1t)&& (x >= pulseWidth)&&(x - summated <=pulseWidth)) + { + pw1t=true; + float frac =(x-pulseWidth) / summated; + mixInImpulseCenter(buffer1,bP1,frac,-1); + } + if((pw1t) && x >= 1.0f) + { + x-=1.0f; + if(pw1t) + mixInImpulseCenter(buffer1,bP1,x/delta, 1); + pw1t=false; + } + + } + inline float getValue(float x,float pulseWidth) + { + float oscmix; + if(x >= pulseWidth) + oscmix = 1 - (0.5-pulseWidth) - 0.5; + else + oscmix = -(0.5-pulseWidth) - 0.5; + return del1.feedReturn(oscmix); + } + inline float getValueFast(float x,float pulseWidth) + { + float oscmix; + if(x >= pulseWidth) + oscmix = 1 - (0.5-pulseWidth) - 0.5; + else + oscmix = -(0.5-pulseWidth) - 0.5; + return oscmix; + } + inline void processSlave(float x , float delta,bool hardSyncReset,float hardSyncFrac,float pulseWidth,float pulseWidthWas) + { + float summated = delta- (pulseWidth - pulseWidthWas); + + if((pw1t) && x >= 1.0f) + { + x -= 1.0f; + if(((!hardSyncReset)||(x/delta > hardSyncFrac)))//de morgan processed equation + { + if(pw1t) + mixInImpulseCenter(buffer1,bP1,x/delta, 1); + pw1t=false; + } + else + { + x+=1; + } + } + + if((!pw1t)&& (x >= pulseWidth) && (x - summated <=pulseWidth)) + { + pw1t=true; + float frac =(x-pulseWidth) / summated; + if(((!hardSyncReset)||(frac > hardSyncFrac)))//de morgan processed equation + { + //transition to 1 + mixInImpulseCenter(buffer1,bP1,frac,-1); + } + else + { + //if transition do not ocurred + pw1t=false; + } + + } + if((pw1t) && x >= 1.0f) + { + x -= 1.0f; + if(((!hardSyncReset)||(x/delta > hardSyncFrac)))//de morgan processed equation + { + if(pw1t) + mixInImpulseCenter(buffer1,bP1,x/delta, 1); + pw1t=false; + } + else + { + x+=1; + } + } + + if(hardSyncReset) + { + //float fracMaster = (delta * hardSyncFrac); + float trans =(pw1t?1:0); + mixInImpulseCenter(buffer1,bP1,hardSyncFrac,trans); + pw1t = false; + } + + } + inline void mixInImpulseCenter(float * buf,int& bpos,float offset, float scale) + { + int lpIn =(int)(B_OVERSAMPLING*(offset)); + float frac = offset * B_OVERSAMPLING - lpIn; + float f1 = 1.0f-frac; + for(int i = 0 ; i < Samples;i++) + { + float mixvalue = (blepPTR[lpIn]*f1+blepPTR[lpIn+1]*(frac)); + buf[(bpos+i)&(n-1)] += mixvalue*scale; + lpIn += B_OVERSAMPLING; + } + for(int i = Samples ; i del1; + float buffer1[Samples*2]; + const int hsam; + const int n; + float const * blepPTR; + int bP1; +public: + SawOsc() : hsam(Samples) + , n(Samples*2) + { + bP1=0; + //del1 = new DelayLine(hsam); + //buffer1= new float[n]; + for(int i = 0 ; i < n ; i++) + buffer1[i]=0; + blepPTR = blep; + } + ~SawOsc() + { + //delete del1; + //delete buffer1; + } + inline void setDecimation() + { + blepPTR = blepd2; + } + inline void removeDecimation() + { + blepPTR = blep; + } + inline float aliasReduction() + { + return -getNextBlep(buffer1,bP1); + } + inline void processMaster(float x,float delta) + { + if(x >= 1.0f) + { + x-=1.0f; + mixInImpulseCenter(buffer1,bP1,x/delta, 1); + } + } + inline float getValue(float x) + { + return del1.feedReturn(x-0.5); + } + inline float getValueFast(float x) + { + return x - 0.5; + } + inline void processSlave(float x , float delta,bool hardSyncReset,float hardSyncFrac) + { + if(x >= 1.0f) + { + x -= 1.0f; + if(((!hardSyncReset)||(x/delta > hardSyncFrac)))//de morgan processed equation + { + mixInImpulseCenter(buffer1,bP1,x/delta, 1); + } + else + { + //if transition do not ocurred + x+=1; + } + } + if(hardSyncReset) + { + float fracMaster = (delta * hardSyncFrac); + float trans = (x-fracMaster); + mixInImpulseCenter(buffer1,bP1,hardSyncFrac,trans); + } + } + inline void mixInImpulseCenter(float * buf,int& bpos,float offset, float scale) + { + int lpIn =(int)(B_OVERSAMPLING*(offset)); + float frac = offset * B_OVERSAMPLING - lpIn; + float f1 = 1.0f-frac; + for(int i = 0 ; i < Samples;i++) + { + float mixvalue = (blepPTR[lpIn]*f1+blepPTR[lpIn+1]*frac); + buf[(bpos+i)&(n-1)] += mixvalue*scale; + lpIn += B_OVERSAMPLING; + } + for(int i = Samples ; i 0.5) + synth.mlfo.setSynced(); + else + synth.mlfo.setUnsynced(); + } + void procAsPlayedAlloc(float val) + { + synth.asPlayedMode = val > 0.5; + } + void procNoteOn(int noteNo,float velocity) + { + synth.setNoteOn(noteNo,velocity); + } + void procNoteOff(int noteNo) + { + synth.setNoteOff(noteNo); + } + void procEconomyMode(float val) + { + synth.economyMode = val>0.5; + } +#define ForEachVoice(expr) \ + for(int i = 0 ; i < synth.MAX_VOICES;i++) \ + {\ + synth.voices[i].expr;\ + }\ + + void procAmpVelocityAmount(float val) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].vamp= val; + } + } + void procFltVelocityAmount(float val) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].vflt= val; + } + } + void procModWheel(float val) + { + modWheelSmoother.setSteep(val); + } + void procModWheelSmoothed(float val) + { + synth.vibratoAmount = val; + } + void procModWheelFrequency(float val) + { + synth.vibratoLfo.setFrequency (logsc(val,3,10)); + synth.vibratoEnabled = val>0.05; + } + void procPitchWheel(float val) + { + pitchWheelSmoother.setSteep(val); + //for(int i = 0 ; i < synth->MAX_VOICES;i++) + //{ + // synth->voices[i]->pitchWheel = val; + //} + } + inline void procPitchWheelSmoothed(float val) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].pitchWheel = val; + } + } + void setVoiceCount(float param) + { + synth.setVoiceCount(roundToInt((param*7) +1)); + } + void procPitchWheelAmount(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].pitchWheelAmt = param>0.5?12:2; + } + } + void procPitchWheelOsc2Only(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].pitchWheelOsc2Only = param>0.5; + } + } + void processPan(float param,int idx) + { + synth.pannings[idx-1] = param; + } + void processTune(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.tune = param*2-1; + } + } + void processLegatoMode(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].legatoMode = roundToInt(param*3 + 1) -1; + } + } + void processOctave(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.oct = (roundToInt(param*4) -2)*12; + } + } + void processFilterKeyFollow(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].fltKF = param; + } + } + void processSelfOscPush(float param) + { + ForEachVoice(selfOscPush = param>0.5); + ForEachVoice(flt.selfOscPush = param>0.5); + } + void processUnison(float param) + { + synth.uni = param>0.5f; + } + void processPortamento(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].porta =logsc(1-param,0.14,250,150); + } + } + void processVolume(float param) + { + synth.Volume = linsc(param,0,0.30); + } + void processLfoFrequency(float param) + { + synth.mlfo.setRawParam(param); + synth.mlfo.setFrequency(logsc(param,0,50,120)); + } + void processLfoSine(float param) + { + if(param>0.5) + { + synth.mlfo.waveForm |=1; + } + else + { + synth.mlfo.waveForm&=~1; + } + } + void processLfoSquare(float param) + { + if(param>0.5) + { + synth.mlfo.waveForm |=2; + } + else + { + synth.mlfo.waveForm&=~2; + } + } + void processLfoSH(float param) + { + if(param>0.5) + { + synth.mlfo.waveForm |=4; + } + else + { + synth.mlfo.waveForm&=~4; + } + } + void processLfoAmt1(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].lfoa1 = logsc(logsc(param,0,1,60),0,60,10); + } + } + void processLfoOsc1(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].lfoo1 = param>0.5; + } + } + void processLfoOsc2(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].lfoo2 = param>0.5; + } + } + void processLfoFilter(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].lfof = param>0.5; + } + } + void processLfoPw1(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].lfopw1 = param>0.5; + } + } + void processLfoPw2(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].lfopw2 = param>0.5; + } + } + void processLfoAmt2(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].lfoa2 = linsc(param,0,0.7); + } + } + void processDetune(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.totalDetune = logsc(param,0.001,0.90); + } + } + void processPulseWidth(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.pulseWidth = linsc(param,0.0,0.95); + } + } + void processPwEnv(float param) + { + ForEachVoice (pwenvmod=linsc(param,0,0.85)); + } + void processPwOfs(float param) + { + ForEachVoice(pwOfs = linsc(param,0,0.75)); + } + void processPwEnvBoth(float param) + { + ForEachVoice(pwEnvBoth = param>0.5); + } + void processInvertFenv(float param) + { + ForEachVoice(invertFenv = param>0.5); + } + void processPitchModBoth(float param) + { + ForEachVoice(pitchModBoth = param>0.5); + } + void processOsc2Xmod(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.xmod= param*24; + } + } + void processEnvelopeToPitch(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].envpitchmod= param*36; + } + } + void processOsc2HardSync(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.hardSync = param>0.5; + } + } + void processOsc1Pitch(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.osc1p = (param * 48); + } + } + void processOsc2Pitch(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.osc2p = (param * 48); + } + } + void processPitchQuantization(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.quantizeCw = param>0.5; + } + } + void processOsc1Mix(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.o1mx = param; + } + } + void processOsc2Mix(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.o2mx = param; + } + } + void processNoiseMix(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.nmx = logsc(param,0,1,35); + } + } + void processBrightness(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].setBrightness( linsc(param,7000,26000)); + } + } + void processOsc2Det(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.osc2Det = logsc(param,0.001,0.6); + } + } + + void processOsc1Saw(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.osc1Saw = param>0.5; + } + } + void processOsc1Pulse(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.osc1Pul = param>0.5; + } + } + void processOsc2Saw(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.osc2Saw= param>0.5; + } + } + void processOsc2Pulse(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].osc.osc2Pul= param>0.5; + } + } + + void processCutoff(float param) + { + cutoffSmoother.setSteep( linsc(param,0,120)); + // for(int i = 0 ; i < synth->MAX_VOICES;i++) + // { + //synth->voices[i]->cutoff = logsc(param,60,19000,30); + // synth->voices[i]->cutoff = linsc(param,0,120); + // } + } + inline void processCutoffSmoothed(float param) + { + ForEachVoice(cutoff=param); + } + void processBandpassSw(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + //synth.voices[i].cutoff = logsc(param,60,19000,30); + synth.voices[i].flt.bandPassSw = param>0.5; + } + } + void processResonance(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].flt.setResonance(0.991-logsc(1-param,0,0.991,40)); + } + } + void processFourPole(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + //synth.voices[i].flt ; + synth.voices[i].fourpole = param>0.5; + } + } + void processMultimode(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + //synth.voices[i].flt ; + synth.voices[i].flt.setMultimode(linsc(param,0,1)); + } + } + void processOversampling(float param) + { + synth.SetOversample(param>0.5); + } + void processFilterEnvelopeAmt(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].fenvamt = linsc(param,0,140); + } + } + void processLoudnessEnvelopeAttack(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].env.setAttack(logsc(param,4,60000,900)); + } + } + void processLoudnessEnvelopeDecay(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].env.setDecay(logsc(param,4,60000,900)); + } + } + void processLoudnessEnvelopeRelease(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].env.setRelease(logsc(param,8,60000,900)); + } + } + void processLoudnessEnvelopeSustain(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].env.setSustain(param); + } + } + void processFilterEnvelopeAttack(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].fenv.setAttack(logsc(param,1,60000,900)); + } + } + void processFilterEnvelopeDecay(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].fenv.setDecay(logsc(param,1,60000,900)); + } + } + void processFilterEnvelopeRelease(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].fenv.setRelease(logsc(param,1,60000,900)); + } + } + void processFilterEnvelopeSustain(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].fenv.setSustain(param); + } + } + void processEnvelopeDetune(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].setEnvDer(linsc(param,0.0,1)); + } + } + void processFilterDetune(float param) + { +for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].FltDetAmt = linsc(param,0.0,18); + } + } + void processPortamentoDetune(float param) + { + for(int i = 0 ; i < synth.MAX_VOICES;i++) + { + synth.voices[i].PortaDetuneAmt = linsc(param,0.0,0.75); + } + } + void processLoudnessDetune(float param) + { + ForEachVoice(levelDetuneAmt = linsc(param,0.0,0.67)); + } + + +}; diff --git a/Source/Engine/TriangleOsc.h b/Source/Engine/TriangleOsc.h new file mode 100755 index 0000000..ceebe1f --- /dev/null +++ b/Source/Engine/TriangleOsc.h @@ -0,0 +1,183 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ +#pragma once +#include "SynthEngine.h" +#include "BlepData.h" +class TriangleOsc +{ + DelayLine del1; + bool fall; + float buffer1[Samples*2]; + const int hsam; + const int n; + float const * blepPTR; + float const * blampPTR; + + int bP1,bP2; +public: + TriangleOsc() : hsam(Samples) + , n(Samples*2) + { + //del1 =new DelayLine(hsam); + fall = false; + bP1=bP2=0; + // buffer1= new float[n]; + for(int i = 0 ; i < n ; i++) + buffer1[i]=0; + blepPTR = blep; + blampPTR = blamp; + } + ~TriangleOsc() + { + //delete buffer1; + //delete del1; + } + inline void setDecimation() + { + blepPTR = blepd2; + blampPTR = blampd2; + } + inline void removeDecimation() + { + blepPTR = blep; + blampPTR = blamp; + } + inline float aliasReduction() + { + return -getNextBlep(buffer1,bP1); + } + inline void processMaster(float x,float delta) + { + if(x >= 1.0) + { + x-=1.0; + mixInBlampCenter(buffer1,bP1,x/delta,-4*Samples*delta); + } + if(x >= 0.5 && x - delta < 0.5) + { + mixInBlampCenter(buffer1,bP1,(x-0.5)/delta,4*Samples*delta); + } + if(x >= 1.0) + { + x-=1.0; + mixInBlampCenter(buffer1,bP1,x/delta,-4*Samples*delta); + } + } + inline float getValue(float x) + { + float mix = x < 0.5 ? 2*x-0.5 : 1.5-2*x; + return del1.feedReturn(mix); + } + inline float getValueFast(float x) + { + float mix = x < 0.5 ? 2*x-0.5 : 1.5-2*x; + return mix; + } + inline void processSlave(float x , float delta,bool hardSyncReset,float hardSyncFrac) + { + bool hspass = true; + if(x >= 1.0) + { + x-=1.0; + if(((!hardSyncReset)||(x/delta > hardSyncFrac)))//de morgan processed equation + { + mixInBlampCenter(buffer1,bP1,x/delta,-4*Samples*delta); + } + else + { + x+=1; + hspass = false; + } + } + if(x >= 0.5 && x - delta < 0.5 &&hspass) + { + float frac = (x - 0.5) / delta; + if(((!hardSyncReset)||(frac > hardSyncFrac)))//de morgan processed equation + { + mixInBlampCenter(buffer1,bP1,frac,4*Samples*delta); + } + } + if(x >= 1.0 && hspass) + { + x-=1.0; + if(((!hardSyncReset)||(x/delta > hardSyncFrac)))//de morgan processed equation + { + mixInBlampCenter(buffer1,bP1,x/delta,-4*Samples*delta); + } + else + { + //if transition do not ocurred + x+=1; + } + } + if(hardSyncReset) + { + float fracMaster = (delta * hardSyncFrac); + float trans = (x-fracMaster); + float mix = trans < 0.5 ? 2*trans-0.5 : 1.5-2*trans; + if(trans >0.5) + mixInBlampCenter(buffer1,bP1,hardSyncFrac,-4*Samples*delta); + mixInImpulseCenter(buffer1,bP1,hardSyncFrac,mix+0.5); + } + } + inline void mixInBlampCenter(float * buf,int& bpos,float offset, float scale) + { + int lpIn =(int)(B_OVERSAMPLING*(offset)); + float frac = offset * B_OVERSAMPLING - lpIn; + float f1 = 1.0f-frac; + for(int i = 0 ; i < n;i++) + { + float mixvalue = (blampPTR[lpIn]*f1+blampPTR[lpIn+1]*(frac)); + buf[(bpos+i)&(n-1)] += mixvalue*scale; + lpIn += B_OVERSAMPLING; + } + } + inline void mixInImpulseCenter(float * buf,int& bpos,float offset, float scale) + { + int lpIn =(int)(B_OVERSAMPLING*(offset)); + float frac = offset * B_OVERSAMPLING - lpIn; + float f1 = 1.0f-frac; + for(int i = 0 ; i < Samples;i++) + { + float mixvalue = (blepPTR[lpIn]*f1+blepPTR[lpIn+1]*(frac)); + buf[(bpos+i)&(n-1)] += mixvalue*scale; + lpIn += B_OVERSAMPLING; + } + for(int i = Samples ; i setImages + kni = k; + toogled = false; + width = kni.getWidth(); + height = kni.getHeight(); + w2=width; + h2 = height / 2; + this->setClickingTogglesState(true); + } + void clicked() + { + toogled = !toogled; + //this->setColour(1,Colours::blue); + //if(toogled) + // this->setColour(TextButton::ColourIds::buttonColourId,Colours::lightgreen); + //else + // this->removeColour(TextButton::ColourIds::buttonColourId); + //this->setColour(DrawableButton::ColourIds::backgroundColourId,Colours::lightpink); + Button::clicked(); + + }; + void paintButton(Graphics& g, bool isMouseOverButton, bool isButtonDown) + { + int offset = 0; + if (toogled) + { + offset = 1; + } + g.drawImage(kni, 0, 0, getWidth(), getHeight(), + 0, offset *h2, w2,h2); + } + void setValue(float state,int notify) + { + if(state > 0.5) + toogled = true; + else toogled = false; + repaint(); + } + float getValue() + { + if(toogled) + return 1; + else return 0; + } + //void paint(Graphics& g) + //{ + // g.drawImageTransformed(kni,AffineTransform::rotation(((getValue() - getMinimum())/(getMaximum() - getMinimum()))*float_Pi - float_Pi*2)); + //} +private: + Image kni; + int width,height,w2,h2; +}; \ No newline at end of file diff --git a/Source/Images/button.png b/Source/Images/button.png new file mode 100644 index 0000000..75f0db4 Binary files /dev/null and b/Source/Images/button.png differ diff --git a/Source/Images/knoblsd.png b/Source/Images/knoblsd.png new file mode 100644 index 0000000..930a148 Binary files /dev/null and b/Source/Images/knoblsd.png differ diff --git a/Source/Images/knobssd.png b/Source/Images/knobssd.png new file mode 100644 index 0000000..dc66298 Binary files /dev/null and b/Source/Images/knobssd.png differ diff --git a/Source/Images/legato.png b/Source/Images/legato.png new file mode 100644 index 0000000..676e932 Binary files /dev/null and b/Source/Images/legato.png differ diff --git a/Source/Images/main.png b/Source/Images/main.png new file mode 100644 index 0000000..438a5e7 Binary files /dev/null and b/Source/Images/main.png differ diff --git a/Source/Images/voices.png b/Source/Images/voices.png new file mode 100644 index 0000000..c8af407 Binary files /dev/null and b/Source/Images/voices.png differ diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp new file mode 100755 index 0000000..d50ec73 --- /dev/null +++ b/Source/PluginEditor.cpp @@ -0,0 +1,731 @@ +/* +============================================================================== + +This file was auto-generated by the Introjucer! + +It contains the basic startup code for a Juce application. + +============================================================================== +*/ +#include "PluginProcessor.h" +#include "PluginEditor.h" +#include +// #include "GUI/BinaryData.h" + + +//============================================================================== +ObxdAudioProcessorEditor::ObxdAudioProcessorEditor (ObxdAudioProcessor* ownerFilter) + : AudioProcessorEditor (ownerFilter) +{ + rebuildComponents(); +} + +ObxdAudioProcessorEditor::~ObxdAudioProcessorEditor() +{ + getFilter()->removeChangeListener(this); + + deleteAllChildren(); +} + +void ObxdAudioProcessorEditor::placeLabel(int x , int y , String text) +{ + Label* lab = new Label(); + lab->setBounds(x,y,110,20); + lab->setJustificationType(Justification::centred); + lab->setText(text,dontSendNotification);lab->setInterceptsMouseClicks(false,true); + addAndMakeVisible(lab); +} + +ButtonList* ObxdAudioProcessorEditor::addNormalButtonList(int x, int y,int width, ObxdAudioProcessor* filter, int parameter,String name,Image img) +{ + ButtonList *bl = new ButtonList(img,24); + bl->setBounds(x, y, width, 24); + //bl->setValue(filter->getParameter(parameter),dontSendNotification); + addAndMakeVisible(bl); + bl->addListener (this); + return bl; + +} + +Knob* ObxdAudioProcessorEditor::addNormalKnob(int x , int y ,ObxdAudioProcessor* filter, int parameter,String name,float defval) +{ + Knob* knob = new Knob(ImageCache::getFromMemory(BinaryData::knoblsd_png,BinaryData::knoblsd_pngSize),48); + //Label* knobl = new Label(); + knob->setSliderStyle(Slider::RotaryVerticalDrag); + knob->setTextBoxStyle(knob->NoTextBox,true,0,0); + knob->setRange(0,1); + addAndMakeVisible(knob); + //addAndMakeVisible(knobl); + knob->setBounds(x, y, 48,48); + knob->setValue(filter->getParameter(parameter),dontSendNotification); + //knobl->setJustificationType(Justification::centred); + //knobl->setInterceptsMouseClicks(false,true); + //knobl->setBounds(x-10,y+40,60,10); + //knobl->setText(name,dontSendNotification); + knob->setTextBoxIsEditable(false); + knob->setDoubleClickReturnValue(true,defval); + knob->addListener (this); + return knob; +} + +Knob* ObxdAudioProcessorEditor::addNormalKnobClassic(int x , int y ,ObxdAudioProcessor* filter, int parameter,String name,float defval) +{ + Knob* knob = new Knob(ImageCache::getFromMemory(BinaryData::knoblsd_png,BinaryData::knoblsd_pngSize),48); + //Label* knobl = new Label(); + knob->setSliderStyle(Slider::RotaryVerticalDrag); + knob->setTextBoxStyle(knob->NoTextBox,true,0,0); + knob->setRange(0,1); + addAndMakeVisible(knob); + //addAndMakeVisible(knobl); + knob->setBounds(x+2, y, 42,42); + knob->setValue(filter->getParameter(parameter),dontSendNotification); + //knobl->setJustificationType(Justification::centred); + //knobl->setInterceptsMouseClicks(false,true); + //knobl->setBounds(x-10,y+40,60,10); + //knobl->setText(name,dontSendNotification); + knob->setTextBoxIsEditable(false); + knob->setDoubleClickReturnValue(true,defval); + knob->addListener (this); + return knob; +} + +Knob* ObxdAudioProcessorEditor::addTinyKnob(int x , int y ,ObxdAudioProcessor* filter, int parameter,String name,float defval) +{ + //Knob* knob = new Knob(ImageCache::getFromMemory(BinaryData::knobssd_png,BinaryData::knobssd_pngSize),42); + Knob* knob = new Knob(ImageCache::getFromMemory(BinaryData::knoblsd_png,BinaryData::knoblsd_pngSize),48); + //Label* knobl = new Label(); + knob->setSliderStyle(Slider::RotaryVerticalDrag); + knob->setTextBoxStyle(knob->NoTextBox,true,0,0); + knob->setRange(0,1); + addAndMakeVisible(knob); + //addAndMakeVisible(knobl); + knob->setBounds(x, y, 36,36); + knob->setValue(filter->getParameter(parameter),dontSendNotification); + //knobl->setJustificationType(Justification::centred); + //knobl->setInterceptsMouseClicks(false,true); + //knobl->setBounds(x-10,y+25,50,10); + //knobl->setText(name,dontSendNotification); + knob->setTextBoxIsEditable(false); + knob->setDoubleClickReturnValue(true,defval); + knob->addListener (this); + return knob; +} + +TooglableButton* ObxdAudioProcessorEditor::addNormalTooglableButton(int x , int y , ObxdAudioProcessor* filter,int parameter,String name) +{ + TooglableButton* button = new TooglableButton(ImageCache::getFromMemory(BinaryData::button_png,BinaryData::button_pngSize)); + // button->setButtonStyle(DrawableButton::ButtonStyle::ImageAboveTextLabel); + addAndMakeVisible(button); + button->setBounds(x,y,19,35); + button->setButtonText(name); + button->setValue(filter->getParameter(parameter),0); + button->addListener(this); + return button; +} + +TooglableButton* ObxdAudioProcessorEditor::addTinyTooglableButton(int x , int y , ObxdAudioProcessor* filter,int parameter,String name) +{ + TooglableButton* button = new TooglableButton(ImageCache::getFromMemory(BinaryData::button_png,BinaryData::button_pngSize)); + // button->setButtonStyle(DrawableButton::ButtonStyle::ImageAboveTextLabel); + addAndMakeVisible(button); + button->setBounds(x,y,20,20); + button->setButtonText(name); + button->setValue(filter->getParameter(parameter),0); + button->addListener(this); + return button; +} + +ButtonList* ObxdAudioProcessorEditor::addNormalButtonListClassic(int x, int y,int width, ObxdAudioProcessor* filter, int parameter,String name,Image img) +{ + ButtonList *bl = new ButtonList(img,32); + bl->setBounds(x, y, width, 32); + //bl->setValue(filter->getParameter(parameter),dontSendNotification); + addAndMakeVisible(bl); + bl->addListener (this); + return bl; +} + +Knob* ObxdAudioProcessorEditor::addTinyKnobClassic(int x , int y ,ObxdAudioProcessor* filter, int parameter,String name,float defval) +{ + Knob* knob = new Knob(ImageCache::getFromMemory(BinaryData::knoblsd_png,BinaryData::knoblsd_pngSize),48); + //Label* knobl = new Label(); + knob->setSliderStyle(Slider::RotaryVerticalDrag); + knob->setTextBoxStyle(knob->NoTextBox,true,0,0); + knob->setRange(0,1); + addAndMakeVisible(knob); + //addAndMakeVisible(knobl); + knob->setBounds(x+3, y+3, 36,36); + knob->setValue(filter->getParameter(parameter),dontSendNotification); + //knobl->setJustificationType(Justification::centred); + //knobl->setInterceptsMouseClicks(false,true); + //knobl->setBounds(x-10,y+25,50,10); + //knobl->setText(name,dontSendNotification); + knob->setTextBoxIsEditable(false); + knob->setDoubleClickReturnValue(true,defval); + knob->addListener (this); + return knob; +} + +TooglableButton* ObxdAudioProcessorEditor::addNormalTooglableButtonClassic(int x , int y , ObxdAudioProcessor* filter,int parameter,String name) +{ + TooglableButton* button = new TooglableButton(ImageCache::getFromFile(skinFolder.getChildFile("button.png"))); + // button->setButtonStyle(DrawableButton::ButtonStyle::ImageAboveTextLabel); + addAndMakeVisible(button); + button->setBounds(x,y,28,35); + button->setButtonText(name); + button->setValue(filter->getParameter(parameter),0); + button->addListener(this); + return button; +} + +void ObxdAudioProcessorEditor::rebuildComponents() +{ + ObxdAudioProcessor* ownerFilter = getFilter(); + + skinFolder = ownerFilter->getCurrentSkinFolder(); + bool useClassicSkin = skinFolder.getChildFile("legato.png").existsAsFile(); + + ownerFilter->removeChangeListener(this); + + deleteAllChildren(); + + if (! useClassicSkin) + { + // This is where our plugin's editor size is set. + + setSize (1440, 450); + cutoffKnob = addNormalKnob(893,77,ownerFilter,CUTOFF,"Cutoff",0.4); + resonanceKnob = addNormalKnob(990,77,ownerFilter,RESONANCE,"Resonance",0); + filterEnvelopeAmtKnob = addNormalKnob(1088,77,ownerFilter,ENVELOPE_AMT,"Envelope",0); + multimodeKnob = addNormalKnob(990,167,ownerFilter,MULTIMODE,"Multimode",0.5); + + volumeKnob = addNormalKnob(56,77,ownerFilter,VOLUME,"Volume",0.4); + portamentoKnob = addNormalKnob(188,77,ownerFilter,PORTAMENTO,"Portamento",0); + osc1PitchKnob = addNormalKnob(593,77,ownerFilter,OSC1P,"Osc1Pitch",0); + pulseWidthKnob = addNormalKnob(691,77,ownerFilter,PW,"PW",0); + osc2PitchKnob = addNormalKnob(788,77,ownerFilter,OSC2P,"Osc2Pitch",0); + + osc1MixKnob = addNormalKnob(597,237,ownerFilter,OSC1MIX,"Osc1",1); + osc2MixKnob = addNormalKnob(788,237,ownerFilter,OSC2MIX,"Osc2",1); + noiseMixKnob = addNormalKnob(691,237,ownerFilter,NOISEMIX,"Noise",0); + + xmodKnob = addNormalKnob(656,324,ownerFilter,XMOD,"Xmod",0); + osc2DetuneKnob = addNormalKnob(800,324,ownerFilter,OSC2_DET,"Detune",0); + + envPitchModKnob = addNormalKnob(728,324,ownerFilter,ENVPITCH,"PEnv",0); + brightnessKnob = addNormalKnob(586,324,ownerFilter,BRIGHTNESS,"Bri",1); + + attackKnob = addNormalKnob(1182,165,ownerFilter,LATK,"Atk",0); + decayKnob = addNormalKnob(1246,165,ownerFilter,LDEC,"Dec",0); + sustainKnob = addNormalKnob(1309,165,ownerFilter,LSUS,"Sus",1); + releaseKnob = addNormalKnob(1373,165,ownerFilter,LREL,"Rel",0); + + fattackKnob = addNormalKnob(1182,75,ownerFilter,FATK,"Atk",0); + fdecayKnob = addNormalKnob(1246,75,ownerFilter,FDEC,"Dec",0); + fsustainKnob = addNormalKnob(1309,75,ownerFilter,FSUS,"Sus",1); + freleaseKnob = addNormalKnob(1373,75,ownerFilter,FREL,"Rel",0); + + lfoFrequencyKnob = addNormalKnob(293,77,ownerFilter,LFOFREQ,"Freq",0); + lfoAmt1Knob = addNormalKnob(390,77,ownerFilter,LFO1AMT,"Pitch",0); + lfoAmt2Knob = addNormalKnob(488,77,ownerFilter,LFO2AMT,"PWM",0); + + lfoSinButton = addNormalTooglableButton(309,162,ownerFilter,LFOSINWAVE,"Sin"); + lfoSquareButton = addNormalTooglableButton(309,252,ownerFilter,LFOSQUAREWAVE,"SQ"); + lfoSHButton = addNormalTooglableButton(309,335,ownerFilter,LFOSHWAVE,"S&H"); + + lfoOsc1Button = addNormalTooglableButton(406,162,ownerFilter,LFOOSC1,"Osc1"); + lfoOsc2Button = addNormalTooglableButton(406,252,ownerFilter,LFOOSC2,"Osc2"); + lfoFilterButton = addNormalTooglableButton(406,335,ownerFilter,LFOFILTER,"Filt"); + + lfoPwm1Button = addNormalTooglableButton(504,162,ownerFilter,LFOPW1,"Osc1"); + lfoPwm2Button = addNormalTooglableButton(504,252,ownerFilter,LFOPW2,"Osc2"); + + hardSyncButton = addNormalTooglableButton(730,162,ownerFilter,OSC2HS,"Sync"); + osc1SawButton = addNormalTooglableButton(587,162,ownerFilter,OSC1Saw,"S"); + osc2SawButton = addNormalTooglableButton(782,162,ownerFilter,OSC2Saw,"S"); + + osc1PulButton = addNormalTooglableButton(632,162,ownerFilter,OSC1Pul,"P"); + osc2PulButton = addNormalTooglableButton(827,162,ownerFilter,OSC2Pul,"P"); + + pitchQuantButton = addNormalTooglableButton(684,162,ownerFilter,OSCQuantize,"Step"); + + filterBPBlendButton = addNormalTooglableButton(1082,162,ownerFilter,BANDPASS,"Bp"); + fourPoleButton = addNormalTooglableButton(1127,162,ownerFilter,FOURPOLE,"24"); + filterHQButton = addNormalTooglableButton(932,162,ownerFilter,FILTER_WARM,"HQ"); + + filterKeyFollowButton = addNormalTooglableButton(887,162,ownerFilter,FLT_KF,"Key"); + unisonButton = addNormalTooglableButton(205,162,ownerFilter,UNISON,"Uni"); + + tuneKnob = addNormalKnob(30,252,ownerFilter,TUNE,"Tune",0.5); + transposeKnob = addNormalKnob(90,252,ownerFilter,OCTAVE,"Transpose",0.5); + + voiceDetuneKnob =addNormalKnob(188,252,ownerFilter,UDET,"VoiceDet",0); + + bendLfoRateKnob = addTinyKnob(928,300,ownerFilter,BENDLFORATE,"ModRate",0.4); + veloFltEnvKnob = addTinyKnob(1013,300,ownerFilter,VFLTENV,"VFE",0); + veloAmpEnvKnob = addTinyKnob(1111,300,ownerFilter,VAMPENV,"VAE",0); + + midiLearnButton = addNormalTooglableButton(74,162,ownerFilter,MIDILEARN,"LEA"); + midiUnlearnButton = addNormalTooglableButton(122,162,ownerFilter,UNLEARN,"UNL"); + + pan1Knob = addTinyKnob(914,368,ownerFilter,PAN1,"1",0.5); + pan2Knob = addTinyKnob(977,368,ownerFilter,PAN2,"2",0.5); + pan3Knob = addTinyKnob(1040,368,ownerFilter,PAN3,"3",0.5); + pan4Knob = addTinyKnob(1103,368,ownerFilter,PAN4,"4",0.5); + + pan5Knob = addTinyKnob(1165,368,ownerFilter,PAN5,"5",0.5); + pan6Knob = addTinyKnob(1228,368,ownerFilter,PAN6,"6",0.5); + pan7Knob = addTinyKnob(1290,368,ownerFilter,PAN7,"7",0.5); + pan8Knob = addTinyKnob(1353,368,ownerFilter,PAN8,"8",0.5); + + bendOsc2OnlyButton = addNormalTooglableButton(228,335,ownerFilter,BENDOSC2,"Osc2"); + bendRangeButton = addNormalTooglableButton(183,335,ownerFilter,BENDRANGE,"12"); + asPlayedAllocButton = addNormalTooglableButton(25,162,ownerFilter,ASPLAYEDALLOCATION,"APA"); + + filterDetuneKnob = addTinyKnob(1228,300,ownerFilter,FILTERDER,"Flt",0.2); + portamentoDetuneKnob = addTinyKnob(1291,300,ownerFilter,PORTADER,"Port",0.2); + envelopeDetuneKnob = addTinyKnob(1353,300,ownerFilter,ENVDER,"Env",0.2); + + voiceSwitch = addNormalButtonList(124,338,17,ownerFilter,VOICE_COUNT,"VoiceCount",ImageCache::getFromMemory(BinaryData::voices_png,BinaryData::voices_pngSize)); + voiceSwitch ->addChoise("1"); + voiceSwitch ->addChoise("2"); + voiceSwitch ->addChoise("3"); + voiceSwitch ->addChoise("4"); + voiceSwitch ->addChoise("5"); + voiceSwitch ->addChoise("6"); + voiceSwitch ->addChoise("7"); + voiceSwitch ->addChoise("8"); + voiceSwitch ->setValue(ownerFilter->getParameter(VOICE_COUNT),dontSendNotification); + + legatoSwitch = addNormalButtonList(25,338,65,ownerFilter,LEGATOMODE,"Legato",ImageCache::getFromMemory(BinaryData::legato_png,BinaryData::legato_pngSize)); + legatoSwitch ->addChoise("Keep All"); + legatoSwitch ->addChoise("Keep Filter Envelope"); + legatoSwitch ->addChoise("Keep Amplitude Envelope"); + legatoSwitch ->addChoise("Retrig"); + legatoSwitch ->setValue(ownerFilter->getParameter(LEGATOMODE),dontSendNotification); + } + else + { + // This is where our plugin's editor size is set. + + setSize (1087, 442); + cutoffKnob = addNormalKnobClassic(577,40,ownerFilter,CUTOFF,"Cutoff",0.4); + resonanceKnob = addNormalKnobClassic(638,40,ownerFilter,RESONANCE,"Resonance",0); + filterEnvelopeAmtKnob = addNormalKnobClassic(699,40,ownerFilter,ENVELOPE_AMT,"Envelope",0); + multimodeKnob = addTinyKnobClassic(643,106,ownerFilter,MULTIMODE,"Multimode",0.5); + + volumeKnob = addNormalKnobClassic(53,120,ownerFilter,VOLUME,"Volume",0.4); + portamentoKnob = addNormalKnobClassic(175,241,ownerFilter,PORTAMENTO,"Portamento",0); + osc1PitchKnob = addNormalKnobClassic(271,40,ownerFilter,OSC1P,"Osc1Pitch",0); + pulseWidthKnob = addNormalKnobClassic(334,40,ownerFilter,PW,"PW",0); + osc2PitchKnob = addNormalKnobClassic(397,40,ownerFilter,OSC2P,"Osc2Pitch",0); + + osc1MixKnob = addNormalKnobClassic(490,40,ownerFilter,OSC1MIX,"Osc1",1); + osc2MixKnob = addNormalKnobClassic(490,132,ownerFilter,OSC2MIX,"Osc2",1); + noiseMixKnob = addNormalKnobClassic(490,224,ownerFilter,NOISEMIX,"Noise",0); + + xmodKnob = addNormalKnobClassic(334,168,ownerFilter,XMOD,"Xmod",0); + osc2DetuneKnob = addNormalKnobClassic(334,104,ownerFilter,OSC2_DET,"Detune",0); + + envPitchModKnob = addNormalKnobClassic(376,232,ownerFilter,ENVPITCH,"PEnv",0); + brightnessKnob = addNormalKnobClassic(291,232,ownerFilter,BRIGHTNESS,"Bri",1); + + attackKnob = addNormalKnobClassic(791,132,ownerFilter,LATK,"Atk",0); + decayKnob = addNormalKnobClassic(853,132,ownerFilter,LDEC,"Dec",0); + sustainKnob = addNormalKnobClassic(916,132,ownerFilter,LSUS,"Sus",1); + releaseKnob = addNormalKnobClassic(980,132,ownerFilter,LREL,"Rel",0); + + fattackKnob = addNormalKnobClassic(791,40,ownerFilter,FATK,"Atk",0); + fdecayKnob = addNormalKnobClassic(853,40,ownerFilter,FDEC,"Dec",0); + fsustainKnob = addNormalKnobClassic(916,40,ownerFilter,FSUS,"Sus",1); + freleaseKnob = addNormalKnobClassic(980,40,ownerFilter,FREL,"Rel",0); + + lfoFrequencyKnob = addNormalKnobClassic(576,207,ownerFilter,LFOFREQ,"Freq",0); + lfoAmt1Knob = addNormalKnobClassic(640,207,ownerFilter,LFO1AMT,"Pitch",0); + lfoAmt2Knob = addNormalKnobClassic(704,207,ownerFilter,LFO2AMT,"PWM",0); + + lfoSinButton = addNormalTooglableButtonClassic(587,269,ownerFilter,LFOSINWAVE,"Sin"); + lfoSquareButton = addNormalTooglableButtonClassic(587,323,ownerFilter,LFOSQUAREWAVE,"SQ"); + lfoSHButton = addNormalTooglableButtonClassic(587,378,ownerFilter,LFOSHWAVE,"S&H"); + + lfoOsc1Button = addNormalTooglableButtonClassic(651,269,ownerFilter,LFOOSC1,"Osc1"); + lfoOsc2Button = addNormalTooglableButtonClassic(651,323,ownerFilter,LFOOSC2,"Osc2"); + lfoFilterButton = addNormalTooglableButtonClassic(651,378,ownerFilter,LFOFILTER,"Filt"); + + lfoPwm1Button = addNormalTooglableButtonClassic(714,269,ownerFilter,LFOPW1,"Osc1"); + lfoPwm2Button = addNormalTooglableButtonClassic(714,323,ownerFilter,LFOPW2,"Osc2"); + + hardSyncButton = addNormalTooglableButtonClassic(282,178,ownerFilter,OSC2HS,"Sync"); + osc1SawButton = addNormalTooglableButtonClassic(265,114,ownerFilter,OSC1Saw,"S"); + osc2SawButton = addNormalTooglableButtonClassic(394,114,ownerFilter,OSC2Saw,"S"); + + osc1PulButton = addNormalTooglableButtonClassic(296,114,ownerFilter,OSC1Pul,"P"); + osc2PulButton = addNormalTooglableButtonClassic(425,114,ownerFilter,OSC2Pul,"P"); + + pitchQuantButton = addNormalTooglableButtonClassic(407,178,ownerFilter,OSCQuantize,"Step"); + + filterBPBlendButton = addNormalTooglableButtonClassic(697,110,ownerFilter,BANDPASS,"Bp"); + fourPoleButton = addNormalTooglableButtonClassic(728,110,ownerFilter,FOURPOLE,"24"); + filterHQButton = addNormalTooglableButtonClassic(604,110,ownerFilter,FILTER_WARM,"HQ"); + + filterKeyFollowButton = addNormalTooglableButtonClassic(573,110,ownerFilter,FLT_KF,"Key"); + unisonButton = addNormalTooglableButtonClassic(125,251,ownerFilter,UNISON,"Uni"); + tuneKnob = addNormalKnobClassic(114,120,ownerFilter,TUNE,"Tune",0.5); + voiceDetuneKnob =addNormalKnobClassic(53,241,ownerFilter,UDET,"VoiceDet",0); + + veloAmpEnvKnob = addNormalKnobClassic(486,345,ownerFilter,VAMPENV,"VAE",0); + veloFltEnvKnob = addNormalKnobClassic(428,345,ownerFilter,VFLTENV,"VFE",0); + midiLearnButton = addNormalTooglableButtonClassic(126,372,ownerFilter,MIDILEARN,"LEA"); + midiUnlearnButton = addNormalTooglableButtonClassic(185,372,ownerFilter,UNLEARN,"UNL"); + transposeKnob = addNormalKnobClassic(176,120,ownerFilter,OCTAVE,"Transpose",0.5); + + pan1Knob = addTinyKnobClassic(796,318,ownerFilter,PAN1,"1",0.5); + pan2Knob = addTinyKnobClassic(858,318,ownerFilter,PAN2,"2",0.5); + pan3Knob = addTinyKnobClassic(921,318,ownerFilter,PAN3,"3",0.5); + pan4Knob = addTinyKnobClassic(984,318,ownerFilter,PAN4,"4",0.5); + + pan5Knob = addTinyKnobClassic(796,371,ownerFilter,PAN5,"5",0.5); + pan6Knob = addTinyKnobClassic(858,371,ownerFilter,PAN6,"6",0.5); + pan7Knob = addTinyKnobClassic(921,371,ownerFilter,PAN7,"7",0.5); + pan8Knob = addTinyKnobClassic(984,371,ownerFilter,PAN8,"8",0.5); + + bendOsc2OnlyButton = addNormalTooglableButtonClassic(321,354,ownerFilter,BENDOSC2,"Osc2"); + bendRangeButton = addNormalTooglableButtonClassic(267,354,ownerFilter,BENDRANGE,"12"); + asPlayedAllocButton = addNormalTooglableButtonClassic(65,372,ownerFilter,ASPLAYEDALLOCATION,"APA"); + + filterDetuneKnob = addTinyKnobClassic(817,240,ownerFilter,FILTERDER,"Flt",0.2); + envelopeDetuneKnob = addTinyKnobClassic(963,240,ownerFilter,ENVDER,"Env",0.2); + portamentoDetuneKnob = addTinyKnobClassic(890,240,ownerFilter,PORTADER,"Port",0.2); + + bendLfoRateKnob = addNormalKnobClassic(364,345,ownerFilter,BENDLFORATE,"ModRate",0.4); + + voiceSwitch = addNormalButtonListClassic(172,321,38,ownerFilter,VOICE_COUNT,"VoiceCount",ImageCache::getFromFile(skinFolder.getChildFile("voices.png"))); + voiceSwitch ->addChoise("1"); + voiceSwitch ->addChoise("2"); + voiceSwitch ->addChoise("3"); + voiceSwitch ->addChoise("4"); + voiceSwitch ->addChoise("5"); + voiceSwitch ->addChoise("6"); + voiceSwitch ->addChoise("7"); + voiceSwitch ->addChoise("8"); + voiceSwitch ->setValue(ownerFilter->getParameter(VOICE_COUNT),dontSendNotification); + + legatoSwitch = addNormalButtonListClassic(65,321,95,ownerFilter,LEGATOMODE,"Legato",ImageCache::getFromFile(skinFolder.getChildFile("legato.png"))); + legatoSwitch ->addChoise("Keep all"); + legatoSwitch ->addChoise("Keep fenv"); + legatoSwitch ->addChoise("Keep aenv"); + legatoSwitch ->addChoise("Retrig"); + legatoSwitch ->setValue(ownerFilter->getParameter(LEGATOMODE),dontSendNotification); + } + + ownerFilter->addChangeListener(this); + + repaint(); +} + +void ObxdAudioProcessorEditor::buttonClicked(Button * b) +{ + TooglableButton* tb = (TooglableButton*)(b); + ObxdAudioProcessor* flt = getFilter(); +#define bp(T) {flt->setParameterNotifyingHost(T,tb->getValue());} +#define handleBParam(K,T) if (tb == K) {bp(T)} else + handleBParam(hardSyncButton,OSC2HS) + handleBParam(osc1SawButton,OSC1Saw) + handleBParam(osc2SawButton,OSC2Saw) + handleBParam(osc1PulButton,OSC1Pul) + handleBParam(osc2PulButton,OSC2Pul) + handleBParam(filterKeyFollowButton,FLT_KF) + handleBParam(pitchQuantButton,OSCQuantize) + handleBParam(unisonButton,UNISON) + handleBParam(filterHQButton,FILTER_WARM) + handleBParam(filterBPBlendButton,BANDPASS) + + handleBParam(lfoSinButton,LFOSINWAVE) + handleBParam(lfoSquareButton,LFOSQUAREWAVE) + handleBParam(lfoSHButton,LFOSHWAVE) + + handleBParam(lfoOsc1Button,LFOOSC1) + handleBParam(lfoOsc2Button,LFOOSC2) + handleBParam(lfoFilterButton,LFOFILTER) + handleBParam(lfoPwm1Button,LFOPW1) + handleBParam(lfoPwm2Button,LFOPW2) + handleBParam(bendOsc2OnlyButton,BENDOSC2) + handleBParam(bendRangeButton,BENDRANGE) + handleBParam(fourPoleButton,FOURPOLE) + handleBParam(asPlayedAllocButton,ASPLAYEDALLOCATION) + handleBParam(midiLearnButton,MIDILEARN) + handleBParam(midiUnlearnButton,UNLEARN) + {}; + +} + +void ObxdAudioProcessorEditor::comboBoxChanged (ComboBox* cb) +{ + ButtonList* bl = (ButtonList*)(cb); + ObxdAudioProcessor* flt = getFilter(); + #define cp(T) {flt->setParameterNotifyingHost(T,bl->getValue());} +#define handleCParam(K,T) if (bl == K) {cp(T)} else + handleCParam(voiceSwitch,VOICE_COUNT) + handleCParam(legatoSwitch,LEGATOMODE) + {}; +} + +void ObxdAudioProcessorEditor::sliderValueChanged (Slider* c) +{ + ObxdAudioProcessor* flt = getFilter(); + // flt->beginParameterChangeGesture(); +#define sp(T) {flt->setParameterNotifyingHost(T,c->getValue());} +#define handleSParam(K,T) if (c == K) {sp(T)} else + handleSParam(cutoffKnob,CUTOFF) + handleSParam(resonanceKnob,RESONANCE) + handleSParam(volumeKnob,VOLUME) + handleSParam(osc1PitchKnob,OSC1P) + handleSParam(osc2PitchKnob,OSC2P) + handleSParam(osc2DetuneKnob,OSC2_DET) + handleSParam(portamentoKnob,PORTAMENTO) + handleSParam(filterEnvelopeAmtKnob,ENVELOPE_AMT) + handleSParam(pulseWidthKnob,PW) + handleSParam(xmodKnob,XMOD) + handleSParam(multimodeKnob,MULTIMODE) + + handleSParam(attackKnob,LATK) + handleSParam(decayKnob,LDEC) + handleSParam(sustainKnob,LSUS) + handleSParam(releaseKnob,LREL) + + handleSParam(fattackKnob,FATK) + handleSParam(fdecayKnob,FDEC) + handleSParam(fsustainKnob,FSUS) + handleSParam(freleaseKnob,FREL) + + handleSParam(osc1MixKnob,OSC1MIX) + handleSParam(osc2MixKnob,OSC2MIX) + handleSParam(noiseMixKnob,NOISEMIX) + handleSParam(voiceDetuneKnob,UDET) + + handleSParam(filterDetuneKnob,FILTERDER) + handleSParam(envelopeDetuneKnob,ENVDER) + handleSParam(portamentoDetuneKnob,PORTADER) + + handleSParam(lfoFrequencyKnob,LFOFREQ) + handleSParam(lfoAmt1Knob,LFO1AMT) + handleSParam(lfoAmt2Knob,LFO2AMT) + + handleSParam(pan1Knob,PAN1) + handleSParam(pan2Knob,PAN2) + handleSParam(pan3Knob,PAN3) + handleSParam(pan4Knob,PAN4) + handleSParam(pan5Knob,PAN5) + handleSParam(pan6Knob,PAN6) + handleSParam(pan7Knob,PAN7) + handleSParam(pan8Knob,PAN8) + + handleSParam(tuneKnob,TUNE) + handleSParam(brightnessKnob,BRIGHTNESS) + handleSParam(envPitchModKnob,ENVPITCH) + + handleSParam(bendLfoRateKnob,BENDLFORATE) + handleSParam(veloAmpEnvKnob,VAMPENV) + handleSParam(veloFltEnvKnob,VFLTENV) + handleSParam(transposeKnob,OCTAVE) + //magic crystal + {}; + + //else if(c == cutoffKnob) + //{sp(CUTOFF);} + //else if(c == resonanceKnob) + //{sp(RESONANCE);} + //else if(c == portamentoKnob) + //{sp(PORTAMENTO);} + //else if(c == volumeKnob) + //{sp(VOLUME);} + //else if(c == osc1PitchKnob) + //{sp(OSC1P);} + //else if (c == osc2PitchKnob) + //{sp(OSC2P);} +} + +//============================================================================== +void ObxdAudioProcessorEditor::changeListenerCallback (ChangeBroadcaster* source) +{ + ObxdAudioProcessor* filter = getFilter(); + + float pr[PARAM_COUNT]; + filter->getCallbackLock().enter(); + for(int i = 0 ; i < PARAM_COUNT;++i) + pr[i] = filter->getPrograms().currentProgramPtr->values[i]; + filter->getCallbackLock().exit(); +#define rn(T,P) (T->setValue(pr[P],dontSendNotification)); + rn(cutoffKnob,CUTOFF) + rn(resonanceKnob,RESONANCE) + rn(volumeKnob,VOLUME) + rn(osc1PitchKnob,OSC1P) + rn(osc2PitchKnob,OSC2P) + rn(osc2DetuneKnob,OSC2_DET) + rn(portamentoKnob,PORTAMENTO) + rn(filterEnvelopeAmtKnob,ENVELOPE_AMT) + rn(pulseWidthKnob,PW) + rn(xmodKnob,XMOD) + rn(multimodeKnob,MULTIMODE) + rn(brightnessKnob,BRIGHTNESS) + rn(envPitchModKnob,ENVPITCH) + + rn(attackKnob,LATK) + rn(decayKnob,LDEC) + rn(sustainKnob,LSUS) + rn(releaseKnob,LREL) + + rn(fattackKnob,FATK) + rn(fdecayKnob,FDEC) + rn(fsustainKnob,FSUS) + rn(freleaseKnob,FREL) + + rn(osc1MixKnob,OSC1MIX) + rn(osc2MixKnob,OSC2MIX) + rn(noiseMixKnob,NOISEMIX) + rn(voiceDetuneKnob,UDET) + + rn(lfoFrequencyKnob,LFOFREQ) + rn(lfoAmt1Knob,LFO1AMT) + rn(lfoAmt2Knob,LFO2AMT) + rn(tuneKnob,TUNE) + rn(bendLfoRateKnob,BENDLFORATE) + rn(veloAmpEnvKnob,VAMPENV) + rn(veloFltEnvKnob,VFLTENV) + //buttons + rn(hardSyncButton,OSC2HS) + rn(osc1SawButton,OSC1Saw) + rn(osc2SawButton,OSC2Saw) + rn(osc1PulButton,OSC1Pul) + rn(osc2PulButton,OSC2Pul) + + rn(filterKeyFollowButton,FLT_KF) + rn(pitchQuantButton,OSCQuantize) + rn(unisonButton,UNISON) + + rn(filterDetuneKnob,FILTERDER) + rn(envelopeDetuneKnob,ENVDER) + rn(portamentoDetuneKnob,PORTADER) + + rn(filterHQButton,FILTER_WARM) + rn(filterBPBlendButton,BANDPASS) + rn(lfoSinButton,LFOSINWAVE) + rn(lfoSquareButton,LFOSQUAREWAVE) + rn(lfoSHButton,LFOSHWAVE) + + rn(bendOsc2OnlyButton,BENDOSC2) + rn(bendRangeButton,BENDRANGE) + + rn(lfoOsc1Button,LFOOSC1) + rn(lfoOsc2Button,LFOOSC2) + rn(lfoFilterButton,LFOFILTER) + rn(lfoPwm1Button,LFOPW1) + rn(lfoPwm2Button,LFOPW2) + rn(fourPoleButton,FOURPOLE) + + rn(transposeKnob,OCTAVE) + + rn(pan1Knob,PAN1) + rn(pan2Knob,PAN2) + rn(pan3Knob,PAN3) + rn(pan4Knob,PAN4) + rn(pan5Knob,PAN5) + rn(pan6Knob,PAN6) + rn(pan7Knob,PAN7) + rn(pan8Knob,PAN8) + + rn(voiceSwitch,VOICE_COUNT) + rn(legatoSwitch,LEGATOMODE) + rn(asPlayedAllocButton,ASPLAYEDALLOCATION) + rn(midiLearnButton,MIDILEARN) + rn(midiUnlearnButton,UNLEARN) +} + +void ObxdAudioProcessorEditor::mouseUp(const MouseEvent& e) +{ + if (e.mods.isRightButtonDown() || e.mods.isCommandDown()) + { + PopupMenu menu; + PopupMenu skinMenu; + PopupMenu bankMenu; + + Array skins; + const Array& banks = getFilter()->getBankFiles(); + + int skinStart = 0; + { + DirectoryIterator it(getFilter()->getSkinFolder(), false, "*", File::findDirectories); + while (it.next()) + { + skins.add(it.getFile()); + } + + for (int i = 0; i < skins.size(); ++i) + { + const File skin = skins.getUnchecked(i); + skinMenu.addItem(i + skinStart + 1, skin.getFileName(), true, skin.getFileName() == skinFolder.getFileName()); + } + + menu.addSubMenu("Skins", skinMenu); + } + + int bankStart = 1000; + { + const String currentBank = getFilter()->getCurrentBankFile().getFileName(); + + for (int i = 0; i < banks.size(); ++i) + { + const File bank = banks.getUnchecked(i); + bankMenu.addItem(i + bankStart + 1, bank.getFileName(), true, bank.getFileName() == currentBank); + } + + menu.addSubMenu("Banks", bankMenu); + } + + const Point pos = e.getMouseDownScreenPosition(); + + int result = menu.showAt(Rectangle(pos.getX(), pos.getY(), 1, 1)); + if (result >= (skinStart + 1) && result <= (skinStart + skins.size())) + { + result -= 1; + result -= skinStart; + + const File newSkinFolder = skins.getUnchecked(result); + getFilter()->setCurrentSkinFolder(newSkinFolder.getFileName()); + + rebuildComponents(); + } + else if (result >= (bankStart + 1) && result <= (bankStart + banks.size())) + { + result -= 1; + result -= bankStart; + + const File bankFile = banks.getUnchecked(result); + getFilter()->loadFromFXBFile(bankFile); + } + } +} + +void ObxdAudioProcessorEditor::paint(Graphics& g) +{ + g.fillAll (Colours::white); + + const File mainFile(skinFolder.getChildFile("main.png")); + + if (skinFolder.exists() && mainFile.exists()) + { + const Image image = ImageCache::getFromFile(mainFile); + + g.drawImage (image, + 0, 0, image.getWidth(), image.getHeight(), + 0, 0, image.getWidth(), image.getHeight()); + } + else + { + const Image image = ImageCache::getFromMemory(BinaryData::main_png, BinaryData::main_pngSize); + + g.drawImage (image, + 0, 0, image.getWidth(), image.getHeight(), + 0, 0, image.getWidth(), image.getHeight()); + } +} diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h new file mode 100755 index 0000000..100f11c --- /dev/null +++ b/Source/PluginEditor.h @@ -0,0 +1,88 @@ +#pragma once +/* + ============================================================================== + + This file was auto-generated by the Introjucer! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +#ifndef PLUGINEDITOR_H_INCLUDED +#define PLUGINEDITOR_H_INCLUDED + +#include "../JuceLibraryCode/JuceHeader.h" +#include "PluginProcessor.h" +#include "Gui/Knob.h" +#include "Gui/TooglableButton.h" +#include "Gui/ButtonList.h" + + +//============================================================================== +/** +*/ +class ObxdAudioProcessorEditor : + public AudioProcessorEditor, + // public AudioProcessorListener, + public ChangeListener, + public Slider::Listener, + public Button::Listener, + public ComboBox::Listener +{ +public: + ObxdAudioProcessorEditor(ObxdAudioProcessor* ownerFilter); + ~ObxdAudioProcessorEditor(); + + void mouseUp(const MouseEvent& e); + void paint(Graphics& g); + + //============================================================================== + void changeListenerCallback (ChangeBroadcaster* source); + +private: + Knob* addNormalKnob(int x , int y ,ObxdAudioProcessor* filter, int parameter,String name,float defval); + Knob* addTinyKnob(int x , int y ,ObxdAudioProcessor* filter, int parameter,String name,float defval); + void placeLabel(int x , int y,String text); + TooglableButton* addNormalTooglableButton(int x , int y , ObxdAudioProcessor* filter,int parameter,String name); + TooglableButton* addTinyTooglableButton(int x , int y , ObxdAudioProcessor* filter,int parameter,String name); + + ButtonList* addNormalButtonList(int x , int y ,int width, ObxdAudioProcessor* filter,int parameter,String name,Image img); + void sliderValueChanged (Slider*); + void buttonClicked (Button *); + void comboBoxChanged(ComboBox*); + + Knob* addNormalKnobClassic(int x , int y ,ObxdAudioProcessor* filter, int parameter,String name,float defval); + Knob* addTinyKnobClassic(int x , int y ,ObxdAudioProcessor* filter, int parameter,String name,float defval); + TooglableButton* addNormalTooglableButtonClassic(int x , int y , ObxdAudioProcessor* filter,int parameter,String name); + ButtonList* addNormalButtonListClassic(int x , int y ,int width, ObxdAudioProcessor* filter,int parameter,String name,Image img); + + void rebuildComponents(); + + //============================================================================== + ObxdAudioProcessor* getFilter() noexcept { return (ObxdAudioProcessor*)getAudioProcessor();} + + //============================================================================== + Knob* cutoffKnob,*resonanceKnob,*osc1PitchKnob,*osc2PitchKnob,*osc2DetuneKnob,*volumeKnob, + *portamentoKnob,*voiceDetuneKnob,*filterEnvelopeAmtKnob,*pulseWidthKnob,*xmodKnob,*multimodeKnob,*attackKnob,*decayKnob,*sustainKnob,*releaseKnob, + *fattackKnob,*fdecayKnob,*fsustainKnob,*freleaseKnob,*osc1MixKnob,*osc2MixKnob,*noiseMixKnob, + *filterDetuneKnob,*envelopeDetuneKnob,*portamentoDetuneKnob, + *tuneKnob, + *lfoFrequencyKnob,*lfoAmt1Knob,*lfoAmt2Knob, + *pan1Knob,*pan2Knob,*pan3Knob,*pan4Knob,*pan5Knob,*pan6Knob,*pan7Knob,*pan8Knob, + *brightnessKnob,*envPitchModKnob, + *bendLfoRateKnob,*veloAmpEnvKnob,*veloFltEnvKnob,*transposeKnob; + + TooglableButton* hardSyncButton,*osc1SawButton,*osc2SawButton,*osc1PulButton,*osc2PulButton,*filterKeyFollowButton,*unisonButton,*pitchQuantButton, + *filterHQButton,*filterBPBlendButton, + *lfoSinButton,*lfoSquareButton,*lfoSHButton,*lfoOsc1Button,*lfoOsc2Button,*lfoFilterButton, + *lfoPwm1Button,*lfoPwm2Button, + *bendRangeButton,*bendOsc2OnlyButton, + *fourPoleButton,*asPlayedAllocButton,*midiLearnButton,*midiUnlearnButton; + + ButtonList *voiceSwitch,*legatoSwitch; + + File skinFolder; +}; + +#endif // PLUGINEDITOR_H_INCLUDED diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp new file mode 100755 index 0000000..e613396 --- /dev/null +++ b/Source/PluginProcessor.cpp @@ -0,0 +1,999 @@ +/* +============================================================================== + +This file was auto-generated! + +It contains the basic startup code for a Juce application. + +============================================================================== +*/ +#include "PluginProcessor.h" +#include "PluginEditor.h" +#include "Engine/Params.h" + +//only sse2 version on windows +#ifdef _WINDOWS +#define __SSE2__ +#define __SSE__ +#endif + +#ifdef __SSE2__ +#include +#endif + +//============================================================================== +#define S(T) (juce::String(T)) + +//============================================================================== +ObxdAudioProcessor::ObxdAudioProcessor() + : bindings() + , programs() + , configLock("__" JucePlugin_Name "ConfigLock__") +{ + isHostAutomatedChange = true; + midiControlledParamSet = false; + lastMovedController = 0; + lastUsedParameter = 0; + + synth.setSampleRate(44100); + + PropertiesFile::Options options; + options.applicationName = JucePlugin_Name; + options.storageFormat = PropertiesFile::storeAsXML; + options.millisecondsBeforeSaving = 2500; + options.processLock = &configLock; + config = new PropertiesFile(getDocumentFolder().getChildFile("Settings.xml"), options); + + currentSkin = config->containsKey("skin") ? config->getValue("skin") : "discoDSP Grey"; + currentBank = "Init"; + + scanAndUpdateBanks(); + initAllParams(); + + if (bankFiles.size() > 0) + { + loadFromFXBFile(bankFiles[0]); + } +} + +ObxdAudioProcessor::~ObxdAudioProcessor() +{ + config->saveIfNeeded(); + config = nullptr; +} + +//============================================================================== +void ObxdAudioProcessor::initAllParams() +{ + for (int i = 0 ; i < PARAM_COUNT; i++) + { + setParameter(i, programs.currentProgramPtr->values[i]); + } +} + +//============================================================================== +int ObxdAudioProcessor::getNumParameters() +{ + return PARAM_COUNT; +} + +float ObxdAudioProcessor::getParameter (int index) +{ + return programs.currentProgramPtr->values[index]; +} + +void ObxdAudioProcessor::setParameter (int index, float newValue) +{ + if(!midiControlledParamSet || index==MIDILEARN || index==UNLEARN) + lastUsedParameter = index; + programs.currentProgramPtr->values[index] = newValue; + switch(index) + { + case SELF_OSC_PUSH: + synth.processSelfOscPush(newValue); + break; + case PW_ENV_BOTH: + synth.processPwEnvBoth(newValue); + break; + case PW_OSC2_OFS: + synth.processPwOfs(newValue); + break; + case ENV_PITCH_BOTH: + synth.processPitchModBoth(newValue); + break; + case FENV_INVERT: + synth.processInvertFenv(newValue); + break; + case LEVEL_DIF: + synth.processLoudnessDetune(newValue); + break; + case PW_ENV: + synth.processPwEnv(newValue); + break; + case LFO_SYNC: + synth.procLfoSync(newValue); + break; + case ECONOMY_MODE: + synth.procEconomyMode(newValue); + break; + case VAMPENV: + synth.procAmpVelocityAmount(newValue); + break; + case VFLTENV: + synth.procFltVelocityAmount(newValue); + break; + case ASPLAYEDALLOCATION: + synth.procAsPlayedAlloc(newValue); + break; + case BENDLFORATE: + synth.procModWheelFrequency(newValue); + break; + case FOURPOLE: + synth.processFourPole(newValue); + break; + case LEGATOMODE: + synth.processLegatoMode(newValue); + break; + case ENVPITCH: + synth.processEnvelopeToPitch(newValue); + break; + case OSCQuantize: + synth.processPitchQuantization(newValue); + break; + case VOICE_COUNT: + synth.setVoiceCount(newValue); + break; + case BANDPASS: + synth.processBandpassSw(newValue); + break; + case FILTER_WARM: + synth.processOversampling(newValue); + break; + case BENDOSC2: + synth.procPitchWheelOsc2Only(newValue); + break; + case BENDRANGE: + synth.procPitchWheelAmount(newValue); + break; + case NOISEMIX: + synth.processNoiseMix(newValue); + break; + case OCTAVE: + synth.processOctave(newValue); + break; + case TUNE: + synth.processTune(newValue); + break; + case BRIGHTNESS: + synth.processBrightness(newValue); + break; + case MULTIMODE: + synth.processMultimode(newValue); + break; + case LFOFREQ: + synth.processLfoFrequency(newValue); + break; + case LFO1AMT: + synth.processLfoAmt1(newValue); + break; + case LFO2AMT: + synth.processLfoAmt2(newValue); + break; + case LFOSINWAVE: + synth.processLfoSine(newValue); + break; + case LFOSQUAREWAVE: + synth.processLfoSquare(newValue); + break; + case LFOSHWAVE: + synth.processLfoSH(newValue); + break; + case LFOFILTER: + synth.processLfoFilter(newValue); + break; + case LFOOSC1: + synth.processLfoOsc1(newValue); + break; + case LFOOSC2: + synth.processLfoOsc2(newValue); + break; + case LFOPW1: + synth.processLfoPw1(newValue); + break; + case LFOPW2: + synth.processLfoPw2(newValue); + break; + case PORTADER: + synth.processPortamentoDetune(newValue); + break; + case FILTERDER: + synth.processFilterDetune(newValue); + break; + case ENVDER: + synth.processEnvelopeDetune(newValue); + break; + case XMOD: + synth.processOsc2Xmod(newValue); + break; + case OSC2HS: + synth.processOsc2HardSync(newValue); + break; + case OSC2P: + synth.processOsc2Pitch(newValue); + break; + case OSC1P: + synth.processOsc1Pitch(newValue); + break; + case PORTAMENTO: + synth.processPortamento(newValue); + break; + case UNISON: + synth.processUnison(newValue); + break; + case FLT_KF: + synth.processFilterKeyFollow(newValue); + break; + case OSC1MIX: + synth.processOsc1Mix(newValue); + break; + case OSC2MIX: + synth.processOsc2Mix(newValue); + break; + case PW: + synth.processPulseWidth(newValue); + break; + case OSC1Saw: + synth.processOsc1Saw(newValue); + break; + case OSC2Saw: + synth.processOsc2Saw(newValue); + break; + case OSC1Pul: + synth.processOsc1Pulse(newValue); + break; + case OSC2Pul: + synth.processOsc2Pulse(newValue); + break; + case VOLUME: + synth.processVolume(newValue); + break; + case UDET: + synth.processDetune(newValue); + break; + case OSC2_DET: + synth.processOsc2Det(newValue); + break; + case CUTOFF: + synth.processCutoff(newValue); + break; + case RESONANCE: + synth.processResonance(newValue); + break; + case ENVELOPE_AMT: + synth.processFilterEnvelopeAmt(newValue); + break; + case LATK: + synth.processLoudnessEnvelopeAttack(newValue); + break; + case LDEC: + synth.processLoudnessEnvelopeDecay(newValue); + break; + case LSUS: + synth.processLoudnessEnvelopeSustain(newValue); + break; + case LREL: + synth.processLoudnessEnvelopeRelease(newValue); + break; + case FATK: + synth.processFilterEnvelopeAttack(newValue); + break; + case FDEC: + synth.processFilterEnvelopeDecay(newValue); + break; + case FSUS: + synth.processFilterEnvelopeSustain(newValue); + break; + case FREL: + synth.processFilterEnvelopeRelease(newValue); + break; + case PAN1: + synth.processPan(newValue,1); + break; + case PAN2: + synth.processPan(newValue,2); + break; + case PAN3: + synth.processPan(newValue,3); + break; + case PAN4: + synth.processPan(newValue,4); + break; + case PAN5: + synth.processPan(newValue,5); + break; + case PAN6: + synth.processPan(newValue,6); + break; + case PAN7: + synth.processPan(newValue,7); + break; + case PAN8: + synth.processPan(newValue,8); + break; + } + //DIRTY HACK + //This should be checked to avoid stalling on gui update + //It is needed because some hosts do wierd stuff + if(isHostAutomatedChange) + sendChangeMessage(); +} + +const String ObxdAudioProcessor::getParameterName (int index) +{ + switch(index) + { + case SELF_OSC_PUSH: + return S("SelfOscPush"); + case ENV_PITCH_BOTH: + return S("EnvPitchBoth"); + case FENV_INVERT: + return S("FenvInvert"); + case PW_OSC2_OFS: + return S("PwOfs"); + case LEVEL_DIF: + return S("LevelDif"); + case PW_ENV_BOTH: + return S("PwEnvBoth"); + case PW_ENV: + return S("PwEnv"); + case LFO_SYNC: + return S("LfoSync"); + case ECONOMY_MODE: + return S("EconomyMode"); + case UNLEARN: + return S("MidiUnlearn"); + case MIDILEARN: + return S("MidiLearn"); + case VAMPENV: + return S("VAmpFactor"); + case VFLTENV: + return S("VFltFactor"); + case ASPLAYEDALLOCATION: + return S("AsPlayedAllocation"); + case BENDLFORATE: + return S("VibratoRate"); + case FOURPOLE: + return S("FourPole"); + case LEGATOMODE: + return S("LegatoMode"); + case ENVPITCH: + return S("EnvelopeToPitch"); + case OSCQuantize: + return S("PitchQuant"); + case VOICE_COUNT: + return S("VoiceCount"); + case BANDPASS: + return S("BandpassBlend"); + case FILTER_WARM: + return S("Filter_Warm"); + case BENDRANGE: + return S("BendRange"); + case BENDOSC2: + return S("BendOsc2Only"); + case OCTAVE: + return S("Octave"); + case TUNE: + return S("Tune"); + case BRIGHTNESS: + return S("Brightness"); + case NOISEMIX: + return S("NoiseMix"); + case OSC1MIX: + return S("Osc1Mix"); + case OSC2MIX: + return S("Osc2Mix"); + case MULTIMODE: + return S("Multimode"); + case LFOSHWAVE: + return S("LfoSampleHoldWave"); + case LFOSINWAVE: + return S("LfoSineWave"); + case LFOSQUAREWAVE: + return S("LfoSquareWave"); + case LFO1AMT: + return S("LfoAmount1"); + case LFO2AMT: + return S("LfoAmount2"); + case LFOFILTER: + return S("LfoFilter"); + case LFOOSC1: + return S("LfoOsc1"); + case LFOOSC2: + return S("LfoOsc2"); + case LFOFREQ: + return S("LfoFrequency"); + case LFOPW1: + return S("LfoPw1"); + case LFOPW2: + return S("LfoPw2"); + case PORTADER: + return S("PortamentoDetune"); + case FILTERDER: + return S("FilterDetune"); + case ENVDER: + return S("EnvelopeDetune"); + case PAN1: + return S("Pan1"); + case PAN2: + return S("Pan2"); + case PAN3: + return S("Pan3"); + case PAN4: + return S("Pan4"); + case PAN5: + return S("Pan5"); + case PAN6: + return S("Pan6"); + case PAN7: + return S("Pan7"); + case PAN8: + return S("Pan8"); + case XMOD: + return S("Xmod"); + case OSC2HS: + return S("Osc2HardSync"); + case OSC1P: + return S("Osc1Pitch"); + case OSC2P: + return S("Osc2Pitch"); + case PORTAMENTO: + return S("Portamento"); + case UNISON: + return S("Unison"); + case FLT_KF: + return S("FilterKeyFollow"); + case PW: + return S("PulseWidth"); + case OSC2Saw: + return S("Osc2Saw"); + case OSC1Saw: + return S("Osc1Saw"); + case OSC1Pul: + return S("Osc1Pulse"); + case OSC2Pul: + return S("Osc2Pulse"); + case VOLUME: + return S("Volume"); + case UDET: + return S("VoiceDetune"); + case OSC2_DET: + return S("Oscillator2detune"); + case CUTOFF: + return S("Cutoff"); + case RESONANCE: + return S("Resonance"); + case ENVELOPE_AMT: + return S("FilterEnvAmount"); + case LATK: + return S("Attack"); + case LDEC: + return S("Decay"); + case LSUS: + return S("Sustain"); + case LREL: + return S("Release"); + case FATK: + return S("FilterAttack"); + case FDEC: + return S("FilterDecay"); + case FSUS: + return S("FilterSustain"); + case FREL: + return S("FilterRelease"); + } + return String::empty; +} + +const String ObxdAudioProcessor::getParameterText (int index) +{ + return String(programs.currentProgramPtr->values[index],2); +} + +//============================================================================== +const String ObxdAudioProcessor::getName() const +{ + return JucePlugin_Name; +} + +const String ObxdAudioProcessor::getInputChannelName (int channelIndex) const +{ + return String (channelIndex + 1); +} + +const String ObxdAudioProcessor::getOutputChannelName (int channelIndex) const +{ + return String (channelIndex + 1); +} + +bool ObxdAudioProcessor::isInputChannelStereoPair (int index) const +{ + return true; +} + +bool ObxdAudioProcessor::isOutputChannelStereoPair (int index) const +{ + return true; +} + +bool ObxdAudioProcessor::acceptsMidi() const +{ +#if JucePlugin_WantsMidiInput + return true; +#else + return false; +#endif +} + +bool ObxdAudioProcessor::producesMidi() const +{ +#if JucePlugin_ProducesMidiOutput + return true; +#else + return false; +#endif +} + +bool ObxdAudioProcessor::silenceInProducesSilenceOut() const +{ + return false; +} + +double ObxdAudioProcessor::getTailLengthSeconds() const +{ + return 0.0; +} + +//============================================================================== +int ObxdAudioProcessor::getNumPrograms() +{ + return PROGRAMCOUNT; +} + +int ObxdAudioProcessor::getCurrentProgram() +{ + return programs.currentProgram; +} + +void ObxdAudioProcessor::setCurrentProgram (int index) +{ + programs.currentProgram = index; + programs.currentProgramPtr = programs.programs + programs.currentProgram; + isHostAutomatedChange = false; + for(int i = 0 ; i < PARAM_COUNT;i++) + setParameter(i,programs.currentProgramPtr->values[i]); + isHostAutomatedChange = true; + sendChangeMessage(); + updateHostDisplay(); +} + +const String ObxdAudioProcessor::getProgramName (int index) +{ + return programs.programs[index].name; +} + +void ObxdAudioProcessor::changeProgramName (int index, const String& newName) +{ + programs.programs[index].name = newName; +} + +//============================================================================== +void ObxdAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) +{ + // Use this method as the place to do any pre-playback + // initialisation that you need.. + nextMidi= new MidiMessage(0xF0); + midiMsg = new MidiMessage(0xF0); + synth.setSampleRate(sampleRate); +} + +void ObxdAudioProcessor::releaseResources() +{ + +} + +inline void ObxdAudioProcessor::processMidiPerSample(MidiBuffer::Iterator* iter,const int samplePos) +{ + while (getNextEvent(iter, samplePos)) + { + if(midiMsg->isNoteOn()) + { + synth.procNoteOn(midiMsg->getNoteNumber(),midiMsg->getFloatVelocity()); + } + if (midiMsg->isNoteOff()) + { + synth.procNoteOff(midiMsg->getNoteNumber()); + } + if(midiMsg->isPitchWheel()) + { + // [0..16383] center = 8192; + synth.procPitchWheel((midiMsg->getPitchWheelValue()-8192) / 8192.0); + } + if(midiMsg->isController() && midiMsg->getControllerNumber()==1) + synth.procModWheel(midiMsg->getControllerValue() / 127.0); + if(midiMsg->isController()) + { + lastMovedController = midiMsg->getControllerNumber(); + if(programs.currentProgramPtr->values[MIDILEARN] > 0.5) + bindings.controllers[lastMovedController] = lastUsedParameter; + if(programs.currentProgramPtr->values[UNLEARN] >0.5) + { + midiControlledParamSet = true; + bindings.controllers[lastMovedController] = 0; + setParameter(UNLEARN,0); + lastMovedController = 0; + lastUsedParameter = 0; + midiControlledParamSet = false; + } + + if(bindings.controllers[lastMovedController] > 0) + { + midiControlledParamSet = true; + setParameter(bindings.controllers[lastMovedController],midiMsg->getControllerValue() / 127.0); + setParameter(MIDILEARN,0); + lastMovedController = 0; + lastUsedParameter = 0; + + midiControlledParamSet = false; + } + + } + if(midiMsg->isSustainPedalOn()) + { + synth.sustainOn(); + } + if(midiMsg->isSustainPedalOff() || midiMsg->isAllNotesOff()||midiMsg->isAllSoundOff()) + { + synth.sustainOff(); + } + if(midiMsg->isAllNotesOff()) + { + synth.allNotesOff(); + } + if(midiMsg->isAllSoundOff()) + { + synth.allSoundOff(); + } + + } +} + +bool ObxdAudioProcessor::getNextEvent(MidiBuffer::Iterator* iter,const int samplePos) +{ + if (hasMidiMessage && midiEventPos <= samplePos) + { + *midiMsg = *nextMidi; + hasMidiMessage = iter->getNextEvent(*nextMidi, midiEventPos); + return true; + } + return false; +} + +void ObxdAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) +{ + //SSE flags set +#ifdef __SSE__ + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); +#endif +#ifdef __SSE2__ + // _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); +#endif + + MidiBuffer::Iterator ppp(midiMessages); + hasMidiMessage = ppp.getNextEvent(*nextMidi,midiEventPos); + + int samplePos = 0; + int numSamples = buffer.getNumSamples(); + float* channelData1 = buffer.getWritePointer(0); + float* channelData2 = buffer.getWritePointer(1); + + AudioPlayHead::CurrentPositionInfo pos; + if (getPlayHead() != 0 && getPlayHead()->getCurrentPosition (pos)) + { + synth.setPlayHead(pos.bpm,pos.ppqPosition); + } + + while (samplePos < numSamples) + { + processMidiPerSample(&ppp,samplePos); + + synth.processSample(channelData1+samplePos,channelData2+samplePos); + + samplePos++; + } +} + +//============================================================================== +bool ObxdAudioProcessor::hasEditor() const +{ + return true; +} + +AudioProcessorEditor* ObxdAudioProcessor::createEditor() +{ + return new ObxdAudioProcessorEditor (this); +} + +//============================================================================== +void ObxdAudioProcessor::getStateInformation (MemoryBlock& destData) +{ + XmlElement xmlState = XmlElement("Datsounds"); + xmlState.setAttribute(S("currentProgram"), programs.currentProgram); + + XmlElement* xprogs = new XmlElement("programs"); + for (int i = 0; i < PROGRAMCOUNT; ++i) + { + XmlElement* xpr = new XmlElement("program"); + xpr->setAttribute(S("programName"), programs.programs[i].name); + + for (int k = 0; k < PARAM_COUNT; ++k) + { + xpr->setAttribute(String(k), programs.programs[i].values[k]); + } + + xprogs->addChildElement(xpr); + } + + xmlState.addChildElement(xprogs); + + for (int i = 0; i < 255; ++i) + { + xmlState.setAttribute(String(i), bindings.controllers[i]); + } + + copyXmlToBinary(xmlState,destData); +} + +void ObxdAudioProcessor::setStateInformation (const void* data, int sizeInBytes) +{ + if (XmlElement* const xmlState = getXmlFromBinary(data,sizeInBytes)) + { + XmlElement* xprogs = xmlState->getFirstChildElement(); + if (xprogs->hasTagName(S("programs"))) + { + int i = 0; + forEachXmlChildElement(*xprogs, e) + { + programs.programs[i].setDefaultValues(); + + for (int k = 0; k < PARAM_COUNT; ++k) + { + programs.programs[i].values[k] = e->getDoubleAttribute(String(k), programs.programs[i].values[k]); + } + + programs.programs[i].name = e->getStringAttribute(S("programName"), S("Default")); + + ++i; + } + } + + for (int i = 0; i < 255; ++i) + { + bindings.controllers[i] = xmlState->getIntAttribute(String(i), 0); + } + + setCurrentProgram(xmlState->getIntAttribute(S("currentProgram"), 0)); + + delete xmlState; + } +} + +void ObxdAudioProcessor::setCurrentProgramStateInformation(const void* data,int sizeInBytes) +{ + if (XmlElement* const e = getXmlFromBinary(data, sizeInBytes)) + { + programs.currentProgramPtr->setDefaultValues(); + + for (int k = 0; k < PARAM_COUNT; ++k) + { + programs.currentProgramPtr->values[k] = e->getDoubleAttribute(String(k), programs.currentProgramPtr->values[k]); + } + + programs.currentProgramPtr->name = e->getStringAttribute(S("programName"), S("Default")); + + setCurrentProgram(programs.currentProgram); + + delete e; + } +} + +void ObxdAudioProcessor::getCurrentProgramStateInformation(MemoryBlock& destData) +{ + XmlElement xmlState = XmlElement("Datsounds"); + + for (int k = 0; k < PARAM_COUNT; ++k) + { + xmlState.setAttribute(String(k), programs.currentProgramPtr->values[k]); + } + + xmlState.setAttribute(S("programName"), programs.currentProgramPtr->name); + + copyXmlToBinary(xmlState, destData); +} + +//============================================================================== +bool ObxdAudioProcessor::loadFromFXBFile(const File& fxbFile) +{ + MemoryBlock mb; + if (! fxbFile.loadFileAsData(mb)) + return false; + + const void* const data = mb.getData(); + const size_t dataSize = mb.getSize(); + + if (dataSize < 28) + return false; + + const fxSet* const set = (const fxSet*) data; + + if ((! compareMagic (set->chunkMagic, "CcnK")) || fxbSwap (set->version) > fxbVersionNum) + return false; + + if (compareMagic (set->fxMagic, "FxBk")) + { + // bank of programs + if (fxbSwap (set->numPrograms) >= 0) + { + const int oldProg = getCurrentProgram(); + const int numParams = fxbSwap (((const fxProgram*) (set->programs))->numParams); + const int progLen = (int) sizeof (fxProgram) + (numParams - 1) * (int) sizeof (float); + + for (int i = 0; i < fxbSwap (set->numPrograms); ++i) + { + if (i != oldProg) + { + const fxProgram* const prog = (const fxProgram*) (((const char*) (set->programs)) + i * progLen); + if (((const char*) prog) - ((const char*) set) >= (ssize_t) dataSize) + return false; + + if (fxbSwap (set->numPrograms) > 0) + setCurrentProgram (i); + + if (! restoreProgramSettings (prog)) + return false; + } + } + + if (fxbSwap (set->numPrograms) > 0) + setCurrentProgram (oldProg); + + const fxProgram* const prog = (const fxProgram*) (((const char*) (set->programs)) + oldProg * progLen); + if (((const char*) prog) - ((const char*) set) >= (ssize_t) dataSize) + return false; + + if (! restoreProgramSettings (prog)) + return false; + } + } + else if (compareMagic (set->fxMagic, "FxCk")) + { + // single program + const fxProgram* const prog = (const fxProgram*) data; + + if (! compareMagic (prog->chunkMagic, "CcnK")) + return false; + + changeProgramName (getCurrentProgram(), prog->prgName); + + for (int i = 0; i < fxbSwap (prog->numParams); ++i) + setParameter (i, fxbSwapFloat (prog->params[i])); + } + else if (compareMagic (set->fxMagic, "FBCh")) + { + // non-preset chunk + const fxChunkSet* const cset = (const fxChunkSet*) data; + + if ((size_t) fxbSwap (cset->chunkSize) + sizeof (fxChunkSet) - 8 > (size_t) dataSize) + return false; + + setStateInformation(cset->chunk, fxbSwap (cset->chunkSize)); + } + else if (compareMagic (set->fxMagic, "FPCh")) + { + // preset chunk + const fxProgramSet* const cset = (const fxProgramSet*) data; + + if ((size_t) fxbSwap (cset->chunkSize) + sizeof (fxProgramSet) - 8 > (size_t) dataSize) + return false; + + setCurrentProgramStateInformation(cset->chunk, fxbSwap (cset->chunkSize)); + + changeProgramName (getCurrentProgram(), cset->name); + } + else + { + return false; + } + + currentBank = fxbFile.getFileName(); + + updateHostDisplay(); + + return true; +} + +bool ObxdAudioProcessor::restoreProgramSettings(const fxProgram* const prog) +{ + if (compareMagic (prog->chunkMagic, "CcnK") + && compareMagic (prog->fxMagic, "FxCk")) + { + changeProgramName (getCurrentProgram(), prog->prgName); + + for (int i = 0; i < fxbSwap (prog->numParams); ++i) + setParameter (i, fxbSwapFloat (prog->params[i])); + + return true; + } + + return false; +} + +//============================================================================== +void ObxdAudioProcessor::scanAndUpdateBanks() +{ + bankFiles.clearQuick(); + + DirectoryIterator it(getBanksFolder(), false, "*.fxb", File::findFiles); + while (it.next()) + { + bankFiles.add(it.getFile()); + } +} + +const Array& ObxdAudioProcessor::getBankFiles() const +{ + return bankFiles; +} + +File ObxdAudioProcessor::getCurrentBankFile() const +{ + return getBanksFolder().getChildFile(currentBank); +} + +//============================================================================== +File ObxdAudioProcessor::getDocumentFolder() const +{ + File folder = File::getSpecialLocation(File::userDocumentsDirectory).getChildFile("discoDSP").getChildFile("OB-Xd"); + if (folder.isSymbolicLink()) + folder = folder.getLinkedTarget(); + return folder; +} + +File ObxdAudioProcessor::getSkinFolder() const +{ + return getDocumentFolder().getChildFile("Skins"); +} + +File ObxdAudioProcessor::getBanksFolder() const +{ + return getDocumentFolder().getChildFile("Banks"); +} + +File ObxdAudioProcessor::getCurrentSkinFolder() const +{ + return getSkinFolder().getChildFile(currentSkin); +} + +void ObxdAudioProcessor::setCurrentSkinFolder(const String& folderName) +{ + currentSkin = folderName; + + config->setValue("skin", folderName); + config->setNeedsToBeSaved(true); +} + +//============================================================================== +// This creates new instances of the plugin.. +AudioProcessor* JUCE_CALLTYPE createPluginFilter() +{ + return new ObxdAudioProcessor(); +} diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h new file mode 100755 index 0000000..89f2ae9 --- /dev/null +++ b/Source/PluginProcessor.h @@ -0,0 +1,222 @@ +/* + ============================================================================== + This file is part of Obxd synthesizer. + + Copyright © 2013-2014 Filatov Vadim + + Contact author via email : + justdat_@_e1.ru + + This file may be licensed under the terms of of the + GNU General Public License Version 2 (the ``GPL''). + + Software distributed under the License is distributed + on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either + express or implied. See the GPL for the specific language + governing rights and limitations. + + You should have received a copy of the GPL along with this + program. If not, go to http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + ============================================================================== + */ + +#ifndef PLUGINPROCESSOR_H_INCLUDED +#define PLUGINPROCESSOR_H_INCLUDED + +#include "../JuceLibraryCode/JuceHeader.h" +#include "Engine/SynthEngine.h" +//#include +#include "Engine/midiMap.h" +#include "Engine/ObxdBank.h" + +//============================================================================== +const int fxbVersionNum = 1; + +struct fxProgram +{ + int32 chunkMagic; // 'CcnK' + int32 byteSize; // of this chunk, excl. magic + byteSize + int32 fxMagic; // 'FxCk' + int32 version; + int32 fxID; // fx unique id + int32 fxVersion; + int32 numParams; + char prgName[28]; + float params[1]; // variable no. of parameters +}; + +struct fxSet +{ + int32 chunkMagic; // 'CcnK' + int32 byteSize; // of this chunk, excl. magic + byteSize + int32 fxMagic; // 'FxBk' + int32 version; + int32 fxID; // fx unique id + int32 fxVersion; + int32 numPrograms; + char future[128]; + fxProgram programs[1]; // variable no. of programs +}; + +struct fxChunkSet +{ + int32 chunkMagic; // 'CcnK' + int32 byteSize; // of this chunk, excl. magic + byteSize + int32 fxMagic; // 'FxCh', 'FPCh', or 'FBCh' + int32 version; + int32 fxID; // fx unique id + int32 fxVersion; + int32 numPrograms; + char future[128]; + int32 chunkSize; + char chunk[8]; // variable +}; + +struct fxProgramSet +{ + int32 chunkMagic; // 'CcnK' + int32 byteSize; // of this chunk, excl. magic + byteSize + int32 fxMagic; // 'FxCh', 'FPCh', or 'FBCh' + int32 version; + int32 fxID; // fx unique id + int32 fxVersion; + int32 numPrograms; + char name[28]; + int32 chunkSize; + char chunk[8]; // variable +}; + +// Compares a magic value in either endianness. +static inline bool compareMagic (int32 magic, const char* name) noexcept +{ + return magic == (int32) ByteOrder::littleEndianInt (name) + || magic == (int32) ByteOrder::bigEndianInt (name); +} + +static inline int32 fxbName (const char* name) noexcept { return (int32) ByteOrder::littleEndianInt (name); } +static inline int32 fxbSwap (const int32 x) noexcept { return (int32) ByteOrder::swapIfLittleEndian ((uint32) x); } + +static inline float fxbSwapFloat (const float x) noexcept +{ +#ifdef JUCE_LITTLE_ENDIAN + union { uint32 asInt; float asFloat; } n; + n.asFloat = x; + n.asInt = ByteOrder::swap (n.asInt); + return n.asFloat; +#else + return x; +#endif +} + +//============================================================================== +/** +*/ +class ObxdAudioProcessor : + public AudioProcessor, + // public AudioProcessorListener, + public ChangeBroadcaster +{ +public: + //============================================================================== + ObxdAudioProcessor(); + ~ObxdAudioProcessor(); + + //============================================================================== + void prepareToPlay (double sampleRate, int samplesPerBlock); + void releaseResources(); + + void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages); + + //============================================================================== + AudioProcessorEditor* createEditor(); + bool hasEditor() const; + + //============================================================================== + void processMidiPerSample(MidiBuffer::Iterator* iter,const int samplePos); + bool getNextEvent(MidiBuffer::Iterator* iter,const int samplePos); + + //============================================================================== + void initAllParams(); + + int getNumParameters(); + + float getParameter (int index); + void setParameter (int index, float newValue); + + const String getParameterName (int index); + const String getParameterText (int index); + + const String getInputChannelName (int channelIndex) const; + const String getOutputChannelName (int channelIndex) const; + bool isInputChannelStereoPair (int index) const; + bool isOutputChannelStereoPair (int index) const; + + bool acceptsMidi() const; + bool producesMidi() const; + bool silenceInProducesSilenceOut() const; + double getTailLengthSeconds() const; + const String getName() const; + + //============================================================================== + int getNumPrograms(); + int getCurrentProgram(); + void setCurrentProgram (int index); + const String getProgramName (int index); + void changeProgramName (int index, const String& newName); + + //============================================================================== + void getStateInformation (MemoryBlock& destData); + void setStateInformation (const void* data, int sizeInBytes); + void setCurrentProgramStateInformation(const void* data,int sizeInBytes); + void getCurrentProgramStateInformation(MemoryBlock& destData); + + //============================================================================== + void scanAndUpdateBanks(); + const Array& getBankFiles() const; + bool loadFromFXBFile(const File& fxbFile); + bool restoreProgramSettings(const fxProgram* const prog); + File getCurrentBankFile() const; + + //============================================================================== + const ObxdBank& getPrograms() const { return programs; } + + //============================================================================== + File getDocumentFolder() const; + File getSkinFolder() const; + File getBanksFolder() const; + + File getCurrentSkinFolder() const; + void setCurrentSkinFolder(const String& folderName); + +private: + //============================================================================== + bool isHostAutomatedChange; + + int lastMovedController; + int lastUsedParameter; + + MidiMessage* nextMidi; + MidiMessage* midiMsg; + MidiMap bindings; + bool midiControlledParamSet; + + bool hasMidiMessage; + int midiEventPos; + + SynthEngine synth; + ObxdBank programs; + + String currentSkin; + String currentBank; + Array bankFiles; + + ScopedPointer config; + InterProcessLock configLock; + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ObxdAudioProcessor) +}; + +#endif // PLUGINPROCESSOR_H_INCLUDED diff --git a/license.txt b/license.txt new file mode 100755 index 0000000..94a9ed0 --- /dev/null +++ b/license.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +.